diff options
Diffstat (limited to 'apps/user_ldap')
423 files changed, 14566 insertions, 13656 deletions
diff --git a/apps/user_ldap/ajax/clearMappings.php b/apps/user_ldap/ajax/clearMappings.php index 39462f334c9..c3b64f08a16 100644 --- a/apps/user_ldap/ajax/clearMappings.php +++ b/apps/user_ldap/ajax/clearMappings.php @@ -1,30 +1,19 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ -use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Mapping\GroupMapping; +use OCA\User_LDAP\Mapping\UserMapping; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Server; +use OCP\User\Events\BeforeUserIdUnassignedEvent; +use OCP\User\Events\UserIdUnassignedEvent; +use OCP\Util; // Check user and app status \OC_JSON::checkAdminUser(); @@ -35,22 +24,28 @@ $subject = (string)$_POST['ldap_clear_mapping']; $mapping = null; try { if ($subject === 'user') { - $mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $mapping = Server::get(UserMapping::class); + /** @var IEventDispatcher $dispatcher */ + $dispatcher = Server::get(IEventDispatcher::class); $result = $mapping->clearCb( - function ($uid) { - \OC::$server->getUserManager()->emit('\OC\User', 'preUnassignedUserId', [$uid]); + function (string $uid) use ($dispatcher): void { + $dispatcher->dispatchTyped(new BeforeUserIdUnassignedEvent($uid)); + /** @psalm-suppress UndefinedInterfaceMethod For now we have to emit, will be removed when all hooks are removed */ + Server::get(IUserManager::class)->emit('\OC\User', 'preUnassignedUserId', [$uid]); }, - function ($uid) { - \OC::$server->getUserManager()->emit('\OC\User', 'postUnassignedUserId', [$uid]); + function (string $uid) use ($dispatcher): void { + $dispatcher->dispatchTyped(new UserIdUnassignedEvent($uid)); + /** @psalm-suppress UndefinedInterfaceMethod For now we have to emit, will be removed when all hooks are removed */ + Server::get(IUserManager::class)->emit('\OC\User', 'postUnassignedUserId', [$uid]); } ); } elseif ($subject === 'group') { - $mapping = new GroupMapping(\OC::$server->getDatabaseConnection()); + $mapping = new GroupMapping(Server::get(IDBConnection::class)); $result = $mapping->clear(); } if ($mapping === null || !$result) { - $l = \OC::$server->getL10N('user_ldap'); + $l = Util::getL10N('user_ldap'); throw new \Exception($l->t('Failed to clear the mappings.')); } \OC_JSON::success(); diff --git a/apps/user_ldap/ajax/deleteConfiguration.php b/apps/user_ldap/ajax/deleteConfiguration.php index 82bfb6de82a..68bce69f982 100644 --- a/apps/user_ldap/ajax/deleteConfiguration.php +++ b/apps/user_ldap/ajax/deleteConfiguration.php @@ -1,29 +1,13 @@ <?php + +use OCA\User_LDAP\Helper; +use OCP\Server; +use OCP\Util; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); @@ -31,10 +15,10 @@ \OC_JSON::callCheck(); $prefix = (string)$_POST['ldap_serverconfig_chooser']; -$helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); +$helper = Server::get(Helper::class); if ($helper->deleteServerConfiguration($prefix)) { \OC_JSON::success(); } else { - $l = \OC::$server->getL10N('user_ldap'); + $l = Util::getL10N('user_ldap'); \OC_JSON::error(['message' => $l->t('Failed to delete the server configuration')]); } diff --git a/apps/user_ldap/ajax/getConfiguration.php b/apps/user_ldap/ajax/getConfiguration.php index b541dbfbea5..79a7372813c 100644 --- a/apps/user_ldap/ajax/getConfiguration.php +++ b/apps/user_ldap/ajax/getConfiguration.php @@ -1,28 +1,11 @@ <?php + +use OCA\User_LDAP\LDAP; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); @@ -30,7 +13,7 @@ \OC_JSON::callCheck(); $prefix = (string)$_POST['ldap_serverconfig_chooser']; -$ldapWrapper = new OCA\User_LDAP\LDAP(); +$ldapWrapper = new LDAP(); $connection = new \OCA\User_LDAP\Connection($ldapWrapper, $prefix); $configuration = $connection->getConfiguration(); if (isset($configuration['ldap_agent_password']) && $configuration['ldap_agent_password'] !== '') { diff --git a/apps/user_ldap/ajax/getNewServerConfigPrefix.php b/apps/user_ldap/ajax/getNewServerConfigPrefix.php index d2194d5ceb7..e5ba6375c73 100644 --- a/apps/user_ldap/ajax/getNewServerConfigPrefix.php +++ b/apps/user_ldap/ajax/getNewServerConfigPrefix.php @@ -1,48 +1,34 @@ <?php + +use OCA\User_LDAP\Configuration; +use OCA\User_LDAP\Helper; +use OCP\Server; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); \OC_JSON::checkAppEnabled('user_ldap'); \OC_JSON::callCheck(); -$helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); +$helper = Server::get(Helper::class); $serverConnections = $helper->getServerConfigurationPrefixes(); sort($serverConnections); $lk = array_pop($serverConnections); $ln = (int)str_replace('s', '', $lk); -$nk = 's'.str_pad($ln + 1, 2, '0', STR_PAD_LEFT); +$nk = 's' . str_pad((string)($ln + 1), 2, '0', STR_PAD_LEFT); $resultData = ['configPrefix' => $nk]; -$newConfig = new \OCA\User_LDAP\Configuration($nk, false); +$newConfig = new Configuration($nk, false); if (isset($_POST['copyConfig'])) { - $originalConfig = new \OCA\User_LDAP\Configuration($_POST['copyConfig']); + $originalConfig = new Configuration($_POST['copyConfig']); $newConfig->setConfiguration($originalConfig->getConfiguration()); } else { - $configuration = new \OCA\User_LDAP\Configuration($nk, false); + $configuration = new Configuration($nk, false); $newConfig->setConfiguration($configuration->getDefaults()); $resultData['defaults'] = $configuration->getDefaults(); } diff --git a/apps/user_ldap/ajax/setConfiguration.php b/apps/user_ldap/ajax/setConfiguration.php index 93717b7d114..815ef040257 100644 --- a/apps/user_ldap/ajax/setConfiguration.php +++ b/apps/user_ldap/ajax/setConfiguration.php @@ -1,27 +1,11 @@ <?php + +use OCA\User_LDAP\LDAP; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); @@ -41,7 +25,7 @@ foreach ($chkboxes as $boxid) { } } -$ldapWrapper = new OCA\User_LDAP\LDAP(); +$ldapWrapper = new LDAP(); $connection = new \OCA\User_LDAP\Connection($ldapWrapper, $prefix); $connection->setConfiguration($_POST); $connection->saveConfiguration(); diff --git a/apps/user_ldap/ajax/testConfiguration.php b/apps/user_ldap/ajax/testConfiguration.php index a5f41e93a92..b77439fa3e8 100644 --- a/apps/user_ldap/ajax/testConfiguration.php +++ b/apps/user_ldap/ajax/testConfiguration.php @@ -1,58 +1,48 @@ <?php + +use OCA\User_LDAP\Exceptions\ConfigurationIssueException; +use OCA\User_LDAP\LDAP; +use OCP\ISession; +use OCP\Server; +use OCP\Util; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); \OC_JSON::checkAppEnabled('user_ldap'); \OC_JSON::callCheck(); -$l = \OC::$server->getL10N('user_ldap'); +$l = Util::getL10N('user_ldap'); -$ldapWrapper = new OCA\User_LDAP\LDAP(); +$ldapWrapper = new LDAP(); $connection = new \OCA\User_LDAP\Connection($ldapWrapper, $_POST['ldap_serverconfig_chooser']); try { - $configurationOk = true; + $configurationError = ''; $conf = $connection->getConfiguration(); if ($conf['ldap_configuration_active'] === '0') { //needs to be true, otherwise it will also fail with an irritating message $conf['ldap_configuration_active'] = '1'; - $configurationOk = $connection->setConfiguration($conf); } - if ($configurationOk) { + try { + $connection->setConfiguration($conf, throw: true); + } catch (ConfigurationIssueException $e) { + $configurationError = $e->getHint(); + } + if ($configurationError === '') { //Configuration is okay /* - * Clossing the session since it won't be used from this point on. There might be a potential + * Closing the session since it won't be used from this point on. There might be a potential * race condition if a second request is made: either this request or the other might not * contact the LDAP backup server the first time when it should, but there shouldn't be any * problem with that other than the extra connection. */ - \OC::$server->getSession()->close(); + Server::get(ISession::class)->close(); if ($connection->bind()) { /* * This shiny if block is an ugly hack to find out whether anonymous @@ -79,7 +69,7 @@ try { } } else { \OC_JSON::error(['message' - => $l->t('Invalid configuration. Please have a look at the logs for further details.')]); + => $l->t('Invalid configuration: %s', $configurationError)]); } } catch (\Exception $e) { \OC_JSON::error(['message' => $e->getMessage()]); diff --git a/apps/user_ldap/ajax/wizard.php b/apps/user_ldap/ajax/wizard.php index 814477d5db0..056299e1bff 100644 --- a/apps/user_ldap/ajax/wizard.php +++ b/apps/user_ldap/ajax/wizard.php @@ -1,79 +1,46 @@ <?php + +use OCA\User_LDAP\AccessFactory; +use OCA\User_LDAP\Configuration; +use OCA\User_LDAP\LDAP; +use OCA\User_LDAP\Wizard; +use OCP\Server; +use OCP\Util; + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ // Check user and app status \OC_JSON::checkAdminUser(); \OC_JSON::checkAppEnabled('user_ldap'); \OC_JSON::callCheck(); -$l = \OC::$server->getL10N('user_ldap'); +$l = Util::getL10N('user_ldap'); if (!isset($_POST['action'])) { \OC_JSON::error(['message' => $l->t('No action specified')]); } $action = (string)$_POST['action']; - if (!isset($_POST['ldap_serverconfig_chooser'])) { \OC_JSON::error(['message' => $l->t('No configuration specified')]); } $prefix = (string)$_POST['ldap_serverconfig_chooser']; -$ldapWrapper = new \OCA\User_LDAP\LDAP(); -$configuration = new \OCA\User_LDAP\Configuration($prefix); +$ldapWrapper = new LDAP(); +$configuration = new Configuration($prefix); $con = new \OCA\User_LDAP\Connection($ldapWrapper, $prefix, null); $con->setConfiguration($configuration->getConfiguration()); -$con->ldapConfigurationActive = true; +$con->ldapConfigurationActive = (string)true; $con->setIgnoreValidation(true); -$userManager = new \OCA\User_LDAP\User\Manager( - \OC::$server->getConfig(), - new \OCA\User_LDAP\FilesystemHelper(), - \OC::$server->get(\Psr\Log\LoggerInterface::class), - \OC::$server->getAvatarManager(), - new \OCP\Image(), - \OC::$server->getUserManager(), - \OC::$server->getNotificationManager(), - \OC::$server->get(\OCP\Share\IManager::class) -); +$factory = Server::get(AccessFactory::class); +$access = $factory->get($con); -$access = new \OCA\User_LDAP\Access( - $con, - $ldapWrapper, - $userManager, - new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), - \OC::$server->getConfig(), - \OC::$server->getUserManager(), - \OC::$server->get(\Psr\Log\LoggerInterface::class) -); - -$wizard = new \OCA\User_LDAP\Wizard($configuration, $ldapWrapper, $access); +$wizard = new Wizard($configuration, $ldapWrapper, $access); switch ($action) { case 'guessPortAndTLS': @@ -124,18 +91,21 @@ switch ($action) { } case 'save': - $key = isset($_POST['cfgkey']) ? $_POST['cfgkey'] : false; - $val = isset($_POST['cfgval']) ? $_POST['cfgval'] : null; + $key = $_POST['cfgkey'] ?? false; + $val = $_POST['cfgval'] ?? null; if ($key === false || is_null($val)) { \OC_JSON::error(['message' => $l->t('No data specified')]); exit; } + if (is_array($key)) { + \OC_JSON::error(['message' => $l->t('Invalid data specified')]); + exit; + } $cfg = [$key => $val]; $setParameters = []; $configuration->setConfiguration($cfg, $setParameters); if (!in_array($key, $setParameters)) { - \OC_JSON::error(['message' => $l->t($key. - ' Could not set configuration %s', $setParameters[0])]); + \OC_JSON::error(['message' => $l->t('Could not set configuration %1$s to %2$s', [$key, $setParameters[0]])]); exit; } $configuration->saveConfiguration(); diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml index 803b2645705..ead312d7f5c 100644 --- a/apps/user_ldap/appinfo/info.xml +++ b/apps/user_ldap/appinfo/info.xml @@ -1,4 +1,9 @@ <?xml version="1.0"?> +<!-- + - SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + - SPDX-FileCopyrightText: 2011-2016 ownCloud, Inc. + - SPDX-License-Identifier: AGPL-3.0-only + --> <info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> <id>user_ldap</id> @@ -9,7 +14,7 @@ A user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation. </description> - <version>1.15.0</version> + <version>1.23.0</version> <licence>agpl</licence> <author>Dominik Schmidt</author> <author>Arthur Schiwon</author> @@ -24,7 +29,7 @@ A user logs into Nextcloud with their LDAP or AD credentials, and is granted acc <bugs>https://github.com/nextcloud/server/issues</bugs> <dependencies> <lib>ldap</lib> - <nextcloud min-version="25" max-version="25"/> + <nextcloud min-version="32" max-version="32"/> </dependencies> <background-jobs> @@ -48,8 +53,10 @@ A user logs into Nextcloud with their LDAP or AD credentials, and is granted acc <commands> <command>OCA\User_LDAP\Command\CheckUser</command> + <command>OCA\User_LDAP\Command\CheckGroup</command> <command>OCA\User_LDAP\Command\CreateEmptyConfig</command> <command>OCA\User_LDAP\Command\DeleteConfig</command> + <command>OCA\User_LDAP\Command\PromoteGroup</command> <command>OCA\User_LDAP\Command\ResetGroup</command> <command>OCA\User_LDAP\Command\ResetUser</command> <command>OCA\User_LDAP\Command\Search</command> @@ -57,6 +64,7 @@ A user logs into Nextcloud with their LDAP or AD credentials, and is granted acc <command>OCA\User_LDAP\Command\ShowConfig</command> <command>OCA\User_LDAP\Command\ShowRemnants</command> <command>OCA\User_LDAP\Command\TestConfig</command> + <command>OCA\User_LDAP\Command\TestUserSettings</command> <command>OCA\User_LDAP\Command\UpdateUUID</command> </commands> diff --git a/apps/user_ldap/appinfo/routes.php b/apps/user_ldap/appinfo/routes.php index 486be2b4389..52138060f58 100644 --- a/apps/user_ldap/appinfo/routes.php +++ b/apps/user_ldap/appinfo/routes.php @@ -3,28 +3,9 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ $this->create('user_ldap_ajax_clearMappings', 'apps/user_ldap/ajax/clearMappings.php') ->actionInclude('user_ldap/ajax/clearMappings.php'); @@ -41,23 +22,17 @@ $this->create('user_ldap_ajax_testConfiguration', 'apps/user_ldap/ajax/testConfi $this->create('user_ldap_ajax_wizard', 'apps/user_ldap/ajax/wizard.php') ->actionInclude('user_ldap/ajax/wizard.php'); -$application = new \OCP\AppFramework\App('user_ldap'); -$application->registerRoutes($this, [ +return [ 'ocs' => [ ['name' => 'ConfigAPI#create', 'url' => '/api/v1/config', 'verb' => 'POST'], ['name' => 'ConfigAPI#show', 'url' => '/api/v1/config/{configID}', 'verb' => 'GET'], ['name' => 'ConfigAPI#modify', 'url' => '/api/v1/config/{configID}', 'verb' => 'PUT'], ['name' => 'ConfigAPI#delete', 'url' => '/api/v1/config/{configID}', 'verb' => 'DELETE'], - ] -]); - -/** @var \OCA\User_LDAP\AppInfo\Application $application */ -$application = \OC::$server->query(\OCA\User_LDAP\AppInfo\Application::class); -$application->registerRoutes($this, [ + ], 'routes' => [ ['name' => 'renewPassword#tryRenewPassword', 'url' => '/renewpassword', 'verb' => 'POST'], ['name' => 'renewPassword#showRenewPasswordForm', 'url' => '/renewpassword/{user}', 'verb' => 'GET'], ['name' => 'renewPassword#cancel', 'url' => '/renewpassword/cancel', 'verb' => 'GET'], ['name' => 'renewPassword#showLoginFormInvalidPassword', 'url' => '/renewpassword/invalidlogin/{user}', 'verb' => 'GET'], - ] -]); + ], +]; diff --git a/apps/user_ldap/composer/autoload.php b/apps/user_ldap/composer/autoload.php index d1e331c189e..89e85038c65 100644 --- a/apps/user_ldap/composer/autoload.php +++ b/apps/user_ldap/composer/autoload.php @@ -3,8 +3,21 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/apps/user_ldap/composer/composer/ClassLoader.php b/apps/user_ldap/composer/composer/ClassLoader.php index afef3fa2ad8..7824d8f7eaf 100644 --- a/apps/user_ldap/composer/composer/ClassLoader.php +++ b/apps/user_ldap/composer/composer/ClassLoader.php @@ -42,35 +42,37 @@ namespace Composer\Autoload; */ class ClassLoader { - /** @var ?string */ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ private $vendorDir; // PSR-4 /** - * @var array[] - * @psalm-var array<string, array<string, int>> + * @var array<string, array<string, int>> */ private $prefixLengthsPsr4 = array(); /** - * @var array[] - * @psalm-var array<string, array<int, string>> + * @var array<string, list<string>> */ private $prefixDirsPsr4 = array(); /** - * @var array[] - * @psalm-var array<string, string> + * @var list<string> */ private $fallbackDirsPsr4 = array(); // PSR-0 /** - * @var array[] - * @psalm-var array<string, array<string, string[]>> + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array<string, array<string, list<string>>> */ private $prefixesPsr0 = array(); /** - * @var array[] - * @psalm-var array<string, string> + * @var list<string> */ private $fallbackDirsPsr0 = array(); @@ -78,8 +80,7 @@ class ClassLoader private $useIncludePath = false; /** - * @var string[] - * @psalm-var array<string, string> + * @var array<string, string> */ private $classMap = array(); @@ -87,29 +88,29 @@ class ClassLoader private $classMapAuthoritative = false; /** - * @var bool[] - * @psalm-var array<string, bool> + * @var array<string, bool> */ private $missingClasses = array(); - /** @var ?string */ + /** @var string|null */ private $apcuPrefix; /** - * @var self[] + * @var array<string, self> */ private static $registeredLoaders = array(); /** - * @param ?string $vendorDir + * @param string|null $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); } /** - * @return string[] + * @return array<string, list<string>> */ public function getPrefixes() { @@ -121,8 +122,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array<string, array<int, string>> + * @return array<string, list<string>> */ public function getPrefixesPsr4() { @@ -130,8 +130,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array<string, string> + * @return list<string> */ public function getFallbackDirs() { @@ -139,8 +138,7 @@ class ClassLoader } /** - * @return array[] - * @psalm-return array<string, string> + * @return list<string> */ public function getFallbackDirsPsr4() { @@ -148,8 +146,7 @@ class ClassLoader } /** - * @return string[] Array of classname => path - * @psalm-return array<string, string> + * @return array<string, string> Array of classname => path */ public function getClassMap() { @@ -157,8 +154,7 @@ class ClassLoader } /** - * @param string[] $classMap Class to filename map - * @psalm-param array<string, string> $classMap + * @param array<string, string> $classMap Class to filename map * * @return void */ @@ -175,24 +171,25 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, - (array) $paths + $paths ); } @@ -201,19 +198,19 @@ class ClassLoader $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; + $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], - (array) $paths + $paths ); } } @@ -222,9 +219,9 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * @@ -232,17 +229,18 @@ class ClassLoader */ public function addPsr4($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, - (array) $paths + $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { @@ -252,18 +250,18 @@ class ClassLoader throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; + $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], - (array) $paths + $paths ); } } @@ -272,8 +270,8 @@ class ClassLoader * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 base directories * * @return void */ @@ -290,8 +288,8 @@ class ClassLoader * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * @@ -425,7 +423,8 @@ class ClassLoader public function loadClass($class) { if ($file = $this->findFile($class)) { - includeFile($file); + $includeFile = self::$includeFile; + $includeFile($file); return true; } @@ -476,9 +475,9 @@ class ClassLoader } /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. + * Returns the currently registered loaders keyed by their corresponding vendor directories. * - * @return self[] + * @return array<string, self> */ public static function getRegisteredLoaders() { @@ -555,18 +554,26 @@ class ClassLoader return false; } -} -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } } diff --git a/apps/user_ldap/composer/composer/InstalledVersions.php b/apps/user_ldap/composer/composer/InstalledVersions.php index 41bc143c114..51e734a774b 100644 --- a/apps/user_ldap/composer/composer/InstalledVersions.php +++ b/apps/user_ldap/composer/composer/InstalledVersions.php @@ -28,7 +28,7 @@ class InstalledVersions { /** * @var mixed[]|null - * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null */ private static $installed; @@ -39,7 +39,7 @@ class InstalledVersions /** * @var array[] - * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static $installedByVendor = array(); @@ -98,7 +98,7 @@ class InstalledVersions { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; } } @@ -119,7 +119,7 @@ class InstalledVersions */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { - $constraint = $parser->parseConstraints($constraint); + $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); @@ -243,7 +243,7 @@ class InstalledVersions /** * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { @@ -257,7 +257,7 @@ class InstalledVersions * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} */ public static function getRawData() { @@ -280,7 +280,7 @@ class InstalledVersions * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] - * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ public static function getAllRawData() { @@ -303,7 +303,7 @@ class InstalledVersions * @param array[] $data A vendor/composer/installed.php data set * @return void * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data */ public static function reload($data) { @@ -313,7 +313,7 @@ class InstalledVersions /** * @return array[] - * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> */ private static function getInstalled() { @@ -328,7 +328,9 @@ class InstalledVersions if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { - $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } @@ -340,12 +342,17 @@ class InstalledVersions // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = require __DIR__ . '/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; } else { self::$installed = array(); } } - $installed[] = self::$installed; + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } return $installed; } diff --git a/apps/user_ldap/composer/composer/autoload_classmap.php b/apps/user_ldap/composer/composer/autoload_classmap.php index ae112b2b604..36259880928 100644 --- a/apps/user_ldap/composer/composer/autoload_classmap.php +++ b/apps/user_ldap/composer/composer/autoload_classmap.php @@ -11,9 +11,11 @@ return array( 'OCA\\User_LDAP\\AccessFactory' => $baseDir . '/../lib/AccessFactory.php', 'OCA\\User_LDAP\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php', 'OCA\\User_LDAP\\BackendUtility' => $baseDir . '/../lib/BackendUtility.php', + 'OCA\\User_LDAP\\Command\\CheckGroup' => $baseDir . '/../lib/Command/CheckGroup.php', 'OCA\\User_LDAP\\Command\\CheckUser' => $baseDir . '/../lib/Command/CheckUser.php', 'OCA\\User_LDAP\\Command\\CreateEmptyConfig' => $baseDir . '/../lib/Command/CreateEmptyConfig.php', 'OCA\\User_LDAP\\Command\\DeleteConfig' => $baseDir . '/../lib/Command/DeleteConfig.php', + 'OCA\\User_LDAP\\Command\\PromoteGroup' => $baseDir . '/../lib/Command/PromoteGroup.php', 'OCA\\User_LDAP\\Command\\ResetGroup' => $baseDir . '/../lib/Command/ResetGroup.php', 'OCA\\User_LDAP\\Command\\ResetUser' => $baseDir . '/../lib/Command/ResetUser.php', 'OCA\\User_LDAP\\Command\\Search' => $baseDir . '/../lib/Command/Search.php', @@ -21,6 +23,7 @@ return array( 'OCA\\User_LDAP\\Command\\ShowConfig' => $baseDir . '/../lib/Command/ShowConfig.php', 'OCA\\User_LDAP\\Command\\ShowRemnants' => $baseDir . '/../lib/Command/ShowRemnants.php', 'OCA\\User_LDAP\\Command\\TestConfig' => $baseDir . '/../lib/Command/TestConfig.php', + 'OCA\\User_LDAP\\Command\\TestUserSettings' => $baseDir . '/../lib/Command/TestUserSettings.php', 'OCA\\User_LDAP\\Command\\UpdateUUID' => $baseDir . '/../lib/Command/UpdateUUID.php', 'OCA\\User_LDAP\\Configuration' => $baseDir . '/../lib/Configuration.php', 'OCA\\User_LDAP\\Connection' => $baseDir . '/../lib/Connection.php', @@ -28,13 +31,15 @@ return array( 'OCA\\User_LDAP\\Controller\\ConfigAPIController' => $baseDir . '/../lib/Controller/ConfigAPIController.php', 'OCA\\User_LDAP\\Controller\\RenewPasswordController' => $baseDir . '/../lib/Controller/RenewPasswordController.php', 'OCA\\User_LDAP\\DataCollector\\LdapDataCollector' => $baseDir . '/../lib/DataCollector/LdapDataCollector.php', + 'OCA\\User_LDAP\\Db\\GroupMembership' => $baseDir . '/../lib/Db/GroupMembership.php', + 'OCA\\User_LDAP\\Db\\GroupMembershipMapper' => $baseDir . '/../lib/Db/GroupMembershipMapper.php', 'OCA\\User_LDAP\\Events\\GroupBackendRegistered' => $baseDir . '/../lib/Events/GroupBackendRegistered.php', 'OCA\\User_LDAP\\Events\\UserBackendRegistered' => $baseDir . '/../lib/Events/UserBackendRegistered.php', 'OCA\\User_LDAP\\Exceptions\\AttributeNotSet' => $baseDir . '/../lib/Exceptions/AttributeNotSet.php', + 'OCA\\User_LDAP\\Exceptions\\ConfigurationIssueException' => $baseDir . '/../lib/Exceptions/ConfigurationIssueException.php', 'OCA\\User_LDAP\\Exceptions\\ConstraintViolationException' => $baseDir . '/../lib/Exceptions/ConstraintViolationException.php', 'OCA\\User_LDAP\\Exceptions\\NoMoreResults' => $baseDir . '/../lib/Exceptions/NoMoreResults.php', 'OCA\\User_LDAP\\Exceptions\\NotOnLDAP' => $baseDir . '/../lib/Exceptions/NotOnLDAP.php', - 'OCA\\User_LDAP\\FilesystemHelper' => $baseDir . '/../lib/FilesystemHelper.php', 'OCA\\User_LDAP\\GroupPluginManager' => $baseDir . '/../lib/GroupPluginManager.php', 'OCA\\User_LDAP\\Group_LDAP' => $baseDir . '/../lib/Group_LDAP.php', 'OCA\\User_LDAP\\Group_Proxy' => $baseDir . '/../lib/Group_Proxy.php', @@ -52,6 +57,7 @@ return array( 'OCA\\User_LDAP\\LDAPProvider' => $baseDir . '/../lib/LDAPProvider.php', 'OCA\\User_LDAP\\LDAPProviderFactory' => $baseDir . '/../lib/LDAPProviderFactory.php', 'OCA\\User_LDAP\\LDAPUtility' => $baseDir . '/../lib/LDAPUtility.php', + 'OCA\\User_LDAP\\LoginListener' => $baseDir . '/../lib/LoginListener.php', 'OCA\\User_LDAP\\Mapping\\AbstractMapping' => $baseDir . '/../lib/Mapping/AbstractMapping.php', 'OCA\\User_LDAP\\Mapping\\GroupMapping' => $baseDir . '/../lib/Mapping/GroupMapping.php', 'OCA\\User_LDAP\\Mapping\\UserMapping' => $baseDir . '/../lib/Mapping/UserMapping.php', @@ -70,13 +76,17 @@ return array( 'OCA\\User_LDAP\\Migration\\Version1130Date20220110154718' => $baseDir . '/../lib/Migration/Version1130Date20220110154718.php', 'OCA\\User_LDAP\\Migration\\Version1130Date20220110154719' => $baseDir . '/../lib/Migration/Version1130Date20220110154719.php', 'OCA\\User_LDAP\\Migration\\Version1141Date20220323143801' => $baseDir . '/../lib/Migration/Version1141Date20220323143801.php', + 'OCA\\User_LDAP\\Migration\\Version1190Date20230706134108' => $baseDir . '/../lib/Migration/Version1190Date20230706134108.php', + 'OCA\\User_LDAP\\Migration\\Version1190Date20230706134109' => $baseDir . '/../lib/Migration/Version1190Date20230706134109.php', 'OCA\\User_LDAP\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php', - 'OCA\\User_LDAP\\PagedResults\\IAdapter' => $baseDir . '/../lib/PagedResults/IAdapter.php', - 'OCA\\User_LDAP\\PagedResults\\Php73' => $baseDir . '/../lib/PagedResults/Php73.php', 'OCA\\User_LDAP\\PagedResults\\TLinkId' => $baseDir . '/../lib/PagedResults/TLinkId.php', 'OCA\\User_LDAP\\Proxy' => $baseDir . '/../lib/Proxy.php', + 'OCA\\User_LDAP\\Service\\BirthdateParserService' => $baseDir . '/../lib/Service/BirthdateParserService.php', + 'OCA\\User_LDAP\\Service\\UpdateGroupsService' => $baseDir . '/../lib/Service/UpdateGroupsService.php', 'OCA\\User_LDAP\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php', 'OCA\\User_LDAP\\Settings\\Section' => $baseDir . '/../lib/Settings/Section.php', + 'OCA\\User_LDAP\\SetupChecks\\LdapConnection' => $baseDir . '/../lib/SetupChecks/LdapConnection.php', + 'OCA\\User_LDAP\\SetupChecks\\LdapInvalidUuids' => $baseDir . '/../lib/SetupChecks/LdapInvalidUuids.php', 'OCA\\User_LDAP\\UserPluginManager' => $baseDir . '/../lib/UserPluginManager.php', 'OCA\\User_LDAP\\User\\DeletedUsersIndex' => $baseDir . '/../lib/User/DeletedUsersIndex.php', 'OCA\\User_LDAP\\User\\Manager' => $baseDir . '/../lib/User/Manager.php', diff --git a/apps/user_ldap/composer/composer/autoload_static.php b/apps/user_ldap/composer/composer/autoload_static.php index 3ff92c350f5..be985838393 100644 --- a/apps/user_ldap/composer/composer/autoload_static.php +++ b/apps/user_ldap/composer/composer/autoload_static.php @@ -26,9 +26,11 @@ class ComposerStaticInitUser_LDAP 'OCA\\User_LDAP\\AccessFactory' => __DIR__ . '/..' . '/../lib/AccessFactory.php', 'OCA\\User_LDAP\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php', 'OCA\\User_LDAP\\BackendUtility' => __DIR__ . '/..' . '/../lib/BackendUtility.php', + 'OCA\\User_LDAP\\Command\\CheckGroup' => __DIR__ . '/..' . '/../lib/Command/CheckGroup.php', 'OCA\\User_LDAP\\Command\\CheckUser' => __DIR__ . '/..' . '/../lib/Command/CheckUser.php', 'OCA\\User_LDAP\\Command\\CreateEmptyConfig' => __DIR__ . '/..' . '/../lib/Command/CreateEmptyConfig.php', 'OCA\\User_LDAP\\Command\\DeleteConfig' => __DIR__ . '/..' . '/../lib/Command/DeleteConfig.php', + 'OCA\\User_LDAP\\Command\\PromoteGroup' => __DIR__ . '/..' . '/../lib/Command/PromoteGroup.php', 'OCA\\User_LDAP\\Command\\ResetGroup' => __DIR__ . '/..' . '/../lib/Command/ResetGroup.php', 'OCA\\User_LDAP\\Command\\ResetUser' => __DIR__ . '/..' . '/../lib/Command/ResetUser.php', 'OCA\\User_LDAP\\Command\\Search' => __DIR__ . '/..' . '/../lib/Command/Search.php', @@ -36,6 +38,7 @@ class ComposerStaticInitUser_LDAP 'OCA\\User_LDAP\\Command\\ShowConfig' => __DIR__ . '/..' . '/../lib/Command/ShowConfig.php', 'OCA\\User_LDAP\\Command\\ShowRemnants' => __DIR__ . '/..' . '/../lib/Command/ShowRemnants.php', 'OCA\\User_LDAP\\Command\\TestConfig' => __DIR__ . '/..' . '/../lib/Command/TestConfig.php', + 'OCA\\User_LDAP\\Command\\TestUserSettings' => __DIR__ . '/..' . '/../lib/Command/TestUserSettings.php', 'OCA\\User_LDAP\\Command\\UpdateUUID' => __DIR__ . '/..' . '/../lib/Command/UpdateUUID.php', 'OCA\\User_LDAP\\Configuration' => __DIR__ . '/..' . '/../lib/Configuration.php', 'OCA\\User_LDAP\\Connection' => __DIR__ . '/..' . '/../lib/Connection.php', @@ -43,13 +46,15 @@ class ComposerStaticInitUser_LDAP 'OCA\\User_LDAP\\Controller\\ConfigAPIController' => __DIR__ . '/..' . '/../lib/Controller/ConfigAPIController.php', 'OCA\\User_LDAP\\Controller\\RenewPasswordController' => __DIR__ . '/..' . '/../lib/Controller/RenewPasswordController.php', 'OCA\\User_LDAP\\DataCollector\\LdapDataCollector' => __DIR__ . '/..' . '/../lib/DataCollector/LdapDataCollector.php', + 'OCA\\User_LDAP\\Db\\GroupMembership' => __DIR__ . '/..' . '/../lib/Db/GroupMembership.php', + 'OCA\\User_LDAP\\Db\\GroupMembershipMapper' => __DIR__ . '/..' . '/../lib/Db/GroupMembershipMapper.php', 'OCA\\User_LDAP\\Events\\GroupBackendRegistered' => __DIR__ . '/..' . '/../lib/Events/GroupBackendRegistered.php', 'OCA\\User_LDAP\\Events\\UserBackendRegistered' => __DIR__ . '/..' . '/../lib/Events/UserBackendRegistered.php', 'OCA\\User_LDAP\\Exceptions\\AttributeNotSet' => __DIR__ . '/..' . '/../lib/Exceptions/AttributeNotSet.php', + 'OCA\\User_LDAP\\Exceptions\\ConfigurationIssueException' => __DIR__ . '/..' . '/../lib/Exceptions/ConfigurationIssueException.php', 'OCA\\User_LDAP\\Exceptions\\ConstraintViolationException' => __DIR__ . '/..' . '/../lib/Exceptions/ConstraintViolationException.php', 'OCA\\User_LDAP\\Exceptions\\NoMoreResults' => __DIR__ . '/..' . '/../lib/Exceptions/NoMoreResults.php', 'OCA\\User_LDAP\\Exceptions\\NotOnLDAP' => __DIR__ . '/..' . '/../lib/Exceptions/NotOnLDAP.php', - 'OCA\\User_LDAP\\FilesystemHelper' => __DIR__ . '/..' . '/../lib/FilesystemHelper.php', 'OCA\\User_LDAP\\GroupPluginManager' => __DIR__ . '/..' . '/../lib/GroupPluginManager.php', 'OCA\\User_LDAP\\Group_LDAP' => __DIR__ . '/..' . '/../lib/Group_LDAP.php', 'OCA\\User_LDAP\\Group_Proxy' => __DIR__ . '/..' . '/../lib/Group_Proxy.php', @@ -67,6 +72,7 @@ class ComposerStaticInitUser_LDAP 'OCA\\User_LDAP\\LDAPProvider' => __DIR__ . '/..' . '/../lib/LDAPProvider.php', 'OCA\\User_LDAP\\LDAPProviderFactory' => __DIR__ . '/..' . '/../lib/LDAPProviderFactory.php', 'OCA\\User_LDAP\\LDAPUtility' => __DIR__ . '/..' . '/../lib/LDAPUtility.php', + 'OCA\\User_LDAP\\LoginListener' => __DIR__ . '/..' . '/../lib/LoginListener.php', 'OCA\\User_LDAP\\Mapping\\AbstractMapping' => __DIR__ . '/..' . '/../lib/Mapping/AbstractMapping.php', 'OCA\\User_LDAP\\Mapping\\GroupMapping' => __DIR__ . '/..' . '/../lib/Mapping/GroupMapping.php', 'OCA\\User_LDAP\\Mapping\\UserMapping' => __DIR__ . '/..' . '/../lib/Mapping/UserMapping.php', @@ -85,13 +91,17 @@ class ComposerStaticInitUser_LDAP 'OCA\\User_LDAP\\Migration\\Version1130Date20220110154718' => __DIR__ . '/..' . '/../lib/Migration/Version1130Date20220110154718.php', 'OCA\\User_LDAP\\Migration\\Version1130Date20220110154719' => __DIR__ . '/..' . '/../lib/Migration/Version1130Date20220110154719.php', 'OCA\\User_LDAP\\Migration\\Version1141Date20220323143801' => __DIR__ . '/..' . '/../lib/Migration/Version1141Date20220323143801.php', + 'OCA\\User_LDAP\\Migration\\Version1190Date20230706134108' => __DIR__ . '/..' . '/../lib/Migration/Version1190Date20230706134108.php', + 'OCA\\User_LDAP\\Migration\\Version1190Date20230706134109' => __DIR__ . '/..' . '/../lib/Migration/Version1190Date20230706134109.php', 'OCA\\User_LDAP\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php', - 'OCA\\User_LDAP\\PagedResults\\IAdapter' => __DIR__ . '/..' . '/../lib/PagedResults/IAdapter.php', - 'OCA\\User_LDAP\\PagedResults\\Php73' => __DIR__ . '/..' . '/../lib/PagedResults/Php73.php', 'OCA\\User_LDAP\\PagedResults\\TLinkId' => __DIR__ . '/..' . '/../lib/PagedResults/TLinkId.php', 'OCA\\User_LDAP\\Proxy' => __DIR__ . '/..' . '/../lib/Proxy.php', + 'OCA\\User_LDAP\\Service\\BirthdateParserService' => __DIR__ . '/..' . '/../lib/Service/BirthdateParserService.php', + 'OCA\\User_LDAP\\Service\\UpdateGroupsService' => __DIR__ . '/..' . '/../lib/Service/UpdateGroupsService.php', 'OCA\\User_LDAP\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php', 'OCA\\User_LDAP\\Settings\\Section' => __DIR__ . '/..' . '/../lib/Settings/Section.php', + 'OCA\\User_LDAP\\SetupChecks\\LdapConnection' => __DIR__ . '/..' . '/../lib/SetupChecks/LdapConnection.php', + 'OCA\\User_LDAP\\SetupChecks\\LdapInvalidUuids' => __DIR__ . '/..' . '/../lib/SetupChecks/LdapInvalidUuids.php', 'OCA\\User_LDAP\\UserPluginManager' => __DIR__ . '/..' . '/../lib/UserPluginManager.php', 'OCA\\User_LDAP\\User\\DeletedUsersIndex' => __DIR__ . '/..' . '/../lib/User/DeletedUsersIndex.php', 'OCA\\User_LDAP\\User\\Manager' => __DIR__ . '/..' . '/../lib/User/Manager.php', diff --git a/apps/user_ldap/composer/composer/installed.php b/apps/user_ldap/composer/composer/installed.php index 5e942064485..34d21903bce 100644 --- a/apps/user_ldap/composer/composer/installed.php +++ b/apps/user_ldap/composer/composer/installed.php @@ -1,22 +1,22 @@ <?php return array( 'root' => array( + 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => '722b062d3fb372799000591b8d23d3b65a4e50db', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), - 'reference' => '9915dc6785d1660068a51604f9379e8b1dc1418c', - 'name' => '__root__', 'dev' => false, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => '722b062d3fb372799000591b8d23d3b65a4e50db', 'type' => 'library', 'install_path' => __DIR__ . '/../', 'aliases' => array(), - 'reference' => '9915dc6785d1660068a51604f9379e8b1dc1418c', 'dev_requirement' => false, ), ), diff --git a/apps/user_ldap/css/renewPassword.css b/apps/user_ldap/css/renewPassword.css index 17da3575e51..8acd97254fa 100644 --- a/apps/user_ldap/css/renewPassword.css +++ b/apps/user_ldap/css/renewPassword.css @@ -1,11 +1,15 @@ +/** + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ #personal-show + label { - left: 230px !important; + inset-inline-start: 230px !important; margin-top: 8px !important; box-sizing: border-box; } #renewpassword .strengthify-wrapper { - left: 10px; + inset-inline-start: 10px; margin-top: 65px; position: absolute; width: 219px; @@ -29,7 +33,6 @@ letter-spacing:normal; line-break:auto; line-height:1.6; - text-align:left; text-align:start; text-decoration:none; text-shadow:none; @@ -59,29 +62,29 @@ } .tooltip.right { - margin-left:3px; + margin-inline-start:3px; padding:0 10px } .tooltip.right .tooltip-arrow { top:50%; - left:0; + inset-inline-start:0; margin-top:-10px; border-width:10px 10px 10px 0; - border-right-color:#fff + border-inline-end-color:#fff } .tooltip.left { - margin-left:-3px; + margin-inline-start:-3px; padding:0 5px } .tooltip.left .tooltip-arrow { top:50%; - right:0; + inset-inline-end:0; margin-top:-10px; border-width:10px 0 10px 10px; - border-left-color:#fff + border-inline-start-color:#fff } .tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow { @@ -91,17 +94,17 @@ } .tooltip.top .tooltip-arrow { - left:50%; - margin-left:-10px + inset-inline-start:50%; + margin-inline-start:-10px } .tooltip.top-left .tooltip-arrow { - right:10px; + inset-inline-end:10px; margin-bottom:-10px } .tooltip.top-right .tooltip-arrow { - left:10px; + inset-inline-start:10px; margin-bottom:-10px } @@ -112,17 +115,17 @@ } .tooltip.bottom .tooltip-arrow { - left:50%; - margin-left:-10px + inset-inline-start:50%; + margin-inline-start:-10px } .tooltip.bottom-left .tooltip-arrow { - right:10px; + inset-inline-end:10px; margin-top:-10px } .tooltip.bottom-right .tooltip-arrow { - left:10px; + inset-inline-start:10px; margin-top:-10px } diff --git a/apps/user_ldap/css/settings.css b/apps/user_ldap/css/settings.css index e89dfd80c8a..a1048031fa2 100644 --- a/apps/user_ldap/css/settings.css +++ b/apps/user_ldap/css/settings.css @@ -1,3 +1,8 @@ +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2012-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ .table { display: table; width: 85%; @@ -12,7 +17,7 @@ display: flex; align-items: center; white-space: nowrap; - text-align: left; + text-align: start; } .tablerow input, .tablerow textarea { @@ -24,7 +29,7 @@ } #ldap .tablerow label { - margin-left: 3px; + margin-inline-start: 3px; } .ldapIconCopy { @@ -45,7 +50,7 @@ .ldapWizardControls { width: 60%; - text-align: right; + text-align: end; } .ldapWizardInfo { @@ -65,31 +70,30 @@ #ldapWizard1 .hostPortCombinatorSpan { width: 14.5%; display: inline-block; - text-align: right; + text-align: end; } #ldapWizard1 .host { width: 100%; - margin-left: 0; - margin-right: 0; + margin-inline: 0; } .tableCellInput { - margin-left: -40%; + margin-inline-start: -40%; width: 100%; } .tableCellLabel { - text-align: right; - padding-right: 25%; + text-align: end; + padding-inline-end: 25%; } .ldapIndent { - margin-left: 50px; + margin-inline-start: 50px; } .ldapwarning { - margin-left: 22px; + margin-inline-start: 22px; color: #FF3B3B; } @@ -111,9 +115,9 @@ max-width: 200px; display: inline-block; vertical-align: top; - text-align: right; + text-align: end; padding-top: 9px; - padding-right: 5px; + padding-inline-end: 5px; } #ldap fieldset input[type=submit] { @@ -154,7 +158,7 @@ input.ldapVerifyInput { .ldapInputColElement { width: 35%; display: inline-block; - padding-left: 10px; + padding-inline-start: 10px; } .ldapToggle { @@ -185,7 +189,7 @@ select[multiple=multiple] + button { } #ldap .ldap_saving { - margin-right: 15px; + margin-inline-end: 15px; color: orange; font-weight: bold; } @@ -198,10 +202,12 @@ select[multiple=multiple] + button { width: 16px; vertical-align: text-bottom; } + .ldap_config_state_indicator_sign.success { background: #37ce02; border-radius: 8px; } + .ldap_config_state_indicator_sign.error { background: #ce3702; } diff --git a/apps/user_ldap/css/vendor/ui-multiselect/jquery.multiselect.css b/apps/user_ldap/css/vendor/ui-multiselect/jquery.multiselect.css index 9b81c3bdcfb..533eb63762f 100644 --- a/apps/user_ldap/css/vendor/ui-multiselect/jquery.multiselect.css +++ b/apps/user_ldap/css/vendor/ui-multiselect/jquery.multiselect.css @@ -1,3 +1,7 @@ +/** + * SPDX-FileCopyrightText: 2012 Eric Hynds + * SPDX-License-Identifier: MIT + */ .ui-multiselect { padding:2px 0 2px 4px; text-align:left; } .ui-multiselect span.ui-icon { float:right; } .ui-multiselect-single .ui-multiselect-checkboxes input { position:absolute !important; top: auto !important; left:-9999px; } diff --git a/apps/user_ldap/img/app-dark.svg b/apps/user_ldap/img/app-dark.svg index 54939fab4f2..f20dbda808a 100644 --- a/apps/user_ldap/img/app-dark.svg +++ b/apps/user_ldap/img/app-dark.svg @@ -1,4 +1 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.0" viewBox="0 0 16 16"> - <path style="block-progression:tb;color:#000000;text-transform:none;text-indent:0" fill="#000" d="m8.4036 1c-1.7312 0-3.1998 1.2661-3.1998 2.9 0.012287 0.51643 0.058473 1.1532 0.36664 2.5v0.033333l0.033328 0.033333c0.098928 0.28338 0.24289 0.44549 0.4333 0.66666s0.41742 0.48149 0.63328 0.69999c0.025397 0.025708 0.041676 0.041633 0.066656 0.066677 0.04281 0.18631 0.094672 0.38681 0.13332 0.56666 0.10284 0.47851 0.092296 0.81737 0.066668 0.93332-0.74389 0.26121-1.6694 0.57228-2.4998 0.93332-0.46622 0.2027-0.8881 0.3837-1.2332 0.59999-0.34513 0.2163-0.68837 0.37971-0.79994 0.86666-0.16004 0.63293-0.19866 0.7539-0.39997 1.5333-0.027212 0.20914 0.083011 0.42961 0.26665 0.53333 1.5078 0.81451 3.824 1.1423 6.1329 1.1333s4.6066-0.35609 6.0662-1.1333c0.11739-0.07353 0.14304-0.10869 0.13332-0.2333-0.04365-0.68908-0.08154-1.3669-0.13332-1.7666-0.01807-0.09908-0.06492-0.19275-0.13332-0.26666-0.46366-0.5537-1.1564-0.89218-1.9665-1.2333-0.7396-0.31144-1.6067-0.63486-2.4665-0.99999-0.048123-0.10721-0.095926-0.41912 0-0.89999 0.025759-0.12912 0.066096-0.26742 0.099994-0.4 0.0808-0.090507 0.14378-0.16447 0.23332-0.26666 0.19096-0.21796 0.39614-0.44661 0.56662-0.66666s0.30996-0.40882 0.39997-0.66666l0.03333-0.033333c0.34839-1.4062 0.34857-1.9929 0.36664-2.5v-0.033333c0-1.6339-1.4686-2.9-3.1998-2.9z"/> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"><path d="M480-480q-60 0-102-42t-42-102q0-60 42-102t102-42q60 0 102 42t42 102q0 60-42 102t-102 42ZM192-192v-96q0-23 12.5-43.5T239-366q55-32 116.5-49T480-432q63 0 124.5 17T721-366q22 13 34.5 34t12.5 44v96H192Z"/></svg>
\ No newline at end of file diff --git a/apps/user_ldap/img/app.svg b/apps/user_ldap/img/app.svg index 430514d235c..4d6d856526c 100644 --- a/apps/user_ldap/img/app.svg +++ b/apps/user_ldap/img/app.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1" viewBox="0 0 16 16"><path color="#000" fill="none" d="M-62.897-32.993h163.31v97.986h-163.31z"/><path style="block-progression:tb;text-transform:none;text-indent:0" fill="#fff" d="M8.404 1c-1.732 0-3.2 1.266-3.2 2.9.012.516.058 1.153.366 2.5v.033l.034.034c.1.283.243.445.433.666s.417.482.633.7l.067.067c.043.186.095.387.133.567.103.478.093.817.067.933-.744.26-1.67.572-2.5.933-.466.203-.888.384-1.233.6-.345.217-.688.38-.8.867-.16.633-.2.754-.4 1.533-.027.21.083.43.267.534C3.78 14.68 6.096 15.01 8.405 15s4.606-.356 6.066-1.133c.117-.074.143-.11.133-.234-.043-.69-.08-1.367-.133-1.766a.537.537 0 0 0-.133-.267c-.464-.554-1.157-.892-1.967-1.233-.74-.312-1.607-.635-2.466-1-.05-.107-.096-.42 0-.9.025-.13.066-.268.1-.4.08-.09.143-.165.233-.267.19-.218.396-.447.566-.667s.31-.408.4-.666l.034-.034c.348-1.406.348-1.992.366-2.5V3.9c0-1.634-1.468-2.9-3.2-2.9z" color="#000"/></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" fill="#fff"><path d="M480-480q-60 0-102-42t-42-102q0-60 42-102t102-42q60 0 102 42t42 102q0 60-42 102t-102 42ZM192-192v-96q0-23 12.5-43.5T239-366q55-32 116.5-49T480-432q63 0 124.5 17T721-366q22 13 34.5 34t12.5 44v96H192Z"/></svg>
\ No newline at end of file diff --git a/apps/user_ldap/img/copy.png b/apps/user_ldap/img/copy.png Binary files differdeleted file mode 100644 index 1bfb6337f76..00000000000 --- a/apps/user_ldap/img/copy.png +++ /dev/null diff --git a/apps/user_ldap/img/copy.svg b/apps/user_ldap/img/copy.svg index ac68211f7c2..fc09a027e8b 100644 --- a/apps/user_ldap/img/copy.svg +++ b/apps/user_ldap/img/copy.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" version="1"><path d="M8.172 4.685A2.4 2.4 0 0 0 5.767 7.09v30.675a2.4 2.4 0 0 0 2.405 2.404h28.944a2.4 2.4 0 0 0 2.404-2.405V7.09a2.4 2.4 0 0 0-2.404-2.405H8.172z" stroke-linejoin="round" stroke="#fff" stroke-width="8.12547063" fill="none"/><path d="M8.172 4.685A2.4 2.4 0 0 0 5.767 7.09v30.675a2.4 2.4 0 0 0 2.405 2.404h28.944a2.4 2.4 0 0 0 2.404-2.405V7.09a2.4 2.4 0 0 0-2.404-2.405H8.172z" stroke-linejoin="round" fill-rule="evenodd" stroke="#000" stroke-width="3.1254052800000003" fill="#fff"/><path d="M22.884 19.83a2.4 2.4 0 0 0-2.404 2.406V52.91a2.4 2.4 0 0 0 2.404 2.405h28.944a2.4 2.4 0 0 0 2.406-2.404V22.237a2.4 2.4 0 0 0-2.406-2.406H22.884z" stroke-linejoin="round" stroke="#fff" stroke-width="8.12547063" fill="none"/><path d="M22.884 19.83a2.4 2.4 0 0 0-2.404 2.406V52.91a2.4 2.4 0 0 0 2.404 2.405h28.944a2.4 2.4 0 0 0 2.406-2.404V22.237a2.4 2.4 0 0 0-2.406-2.406H22.884z" stroke-linejoin="round" fill-rule="evenodd" stroke="#000" stroke-width="3.1254052800000003" fill="#fff"/><path d="M12.457 21.6c2.325 20.528 20.15 19.15 21.296 19.042v6.14l8.98-8.89-8.98-8.87v6.066c-1.348.16-13.94 1.422-21.296-13.49z" stroke-linejoin="round" stroke="#fff" stroke-linecap="round" stroke-width="8.125" fill="none"/><path d="M12.457 21.6c2.325 20.528 20.15 19.15 21.296 19.042v6.14l8.98-8.89-8.98-8.87v6.066c-1.348.16-13.94 1.422-21.296-13.49z" stroke-linejoin="round" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-width="3.125"/></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px"><path d="M360-240q-29.7 0-50.85-21.15Q288-282.3 288-312v-480q0-29.7 21.15-50.85Q330.3-864 360-864h384q29.7 0 50.85 21.15Q816-821.7 816-792v480q0 29.7-21.15 50.85Q773.7-240 744-240H360ZM216-96q-29.7 0-50.85-21.15Q144-138.3 144-168v-552h72v552h456v72H216Z"/></svg>
\ No newline at end of file diff --git a/apps/user_ldap/js/renewPassword.js b/apps/user_ldap/js/renewPassword.js index bd035cd70be..65615d90889 100644 --- a/apps/user_ldap/js/renewPassword.js +++ b/apps/user_ldap/js/renewPassword.js @@ -1,22 +1,6 @@ /** - * - * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de) - * - * @license AGPL-3.0-or-later - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/vendor/ui-multiselect/MIT-LICENSE b/apps/user_ldap/js/vendor/ui-multiselect/MIT-LICENSE deleted file mode 100644 index 2dc8e79e3ad..00000000000 --- a/apps/user_ldap/js/vendor/ui-multiselect/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 Eric Hynds - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js b/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js index 16ae4264177..4dc6ab5ffbe 100644 --- a/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js +++ b/apps/user_ldap/js/vendor/ui-multiselect/src/jquery.multiselect.js @@ -17,7 +17,9 @@ * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * -*/ + * SPDX-FileCopyrightText: 2012 Eric Hynds + * SPDX-License-Identifier: MIT + */ (function($, undefined){ var multiselectID = 0; @@ -571,7 +573,7 @@ $.widget("ech.multiselect", { } else { menu.css({ top: pos.top + button.outerHeight(), - left: pos.left + 'inset-inline-start': pos.left }); } diff --git a/apps/user_ldap/js/wizard/configModel.js b/apps/user_ldap/js/wizard/configModel.js index d99392660c8..85c87e2ef15 100644 --- a/apps/user_ldap/js/wizard/configModel.js +++ b/apps/user_ldap/js/wizard/configModel.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/controller.js b/apps/user_ldap/js/wizard/controller.js index 7c1f0d5d818..0bfa0fb7ffd 100644 --- a/apps/user_ldap/js/wizard/controller.js +++ b/apps/user_ldap/js/wizard/controller.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/view.js b/apps/user_ldap/js/wizard/view.js index 1a89eba3515..ba77d287141 100644 --- a/apps/user_ldap/js/wizard/view.js +++ b/apps/user_ldap/js/wizard/view.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -40,7 +40,7 @@ OCA = OCA || {}; }, /** - * applies click events to the forward and backword buttons + * applies click events to the forward and backward buttons */ initControls: function() { var view = this; @@ -86,7 +86,8 @@ OCA = OCA || {}; var agent = view.configModel.configuration.ldap_dn; var pwd = view.configModel.configuration.ldap_agent_password; - if((host && port && base) && ((!agent && !pwd) || (agent && pwd))) { + if(((host && port && base) || (host && base && host.indexOf('ldapi://') > -1 )) + && ((!agent && !pwd) || (agent && pwd))) { view.enableTabs(); } else { view.disableTabs(); @@ -107,7 +108,8 @@ OCA = OCA || {}; var userFilter = this.configModel.configuration.ldap_userlist_filter; var loginFilter = this.configModel.configuration.ldap_login_filter; - if(host && port && base && userFilter && loginFilter) { + if((host && port && base && userFilter && loginFilter) || + (host && base && host.indexOf('ldapi://') > -1 && userFilter && loginFilter)) { this.configModel.requestConfigurationTest(); } else { this._updateStatusIndicator(this.STATUS_INCOMPLETE); @@ -354,7 +356,6 @@ OCA = OCA || {}; this.$settings.tabs({}); $('#ldapSettings button:not(.icon-default-style):not(.ui-multiselect)').button(); $('#ldapSettings').tabs({ beforeActivate: this.onTabChange }); - $('#ldapSettings :input').tooltip({placement: "right", container: "body", trigger: "hover"}); this.initControls(); this.disableTabs(); diff --git a/apps/user_ldap/js/wizard/wizard.js b/apps/user_ldap/js/wizard/wizard.js index 39ab2e13ef8..b8a3d74b881 100644 --- a/apps/user_ldap/js/wizard/wizard.js +++ b/apps/user_ldap/js/wizard/wizard.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js b/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js index fd43b032ad5..4fae1ef5e99 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js +++ b/apps/user_ldap/js/wizard/wizardDetectorAvailableAttributes.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js b/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js index f81d342b692..3d3bba4f821 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js +++ b/apps/user_ldap/js/wizard/wizardDetectorBaseDN.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js b/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js index c6ef0a9cab1..740fc3a3f6b 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js +++ b/apps/user_ldap/js/wizard/wizardDetectorClearGroupMappings.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js b/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js index 0e4811b39ea..1032682d926 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js +++ b/apps/user_ldap/js/wizard/wizardDetectorClearUserMappings.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js b/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js index 5f177734681..007a9cc8079 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js +++ b/apps/user_ldap/js/wizard/wizardDetectorEmailAttribute.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js index e025d8d6242..3d43cd369d5 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFeatureAbstract.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js b/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js index f56550a919e..507f7490731 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterGroup.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js b/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js index 7012847193b..827886c840c 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterLogin.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js b/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js index 3cd2935bd87..11e990a36e0 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js +++ b/apps/user_ldap/js/wizard/wizardDetectorFilterUser.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGeneric.js b/apps/user_ldap/js/wizard/wizardDetectorGeneric.js index 2126828c197..ab1c0c96d99 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGeneric.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGeneric.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js b/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js index d2f3dd978c5..9e29cf093ea 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupCount.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js b/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js index 6d6048b7986..cbfb1f91a41 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupObjectClasses.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js b/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js index fbb3f02e10a..2e898f5317e 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupsForGroups.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js b/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js index fe67854c794..de8407a0edd 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js +++ b/apps/user_ldap/js/wizard/wizardDetectorGroupsForUsers.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorPort.js b/apps/user_ldap/js/wizard/wizardDetectorPort.js index 50b1a1b4746..10055cd1cdd 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorPort.js +++ b/apps/user_ldap/js/wizard/wizardDetectorPort.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorQueue.js b/apps/user_ldap/js/wizard/wizardDetectorQueue.js index b6fa644558e..c00064f5c45 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorQueue.js +++ b/apps/user_ldap/js/wizard/wizardDetectorQueue.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js index 8a1da617aa0..80d14f8466c 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorSimpleRequestAbstract.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js b/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js index e371dbf0f63..929ea0e84e8 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestAbstract.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js b/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js index 52848819bd8..de01726e1c1 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestBaseDN.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js b/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js index aed99539384..5049c101f09 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestConfiguration.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js b/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js index 260df5a0fe0..5e0319586b3 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js +++ b/apps/user_ldap/js/wizard/wizardDetectorTestLoginName.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserCount.js b/apps/user_ldap/js/wizard/wizardDetectorUserCount.js index bcff2cf3b10..144c64d24be 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserCount.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserCount.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js b/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js index ae734480c1c..64e5bb50371 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserDisplayNameAttribute.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js b/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js index a20bdd9ac9b..a0051532388 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserGroupAssociation.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js b/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js index 0fa324a0809..13e034e353e 100644 --- a/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js +++ b/apps/user_ldap/js/wizard/wizardDetectorUserObjectClasses.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardFilterOnType.js b/apps/user_ldap/js/wizard/wizardFilterOnType.js index f792b1a99a2..80232ffd91b 100644 --- a/apps/user_ldap/js/wizard/wizardFilterOnType.js +++ b/apps/user_ldap/js/wizard/wizardFilterOnType.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js b/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js index bd6511dc8b0..de207574539 100644 --- a/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js +++ b/apps/user_ldap/js/wizard/wizardFilterOnTypeFactory.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardObject.js b/apps/user_ldap/js/wizard/wizardObject.js index a90f1533a26..9ae574d4ffd 100644 --- a/apps/user_ldap/js/wizard/wizardObject.js +++ b/apps/user_ldap/js/wizard/wizardObject.js @@ -1,8 +1,6 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js b/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js index 8312ad909ec..f5cfd4a14fb 100644 --- a/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabAbstractFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabAdvanced.js b/apps/user_ldap/js/wizard/wizardTabAdvanced.js index be98072dcb3..8f0d0aa7973 100644 --- a/apps/user_ldap/js/wizard/wizardTabAdvanced.js +++ b/apps/user_ldap/js/wizard/wizardTabAdvanced.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; @@ -67,6 +66,10 @@ OCA = OCA || {}; $element: $('#ldap_attributes_for_user_search'), setMethod: 'setSearchAttributesUsers' }, + ldap_mark_remnants_as_disabled: { + $element: $('#ldap_mark_remnants_as_disabled'), + setMethod: 'setMarkRemnantsAsDisabled' + }, ldap_group_display_name: { $element: $('#ldap_group_display_name'), setMethod: 'setGroupDisplayName' @@ -125,6 +128,48 @@ OCA = OCA || {}; $element: $('#ldap_ext_storage_home_attribute'), setMethod: 'setExternalStorageHomeAttribute' }, + + //User Profile Attributes + ldap_attr_phone: { + $element: $('#ldap_attr_phone'), + setMethod: 'setPhoneAttribute' + }, + ldap_attr_website: { + $element: $('#ldap_attr_website'), + setMethod: 'setWebsiteAttribute' + }, + ldap_attr_address: { + $element: $('#ldap_attr_address'), + setMethod: 'setAddressAttribute' + }, + ldap_attr_twitter: { + $element: $('#ldap_attr_twitter'), + setMethod: 'setTwitterAttribute' + }, + ldap_attr_fediverse: { + $element: $('#ldap_attr_fediverse'), + setMethod: 'setFediverseAttribute' + }, + ldap_attr_organisation: { + $element: $('#ldap_attr_organisation'), + setMethod: 'setOrganisationAttribute' + }, + ldap_attr_role: { + $element: $('#ldap_attr_role'), + setMethod: 'setRoleAttribute' + }, + ldap_attr_headline: { + $element: $('#ldap_attr_headline'), + setMethod: 'setHeadlineAttribute' + }, + ldap_attr_biography: { + $element: $('#ldap_attr_biography'), + setMethod: 'setBiographyAttribute' + }, + ldap_attr_birthdate: { + $element: $('#ldap_attr_birthdate'), + setMethod: 'setBirthdateAttribute' + }, }; this.setManagedItems(items); }, @@ -238,6 +283,15 @@ OCA = OCA || {}; }, /** + * enables or disables marking remnants as disabled + * + * @param {string} markRemnantsAsDisabled contains an int + */ + setMarkRemnantsAsDisabled: function(markRemnantsAsDisabled) { + this.setElementValue(this.managedItems.ldap_mark_remnants_as_disabled.$element, markRemnantsAsDisabled); + }, + + /** * sets the display name attribute for groups * * @param {string} attribute @@ -367,6 +421,96 @@ OCA = OCA || {}; }, /** + * sets the attribute for the Nextcloud user profile phone Number + * + * @param {string} attribute + */ + setPhoneAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_phone.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile website + * + * @param {string} attribute + */ + setWebsiteAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_website.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile postal address + * + * @param {string} attribute + */ + setAddressAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_address.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile twitter + * + * @param {string} attribute + */ + setTwitterAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_twitter.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile fediverse + * + * @param {string} attribute + */ + setFediverseAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_fediverse.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile organisation + * + * @param {string} attribute + */ + setOrganisationAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_organisation.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile role + * + * @param {string} attribute + */ + setRoleAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_role.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile headline + * + * @param {string} attribute + */ + setHeadlineAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_headline.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile biography + * + * @param {string} attribute + */ + setBiographyAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_biography.$element, attribute); + }, + + /** + * sets the attribute for the Nextcloud user profile birthday + * + * @param {string} attribute + */ + setBirthdateAttribute: function(attribute) { + this.setElementValue(this.managedItems.ldap_attr_birthdate.$element, attribute); + }, + + /** * deals with the result of the Test Connection test * * @param {WizardTabAdvanced} view diff --git a/apps/user_ldap/js/wizard/wizardTabElementary.js b/apps/user_ldap/js/wizard/wizardTabElementary.js index 7dbb9998064..2a04d773058 100644 --- a/apps/user_ldap/js/wizard/wizardTabElementary.js +++ b/apps/user_ldap/js/wizard/wizardTabElementary.js @@ -1,8 +1,8 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabExpert.js b/apps/user_ldap/js/wizard/wizardTabExpert.js index 61a1b8c9aa3..4848ced40fe 100644 --- a/apps/user_ldap/js/wizard/wizardTabExpert.js +++ b/apps/user_ldap/js/wizard/wizardTabExpert.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabGeneric.js b/apps/user_ldap/js/wizard/wizardTabGeneric.js index 89ae257d368..3496dee5009 100644 --- a/apps/user_ldap/js/wizard/wizardTabGeneric.js +++ b/apps/user_ldap/js/wizard/wizardTabGeneric.js @@ -1,8 +1,7 @@ - /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabGroupFilter.js b/apps/user_ldap/js/wizard/wizardTabGroupFilter.js index 3fbff9de9a0..850387b4589 100644 --- a/apps/user_ldap/js/wizard/wizardTabGroupFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabGroupFilter.js @@ -1,7 +1,6 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js index 774c02dbf4a..d907957ac95 100644 --- a/apps/user_ldap/js/wizard/wizardTabLoginFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabLoginFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/js/wizard/wizardTabUserFilter.js b/apps/user_ldap/js/wizard/wizardTabUserFilter.js index b57aa54db69..00aa62f0cd7 100644 --- a/apps/user_ldap/js/wizard/wizardTabUserFilter.js +++ b/apps/user_ldap/js/wizard/wizardTabUserFilter.js @@ -1,7 +1,7 @@ /** - * Copyright (c) 2015, Arthur Schiwon <blizzz@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or later. - * See the COPYING-README file. + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2015-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-or-later */ OCA = OCA || {}; diff --git a/apps/user_ldap/l10n/ach.js b/apps/user_ldap/l10n/ach.js deleted file mode 100644 index 95c97db2f9c..00000000000 --- a/apps/user_ldap/l10n/ach.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/ach.json b/apps/user_ldap/l10n/ach.json deleted file mode 100644 index 8e0cd6f6783..00000000000 --- a/apps/user_ldap/l10n/ach.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ady.js b/apps/user_ldap/l10n/ady.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/ady.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ady.json b/apps/user_ldap/l10n/ady.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/ady.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ak.js b/apps/user_ldap/l10n/ak.js deleted file mode 100644 index a88c80b7933..00000000000 --- a/apps/user_ldap/l10n/ak.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=n > 1;"); diff --git a/apps/user_ldap/l10n/ak.json b/apps/user_ldap/l10n/ak.json deleted file mode 100644 index 58fcef711ee..00000000000 --- a/apps/user_ldap/l10n/ak.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=n > 1;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/am_ET.js b/apps/user_ldap/l10n/am_ET.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/am_ET.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/am_ET.json b/apps/user_ldap/l10n/am_ET.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/am_ET.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ar.js b/apps/user_ldap/l10n/ar.js index b940b69a1a7..14629f8a426 100644 --- a/apps/user_ldap/l10n/ar.js +++ b/apps/user_ldap/l10n/ar.js @@ -1,35 +1,238 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "فشل مسح الارتباطات (mappings)", - "Failed to delete the server configuration" : "تعذر حذف ملف إعدادات الخادم", - "The configuration is valid and the connection could be established!" : "الإعدادت صحيحة", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "الإعدادات صحيحة، لكن لم ينجح الارتباط. يرجى التأكد من إعدادات الخادم وبيانات التحقق من الدخول.", - "The configuration is invalid. Please have a look at the logs for further details." : "الإعدادات غير صحيحة. يرجى الاطلاع على سجلات المتابعة للمزيد من التفاصيل.", - "No action specified" : "لم يتم تحديد الإجراء", - "No configuration specified" : "لم يتم تحديد الإعدادات.", - "No data specified" : "لم يتم تحديد البيانات.", - " Could not set configuration %s" : "تعذر تنفيذ الإعداد %s", + "Failed to clear the mappings." : "فشل مسح الارتباطات mappings", + "Failed to delete the server configuration" : "تعذّر حذف ملف إعدادات الخادم", + "Invalid configuration: Anonymous binding is not allowed." : "تكوين غير صالح: الربط المجهول Anonymous binding غير مسموح به.", + "Valid configuration, connection established!" : "تكوين صالح، تمّ تأسيس الاتصال!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "تكوين صالح، لكن فشل الربط binding. يرجى التحقّق من إعدادات الخادم وأذونات الدخول credentials.", + "Invalid configuration: %s" : "تهيئة غير صحيحة: %s", + "No action specified" : "لم يتم تحديد أيّ إجراءٍ", + "No configuration specified" : "لم يتم تحديد أيّ إعداداتٍ", + "No data specified" : "لم يتم تحديد أيّ بياناتٍ", + "Invalid data specified" : "البيانات المحددة غير صالحة", + "Could not set configuration %1$s to %2$s" : "يتعذّر تعيين الإعداد %1$s لـ %2$s", + "Action does not exist" : "الإجراء غير موجود", + "Renewing …" : "التجديد جارٍ …", + "Very weak password" : "كلمة المرور ضعيفة جدا", + "Weak password" : "كلمة المرور ضعيفة", + "So-so password" : "كلمة المرور مقبولة نوعاً ما", + "Good password" : "كلمة المرور جيدة", + "Strong password" : "كلمة المرور قوية", + "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئٌ", + "Testing configuration…" : "إختبار التهيئة...", "Configuration incorrect" : "الإعدادات غير صحيحة", "Configuration incomplete" : "الإعدادات غير مكتملة", "Configuration OK" : "الإعدادات صحيحة", - "Select groups" : "إختر مجموعة", - "Select object classes" : "اختر أصناف المكونات", - "{nthServer}. Server" : "الخادم {nthServer}.", + "Select groups" : "إختر المجموعات", + "Select object classes" : "إختر أصناف الكائنات object classes", + "Please check the credentials, they seem to be wrong." : "يرجى التحقق من حيثيّات الدخول credentials، يبدو أنها خاطئة.", + "Please specify the port, it could not be auto-detected." : "يُرجى تحديد المنفذ port، حيث لا يمكن اكتشافه تلقائيا.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي Base DN تلقائيًا، يرجى مراجعة حيثيّات الدخول credentials، والمُضيف host، والمنفذ port.", + "Could not detect Base DN, please enter it manually." : "تعذّر اكتشاف الاسم المميز الأساسي Base DN، يُرجى إدخاله يدويًا.", + "{nthServer}. Server" : "{nthServer}. الخادم", + "No object found in the given Base DN. Please revise." : "لم يتم العثور على أي كائن object في الاسم المميز الأساسي Base DN المحدد. يُرجي المُراجعة.", + "More than 1,000 directory entries available." : "يُوجد أكثر من 1,000 مُدخل في الدليل directory entries.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخل متاح من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "حدث خطأ. يرجي التحقق من الاسم المميز الأساسي Base DN، وكذلك إعدادات الاتصال، و حيثيّات الدخول credentials.", "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادم الحالي؟", "Confirm Deletion" : "تأكيد الحذف", + "Mappings cleared successfully!" : "تم مسح الارتباطات mappings بنجاح!", + "Error while clearing the mappings." : "خطأ أثناء مسح الارتباطات mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول Anonymous bind غير مسموح به. يرجى إدخال الاسم المميز للمستخدم User DN، وكلمة المرور.", + "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات LDAP. قد لا يكون مسموحاُ بالربط المجهول Anonymous bind.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "فشل الحفظ. يرجى التأكد من أن قاعدة البيانات قيد التشغيل. أعد التحميل قبل المتابعة.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "تفعيل الوضع سوف ينتج عنه تمكين استعلامات بروتوكولLDAP التلقائية. وقد يستغرق الأمر بعض الوقت بناء على حجم LDAP خاصتك. هل ما زلت تريد تفعيل الوضع؟", + "Mode switch" : "تبديل النمط", "Select attributes" : "اختر الخصائص", - "_%s group found_::_%s groups found_" : ["لا توجد مجموعات: %s","تم إيجاد %s مجموعة واحدة","تم إيجاد %s مجموعتين","تم إيجاد %s مجموعات","تم إيجاد %s مجموعة","تم إيجاد %s مجموعة/مجموعات"], - "Server" : "خادم", - "Users" : "المستخدمين", - "Groups" : "مجموعات", - "Help" : "المساعدة", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "لم يتم العثور على المستخدم. يرجى التحقق من تحديدات تسجيل الدخول واسم المستخدم الخاصين بك. عامل التصفية الفعال (للنسخ واللصق للتحقق من صحة سطر الأوامر):<br/>", + "User found and settings verified." : "تم العثور على المستخدم وتم التحقق من الإعدادات.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ضع في اعتبارك تضييق نطاق البحث، لأنه يشمل مستخدمين كُثْرٌ، ولن يتمكن سوى أول واحد منهم من تسجيل الدخول.", + "An unspecified error occurred. Please check log and settings." : "حدث خطأ غير محدد. يرجى التحقق من السجل والإعدادات.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "عامل تصفية البحث غير صالح؛ ربما بسبب مشكلات في بناء الجملة مثل عدم تساوي عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "حدث خطأ في الاتصال بـ LDAP/AD. يرجى التحقق من المضيف host، والمنفذ port، وبيانات تسجيل الدخول.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "العنصر النائب placeholder ـ \"%u مُعرّف\". سيتم استبداله باسم دخول عند الاستعلام من LDAP/AD.", + "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول لاختباره", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "تم تعطيل مربع المجموعة؛ لأن خادم LDAP/AD لا يدعم خاصّيّة \"عضوٌ في\" memberOf.", + "Password change rejected. Hint: %s" : "تمّ رفض تغيير كلمة المرور. إرشاد: %s", + "Mandatory field \"%s\" left empty" : "الحقل الإلزامي \"%s\" تُرِك فارغاً", + "A password is given, but not an LDAP agent" : "تمّ إعطاء كلمة المرور لكن لم يتم إعطاء وكيل LDAP", + "No password is given for the user agent" : "لم يتم إعطاء كلمة المرور لوكيل المُستخدِم", + "No LDAP base DN was given" : "لم يتم إعطاء اسم الدليل الأساسي base DN لقائمة المستخدِمين LADP", + "User base DN is not a subnode of global base DN" : "الدليل الأساسي للمستخدِم User base DN ليس متفرعاً عن الدليل الأساسي العمومي Global base DN", + "Group base DN is not a subnode of global base DN" : "الدليل الأساسي للمجموعة Group base DN ليس متفرعاً عن الدليل الأساسي العمومي Global base DN", + "Please login with the new password" : "الرجاء تسجيل الدخول باستخدام كلمة المرور الجديدة", + "LDAP User backend" : "خلفية المستخدمين User backend من LDAP ", + "Your password will expire tomorrow." : "كلمة مرورك تنتهي صلاحيتها غداً.", + "Your password will expire today." : "كلمة مرورك تنتهي صلاحيتها اليوم.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %n أيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nيوم.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام."], + "LDAP/AD integration" : "التكامل مع LDAP/AD ", + "LDAP Connection" : "الاتصال بدليل المستخدِمين LDAP ", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %s مع تكوين دليل المستخدمين LDAP هذا.","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["توجد %n تكوينات دليل مستخدمين LDAP غير نشطة:%s","بوجد تكوين. لدليل مستخدمين LDAP غير نشط: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في توصيلة دليل المستخدمين المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ%n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ%n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)"], + "Invalid LDAP UUIDs" : "مُعرِّفات UUID الخاصة بـ LDAP غير صحيحة", + "None found" : "لم يُمكن العثور على أي شيء", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "تم العثور على مُعرِّفات UUID غير صالحة لحسابات أو مجموعات LDAP. الرجاء مراجعة الإعداد \"تجاوز اكتشاف UUID ـ Override UUID detection\" في الجزء الخبير من تكوين LDAP ثم اعطِ الأمر السطري: \"occ ldap:update-uuid\" لتحديثها", + "_%n group found_::_%n groups found_" : ["تم العثور على %n مجموعات","تم العثور على %n مجموعة","تم العثور على %n مجموعات","تم العثور على %n مجموعات","تم العثور على %n مجموعات","تم العثور على %n مجموعات"], + "> 1000 groups found" : "> 1000 مجموعة موجودة", + "> 1000 users found" : "> 1000 مستخدِم موجود", + "_%n user found_::_%n users found_" : ["تم العثور على %n مستخدمين","تم العثور على %n مستخدم","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "تعذر اكتشاف خاصّية اسم العرض للمستخدم user display name attribute. يرجى تحديدها بنفسك في الإعدادات المتقدمة لخادم LDAP.", + "Could not find the desired feature" : "تعذر العثور على الميزة المطلوبة", + "Invalid Host" : "مُضيف غير صالح", + "LDAP user and group backend" : "خلفية المستخدمين و المجموعات من LDAP", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "يتيح هذا التطبيق لمسؤولي النظام توصيل نكست كلاود بدليل المستخدمين المستند إلى LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "يتيح هذا التطبيق لمسؤولي النظام توصيل نكست كلاود بدليل المستخدمين المستنِد إلى LDAP للمصادقة و توفير المستخدمين users، والمجموعات groups، و سمات المستخدمين user attributes. \nيمكن للمشرفين تكوين هذا التطبيق للاتصال بدليل LDAP واحد أو أكثر عبر واجهة LDAP. \nيمكن سحب سماتٍ مثل حصة المستخدم التخزينية، و البريد الإلكتروني، و التجسيدات الرمزية avatar، وعضوية المجموعات و غيرها إلى نكست كلاود باستخدام الاستعلامات والمرشحات المناسبة. \nيقوم المستخدم بتسجيل الدخول إلى نكست كلاود باستخدام حيثيات دخوله من LDAP أو AD، ويتم منحه حق الوصول بناءً على طلب المصادقة الذي تتم معالجته بواسطة خادم LDAP أو AD. \nلا يقوم نكست كلاود بتخزين كلمات مرور LDAP أو AD، بل يستخدم حيثيّات المستخدم هذه للمصادقة ثم يستخدم مُعرّف الجلسة session كمُعرّف للمستخدم. \n\nيتوفر المزيد من المعلومات في وثائق مستخدم LDAP و Group Backend.", + "Test Configuration" : "اختبر التكوين", + "Help" : "مساعدة", + "Groups meeting these criteria are available in %s:" : "المجموعات التي تلبي هذه المعايير متوفرة في %s:", + "Only these object classes:" : "فئات هذه الكائنات فقط:", + "Only from these groups:" : "فقط من هذه المجموعات:", + "Search groups" : "مجموعات البحث", + "Available groups" : "المجموعات المتاحة", + "Selected groups" : "المجموعات المحددة", + "Edit LDAP Query" : "تحرير استعلام من خادم LDAP", + "LDAP Filter:" : "تصفية LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "يحدد عامل التصفية أي مجموعات من LDAP سوف يكون لها حق الوصول إلى التطبيق %s.", + "Verify settings and count the groups" : "تحقق من الإعدادات و احصر عدد المجموعات", + "When logging in, %s will find the user based on the following attributes:" : "عند تسجيل الدخول، %sسوف تجد المستخدم بناءً على الخصائص التالية:", + "LDAP/AD Username:" : "اسم مستخدم LDAP/AD ـ : ", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "يسمح بتسجيل الدخول مقابل اسم مستخدم LDAP / AD ، والذي يكون إما \"uid\" أو \"sAMAccountName\" وسيتم اكتشافه.", + "LDAP/AD Email Address:" : "عنوان البريد الالكتروني LDAP/AD ـ :", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "يُسمح بتسجيل الدخول مقابل خاصّية البريد الإلكتروني. \"mail\" و \"mailPrimaryAddress\" مسموح بهما.", + "Other Attributes:" : "خصائص أخري:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "حدد عامل التصفية الذي سيتم تطبيقه، عند محاولة تسجيل الدخول. يحل \"%%uid\" محل اسم المستخدم في إجراء تسجيل الدخول. مثال: \"uid=%%uid\"", + "Test Loginname" : "اختبار اسم تسجيل الدخول", + "Attempts to receive a DN for the given loginname and the current login filter" : "محاولة تلقّي الاسم المميز DN لاسم تسجيل الدخول المحدد و عامل تصفية تسجيل الدخول الحالي", + "Verify settings" : "التحقُّق من الإعدادات", + "%s. Server:" : "%s. خادم:", + "Add a new configuration" : "إضافة تكوين جديد", + "Copy current configuration into new directory binding" : "نسخ التهيئة الحالية إلى دليل جديد مرتبط", + "Delete the current configuration" : "حذف التهيئة الحالية", "Host" : "المضيف", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "يمكنك التغاضي عن البروتوكول، ما لم يكن SSL مطلوب. إذا كان الأمر كذلك، فابدأ بـ ldaps", "Port" : "المنفذ", + "Detect Port" : "إكتشِف المنفذ", + "User DN" : "الاسم المميز للمستخدم DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم DN الذي يجب الربط معه. على سبيل المثال، uid=agent,dc=example,dc=com. للوصول مجهول الهوية anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.", "Password" : "كلمة المرور", + "For anonymous access, leave DN and Password empty." : "للوصول المجهول anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.", + "Save Credentials" : "حفظ بيانات تسجيل الدخول", + "One Base DN per line" : "اسم مميز واحد أساسي Base DN لكل سطر", + "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد الاسم المميز الأساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة", + "Detect Base DN" : "اكتشاف الاسم المميز الأساسي Base DN", + "Test Base DN" : "إختبر الاسم المميز الأساسي Base DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "يُلغي طلبات LDAP التلقائية. يُفضّل استعماله في حالة الخوادم التي تخدم أعداداً كبيرة، ولكنه يتطلب بعض المعرفة فيما يخص بروتوكول LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "الإدخال اليدوي لفلاتر بروتوكول LDAP (يُنصح به في حالة الأدلة الكبيرة)", + "Listing and searching for users is constrained by these criteria:" : "العرض والبحث عن المستخدمين مُقيّدٌ بهذه الشروط:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "أكثر فئات الكائنات شيوعًا بالنسبة للمستخدمين هي: الشخص التنظيمي \"organizationalPerson\" والشخص \"person\" والمستخدم \"user\"وinetOrgPerson. إذا لم تكن متأكدًا من فئة الكائن التي تريد تحديدها، فيرجى استشارة مسئول الدليل الخاص بك.", + "The filter specifies which LDAP users shall have access to the %s instance." : "يُحدِّد عامل التصفية أيّ مستخدمي LDAP يمكنه الوصول إلى الخادم %s.", + "Verify settings and count users" : "التّحقق من الإعدادات وعدد المستخدمين", + "Saving" : "الحفظ جارٍ...", "Back" : "رجوع", - "Continue" : "المتابعة", - "Advanced" : "تعديلات متقدمه", - "Email Field" : "خانة البريد الإلكتروني" + "Continue" : "متابعة", + "Please renew your password." : "الرجاء تجديد كلمة مرورك.", + "An internal error occurred." : "حدث خطأ داخلي.", + "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مسؤول النظام.", + "Current password" : "كلمة المرور الحالية", + "New password" : "كلمة المرور الجديدة", + "Renew password" : "تجديد كلمة المرور", + "Wrong password." : "كلمة مرور خاطئة.", + "Cancel" : "إلغاء", + "Server" : "خادم", + "Users" : "المستخدمين", + "Login Attributes" : "خصائص تسجيل الدخول", + "Groups" : "مجموعات", + "Expert" : "خبير", + "Advanced" : "متقدمة", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> وِحدة PHP LDAP غير مُنصبّة؛ لذا فإن الخلفية لن تعمل. يرجى طلب تنصيبها من مسؤول النظام.", + "Connection Settings" : "إعدادات الربط", + "Configuration Active" : "الإعداد نشط", + "When unchecked, this configuration will be skipped." : "عندما لا يتم تحديده، سوف يتم تخطي هذه التهيئة.", + "Backup (Replica) Host" : "مضيف النسخ الاحتياطي (طِبقَ الأصل)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادم LDAP/AC.", + "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (طِبقَ الأصل)", + "Disable Main Server" : "تعطيل الخادم الرئيسي", + "Only connect to the replica server." : "متصل فقط بالخادم الاحتياطي.", + "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة SSL لخادم LDAP في الخادم %s.", + "Cache Time-To-Live" : "مدة صلاحية ذاكرة التخزين المؤقت cache", + "in seconds. A change empties the cache." : "خلال ثوان. يؤدي التغيير إلى إفراغ ذاكرة التخزين المؤقت cache.", + "Directory Settings" : "إعدادات الدليل", + "User Display Name Field" : "حقل عرض اسم المستخدم", + "The LDAP attribute to use to generate the user's display name." : "تستخدم سمة بروتوكول LDAP لتوليد اسم عرض المستخدم.", + "2nd User Display Name Field" : "الحقل 2 لعرض اسم المستخدم ", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. سمة LDAP سوف تُضاف إلى اسم العرض بين قوسين. و النتيجة ستكون كما في المثال: »John Doe (john.doe@example.org)«.", + "Base User Tree" : "شجرة المستخدم الأساسي Base User Tree", + "One User Base DN per line" : "اسم مميز أساسي User Base DN لمستخدم واحد لكل سطر", + "User Search Attributes" : "خصائص بحث المستخدم", + "Optional; one attribute per line" : "اختياري؛ سمة واحدة لكل سطر", + "Disable users missing from LDAP" : "إيقاف المستخدمين غير الموجودين على LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "عند التشغيل، سيتم تعطيل المستخدمين الذين تمّ استيرادهم من LDAP لكن تعذّر إيحادهم عندها", + "Group Display Name Field" : "حقل عرض اسم المجموعة", + "The LDAP attribute to use to generate the groups's display name." : "تستخدم خاصية بروتوكول LDAP لإنشاء اسماء عرض للمجموعات.", + "Base Group Tree" : "شجرة المجموعة الأساسية Base Group Tree", + "One Group Base DN per line" : "اسم مميز أساسي Group Base DN واحد للمجموعة لكل سطر", + "Group Search Attributes" : "خصائص بحث المجموعات", + "Group-Member association" : "ارتباط أعضاء المجموعة Group-Member association", + "Dynamic Group Member URL" : "محدد موقع URL الديناميكي لعضو المجموعة ", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "تحتوي خاصية بروتوكولLDAP الموجودة في كائنات المجموعة على عنوان بحث LDAP و الذي يحدد الكائنات التي تنتمي إلى المجموعة. (الإعداد الفارغ يتسبب في تعطيل وظيفة عضوية المجموعة الديناميكية.)", + "Nested Groups" : "المجموعات المتداخلة", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "عند التشغيل، يتم دعم المجموعات التي تحتوي على مجموعات. (تعمل فقط إذا كان تحديد عضو المجموعة يحتوي على اسم مميز DN).", + "Paging chunksize" : "حجم رزم الصفحات Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "يتم استخدام حجم الرِّزمَة لعمليات البحث المقسمة إلى صفحات في LDAP؛ والتي قد تعطي نتائج ضخمة تبعاً لعدد المستخدمين و المجموعات. (الضبط علي 0 يؤدي إلى تعطيل هذا الأسلوب من البحث في تلك الحالات.)", + "Enable LDAP password changes per user" : "تمكين تغيير كلمة المرور لكل مستخدم علي خادم LDAP ", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "يتيح خادم بروتوكول LDAP للمستخدمين تغيير كلمة المرور الخاصة بهم والسماح لمسؤولي النظام المتميزين ومسؤولي المجموعات بتغيير كلمة مرور مستخدمي الخادم. وتعمل هذه الخاصية عندما يتم تهيئة وضبط سياسات التحكم في الوصول على خادم LDAP وفقًا لذلك. وحيث أن كلمات المرور يتم إرسالها فى صورة نصٍّ عادي إلى خادم LDAP، فيجب استخدام تشفير النقل وضبط تجزئة كلمة المرور على خادم LDAP.", + "(New password is sent as plain text to LDAP)" : "(يتم إرسال كلمة المرور الجديدة كنص عادي إلى خادم LDAP )", + "Default password policy DN" : "سياسة الاسم المميز لكلمة المرورالافتراضية", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "سياسة الاسم المميز DN لكلمة المرورالافتراضية التي سيتم استخدامها لمعالجة انتهاء صلاحية كلمة المرور تعمل فقط عندما يتم تمكين تغيير كلمة مرور خادم LDAP لكل مستخدم ويكون مدعومًا فقط بواسطة OpenLDAP. H. أترُكه فارغًا لتعطيل معالجة انتهاء صلاحية كلمة المرور.", + "Special Attributes" : "خصائص خاصة", + "Quota Field" : "حقل الحِّصّة التخزينية", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "اتركه فارغًا للحصة التخزينية الافتراضية للمستخدم. خلاف ذلك، حدد خاصّية خادم LDAP/AD.", + "Quota Default" : "الحصة الافتراضية", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "تخطِّي الحصة الافتراضية لمستخدمي خادم LDAP الذين ليس لديهم حصة محددة في حقل الحصة.", + "Email Field" : "خانة البريد الإلكتروني", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "قُم بتعيين البريد الإلكتروني للمستخدمين من خاصّية خادم LDAP الخاصة بهم. اتركه فارغًا للتصرُّف الافتراضي.", + "User Home Folder Naming Rule" : "قاعدة تسمية المجلد الرئيسي للمستخدم", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "أترُكه فارغًا لاسم المستخدم (افتراضي). خلاف ذلك، حدِّد خاصّية LDAP/AD.", + "\"$home\" Placeholder Field" : "حقل العنصر النائب \"$home\"", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "سيتم استبدال $home في تكوين وحدة التخزين الخارجية بقيمة الخاصّية المحددة", + "User Profile Attributes" : "خصائص الملف الشخصي للمستخدِم", + "Phone Field" : "خانة الهاتف", + "User profile Phone will be set from the specified attribute" : "خانة الهاتف في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Website Field" : "خانة موقع الويب", + "User profile Website will be set from the specified attribute" : "خانة موقع الويب في الملف الشخصي للمستخدم سيتم تعيينها من الخاصّية المحددة", + "Address Field" : "خانة العنوان", + "User profile Address will be set from the specified attribute" : "خانة العنوان في الملف الشخصي للمستخدم سيتم تعيينها من الخاصّية المُحدّدة", + "Twitter Field" : "خانة حساب تويتر", + "User profile Twitter will be set from the specified attribute" : "خانة حساب تويتر في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Fediverse Field" : "خانة حساب Fediverse", + "User profile Fediverse will be set from the specified attribute" : "خانة حساب Fediverse في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Organisation Field" : "خانة المؤسسة organization", + "User profile Organisation will be set from the specified attribute" : "خانة المنظمة organization في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Role Field" : "خانة الوظيفة role", + "User profile Role will be set from the specified attribute" : "خانة الوظيفة role في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Headline Field" : "حقل العنوان", + "User profile Headline will be set from the specified attribute" : "خانة العنوان في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Biography Field" : "خانة السيرة الذاتية biography", + "User profile Biography will be set from the specified attribute" : "خانة السيرة الذاتية biography في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Birthdate Field" : "حقل تاريخ الميلاد", + "User profile Date of birth will be set from the specified attribute" : "تاريخ الميلاد في ملف المستخدم سيتم ملؤه من الخانة المحددة", + "Pronouns Field" : "حقل الضمائر", + "User profile Pronouns will be set from the specified attribute" : "سيتم تعيين ضمائر ملف تعريف المستخدم من السمة المحددة", + "Internal Username" : "اسم المستخدم الداخلي", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "بشكل افتراضي، سيتم إنشاء اسم المستخدم الداخلي internal username من خاصّية المُغرّف المُميّز الشامل UUID. هذا يضمن أن اسم المستخدم فريدٌ ولا يلزمه أي تحويل في الأحرف. اسم المستخدم الداخلي مُقيّدٌ باستخدام هذه الأحرف فقط: [a-zA-Z0-9 _. @ -]. غير هذه الأحرف يقع استبدالها بما يقابلها من أحرف الآسكي ASCII أو - ببساطة - يقع حذفها. في حالة وقوع تضاربٍِ، سيتم إلحاق عدد بالاسم. \n\nيُستخدم هذا الاسم الداخلي لتعريف المستخدم داخليًا. وهو أيضًا الاسم الافتراضي للمجلد الرئيسي للمستخدم. و هو أيضًا جزء من عناوين remote URL القَصِيّة كما في خدمات DAV على سبيل المثال. باستخدام هذا الإعداد ، يمكن تجاوز السلوك الافتراضي. سيكون للتغييرات تأثير فقط على مستخدمي LDAP المُعيّنين حديثًا (المُضافين). أترُكه فارغًا للسلوك الافتراضي.", + "Internal Username Attribute:" : "خاصّية اسم المستخدم الداخلي:", + "Override UUID detection" : "تجاوُز اكتشاف المعرف الفريد الشامل UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "بشكل افتراضي، يتم اكتشاف خاصية المعرف الفريد الشامل UUID تلقائيًا. ويتم استخدام هذه الخاصّية لتحديد مستخدمي ومجموعات LDAP علي نحو موثوق. أيضًا، سيتم إنشاء اسم المستخدم الداخلي بناءً على المعرف الفريد الشامل UUID إذا لم يتم تحديده أعلاه. يمكنك تجاوز الإعداد وتجاوز الخاصية حسب اختيارك. يجب عليك التأكد من إمكانية الوصول إلي الخاصية التي قمت باختيارها من قبل كل من المستخدمين والمجموعات وأنها فريدة. أترُكه فارغًا للوضع الافتراضي. تصبح التغييرات نافذة فقط على مستخدمي ومجموعات بروتوكول LDAP المُعيّنين حديثًا (المُضافين).", + "UUID Attribute for Users:" : "خاصية المعرف الفريد الشامل للمستخدمين UUID:", + "UUID Attribute for Groups:" : "خاصية المعرف الفريد الشامل للمجموعات UUID:", + "Username-LDAP User Mapping" : "الربط بين اسم المستخدم في LDAP و المستخدم", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "تُستخدم أسماء المستخدمين لتخزين وتخصيص البيانات التعريف الوصفية. من أجل تحديد المستخدمين والتعرف عليهم بدقة، سيكون لكل مستخدم على خادم LDAP اسم مستخدم داخلي. يتطلب هذا ربطاً mapping بين اسم المستخدم و مستخدم خادم LDAP. يتم تعيين اسم المستخدم الذي تم إنشاؤه إلى المعرف الفريد الشامل \"UUID\" لمستخدم LDAP. بالإضافة إلى ذلك، يتم تخزين الاسم المميز DN مؤقتًا أيضًا لتقليل تفاعل LDAP، ولكنه لا يستخدم لتحديد الهوية. وعند تغير الاسم المميز يتم العثور على التغييرات. ويتم استخدام اسم المستخدم الداخلي في كل مكان. إلغاء الربط سيكون له آثار متبقية في كل مكان. إلغاء الربط يؤثر على جميع تكوينات LDAP! لا تقم مطلقًا بإلغاء الربط في بيئة الإنتاج. فقط في مرحلة الاختبار أو المرحلة التجريبية.", + "Clear Username-LDAP User Mapping" : "إلغاء الربط بين اسم المستخدم في LDAP و المستخدم", + "Clear Groupname-LDAP Group Mapping" : "إلغاء الربط بين اسم المجموعة في LDAP و المجموعة", + "Invalid configuration. Please have a look at the logs for further details." : "تكوين غير صحيح. يرجى الرجوع إلى سجلات الأنشطة لمزيد من التفاصيل." }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/user_ldap/l10n/ar.json b/apps/user_ldap/l10n/ar.json index 20ba16d1481..9a3518c00fc 100644 --- a/apps/user_ldap/l10n/ar.json +++ b/apps/user_ldap/l10n/ar.json @@ -1,33 +1,236 @@ { "translations": { - "Failed to clear the mappings." : "فشل مسح الارتباطات (mappings)", - "Failed to delete the server configuration" : "تعذر حذف ملف إعدادات الخادم", - "The configuration is valid and the connection could be established!" : "الإعدادت صحيحة", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "الإعدادات صحيحة، لكن لم ينجح الارتباط. يرجى التأكد من إعدادات الخادم وبيانات التحقق من الدخول.", - "The configuration is invalid. Please have a look at the logs for further details." : "الإعدادات غير صحيحة. يرجى الاطلاع على سجلات المتابعة للمزيد من التفاصيل.", - "No action specified" : "لم يتم تحديد الإجراء", - "No configuration specified" : "لم يتم تحديد الإعدادات.", - "No data specified" : "لم يتم تحديد البيانات.", - " Could not set configuration %s" : "تعذر تنفيذ الإعداد %s", + "Failed to clear the mappings." : "فشل مسح الارتباطات mappings", + "Failed to delete the server configuration" : "تعذّر حذف ملف إعدادات الخادم", + "Invalid configuration: Anonymous binding is not allowed." : "تكوين غير صالح: الربط المجهول Anonymous binding غير مسموح به.", + "Valid configuration, connection established!" : "تكوين صالح، تمّ تأسيس الاتصال!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "تكوين صالح، لكن فشل الربط binding. يرجى التحقّق من إعدادات الخادم وأذونات الدخول credentials.", + "Invalid configuration: %s" : "تهيئة غير صحيحة: %s", + "No action specified" : "لم يتم تحديد أيّ إجراءٍ", + "No configuration specified" : "لم يتم تحديد أيّ إعداداتٍ", + "No data specified" : "لم يتم تحديد أيّ بياناتٍ", + "Invalid data specified" : "البيانات المحددة غير صالحة", + "Could not set configuration %1$s to %2$s" : "يتعذّر تعيين الإعداد %1$s لـ %2$s", + "Action does not exist" : "الإجراء غير موجود", + "Renewing …" : "التجديد جارٍ …", + "Very weak password" : "كلمة المرور ضعيفة جدا", + "Weak password" : "كلمة المرور ضعيفة", + "So-so password" : "كلمة المرور مقبولة نوعاً ما", + "Good password" : "كلمة المرور جيدة", + "Strong password" : "كلمة المرور قوية", + "The Base DN appears to be wrong" : "يبدو أن الاسم المميز الأساسي Base DN خاطئٌ", + "Testing configuration…" : "إختبار التهيئة...", "Configuration incorrect" : "الإعدادات غير صحيحة", "Configuration incomplete" : "الإعدادات غير مكتملة", "Configuration OK" : "الإعدادات صحيحة", - "Select groups" : "إختر مجموعة", - "Select object classes" : "اختر أصناف المكونات", - "{nthServer}. Server" : "الخادم {nthServer}.", + "Select groups" : "إختر المجموعات", + "Select object classes" : "إختر أصناف الكائنات object classes", + "Please check the credentials, they seem to be wrong." : "يرجى التحقق من حيثيّات الدخول credentials، يبدو أنها خاطئة.", + "Please specify the port, it could not be auto-detected." : "يُرجى تحديد المنفذ port، حيث لا يمكن اكتشافه تلقائيا.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "تعذر اكتشاف الاسم المميز الأساسي Base DN تلقائيًا، يرجى مراجعة حيثيّات الدخول credentials، والمُضيف host، والمنفذ port.", + "Could not detect Base DN, please enter it manually." : "تعذّر اكتشاف الاسم المميز الأساسي Base DN، يُرجى إدخاله يدويًا.", + "{nthServer}. Server" : "{nthServer}. الخادم", + "No object found in the given Base DN. Please revise." : "لم يتم العثور على أي كائن object في الاسم المميز الأساسي Base DN المحدد. يُرجي المُراجعة.", + "More than 1,000 directory entries available." : "يُوجد أكثر من 1,000 مُدخل في الدليل directory entries.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخل متاح من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم","{objectsFound} مدخلات متاحة من خلال الاسم المميز الأساسي المقدم"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "حدث خطأ. يرجي التحقق من الاسم المميز الأساسي Base DN، وكذلك إعدادات الاتصال، و حيثيّات الدخول credentials.", "Do you really want to delete the current Server Configuration?" : "هل ترغب فعلاً في حذف إعدادات الخادم الحالي؟", "Confirm Deletion" : "تأكيد الحذف", + "Mappings cleared successfully!" : "تم مسح الارتباطات mappings بنجاح!", + "Error while clearing the mappings." : "خطأ أثناء مسح الارتباطات mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "الربط المجهول Anonymous bind غير مسموح به. يرجى إدخال الاسم المميز للمستخدم User DN، وكلمة المرور.", + "LDAP Operations error. Anonymous bind might not be allowed." : "خطأ في عمليات LDAP. قد لا يكون مسموحاُ بالربط المجهول Anonymous bind.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "فشل الحفظ. يرجى التأكد من أن قاعدة البيانات قيد التشغيل. أعد التحميل قبل المتابعة.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "تفعيل الوضع سوف ينتج عنه تمكين استعلامات بروتوكولLDAP التلقائية. وقد يستغرق الأمر بعض الوقت بناء على حجم LDAP خاصتك. هل ما زلت تريد تفعيل الوضع؟", + "Mode switch" : "تبديل النمط", "Select attributes" : "اختر الخصائص", - "_%s group found_::_%s groups found_" : ["لا توجد مجموعات: %s","تم إيجاد %s مجموعة واحدة","تم إيجاد %s مجموعتين","تم إيجاد %s مجموعات","تم إيجاد %s مجموعة","تم إيجاد %s مجموعة/مجموعات"], - "Server" : "خادم", - "Users" : "المستخدمين", - "Groups" : "مجموعات", - "Help" : "المساعدة", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "لم يتم العثور على المستخدم. يرجى التحقق من تحديدات تسجيل الدخول واسم المستخدم الخاصين بك. عامل التصفية الفعال (للنسخ واللصق للتحقق من صحة سطر الأوامر):<br/>", + "User found and settings verified." : "تم العثور على المستخدم وتم التحقق من الإعدادات.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ضع في اعتبارك تضييق نطاق البحث، لأنه يشمل مستخدمين كُثْرٌ، ولن يتمكن سوى أول واحد منهم من تسجيل الدخول.", + "An unspecified error occurred. Please check log and settings." : "حدث خطأ غير محدد. يرجى التحقق من السجل والإعدادات.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "عامل تصفية البحث غير صالح؛ ربما بسبب مشكلات في بناء الجملة مثل عدم تساوي عدد الأقواس المفتوحة والمغلقة. يرجي المراجعة.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "حدث خطأ في الاتصال بـ LDAP/AD. يرجى التحقق من المضيف host، والمنفذ port، وبيانات تسجيل الدخول.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "العنصر النائب placeholder ـ \"%u مُعرّف\". سيتم استبداله باسم دخول عند الاستعلام من LDAP/AD.", + "Please provide a login name to test against" : "يرجى تقديم اسم تسجيل الدخول لاختباره", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "تم تعطيل مربع المجموعة؛ لأن خادم LDAP/AD لا يدعم خاصّيّة \"عضوٌ في\" memberOf.", + "Password change rejected. Hint: %s" : "تمّ رفض تغيير كلمة المرور. إرشاد: %s", + "Mandatory field \"%s\" left empty" : "الحقل الإلزامي \"%s\" تُرِك فارغاً", + "A password is given, but not an LDAP agent" : "تمّ إعطاء كلمة المرور لكن لم يتم إعطاء وكيل LDAP", + "No password is given for the user agent" : "لم يتم إعطاء كلمة المرور لوكيل المُستخدِم", + "No LDAP base DN was given" : "لم يتم إعطاء اسم الدليل الأساسي base DN لقائمة المستخدِمين LADP", + "User base DN is not a subnode of global base DN" : "الدليل الأساسي للمستخدِم User base DN ليس متفرعاً عن الدليل الأساسي العمومي Global base DN", + "Group base DN is not a subnode of global base DN" : "الدليل الأساسي للمجموعة Group base DN ليس متفرعاً عن الدليل الأساسي العمومي Global base DN", + "Please login with the new password" : "الرجاء تسجيل الدخول باستخدام كلمة المرور الجديدة", + "LDAP User backend" : "خلفية المستخدمين User backend من LDAP ", + "Your password will expire tomorrow." : "كلمة مرورك تنتهي صلاحيتها غداً.", + "Your password will expire today." : "كلمة مرورك تنتهي صلاحيتها اليوم.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %n أيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nيوم.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام.","سوف تنتهي صلاحية كلمة المرور الخاصة بك خلال %nأيام."], + "LDAP/AD integration" : "التكامل مع LDAP/AD ", + "LDAP Connection" : "الاتصال بدليل المستخدِمين LDAP ", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %s مع تكوين دليل المستخدمين LDAP هذا.","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s","فشل ارتباط %n مع تكوينات LDAP دليل المستخدمين: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s","فشل البحث عن %n تكوينات LDAP دليل المستخدمين: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["توجد %n تكوينات دليل مستخدمين LDAP غير نشطة:%s","بوجد تكوين. لدليل مستخدمين LDAP غير نشط: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s","توجد %n تكوينات دليل مستخدمين LDAP غير نشطة: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في توصيلة دليل المستخدمين المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ%n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ%n لأدلة المستخدمين LDAP المُكوَّنة (%s)","الارتباط و البحث يعمل كما يجب في كل التوصيلات الـ %n لأدلة المستخدمين LDAP المُكوَّنة (%s)"], + "Invalid LDAP UUIDs" : "مُعرِّفات UUID الخاصة بـ LDAP غير صحيحة", + "None found" : "لم يُمكن العثور على أي شيء", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "تم العثور على مُعرِّفات UUID غير صالحة لحسابات أو مجموعات LDAP. الرجاء مراجعة الإعداد \"تجاوز اكتشاف UUID ـ Override UUID detection\" في الجزء الخبير من تكوين LDAP ثم اعطِ الأمر السطري: \"occ ldap:update-uuid\" لتحديثها", + "_%n group found_::_%n groups found_" : ["تم العثور على %n مجموعات","تم العثور على %n مجموعة","تم العثور على %n مجموعات","تم العثور على %n مجموعات","تم العثور على %n مجموعات","تم العثور على %n مجموعات"], + "> 1000 groups found" : "> 1000 مجموعة موجودة", + "> 1000 users found" : "> 1000 مستخدِم موجود", + "_%n user found_::_%n users found_" : ["تم العثور على %n مستخدمين","تم العثور على %n مستخدم","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين","تم العثور على %n مستخدمين"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "تعذر اكتشاف خاصّية اسم العرض للمستخدم user display name attribute. يرجى تحديدها بنفسك في الإعدادات المتقدمة لخادم LDAP.", + "Could not find the desired feature" : "تعذر العثور على الميزة المطلوبة", + "Invalid Host" : "مُضيف غير صالح", + "LDAP user and group backend" : "خلفية المستخدمين و المجموعات من LDAP", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "يتيح هذا التطبيق لمسؤولي النظام توصيل نكست كلاود بدليل المستخدمين المستند إلى LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "يتيح هذا التطبيق لمسؤولي النظام توصيل نكست كلاود بدليل المستخدمين المستنِد إلى LDAP للمصادقة و توفير المستخدمين users، والمجموعات groups، و سمات المستخدمين user attributes. \nيمكن للمشرفين تكوين هذا التطبيق للاتصال بدليل LDAP واحد أو أكثر عبر واجهة LDAP. \nيمكن سحب سماتٍ مثل حصة المستخدم التخزينية، و البريد الإلكتروني، و التجسيدات الرمزية avatar، وعضوية المجموعات و غيرها إلى نكست كلاود باستخدام الاستعلامات والمرشحات المناسبة. \nيقوم المستخدم بتسجيل الدخول إلى نكست كلاود باستخدام حيثيات دخوله من LDAP أو AD، ويتم منحه حق الوصول بناءً على طلب المصادقة الذي تتم معالجته بواسطة خادم LDAP أو AD. \nلا يقوم نكست كلاود بتخزين كلمات مرور LDAP أو AD، بل يستخدم حيثيّات المستخدم هذه للمصادقة ثم يستخدم مُعرّف الجلسة session كمُعرّف للمستخدم. \n\nيتوفر المزيد من المعلومات في وثائق مستخدم LDAP و Group Backend.", + "Test Configuration" : "اختبر التكوين", + "Help" : "مساعدة", + "Groups meeting these criteria are available in %s:" : "المجموعات التي تلبي هذه المعايير متوفرة في %s:", + "Only these object classes:" : "فئات هذه الكائنات فقط:", + "Only from these groups:" : "فقط من هذه المجموعات:", + "Search groups" : "مجموعات البحث", + "Available groups" : "المجموعات المتاحة", + "Selected groups" : "المجموعات المحددة", + "Edit LDAP Query" : "تحرير استعلام من خادم LDAP", + "LDAP Filter:" : "تصفية LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "يحدد عامل التصفية أي مجموعات من LDAP سوف يكون لها حق الوصول إلى التطبيق %s.", + "Verify settings and count the groups" : "تحقق من الإعدادات و احصر عدد المجموعات", + "When logging in, %s will find the user based on the following attributes:" : "عند تسجيل الدخول، %sسوف تجد المستخدم بناءً على الخصائص التالية:", + "LDAP/AD Username:" : "اسم مستخدم LDAP/AD ـ : ", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "يسمح بتسجيل الدخول مقابل اسم مستخدم LDAP / AD ، والذي يكون إما \"uid\" أو \"sAMAccountName\" وسيتم اكتشافه.", + "LDAP/AD Email Address:" : "عنوان البريد الالكتروني LDAP/AD ـ :", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "يُسمح بتسجيل الدخول مقابل خاصّية البريد الإلكتروني. \"mail\" و \"mailPrimaryAddress\" مسموح بهما.", + "Other Attributes:" : "خصائص أخري:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "حدد عامل التصفية الذي سيتم تطبيقه، عند محاولة تسجيل الدخول. يحل \"%%uid\" محل اسم المستخدم في إجراء تسجيل الدخول. مثال: \"uid=%%uid\"", + "Test Loginname" : "اختبار اسم تسجيل الدخول", + "Attempts to receive a DN for the given loginname and the current login filter" : "محاولة تلقّي الاسم المميز DN لاسم تسجيل الدخول المحدد و عامل تصفية تسجيل الدخول الحالي", + "Verify settings" : "التحقُّق من الإعدادات", + "%s. Server:" : "%s. خادم:", + "Add a new configuration" : "إضافة تكوين جديد", + "Copy current configuration into new directory binding" : "نسخ التهيئة الحالية إلى دليل جديد مرتبط", + "Delete the current configuration" : "حذف التهيئة الحالية", "Host" : "المضيف", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "يمكنك التغاضي عن البروتوكول، ما لم يكن SSL مطلوب. إذا كان الأمر كذلك، فابدأ بـ ldaps", "Port" : "المنفذ", + "Detect Port" : "إكتشِف المنفذ", + "User DN" : "الاسم المميز للمستخدم DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "الاسم المميز للعميل المستخدم DN الذي يجب الربط معه. على سبيل المثال، uid=agent,dc=example,dc=com. للوصول مجهول الهوية anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.", "Password" : "كلمة المرور", + "For anonymous access, leave DN and Password empty." : "للوصول المجهول anonymous access، اترك خانتيْ الاسم المميز وكلمة المرور فارغتين.", + "Save Credentials" : "حفظ بيانات تسجيل الدخول", + "One Base DN per line" : "اسم مميز واحد أساسي Base DN لكل سطر", + "You can specify Base DN for users and groups in the Advanced tab" : "يمكنك تحديد الاسم المميز الأساسي Base DN للمستخدمين والمجموعات من علامة تبويب الإعدادات المتقدمة", + "Detect Base DN" : "اكتشاف الاسم المميز الأساسي Base DN", + "Test Base DN" : "إختبر الاسم المميز الأساسي Base DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "يُلغي طلبات LDAP التلقائية. يُفضّل استعماله في حالة الخوادم التي تخدم أعداداً كبيرة، ولكنه يتطلب بعض المعرفة فيما يخص بروتوكول LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "الإدخال اليدوي لفلاتر بروتوكول LDAP (يُنصح به في حالة الأدلة الكبيرة)", + "Listing and searching for users is constrained by these criteria:" : "العرض والبحث عن المستخدمين مُقيّدٌ بهذه الشروط:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "أكثر فئات الكائنات شيوعًا بالنسبة للمستخدمين هي: الشخص التنظيمي \"organizationalPerson\" والشخص \"person\" والمستخدم \"user\"وinetOrgPerson. إذا لم تكن متأكدًا من فئة الكائن التي تريد تحديدها، فيرجى استشارة مسئول الدليل الخاص بك.", + "The filter specifies which LDAP users shall have access to the %s instance." : "يُحدِّد عامل التصفية أيّ مستخدمي LDAP يمكنه الوصول إلى الخادم %s.", + "Verify settings and count users" : "التّحقق من الإعدادات وعدد المستخدمين", + "Saving" : "الحفظ جارٍ...", "Back" : "رجوع", - "Continue" : "المتابعة", - "Advanced" : "تعديلات متقدمه", - "Email Field" : "خانة البريد الإلكتروني" + "Continue" : "متابعة", + "Please renew your password." : "الرجاء تجديد كلمة مرورك.", + "An internal error occurred." : "حدث خطأ داخلي.", + "Please try again or contact your administrator." : "حاول مجددا أو تواصل مع مسؤول النظام.", + "Current password" : "كلمة المرور الحالية", + "New password" : "كلمة المرور الجديدة", + "Renew password" : "تجديد كلمة المرور", + "Wrong password." : "كلمة مرور خاطئة.", + "Cancel" : "إلغاء", + "Server" : "خادم", + "Users" : "المستخدمين", + "Login Attributes" : "خصائص تسجيل الدخول", + "Groups" : "مجموعات", + "Expert" : "خبير", + "Advanced" : "متقدمة", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>تحذير:</b> وِحدة PHP LDAP غير مُنصبّة؛ لذا فإن الخلفية لن تعمل. يرجى طلب تنصيبها من مسؤول النظام.", + "Connection Settings" : "إعدادات الربط", + "Configuration Active" : "الإعداد نشط", + "When unchecked, this configuration will be skipped." : "عندما لا يتم تحديده، سوف يتم تخطي هذه التهيئة.", + "Backup (Replica) Host" : "مضيف النسخ الاحتياطي (طِبقَ الأصل)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "توفير مضيف احتياطي اختياري. يجب أن يكون نسخة طبق الأصل من خادم LDAP/AC.", + "Backup (Replica) Port" : "منفذ النسخ الاحتياطي (طِبقَ الأصل)", + "Disable Main Server" : "تعطيل الخادم الرئيسي", + "Only connect to the replica server." : "متصل فقط بالخادم الاحتياطي.", + "Turn off SSL certificate validation." : "إيقاف تشغيل التحقق من صحة شهادة SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "لا يوصي به، استخدمه للاختبار فقط! إذا كان الاتصال يعمل فقط مع هذا الخيار، فقم باستيراد شهادة SSL لخادم LDAP في الخادم %s.", + "Cache Time-To-Live" : "مدة صلاحية ذاكرة التخزين المؤقت cache", + "in seconds. A change empties the cache." : "خلال ثوان. يؤدي التغيير إلى إفراغ ذاكرة التخزين المؤقت cache.", + "Directory Settings" : "إعدادات الدليل", + "User Display Name Field" : "حقل عرض اسم المستخدم", + "The LDAP attribute to use to generate the user's display name." : "تستخدم سمة بروتوكول LDAP لتوليد اسم عرض المستخدم.", + "2nd User Display Name Field" : "الحقل 2 لعرض اسم المستخدم ", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "اختياري. سمة LDAP سوف تُضاف إلى اسم العرض بين قوسين. و النتيجة ستكون كما في المثال: »John Doe (john.doe@example.org)«.", + "Base User Tree" : "شجرة المستخدم الأساسي Base User Tree", + "One User Base DN per line" : "اسم مميز أساسي User Base DN لمستخدم واحد لكل سطر", + "User Search Attributes" : "خصائص بحث المستخدم", + "Optional; one attribute per line" : "اختياري؛ سمة واحدة لكل سطر", + "Disable users missing from LDAP" : "إيقاف المستخدمين غير الموجودين على LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "عند التشغيل، سيتم تعطيل المستخدمين الذين تمّ استيرادهم من LDAP لكن تعذّر إيحادهم عندها", + "Group Display Name Field" : "حقل عرض اسم المجموعة", + "The LDAP attribute to use to generate the groups's display name." : "تستخدم خاصية بروتوكول LDAP لإنشاء اسماء عرض للمجموعات.", + "Base Group Tree" : "شجرة المجموعة الأساسية Base Group Tree", + "One Group Base DN per line" : "اسم مميز أساسي Group Base DN واحد للمجموعة لكل سطر", + "Group Search Attributes" : "خصائص بحث المجموعات", + "Group-Member association" : "ارتباط أعضاء المجموعة Group-Member association", + "Dynamic Group Member URL" : "محدد موقع URL الديناميكي لعضو المجموعة ", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "تحتوي خاصية بروتوكولLDAP الموجودة في كائنات المجموعة على عنوان بحث LDAP و الذي يحدد الكائنات التي تنتمي إلى المجموعة. (الإعداد الفارغ يتسبب في تعطيل وظيفة عضوية المجموعة الديناميكية.)", + "Nested Groups" : "المجموعات المتداخلة", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "عند التشغيل، يتم دعم المجموعات التي تحتوي على مجموعات. (تعمل فقط إذا كان تحديد عضو المجموعة يحتوي على اسم مميز DN).", + "Paging chunksize" : "حجم رزم الصفحات Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "يتم استخدام حجم الرِّزمَة لعمليات البحث المقسمة إلى صفحات في LDAP؛ والتي قد تعطي نتائج ضخمة تبعاً لعدد المستخدمين و المجموعات. (الضبط علي 0 يؤدي إلى تعطيل هذا الأسلوب من البحث في تلك الحالات.)", + "Enable LDAP password changes per user" : "تمكين تغيير كلمة المرور لكل مستخدم علي خادم LDAP ", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "يتيح خادم بروتوكول LDAP للمستخدمين تغيير كلمة المرور الخاصة بهم والسماح لمسؤولي النظام المتميزين ومسؤولي المجموعات بتغيير كلمة مرور مستخدمي الخادم. وتعمل هذه الخاصية عندما يتم تهيئة وضبط سياسات التحكم في الوصول على خادم LDAP وفقًا لذلك. وحيث أن كلمات المرور يتم إرسالها فى صورة نصٍّ عادي إلى خادم LDAP، فيجب استخدام تشفير النقل وضبط تجزئة كلمة المرور على خادم LDAP.", + "(New password is sent as plain text to LDAP)" : "(يتم إرسال كلمة المرور الجديدة كنص عادي إلى خادم LDAP )", + "Default password policy DN" : "سياسة الاسم المميز لكلمة المرورالافتراضية", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "سياسة الاسم المميز DN لكلمة المرورالافتراضية التي سيتم استخدامها لمعالجة انتهاء صلاحية كلمة المرور تعمل فقط عندما يتم تمكين تغيير كلمة مرور خادم LDAP لكل مستخدم ويكون مدعومًا فقط بواسطة OpenLDAP. H. أترُكه فارغًا لتعطيل معالجة انتهاء صلاحية كلمة المرور.", + "Special Attributes" : "خصائص خاصة", + "Quota Field" : "حقل الحِّصّة التخزينية", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "اتركه فارغًا للحصة التخزينية الافتراضية للمستخدم. خلاف ذلك، حدد خاصّية خادم LDAP/AD.", + "Quota Default" : "الحصة الافتراضية", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "تخطِّي الحصة الافتراضية لمستخدمي خادم LDAP الذين ليس لديهم حصة محددة في حقل الحصة.", + "Email Field" : "خانة البريد الإلكتروني", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "قُم بتعيين البريد الإلكتروني للمستخدمين من خاصّية خادم LDAP الخاصة بهم. اتركه فارغًا للتصرُّف الافتراضي.", + "User Home Folder Naming Rule" : "قاعدة تسمية المجلد الرئيسي للمستخدم", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "أترُكه فارغًا لاسم المستخدم (افتراضي). خلاف ذلك، حدِّد خاصّية LDAP/AD.", + "\"$home\" Placeholder Field" : "حقل العنصر النائب \"$home\"", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "سيتم استبدال $home في تكوين وحدة التخزين الخارجية بقيمة الخاصّية المحددة", + "User Profile Attributes" : "خصائص الملف الشخصي للمستخدِم", + "Phone Field" : "خانة الهاتف", + "User profile Phone will be set from the specified attribute" : "خانة الهاتف في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Website Field" : "خانة موقع الويب", + "User profile Website will be set from the specified attribute" : "خانة موقع الويب في الملف الشخصي للمستخدم سيتم تعيينها من الخاصّية المحددة", + "Address Field" : "خانة العنوان", + "User profile Address will be set from the specified attribute" : "خانة العنوان في الملف الشخصي للمستخدم سيتم تعيينها من الخاصّية المُحدّدة", + "Twitter Field" : "خانة حساب تويتر", + "User profile Twitter will be set from the specified attribute" : "خانة حساب تويتر في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Fediverse Field" : "خانة حساب Fediverse", + "User profile Fediverse will be set from the specified attribute" : "خانة حساب Fediverse في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Organisation Field" : "خانة المؤسسة organization", + "User profile Organisation will be set from the specified attribute" : "خانة المنظمة organization في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Role Field" : "خانة الوظيفة role", + "User profile Role will be set from the specified attribute" : "خانة الوظيفة role في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Headline Field" : "حقل العنوان", + "User profile Headline will be set from the specified attribute" : "خانة العنوان في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Biography Field" : "خانة السيرة الذاتية biography", + "User profile Biography will be set from the specified attribute" : "خانة السيرة الذاتية biography في الملف الشخصي للمستخدم سوف يتم تعيينها من الخاصّية المُحدّدة", + "Birthdate Field" : "حقل تاريخ الميلاد", + "User profile Date of birth will be set from the specified attribute" : "تاريخ الميلاد في ملف المستخدم سيتم ملؤه من الخانة المحددة", + "Pronouns Field" : "حقل الضمائر", + "User profile Pronouns will be set from the specified attribute" : "سيتم تعيين ضمائر ملف تعريف المستخدم من السمة المحددة", + "Internal Username" : "اسم المستخدم الداخلي", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "بشكل افتراضي، سيتم إنشاء اسم المستخدم الداخلي internal username من خاصّية المُغرّف المُميّز الشامل UUID. هذا يضمن أن اسم المستخدم فريدٌ ولا يلزمه أي تحويل في الأحرف. اسم المستخدم الداخلي مُقيّدٌ باستخدام هذه الأحرف فقط: [a-zA-Z0-9 _. @ -]. غير هذه الأحرف يقع استبدالها بما يقابلها من أحرف الآسكي ASCII أو - ببساطة - يقع حذفها. في حالة وقوع تضاربٍِ، سيتم إلحاق عدد بالاسم. \n\nيُستخدم هذا الاسم الداخلي لتعريف المستخدم داخليًا. وهو أيضًا الاسم الافتراضي للمجلد الرئيسي للمستخدم. و هو أيضًا جزء من عناوين remote URL القَصِيّة كما في خدمات DAV على سبيل المثال. باستخدام هذا الإعداد ، يمكن تجاوز السلوك الافتراضي. سيكون للتغييرات تأثير فقط على مستخدمي LDAP المُعيّنين حديثًا (المُضافين). أترُكه فارغًا للسلوك الافتراضي.", + "Internal Username Attribute:" : "خاصّية اسم المستخدم الداخلي:", + "Override UUID detection" : "تجاوُز اكتشاف المعرف الفريد الشامل UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "بشكل افتراضي، يتم اكتشاف خاصية المعرف الفريد الشامل UUID تلقائيًا. ويتم استخدام هذه الخاصّية لتحديد مستخدمي ومجموعات LDAP علي نحو موثوق. أيضًا، سيتم إنشاء اسم المستخدم الداخلي بناءً على المعرف الفريد الشامل UUID إذا لم يتم تحديده أعلاه. يمكنك تجاوز الإعداد وتجاوز الخاصية حسب اختيارك. يجب عليك التأكد من إمكانية الوصول إلي الخاصية التي قمت باختيارها من قبل كل من المستخدمين والمجموعات وأنها فريدة. أترُكه فارغًا للوضع الافتراضي. تصبح التغييرات نافذة فقط على مستخدمي ومجموعات بروتوكول LDAP المُعيّنين حديثًا (المُضافين).", + "UUID Attribute for Users:" : "خاصية المعرف الفريد الشامل للمستخدمين UUID:", + "UUID Attribute for Groups:" : "خاصية المعرف الفريد الشامل للمجموعات UUID:", + "Username-LDAP User Mapping" : "الربط بين اسم المستخدم في LDAP و المستخدم", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "تُستخدم أسماء المستخدمين لتخزين وتخصيص البيانات التعريف الوصفية. من أجل تحديد المستخدمين والتعرف عليهم بدقة، سيكون لكل مستخدم على خادم LDAP اسم مستخدم داخلي. يتطلب هذا ربطاً mapping بين اسم المستخدم و مستخدم خادم LDAP. يتم تعيين اسم المستخدم الذي تم إنشاؤه إلى المعرف الفريد الشامل \"UUID\" لمستخدم LDAP. بالإضافة إلى ذلك، يتم تخزين الاسم المميز DN مؤقتًا أيضًا لتقليل تفاعل LDAP، ولكنه لا يستخدم لتحديد الهوية. وعند تغير الاسم المميز يتم العثور على التغييرات. ويتم استخدام اسم المستخدم الداخلي في كل مكان. إلغاء الربط سيكون له آثار متبقية في كل مكان. إلغاء الربط يؤثر على جميع تكوينات LDAP! لا تقم مطلقًا بإلغاء الربط في بيئة الإنتاج. فقط في مرحلة الاختبار أو المرحلة التجريبية.", + "Clear Username-LDAP User Mapping" : "إلغاء الربط بين اسم المستخدم في LDAP و المستخدم", + "Clear Groupname-LDAP Group Mapping" : "إلغاء الربط بين اسم المجموعة في LDAP و المجموعة", + "Invalid configuration. Please have a look at the logs for further details." : "تكوين غير صحيح. يرجى الرجوع إلى سجلات الأنشطة لمزيد من التفاصيل." },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ast.js b/apps/user_ldap/l10n/ast.js deleted file mode 100644 index cac4e0ddd2c..00000000000 --- a/apps/user_ldap/l10n/ast.js +++ /dev/null @@ -1,159 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Fallu al llimpiar los mapeos.", - "Failed to delete the server configuration" : "Fallu al desaniciar la configuración del sirvidor", - "Valid configuration, connection established!" : "¡Configuración válida, afitóse la conexón!", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración non válida. Écha-yos un güeyu a los rexistros pa más detalles, por favor.", - "No action specified" : "Nun s'especificó l'aición", - "No configuration specified" : "Nun s'especificó la configuración", - "No data specified" : "Nun s'especificaron los datos", - " Could not set configuration %s" : "Nun pudo afitase la configuración %s", - "Action does not exist" : "L'acción nun esiste", - "Renewing …" : "Renovando...", - "Very weak password" : "Contraseña perfeble", - "Weak password" : "Contraseña feble", - "So-so password" : "Contraseña normalina", - "Good password" : "Contraseña bona", - "Strong password" : "Contraseña fuerte", - "The Base DN appears to be wrong" : "La base DN paez tar mal", - "Testing configuration…" : "Probando configuración...", - "Configuration incorrect" : "Configuración incorreuta", - "Configuration incomplete" : "Configuración incompleta", - "Configuration OK" : "Configuración correuta", - "Select groups" : "Esbillar grupos", - "Select object classes" : "Esbillar les clases d'oxetu", - "Please check the credentials, they seem to be wrong." : "Por favor, compruebe les credenciales, que paecen tar mal.", - "Please specify the port, it could not be auto-detected." : "Por favor especifica'l puertu, nun puede ser detectáu automáticamente .", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nun puede ser detectada automáticamente, por favor revisa les credenciales, host yá'l puertu.", - "Could not detect Base DN, please enter it manually." : "Nun se detectó base DN, por favor introduzla manualmente .", - "{nthServer}. Server" : "{nthServer}. Sirvidor", - "No object found in the given Base DN. Please revise." : "Nun s'atopó nengún oxetu na Base DN dada. Por favor, revísalo.", - "More than 1,000 directory entries available." : "Más de 1.000 entraes de directoriu disponibles.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Asocedió un erru. Por favor, compruebe la Base DN , amás de la configuración de conexón y les credenciales.", - "Do you really want to delete the current Server Configuration?" : "¿Daveres que quies desaniciar la configuración actual del sirvidor?", - "Confirm Deletion" : "Confirmar desaniciu", - "Mappings cleared successfully!" : "¡Asignaciones borraes correutamente!", - "Error while clearing the mappings." : "Fallu mientres desaniciaben les asignaciones.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Nun s'almite l'enllaz anónimu. Por favor apurre un usuariu DN y contraseña.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Erru d'operaciones LDAP . Enllaz anónimu nun s'almite.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Nun pudo guardase. Por favor asegúrate que la base de datos ta en funcionamientu. Actualiza enantes de siguir.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar el mou va habilitar les consultes LDAP automátiques . Dependiendo del to tamañu de LDAP puede llevar un tiempu. ¿Inda deseya camudar el mou?", - "Select attributes" : "Esbillar atributos", - "User found and settings verified." : "Usuariu atopáu y la configuración verificada.", - "An unspecified error occurred. Please check log and settings." : "Asocedió un fallu non especificáu. Comprueba'l rexistru y los axustes, por favor.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtru de busca nun ye válidu , probablemente por cuenta de problemes de sintaxis como'l númberu impar de soportes abiertos y zarraos. Por favor revisalo.", - "Please provide a login name to test against" : "Por favor, proporcione un nombre de inicio de sesión para comprobar en contra", - "Your password will expire today." : "Güei caduca la to contraseña.", - "_%s group found_::_%s groups found_" : ["%s grupu alcontráu","%s grupos alcontraos"], - "_%s user found_::_%s users found_" : ["%s usuariu alcontráu","%s usuarios alcontraos"], - "Could not find the desired feature" : "Nun pudo alcontrase la carauterística deseyada", - "Invalid Host" : "Agospiu non válidu", - "Test Configuration" : "Configuración de prueba", - "Help" : "Ayuda", - "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen estos criterios tán disponibles en %s:", - "Only these object classes:" : "Namái d'estes clases d'oxetu:", - "Only from these groups:" : "Namái d'estos grupos:", - "Search groups" : "Esbillar grupos", - "Available groups" : "Grupos disponibles", - "Selected groups" : "Grupos seleicionaos", - "Edit LDAP Query" : "Editar consulta LDAP", - "LDAP Filter:" : "Filtru LDAP:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtru especifica qué grupos LDAP van tener accesu a %s.", - "Verify settings and count the groups" : "Verificar axustes y contar los grupos", - "When logging in, %s will find the user based on the following attributes:" : "Al empecipiar sesión, %s atópase l'usuariu en función de los siguientes atributos :", - "Other Attributes:" : "Otros atributos:", - "Test Loginname" : "Preba de Nome d'Aniciu de Sesión", - "Verify settings" : "Comprobar los axustes", - "%s. Server:" : "%s. Sirvidor:", - "Copy current configuration into new directory binding" : "Copiar configuración actual nel nuevu directoriu obligatoriu", - "Delete the current configuration" : "Desaniciar la configuración actual", - "Host" : "Equipu", - "Port" : "Puertu", - "Detect Port" : "Detectar Puertu", - "User DN" : "DN usuariu", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuariu veceru col que va facese l'asociación, p.ex. uid=axente,dc=exemplu,dc=com. P'accesu anónimu, dexa DN y contraseña baleros.", - "Password" : "Contraseña", - "For anonymous access, leave DN and Password empty." : "Pa un accesu anónimu, dexar el DN y la contraseña baleros.", - "One Base DN per line" : "Un DN Base por llinia", - "You can specify Base DN for users and groups in the Advanced tab" : "Pues especificar el DN base pa usuarios y grupos na llingüeta Avanzáu", - "Detect Base DN" : "Detectar Base DN", - "Test Base DN" : "Probar Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automátiques de LDAP. Meyor pa grandes configuraciones, pero rique mayor conocimientu de LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Inxerta manualmente los filtros de LDAP (recomendáu pa direutorios llargos)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les clases d'oxetos más comunes pa los usuarios d'Internet son organizationalPerson, persona, usuariu y inetOrgPerson . Si nun ta seguro de qué clase d'oxetu escoyer, por favor consulte al so alministrador de directorios.", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtru especifica qué usuarios LDAP puen tener accesu a %s.", - "Verify settings and count users" : "Comprobar la configuración y usuarios de recuentu", - "Saving" : "Guardando", - "Back" : "Atrás", - "Continue" : "Continuar", - "Please renew your password." : "Renueva la to contraseña, por favor.", - "An internal error occurred." : "Asocedió un fallu internu.", - "Please try again or contact your administrator." : "Volvi tentalo o contauta col to alministrador, por favor.", - "Current password" : "Contraseña actual", - "New password" : "Contraseña nueva", - "Renew password" : "Renovar contraseña", - "Wrong password." : "Contraseña incorreuta.", - "Cancel" : "Encaboxar", - "Server" : "Sirvidor", - "Users" : "Usuarios", - "Login Attributes" : "Los atributos d'aniciu de sesión", - "Groups" : "Grupos", - "Expert" : "Espertu", - "Advanced" : "Avanzáu", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avisu:</b> El módulu LDAP de PHP nun ta instaláu, el sistema nun va funcionar. Por favor consulta al alministrador del sistema pa instalalu.", - "Connection Settings" : "Axustes de conexón", - "Configuration Active" : "Configuración activa", - "When unchecked, this configuration will be skipped." : "Cuando nun tea conseñáu, saltaráse esta configuración.", - "Backup (Replica) Host" : "Sirvidor de copia de seguranza (Réplica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Dar un sirvidor de copia de seguranza opcional. Tien de ser una réplica del sirvidor principal LDAP / AD.", - "Backup (Replica) Port" : "Puertu pa copies de seguranza (Réplica)", - "Disable Main Server" : "Deshabilitar sirvidor principal", - "Only connect to the replica server." : "Coneutar namái col sirvidor de réplica.", - "Turn off SSL certificate validation." : "Apagar la validación del certificáu SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nun se recomienda, ¡úsalu namái pa pruebes! Si la conexón namái funciona con esta opción, importa'l certificáu SSL del sirvidor LDAP nel to sirvidor %s.", - "Cache Time-To-Live" : "Cache Time-To-Live", - "in seconds. A change empties the cache." : "en segundos. Un cambéu vacia la caché.", - "Directory Settings" : "Axustes del direutoriu", - "User Display Name Field" : "Campu de nome d'usuariu a amosar", - "The LDAP attribute to use to generate the user's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del usuariu.", - "2nd User Display Name Field" : "2ª usuariu amuesa Nome del campu", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributu LDAP que s'amesta al nome de visualización ente paréntesis. Los resultaos en, por exemplu, »John Doe (john.doe@example.org)«.", - "Base User Tree" : "Árbol base d'usuariu", - "One User Base DN per line" : "Un DN Base d'Usuariu por llinia", - "User Search Attributes" : "Atributos de la gueta d'usuariu", - "Optional; one attribute per line" : "Opcional; un atributu por llinia", - "Group Display Name Field" : "Campu de nome de grupu a amosar", - "The LDAP attribute to use to generate the groups's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del grupu.", - "Base Group Tree" : "Árbol base de grupu", - "One Group Base DN per line" : "Un DN Base de Grupu por llinia", - "Group Search Attributes" : "Atributos de gueta de grupu", - "Group-Member association" : "Asociación Grupu-Miembru", - "Dynamic Group Member URL" : "URL Dinámica de Grupu d'Usuarios", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atributu LDAP que nos oxetos de grupu contien una gueta de URLs de LDAP que determina qué oxetos pertenecen al grupu. (Un axuste vacíu desanicia la funcionalidá dinámica de pertenencia al grupu.)", - "Nested Groups" : "Grupos añeraos", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando s'active, van permitise grupos que contengan otros grupos (namái funciona si l'atributu de miembru de grupu contién DNs).", - "Paging chunksize" : "Tamañu de los fragmentos de paxinación", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamañu de los fragmentos usáu pa busques LDAP paxinaes que puen devolver resultaos voluminosos, como enubmeración d'usuarios o de grupos. (Si s'afita en 0, van deshabilitase les busques LDAP paxinaes neses situaciones.)", - "(New password is sent as plain text to LDAP)" : "(La contraseña únviase como testu planu a LDAP)", - "Special Attributes" : "Atributos especiales", - "Quota Field" : "Cuota", - "Quota Default" : "Cuota por defeutu", - "Email Field" : "E-mail", - "User Home Folder Naming Rule" : "Regla pa la carpeta Home d'usuariu", - "Internal Username" : "Nome d'usuariu internu", - "Internal Username Attribute:" : "Atributu Nome d'usuariu Internu:", - "Override UUID detection" : "Sobrescribir la deteición UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeutu, l'atributu UUID autodetéutase. Esti atributu úsase pa identificar induldablemente usuarios y grupos LDAP. Arriendes, el nome d'usuariu internu va crease en bas al UUID, si nun s'especificó otru comportamientu arriba. Pues sobrescribir la configuración y pasar un atributu de la to eleición. Tienes d'asegurate de que l'atributu de la to eleición seya accesible polos usuarios y grupos y ser únicu. Déxalu en blanco pa usar el comportamientu por defeutu. Los cambeos van tener efeutu namái nos usuarios y grupos de LDAP mapeaos (amestaos) recién.", - "UUID Attribute for Users:" : "Atributu UUID pa usuarios:", - "UUID Attribute for Groups:" : "Atributu UUID pa Grupos:", - "Username-LDAP User Mapping" : "Asignación del Nome d'usuariu LDAP", - "Clear Username-LDAP User Mapping" : "Llimpiar l'asignación de los Nomes d'usuariu de los usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Llimpiar l'asignación de los Nomes de grupu de los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Asocedió un erru de conexón a LDAP / AD, por favor, comprueba'l host, el puertu y les credenciales.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadru de grupu taba desactiváu , por mor qu'el servidor LDAP / AD nun almite memberOf .", - "LDAP / AD integration" : "Integración de LDAP/AD", - "LDAP / AD Username:" : "Nome d'usuariu LDAP / AD:", - "LDAP / AD Email Address:" : "Direición e-mail LDAP / AD:" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ast.json b/apps/user_ldap/l10n/ast.json deleted file mode 100644 index 3549d08f210..00000000000 --- a/apps/user_ldap/l10n/ast.json +++ /dev/null @@ -1,157 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Fallu al llimpiar los mapeos.", - "Failed to delete the server configuration" : "Fallu al desaniciar la configuración del sirvidor", - "Valid configuration, connection established!" : "¡Configuración válida, afitóse la conexón!", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración non válida. Écha-yos un güeyu a los rexistros pa más detalles, por favor.", - "No action specified" : "Nun s'especificó l'aición", - "No configuration specified" : "Nun s'especificó la configuración", - "No data specified" : "Nun s'especificaron los datos", - " Could not set configuration %s" : "Nun pudo afitase la configuración %s", - "Action does not exist" : "L'acción nun esiste", - "Renewing …" : "Renovando...", - "Very weak password" : "Contraseña perfeble", - "Weak password" : "Contraseña feble", - "So-so password" : "Contraseña normalina", - "Good password" : "Contraseña bona", - "Strong password" : "Contraseña fuerte", - "The Base DN appears to be wrong" : "La base DN paez tar mal", - "Testing configuration…" : "Probando configuración...", - "Configuration incorrect" : "Configuración incorreuta", - "Configuration incomplete" : "Configuración incompleta", - "Configuration OK" : "Configuración correuta", - "Select groups" : "Esbillar grupos", - "Select object classes" : "Esbillar les clases d'oxetu", - "Please check the credentials, they seem to be wrong." : "Por favor, compruebe les credenciales, que paecen tar mal.", - "Please specify the port, it could not be auto-detected." : "Por favor especifica'l puertu, nun puede ser detectáu automáticamente .", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nun puede ser detectada automáticamente, por favor revisa les credenciales, host yá'l puertu.", - "Could not detect Base DN, please enter it manually." : "Nun se detectó base DN, por favor introduzla manualmente .", - "{nthServer}. Server" : "{nthServer}. Sirvidor", - "No object found in the given Base DN. Please revise." : "Nun s'atopó nengún oxetu na Base DN dada. Por favor, revísalo.", - "More than 1,000 directory entries available." : "Más de 1.000 entraes de directoriu disponibles.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Asocedió un erru. Por favor, compruebe la Base DN , amás de la configuración de conexón y les credenciales.", - "Do you really want to delete the current Server Configuration?" : "¿Daveres que quies desaniciar la configuración actual del sirvidor?", - "Confirm Deletion" : "Confirmar desaniciu", - "Mappings cleared successfully!" : "¡Asignaciones borraes correutamente!", - "Error while clearing the mappings." : "Fallu mientres desaniciaben les asignaciones.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Nun s'almite l'enllaz anónimu. Por favor apurre un usuariu DN y contraseña.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Erru d'operaciones LDAP . Enllaz anónimu nun s'almite.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Nun pudo guardase. Por favor asegúrate que la base de datos ta en funcionamientu. Actualiza enantes de siguir.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar el mou va habilitar les consultes LDAP automátiques . Dependiendo del to tamañu de LDAP puede llevar un tiempu. ¿Inda deseya camudar el mou?", - "Select attributes" : "Esbillar atributos", - "User found and settings verified." : "Usuariu atopáu y la configuración verificada.", - "An unspecified error occurred. Please check log and settings." : "Asocedió un fallu non especificáu. Comprueba'l rexistru y los axustes, por favor.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtru de busca nun ye válidu , probablemente por cuenta de problemes de sintaxis como'l númberu impar de soportes abiertos y zarraos. Por favor revisalo.", - "Please provide a login name to test against" : "Por favor, proporcione un nombre de inicio de sesión para comprobar en contra", - "Your password will expire today." : "Güei caduca la to contraseña.", - "_%s group found_::_%s groups found_" : ["%s grupu alcontráu","%s grupos alcontraos"], - "_%s user found_::_%s users found_" : ["%s usuariu alcontráu","%s usuarios alcontraos"], - "Could not find the desired feature" : "Nun pudo alcontrase la carauterística deseyada", - "Invalid Host" : "Agospiu non válidu", - "Test Configuration" : "Configuración de prueba", - "Help" : "Ayuda", - "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen estos criterios tán disponibles en %s:", - "Only these object classes:" : "Namái d'estes clases d'oxetu:", - "Only from these groups:" : "Namái d'estos grupos:", - "Search groups" : "Esbillar grupos", - "Available groups" : "Grupos disponibles", - "Selected groups" : "Grupos seleicionaos", - "Edit LDAP Query" : "Editar consulta LDAP", - "LDAP Filter:" : "Filtru LDAP:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtru especifica qué grupos LDAP van tener accesu a %s.", - "Verify settings and count the groups" : "Verificar axustes y contar los grupos", - "When logging in, %s will find the user based on the following attributes:" : "Al empecipiar sesión, %s atópase l'usuariu en función de los siguientes atributos :", - "Other Attributes:" : "Otros atributos:", - "Test Loginname" : "Preba de Nome d'Aniciu de Sesión", - "Verify settings" : "Comprobar los axustes", - "%s. Server:" : "%s. Sirvidor:", - "Copy current configuration into new directory binding" : "Copiar configuración actual nel nuevu directoriu obligatoriu", - "Delete the current configuration" : "Desaniciar la configuración actual", - "Host" : "Equipu", - "Port" : "Puertu", - "Detect Port" : "Detectar Puertu", - "User DN" : "DN usuariu", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuariu veceru col que va facese l'asociación, p.ex. uid=axente,dc=exemplu,dc=com. P'accesu anónimu, dexa DN y contraseña baleros.", - "Password" : "Contraseña", - "For anonymous access, leave DN and Password empty." : "Pa un accesu anónimu, dexar el DN y la contraseña baleros.", - "One Base DN per line" : "Un DN Base por llinia", - "You can specify Base DN for users and groups in the Advanced tab" : "Pues especificar el DN base pa usuarios y grupos na llingüeta Avanzáu", - "Detect Base DN" : "Detectar Base DN", - "Test Base DN" : "Probar Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automátiques de LDAP. Meyor pa grandes configuraciones, pero rique mayor conocimientu de LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Inxerta manualmente los filtros de LDAP (recomendáu pa direutorios llargos)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les clases d'oxetos más comunes pa los usuarios d'Internet son organizationalPerson, persona, usuariu y inetOrgPerson . Si nun ta seguro de qué clase d'oxetu escoyer, por favor consulte al so alministrador de directorios.", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtru especifica qué usuarios LDAP puen tener accesu a %s.", - "Verify settings and count users" : "Comprobar la configuración y usuarios de recuentu", - "Saving" : "Guardando", - "Back" : "Atrás", - "Continue" : "Continuar", - "Please renew your password." : "Renueva la to contraseña, por favor.", - "An internal error occurred." : "Asocedió un fallu internu.", - "Please try again or contact your administrator." : "Volvi tentalo o contauta col to alministrador, por favor.", - "Current password" : "Contraseña actual", - "New password" : "Contraseña nueva", - "Renew password" : "Renovar contraseña", - "Wrong password." : "Contraseña incorreuta.", - "Cancel" : "Encaboxar", - "Server" : "Sirvidor", - "Users" : "Usuarios", - "Login Attributes" : "Los atributos d'aniciu de sesión", - "Groups" : "Grupos", - "Expert" : "Espertu", - "Advanced" : "Avanzáu", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avisu:</b> El módulu LDAP de PHP nun ta instaláu, el sistema nun va funcionar. Por favor consulta al alministrador del sistema pa instalalu.", - "Connection Settings" : "Axustes de conexón", - "Configuration Active" : "Configuración activa", - "When unchecked, this configuration will be skipped." : "Cuando nun tea conseñáu, saltaráse esta configuración.", - "Backup (Replica) Host" : "Sirvidor de copia de seguranza (Réplica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Dar un sirvidor de copia de seguranza opcional. Tien de ser una réplica del sirvidor principal LDAP / AD.", - "Backup (Replica) Port" : "Puertu pa copies de seguranza (Réplica)", - "Disable Main Server" : "Deshabilitar sirvidor principal", - "Only connect to the replica server." : "Coneutar namái col sirvidor de réplica.", - "Turn off SSL certificate validation." : "Apagar la validación del certificáu SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nun se recomienda, ¡úsalu namái pa pruebes! Si la conexón namái funciona con esta opción, importa'l certificáu SSL del sirvidor LDAP nel to sirvidor %s.", - "Cache Time-To-Live" : "Cache Time-To-Live", - "in seconds. A change empties the cache." : "en segundos. Un cambéu vacia la caché.", - "Directory Settings" : "Axustes del direutoriu", - "User Display Name Field" : "Campu de nome d'usuariu a amosar", - "The LDAP attribute to use to generate the user's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del usuariu.", - "2nd User Display Name Field" : "2ª usuariu amuesa Nome del campu", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributu LDAP que s'amesta al nome de visualización ente paréntesis. Los resultaos en, por exemplu, »John Doe (john.doe@example.org)«.", - "Base User Tree" : "Árbol base d'usuariu", - "One User Base DN per line" : "Un DN Base d'Usuariu por llinia", - "User Search Attributes" : "Atributos de la gueta d'usuariu", - "Optional; one attribute per line" : "Opcional; un atributu por llinia", - "Group Display Name Field" : "Campu de nome de grupu a amosar", - "The LDAP attribute to use to generate the groups's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del grupu.", - "Base Group Tree" : "Árbol base de grupu", - "One Group Base DN per line" : "Un DN Base de Grupu por llinia", - "Group Search Attributes" : "Atributos de gueta de grupu", - "Group-Member association" : "Asociación Grupu-Miembru", - "Dynamic Group Member URL" : "URL Dinámica de Grupu d'Usuarios", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atributu LDAP que nos oxetos de grupu contien una gueta de URLs de LDAP que determina qué oxetos pertenecen al grupu. (Un axuste vacíu desanicia la funcionalidá dinámica de pertenencia al grupu.)", - "Nested Groups" : "Grupos añeraos", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando s'active, van permitise grupos que contengan otros grupos (namái funciona si l'atributu de miembru de grupu contién DNs).", - "Paging chunksize" : "Tamañu de los fragmentos de paxinación", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamañu de los fragmentos usáu pa busques LDAP paxinaes que puen devolver resultaos voluminosos, como enubmeración d'usuarios o de grupos. (Si s'afita en 0, van deshabilitase les busques LDAP paxinaes neses situaciones.)", - "(New password is sent as plain text to LDAP)" : "(La contraseña únviase como testu planu a LDAP)", - "Special Attributes" : "Atributos especiales", - "Quota Field" : "Cuota", - "Quota Default" : "Cuota por defeutu", - "Email Field" : "E-mail", - "User Home Folder Naming Rule" : "Regla pa la carpeta Home d'usuariu", - "Internal Username" : "Nome d'usuariu internu", - "Internal Username Attribute:" : "Atributu Nome d'usuariu Internu:", - "Override UUID detection" : "Sobrescribir la deteición UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeutu, l'atributu UUID autodetéutase. Esti atributu úsase pa identificar induldablemente usuarios y grupos LDAP. Arriendes, el nome d'usuariu internu va crease en bas al UUID, si nun s'especificó otru comportamientu arriba. Pues sobrescribir la configuración y pasar un atributu de la to eleición. Tienes d'asegurate de que l'atributu de la to eleición seya accesible polos usuarios y grupos y ser únicu. Déxalu en blanco pa usar el comportamientu por defeutu. Los cambeos van tener efeutu namái nos usuarios y grupos de LDAP mapeaos (amestaos) recién.", - "UUID Attribute for Users:" : "Atributu UUID pa usuarios:", - "UUID Attribute for Groups:" : "Atributu UUID pa Grupos:", - "Username-LDAP User Mapping" : "Asignación del Nome d'usuariu LDAP", - "Clear Username-LDAP User Mapping" : "Llimpiar l'asignación de los Nomes d'usuariu de los usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Llimpiar l'asignación de los Nomes de grupu de los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Asocedió un erru de conexón a LDAP / AD, por favor, comprueba'l host, el puertu y les credenciales.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadru de grupu taba desactiváu , por mor qu'el servidor LDAP / AD nun almite memberOf .", - "LDAP / AD integration" : "Integración de LDAP/AD", - "LDAP / AD Username:" : "Nome d'usuariu LDAP / AD:", - "LDAP / AD Email Address:" : "Direición e-mail LDAP / AD:" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/az.js b/apps/user_ldap/l10n/az.js deleted file mode 100644 index b431ba72723..00000000000 --- a/apps/user_ldap/l10n/az.js +++ /dev/null @@ -1,37 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Xəritələnməni silmək mümkün olmadı", - "Failed to delete the server configuration" : "Server configini silmək mümkün olmadı", - "The configuration is valid and the connection could be established!" : "Configurasiya doğrudur və qoşulmaq mümkündür!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Configurasiya doğrudur yalnız, birləşmədə səhv oldu. Xahiş olunur server quraşdırmalarını və daxil etdiyiniz verilənlərin düzgünlüyünü yoxlayasınız.", - "The configuration is invalid. Please have a look at the logs for further details." : "Configurasiya dügün deyil. Əlavə detallar üçün xahiş edirik jurnal faylına baxasınız.", - "No action specified" : "Heç bir iş təyin edilməyib", - "No configuration specified" : "Təyin edilmiş konfiqurasiya yoxdur", - "No data specified" : "Təyin edilmiş data yoxdur", - " Could not set configuration %s" : "%s configi təyin etmək mümkün olmadı", - "Configuration incorrect" : "Konfiqurasiya düzgün deyil", - "Configuration incomplete" : "Konfiqruasiya bitmiş deyil", - "Configuration OK" : "Konfiqurasiya OK-dir", - "Select groups" : "Qrupları seç", - "Select object classes" : "object class-larını seç", - "{nthServer}. Server" : "{nthServer}. Server", - "Do you really want to delete the current Server Configuration?" : "Siz hal-hazırki server konfiqini silmək istədiyinizdən həqiqətən əminsinizmi?", - "Confirm Deletion" : "Silinmənin təsdiqi", - "Select attributes" : "Atributları seç", - "_%s group found_::_%s groups found_" : ["%s qruplar tapıldı","%s qruplar tapıldı"], - "_%s user found_::_%s users found_" : ["%s istifadəçilər tapıldı","%s istifadəçilər tapıldı"], - "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "İstifadəçinin ekran atributu adını təyin etmək mümkün deyil. Xahiş olunur sizin özünüz onu əllə ldap konfiqində təyin edəsiniz.", - "Could not find the desired feature" : "Arzulanılan imkanı tapmaq mümkün deyil", - "Invalid Host" : "Yalnış Host", - "Server" : "Server", - "Users" : "İstifadəçilər", - "Groups" : "Qruplar", - "Test Configuration" : "Konfiqurasiya testi", - "Help" : "Kömək", - "Host" : "Şəbəkədə ünvan", - "Port" : "Port", - "Password" : "Şifrə", - "Advanced" : "İrəliləmiş" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/az.json b/apps/user_ldap/l10n/az.json deleted file mode 100644 index aa5e52cb346..00000000000 --- a/apps/user_ldap/l10n/az.json +++ /dev/null @@ -1,35 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Xəritələnməni silmək mümkün olmadı", - "Failed to delete the server configuration" : "Server configini silmək mümkün olmadı", - "The configuration is valid and the connection could be established!" : "Configurasiya doğrudur və qoşulmaq mümkündür!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Configurasiya doğrudur yalnız, birləşmədə səhv oldu. Xahiş olunur server quraşdırmalarını və daxil etdiyiniz verilənlərin düzgünlüyünü yoxlayasınız.", - "The configuration is invalid. Please have a look at the logs for further details." : "Configurasiya dügün deyil. Əlavə detallar üçün xahiş edirik jurnal faylına baxasınız.", - "No action specified" : "Heç bir iş təyin edilməyib", - "No configuration specified" : "Təyin edilmiş konfiqurasiya yoxdur", - "No data specified" : "Təyin edilmiş data yoxdur", - " Could not set configuration %s" : "%s configi təyin etmək mümkün olmadı", - "Configuration incorrect" : "Konfiqurasiya düzgün deyil", - "Configuration incomplete" : "Konfiqruasiya bitmiş deyil", - "Configuration OK" : "Konfiqurasiya OK-dir", - "Select groups" : "Qrupları seç", - "Select object classes" : "object class-larını seç", - "{nthServer}. Server" : "{nthServer}. Server", - "Do you really want to delete the current Server Configuration?" : "Siz hal-hazırki server konfiqini silmək istədiyinizdən həqiqətən əminsinizmi?", - "Confirm Deletion" : "Silinmənin təsdiqi", - "Select attributes" : "Atributları seç", - "_%s group found_::_%s groups found_" : ["%s qruplar tapıldı","%s qruplar tapıldı"], - "_%s user found_::_%s users found_" : ["%s istifadəçilər tapıldı","%s istifadəçilər tapıldı"], - "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "İstifadəçinin ekran atributu adını təyin etmək mümkün deyil. Xahiş olunur sizin özünüz onu əllə ldap konfiqində təyin edəsiniz.", - "Could not find the desired feature" : "Arzulanılan imkanı tapmaq mümkün deyil", - "Invalid Host" : "Yalnış Host", - "Server" : "Server", - "Users" : "İstifadəçilər", - "Groups" : "Qruplar", - "Test Configuration" : "Konfiqurasiya testi", - "Help" : "Kömək", - "Host" : "Şəbəkədə ünvan", - "Port" : "Port", - "Password" : "Şifrə", - "Advanced" : "İrəliləmiş" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/be.js b/apps/user_ldap/l10n/be.js deleted file mode 100644 index 99117026327..00000000000 --- a/apps/user_ldap/l10n/be.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Advanced" : "Дасведчаны" -}, -"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/user_ldap/l10n/be.json b/apps/user_ldap/l10n/be.json deleted file mode 100644 index 987589ccd81..00000000000 --- a/apps/user_ldap/l10n/be.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Advanced" : "Дасведчаны" -},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/bg.js b/apps/user_ldap/l10n/bg.js index 3e49265858a..4cef2c94481 100644 --- a/apps/user_ldap/l10n/bg.js +++ b/apps/user_ldap/l10n/bg.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Невалидна конфигурация: Анонимното обвързване не е разрешено.", "Valid configuration, connection established!" : "Валидна конфигурация, връзката е установена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Валидна конфигурация, но обвързването не бе успешно. Моля, проверете настройките и идентификационните данни на сървъра.", - "Invalid configuration. Please have a look at the logs for further details." : "Невалидна конфигурация. Моля, разгледайте журналите за повече подробности.", "No action specified" : "Не е посочено действие", "No configuration specified" : "Не е посочена конфигурация", "No data specified" : "Не са посочени данни", - " Could not set configuration %s" : "Неуспешно задаване на конфигруацията %s", + "Invalid data specified" : "Посочени са невалидни данни", "Action does not exist" : "Действието не съществува", "Renewing …" : "Подновяване …", "Very weak password" : "Много проста парола", @@ -53,15 +52,16 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заместителят „ %u“ липсва. Той ще бъде заменен с името за вход при запитване към LDAP/AD.", "Please provide a login name to test against" : "Моля, посочете име за вход, срещу което да тествате", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Груповата кутия е деактивирана, тъй като LDAP/AD сървърът не поддържа memberOf.", - "Password change rejected. Hint: " : "Смяната на паролата е отхвърлена. Подсказка:", "Please login with the new password" : "Моля, влезте с новата парола", "LDAP User backend" : "LDAP потребителски сървър", "Your password will expire tomorrow." : "Вашата парола ще изтече утре.", "Your password will expire today." : "Вашата парола ще изтече днес.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Вашата парола ще изтече в рамките на %n дни.","Вашата парола ще изтече в рамките на %n дни."], "LDAP/AD integration" : "LDAP/AD интеграция", - "_%s group found_::_%s groups found_" : ["%s открита група","%s открити групи"], - "_%s user found_::_%s users found_" : ["%s октрит потребител","%s октрити потребители"], + "_%n group found_::_%n groups found_" : ["%n открити групи","%n открити групи"], + "> 1000 groups found" : "> 1000 открити групи", + "> 1000 users found" : "> 1000 намерени потребители", + "_%n user found_::_%n users found_" : ["%n намерени потребители","%n намерени потребители"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не можа да се открие атрибут за показвано име на потребителя. Моля, посочете го сами в разширените настройки на LDAP.", "Could not find the desired feature" : "Не е открита желанта функция", "Invalid Host" : "Невалиден хост", @@ -88,6 +88,7 @@ OC.L10N.register( "Other Attributes:" : "Други атрибути:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Определя филтър, който да се приложи при опит за влизане. „%%“ замества името на потребител в действието за влизане. Пример: „uid=%%uid “", "Test Loginname" : "Проверка на Потребителско име", + "Attempts to receive a DN for the given loginname and the current login filter" : "Опити за получаване на DN за даденото име за влизане и текущия филтър за вход", "Verify settings" : "Потвърди настройките", "%s. Server:" : "%s. Сървър:", "Add a new configuration" : "Добавяне на нова конфигурация", @@ -179,8 +180,30 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставете празно за име на потребител (по пдразбиране). Или посочете LDAP/AD атрибут.", "\"$home\" Placeholder Field" : "„$home“ Заместващо поле", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home в конфигурация за външно хранилище ще бъде заменен със стойността на посочения атрибут", + "User Profile Attributes" : "Атрибути на Потребителски Профил", + "Phone Field" : "Поле за Телефонен номер", + "User profile Phone will be set from the specified attribute" : "Телефонът на потребителския профил ще бъде зададен от определения атрибут", + "Website Field" : "Поле за Уеб сайт", + "User profile Website will be set from the specified attribute" : "Уеб сайтът на потребителския профил ще бъде зададен от определения атрибут", + "Address Field" : "Поле за Адрес", + "User profile Address will be set from the specified attribute" : "Адресът на потребителския профил ще бъде зададен от определения атрибут", + "Twitter Field" : "Twitter Поле", + "User profile Twitter will be set from the specified attribute" : "Потребителският профил вTwitter ще бъде зададен от определения атрибут", + "Fediverse Field" : "Fediverse Поле", + "User profile Fediverse will be set from the specified attribute" : "Потребителският профил във Fediverse ще бъде зададен от определения атрибут", + "Organisation Field" : "Поле за име на Организация", + "User profile Organisation will be set from the specified attribute" : "Организацията на потребителския профил ще бъде зададена от определения атрибут", + "Role Field" : "Поле за Роля", + "User profile Role will be set from the specified attribute" : "Ролята на потребителския профил ще бъде зададена от определения атрибут", + "Headline Field" : "Поле за Заглавие", + "User profile Headline will be set from the specified attribute" : "Заглавието на потребителския профил ще бъде зададено от определения атрибут", + "Biography Field" : "Поле за Биография", + "User profile Biography will be set from the specified attribute" : "Биографията на потребителския профил ще бъде зададена от определения атрибут", + "User profile Date of birth will be set from the specified attribute" : "Датата на раждане в потребителския профил ще се зададе от този атрибут", + "Pronouns Field" : "Поле за обръщение", + "User profile Pronouns will be set from the specified attribute" : "Опциите за обръщение в профила на потребителите ще се зададат от този атрибут", "Internal Username" : "Вътрешно потребителско име", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP. Оставете го празно за поведение по подразбиране. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP. Оставете го празно за поведение по подразбиране. ", "Internal Username Attribute:" : "Атрибут на вътрешното потребителско име:", "Override UUID detection" : "Промени UUID откриването", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Обикновено UUID атрибутът ще бъде намерен автоматично. UUID атрибута се използва, за да се идентифицират еднозначно LDAP потребители и групи. Освен това ще бъде генерирано вътрешното име базирано на UUID-то, ако такова не е посочено по-горе. Можете да промените настройката и да използвате атрибут по свой избор. Наложително е атрибутът да бъде уникален както за потребителите така и за групите. Промените ще се отразят само за новодобавени (map-нати) LDAP потребители.", @@ -190,13 +213,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Потребителските имена се използват за съхраняване и присвояване на метаданни. С цел точно идентифициране и разпознаване на потребителите, всеки потребител на LDAP ще има вътрешно име на потребител. Това изисква съпоставяне от име на потребител към потребител на LDAP. Създаденото име на потребител се съпоставя с UUID на потребителя на LDAP. Освен това DN се кешира, за да се намали взаимодействието с LDAP, но не се използва за идентификация. Ако DN се промени, промените ще бъдат намерени. Вътрешното име на потребител се използва навсякъде. Изчистването на съпоставянията ще има остатъци навсякъде. Изчистването на съпоставянията не е чувствително към конфигурацията, засяга всички LDAP конфигурации! Никога не изчиствайте съпоставянията в производствена среда, само в тестов или експериментален етап.", "Clear Username-LDAP User Mapping" : "Изчистване на име на потребител-LDAP Потребителско съпоставяне ", "Clear Groupname-LDAP Group Mapping" : "Изчистване на име на група-LDAP Потребителско съпоставяне ", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Възникна грешка при свързване към LDAP / AD, моля, проверете хост сървър, порт и идентификационни данни.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Заместителят „ %u“ липсва. Той ще бъде заменен с името за вход при запитване към LDAP/AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Груповата кутия е деактивирана, тъй като LDAP/AD сървърът не поддържа memberOf.", - "LDAP / AD integration" : "LDAP / AD интеграция", - "LDAP / AD Username:" : "LDAP / AD потребител:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Позволява влизане с име на потребител на LDAP/AD, което е или „uid“ или „sAMAccountName“ и ще бъде открито.", - "LDAP / AD Email Address:" : "LDAP / AD имейл адрес:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Оставете го празно за поведение по подразбиране. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Невалидна конфигурация. Моля, разгледайте журналите за повече подробности." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/bg.json b/apps/user_ldap/l10n/bg.json index d345da05701..edb583c67e1 100644 --- a/apps/user_ldap/l10n/bg.json +++ b/apps/user_ldap/l10n/bg.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Невалидна конфигурация: Анонимното обвързване не е разрешено.", "Valid configuration, connection established!" : "Валидна конфигурация, връзката е установена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Валидна конфигурация, но обвързването не бе успешно. Моля, проверете настройките и идентификационните данни на сървъра.", - "Invalid configuration. Please have a look at the logs for further details." : "Невалидна конфигурация. Моля, разгледайте журналите за повече подробности.", "No action specified" : "Не е посочено действие", "No configuration specified" : "Не е посочена конфигурация", "No data specified" : "Не са посочени данни", - " Could not set configuration %s" : "Неуспешно задаване на конфигруацията %s", + "Invalid data specified" : "Посочени са невалидни данни", "Action does not exist" : "Действието не съществува", "Renewing …" : "Подновяване …", "Very weak password" : "Много проста парола", @@ -51,15 +50,16 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заместителят „ %u“ липсва. Той ще бъде заменен с името за вход при запитване към LDAP/AD.", "Please provide a login name to test against" : "Моля, посочете име за вход, срещу което да тествате", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Груповата кутия е деактивирана, тъй като LDAP/AD сървърът не поддържа memberOf.", - "Password change rejected. Hint: " : "Смяната на паролата е отхвърлена. Подсказка:", "Please login with the new password" : "Моля, влезте с новата парола", "LDAP User backend" : "LDAP потребителски сървър", "Your password will expire tomorrow." : "Вашата парола ще изтече утре.", "Your password will expire today." : "Вашата парола ще изтече днес.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Вашата парола ще изтече в рамките на %n дни.","Вашата парола ще изтече в рамките на %n дни."], "LDAP/AD integration" : "LDAP/AD интеграция", - "_%s group found_::_%s groups found_" : ["%s открита група","%s открити групи"], - "_%s user found_::_%s users found_" : ["%s октрит потребител","%s октрити потребители"], + "_%n group found_::_%n groups found_" : ["%n открити групи","%n открити групи"], + "> 1000 groups found" : "> 1000 открити групи", + "> 1000 users found" : "> 1000 намерени потребители", + "_%n user found_::_%n users found_" : ["%n намерени потребители","%n намерени потребители"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не можа да се открие атрибут за показвано име на потребителя. Моля, посочете го сами в разширените настройки на LDAP.", "Could not find the desired feature" : "Не е открита желанта функция", "Invalid Host" : "Невалиден хост", @@ -86,6 +86,7 @@ "Other Attributes:" : "Други атрибути:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Определя филтър, който да се приложи при опит за влизане. „%%“ замества името на потребител в действието за влизане. Пример: „uid=%%uid “", "Test Loginname" : "Проверка на Потребителско име", + "Attempts to receive a DN for the given loginname and the current login filter" : "Опити за получаване на DN за даденото име за влизане и текущия филтър за вход", "Verify settings" : "Потвърди настройките", "%s. Server:" : "%s. Сървър:", "Add a new configuration" : "Добавяне на нова конфигурация", @@ -177,8 +178,30 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставете празно за име на потребител (по пдразбиране). Или посочете LDAP/AD атрибут.", "\"$home\" Placeholder Field" : "„$home“ Заместващо поле", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home в конфигурация за външно хранилище ще бъде заменен със стойността на посочения атрибут", + "User Profile Attributes" : "Атрибути на Потребителски Профил", + "Phone Field" : "Поле за Телефонен номер", + "User profile Phone will be set from the specified attribute" : "Телефонът на потребителския профил ще бъде зададен от определения атрибут", + "Website Field" : "Поле за Уеб сайт", + "User profile Website will be set from the specified attribute" : "Уеб сайтът на потребителския профил ще бъде зададен от определения атрибут", + "Address Field" : "Поле за Адрес", + "User profile Address will be set from the specified attribute" : "Адресът на потребителския профил ще бъде зададен от определения атрибут", + "Twitter Field" : "Twitter Поле", + "User profile Twitter will be set from the specified attribute" : "Потребителският профил вTwitter ще бъде зададен от определения атрибут", + "Fediverse Field" : "Fediverse Поле", + "User profile Fediverse will be set from the specified attribute" : "Потребителският профил във Fediverse ще бъде зададен от определения атрибут", + "Organisation Field" : "Поле за име на Организация", + "User profile Organisation will be set from the specified attribute" : "Организацията на потребителския профил ще бъде зададена от определения атрибут", + "Role Field" : "Поле за Роля", + "User profile Role will be set from the specified attribute" : "Ролята на потребителския профил ще бъде зададена от определения атрибут", + "Headline Field" : "Поле за Заглавие", + "User profile Headline will be set from the specified attribute" : "Заглавието на потребителския профил ще бъде зададено от определения атрибут", + "Biography Field" : "Поле за Биография", + "User profile Biography will be set from the specified attribute" : "Биографията на потребителския профил ще бъде зададена от определения атрибут", + "User profile Date of birth will be set from the specified attribute" : "Датата на раждане в потребителския профил ще се зададе от този атрибут", + "Pronouns Field" : "Поле за обръщение", + "User profile Pronouns will be set from the specified attribute" : "Опциите за обръщение в профила на потребителите ще се зададат от този атрибут", "Internal Username" : "Вътрешно потребителско име", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP. Оставете го празно за поведение по подразбиране. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP. Оставете го празно за поведение по подразбиране. ", "Internal Username Attribute:" : "Атрибут на вътрешното потребителско име:", "Override UUID detection" : "Промени UUID откриването", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Обикновено UUID атрибутът ще бъде намерен автоматично. UUID атрибута се използва, за да се идентифицират еднозначно LDAP потребители и групи. Освен това ще бъде генерирано вътрешното име базирано на UUID-то, ако такова не е посочено по-горе. Можете да промените настройката и да използвате атрибут по свой избор. Наложително е атрибутът да бъде уникален както за потребителите така и за групите. Промените ще се отразят само за новодобавени (map-нати) LDAP потребители.", @@ -188,13 +211,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Потребителските имена се използват за съхраняване и присвояване на метаданни. С цел точно идентифициране и разпознаване на потребителите, всеки потребител на LDAP ще има вътрешно име на потребител. Това изисква съпоставяне от име на потребител към потребител на LDAP. Създаденото име на потребител се съпоставя с UUID на потребителя на LDAP. Освен това DN се кешира, за да се намали взаимодействието с LDAP, но не се използва за идентификация. Ако DN се промени, промените ще бъдат намерени. Вътрешното име на потребител се използва навсякъде. Изчистването на съпоставянията ще има остатъци навсякъде. Изчистването на съпоставянията не е чувствително към конфигурацията, засяга всички LDAP конфигурации! Никога не изчиствайте съпоставянията в производствена среда, само в тестов или експериментален етап.", "Clear Username-LDAP User Mapping" : "Изчистване на име на потребител-LDAP Потребителско съпоставяне ", "Clear Groupname-LDAP Group Mapping" : "Изчистване на име на група-LDAP Потребителско съпоставяне ", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Възникна грешка при свързване към LDAP / AD, моля, проверете хост сървър, порт и идентификационни данни.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Заместителят „ %u“ липсва. Той ще бъде заменен с името за вход при запитване към LDAP/AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Груповата кутия е деактивирана, тъй като LDAP/AD сървърът не поддържа memberOf.", - "LDAP / AD integration" : "LDAP / AD интеграция", - "LDAP / AD Username:" : "LDAP / AD потребител:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Позволява влизане с име на потребител на LDAP/AD, което е или „uid“ или „sAMAccountName“ и ще бъде открито.", - "LDAP / AD Email Address:" : "LDAP / AD имейл адрес:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По подразбиране вътрешното име на потребител ще бъде създадено от атрибута UUID. Той гарантира, че името на потребител е уникално и знаците не трябва да се преобразуват. Вътрешното име на потребител има ограничението, че са позволени само тези знаци: [a-zA-Z0-9_.@-]. Други знаци се заменят с тяхното ASCII съответствие или просто се пропускат. При сблъсъци числото ще бъде добавено/увеличено. Вътрешното име на потребител се използва за вътрешно идентифициране на потребител. Това също е името по подразбиране за домашната папка на потребителя. Той също така е част от отдалечени URL адреси, например за всички *DAV услуги. С тази настройка поведението по подразбиране може да бъде отменено. Оставете го празно за поведение по подразбиране. Промените ще имат ефект само върху ново съпоставени (добавени) потребители на LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Невалидна конфигурация. Моля, разгледайте журналите за повече подробности." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/bn_BD.js b/apps/user_ldap/l10n/bn_BD.js deleted file mode 100644 index c74a22160e6..00000000000 --- a/apps/user_ldap/l10n/bn_BD.js +++ /dev/null @@ -1,80 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "মানচিত্রায়ন মুছতে ব্যার্থ হলো।", - "Failed to delete the server configuration" : "সার্ভার কনফিগারেশন মোছা ব্যার্থ হলো", - "The configuration is valid and the connection could be established!" : "কনফিগারেশনটি বৈধ এবং যোগাযোগ প্রতিষ্ঠা করা যায়!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "কনফিগারেশনটি বৈধ তবে Bind ব্যার্থ। দয়া করে সার্ভার নিয়ামকসমূহ এবং ব্যবহারকারী পরীক্ষা করুন।", - "The configuration is invalid. Please have a look at the logs for further details." : "কনফিহারেশনটি অবৈধ। বিস্তারিত জানতে দয়া করে লগ দেখুন।", - "No action specified" : "কোন কার্যাদেশ সুনির্দিষ্ট নয়", - "No configuration specified" : " কোন কনফিগারেসন সুনির্দিষ্ট নয়", - "No data specified" : "কোন ডাটা সুনির্দিষ্ট নয়", - " Could not set configuration %s" : "%s কনফিগারেসন ঠিক করা গেল না", - "Configuration incorrect" : "ভুল কনফিগারেসন", - "Configuration incomplete" : "অসম্পূর্ণ কনফিগারেসন", - "Configuration OK" : "কনফিগারেসন ঠিক আছে", - "Select groups" : "গ্রুপ নির্ধারণ", - "Select object classes" : "অবজেক্ট ক্লাস নির্ধারণ", - "{nthServer}. Server" : "{nthServer}. সার্ভার", - "Do you really want to delete the current Server Configuration?" : "আপনি কি সত্যিই চলতি সার্ভার কনফিগারেসন মুছতে চান?", - "Confirm Deletion" : "মোছার আদেশ নিশ্চিত করুন", - "Select attributes" : "বৈশিষ্ট্য নির্ধারণ", - "_%s group found_::_%s groups found_" : ["%s গ্রুপ পাওয়া গেছে","%s গ্রুপ পাওয়া গেছে"], - "_%s user found_::_%s users found_" : ["%s ব্যাবহারকারী পাওয়া গেছে","%s ব্যাবহারকারী পাওয়া গেছে"], - "Could not find the desired feature" : "চাহিদামাফিক ফিচারটি পাওয়া গেলনা", - "Invalid Host" : "অবৈধ হোস্ট", - "Server" : "সার্ভার", - "Users" : "ব্যবহারকারী", - "Groups" : "গোষ্ঠীসমূহ", - "Test Configuration" : "পরীক্ষামূলক কনফিগারেসন", - "Help" : "সহায়িকা", - "Groups meeting these criteria are available in %s:" : "প্রদত্ত বৈশিষ্ট্য অনুযায়ী %s এ প্রাপ্তব্য গ্রুপসমূহ:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "ফিল্টারটি %s সার্ভারে কোন কোন LDAP গ্রুপ প্রবেশাধিকার পাবে তা নির্ধারণ করে।", - "Other Attributes:" : "অন্যান্য বৈশিষ্ট্য:", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "প্রবেশ প্রচেষ্টা নিলে প্রযোজ্য ফিল্টার নির্ধারণ করে। প্রবেশকালে %%uid ব্যাবহারকারীর নামকে প্রতিস্থাপন করে। ঊদাহরণ: \"uid=%%uid\"", - "1. Server" : "1. সার্ভার", - "%s. Server:" : "%s. সার্ভার:", - "Host" : "হোস্ট", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL আবশ্যক না হলে আপনি এই প্রটোকলটি মুছে ফেলতে পারেন । এরপর শুরু করুন এটা দিয়ে ldaps://", - "Port" : "পোর্ট", - "User DN" : "ব্যবহারকারি DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. পরিচয় গোপন রেখে অধিগমনের জন্য DN এবং কূটশব্দটি ফাঁকা রাখুন।", - "Password" : "কূটশব্দ", - "For anonymous access, leave DN and Password empty." : "অজ্ঞাতকুলশীল অধিগমনের জন্য DN এবং কূটশব্দটি ফাঁকা রাখুন।", - "One Base DN per line" : "লাইনপ্রতি একটি Base DN", - "You can specify Base DN for users and groups in the Advanced tab" : "সুচারু ট্যঅবে গিয়ে আপনি ব্যবহারকারি এবং গোষ্ঠীসমূহের জন্য ভিত্তি DN নির্ধারণ করতে পারেন।", - "The filter specifies which LDAP users shall have access to the %s instance." : "এই ফিল্টারটি কোন কোন LDAP ব্যবহারকারী %s সার্ভারে প্রবেশ করবেন তা বাছাই করে।", - "Back" : "পেছনে যাও", - "Continue" : "চালিয়ে যাও", - "Expert" : "দক্ষ", - "Advanced" : "সুচারু", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Warning:</b> Apps user_ldap and user_webdavauth কম্প্যাটিবল নয়। আপনি অবান্ছিত জটিলতার মুখোমুখি হতে পারেন। সিস্টেম প্রশাসককে যেকোন একটি অকার্যকর করে দিতে বলুন।", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> PHP LDAP মডিউল ইনস্টল করা নেই, ব্যাকএন্ড কাজ করবেনা। সিস্টেম প্রশাসককে এটি ইনস্টল করতে বলুন।", - "Connection Settings" : "সংযোগ নিয়ামকসমূহ", - "Configuration Active" : "কনফিগারেসন সক্রিয়", - "When unchecked, this configuration will be skipped." : "চেকমার্ক তুলে দিলে কনফিগারেসন এড়িয়ে যাবে।", - "Backup (Replica) Host" : "ব্যাকআপ (নকল) হোস্ট", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "একটি ঐচ্ছিক ব্যাকআপ হোস্ট দিন। এটি মূল LDAP/AD সার্ভারের নকল হবে।", - "Backup (Replica) Port" : "ব্যাকআপ (নকল) পোর্ট", - "Disable Main Server" : "মূল সার্ভারকে অকার্যকর কর", - "Only connect to the replica server." : "শুধুমাত্র নকল সার্ভারে সংযোগ দাও।", - "Turn off SSL certificate validation." : "SSL সনদপত্র যাচাইকরণ বন্ধ রাক।", - "Cache Time-To-Live" : "ক্যাশে টাইম-টু-লিভ", - "in seconds. A change empties the cache." : "সেকেন্ডে। কোন পরিবর্তন ক্যাসে খালি করবে।", - "Directory Settings" : "ডিরেক্টরি নিয়ামকসমূহ", - "User Display Name Field" : "ব্যবহারকারীর প্রদর্শিতব্য নামের ক্ষেত্র", - "The LDAP attribute to use to generate the user's display name." : "ব্যবহারকারীর প্রদর্শনীয় নাম তৈরি করার জন্য ব্যবহৃত LDAP বৈশিষ্ট্য।", - "Base User Tree" : "ভিত্তি ব্যবহারকারি বৃক্ষাকারে", - "Group Display Name Field" : "গোষ্ঠীর প্রদর্শিতব্য নামের ক্ষেত্র", - "Base Group Tree" : "ভিত্তি গোষ্ঠী বৃক্ষাকারে", - "Group Search Attributes" : "গ্রুপ খোঁজার বৈশিষ্ট্য", - "Group-Member association" : "গোষ্ঠী-সদস্য সংস্থাপন", - "Nested Groups" : "একতাবদ্ধ গোষ্ঠিসমূহ", - "Special Attributes" : "বিশেষ বৈশিষ্ট্যসমূহ", - "Quota Field" : "কোটা", - "Quota Default" : "পূর্বনির্ধারিত কোটা", - "in bytes" : "বাইটে", - "Email Field" : "ইমেইল ক্ষেত্র", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "ব্যবহারকারী নামের জন্য ফাঁকা রাখুন (পূর্বনির্ধারিত)। অন্যথায়, LDAP/AD বৈশিষ্ট্য নির্ধারণ করুন।" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/bn_BD.json b/apps/user_ldap/l10n/bn_BD.json deleted file mode 100644 index 68883909add..00000000000 --- a/apps/user_ldap/l10n/bn_BD.json +++ /dev/null @@ -1,78 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "মানচিত্রায়ন মুছতে ব্যার্থ হলো।", - "Failed to delete the server configuration" : "সার্ভার কনফিগারেশন মোছা ব্যার্থ হলো", - "The configuration is valid and the connection could be established!" : "কনফিগারেশনটি বৈধ এবং যোগাযোগ প্রতিষ্ঠা করা যায়!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "কনফিগারেশনটি বৈধ তবে Bind ব্যার্থ। দয়া করে সার্ভার নিয়ামকসমূহ এবং ব্যবহারকারী পরীক্ষা করুন।", - "The configuration is invalid. Please have a look at the logs for further details." : "কনফিহারেশনটি অবৈধ। বিস্তারিত জানতে দয়া করে লগ দেখুন।", - "No action specified" : "কোন কার্যাদেশ সুনির্দিষ্ট নয়", - "No configuration specified" : " কোন কনফিগারেসন সুনির্দিষ্ট নয়", - "No data specified" : "কোন ডাটা সুনির্দিষ্ট নয়", - " Could not set configuration %s" : "%s কনফিগারেসন ঠিক করা গেল না", - "Configuration incorrect" : "ভুল কনফিগারেসন", - "Configuration incomplete" : "অসম্পূর্ণ কনফিগারেসন", - "Configuration OK" : "কনফিগারেসন ঠিক আছে", - "Select groups" : "গ্রুপ নির্ধারণ", - "Select object classes" : "অবজেক্ট ক্লাস নির্ধারণ", - "{nthServer}. Server" : "{nthServer}. সার্ভার", - "Do you really want to delete the current Server Configuration?" : "আপনি কি সত্যিই চলতি সার্ভার কনফিগারেসন মুছতে চান?", - "Confirm Deletion" : "মোছার আদেশ নিশ্চিত করুন", - "Select attributes" : "বৈশিষ্ট্য নির্ধারণ", - "_%s group found_::_%s groups found_" : ["%s গ্রুপ পাওয়া গেছে","%s গ্রুপ পাওয়া গেছে"], - "_%s user found_::_%s users found_" : ["%s ব্যাবহারকারী পাওয়া গেছে","%s ব্যাবহারকারী পাওয়া গেছে"], - "Could not find the desired feature" : "চাহিদামাফিক ফিচারটি পাওয়া গেলনা", - "Invalid Host" : "অবৈধ হোস্ট", - "Server" : "সার্ভার", - "Users" : "ব্যবহারকারী", - "Groups" : "গোষ্ঠীসমূহ", - "Test Configuration" : "পরীক্ষামূলক কনফিগারেসন", - "Help" : "সহায়িকা", - "Groups meeting these criteria are available in %s:" : "প্রদত্ত বৈশিষ্ট্য অনুযায়ী %s এ প্রাপ্তব্য গ্রুপসমূহ:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "ফিল্টারটি %s সার্ভারে কোন কোন LDAP গ্রুপ প্রবেশাধিকার পাবে তা নির্ধারণ করে।", - "Other Attributes:" : "অন্যান্য বৈশিষ্ট্য:", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "প্রবেশ প্রচেষ্টা নিলে প্রযোজ্য ফিল্টার নির্ধারণ করে। প্রবেশকালে %%uid ব্যাবহারকারীর নামকে প্রতিস্থাপন করে। ঊদাহরণ: \"uid=%%uid\"", - "1. Server" : "1. সার্ভার", - "%s. Server:" : "%s. সার্ভার:", - "Host" : "হোস্ট", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "SSL আবশ্যক না হলে আপনি এই প্রটোকলটি মুছে ফেলতে পারেন । এরপর শুরু করুন এটা দিয়ে ldaps://", - "Port" : "পোর্ট", - "User DN" : "ব্যবহারকারি DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. পরিচয় গোপন রেখে অধিগমনের জন্য DN এবং কূটশব্দটি ফাঁকা রাখুন।", - "Password" : "কূটশব্দ", - "For anonymous access, leave DN and Password empty." : "অজ্ঞাতকুলশীল অধিগমনের জন্য DN এবং কূটশব্দটি ফাঁকা রাখুন।", - "One Base DN per line" : "লাইনপ্রতি একটি Base DN", - "You can specify Base DN for users and groups in the Advanced tab" : "সুচারু ট্যঅবে গিয়ে আপনি ব্যবহারকারি এবং গোষ্ঠীসমূহের জন্য ভিত্তি DN নির্ধারণ করতে পারেন।", - "The filter specifies which LDAP users shall have access to the %s instance." : "এই ফিল্টারটি কোন কোন LDAP ব্যবহারকারী %s সার্ভারে প্রবেশ করবেন তা বাছাই করে।", - "Back" : "পেছনে যাও", - "Continue" : "চালিয়ে যাও", - "Expert" : "দক্ষ", - "Advanced" : "সুচারু", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Warning:</b> Apps user_ldap and user_webdavauth কম্প্যাটিবল নয়। আপনি অবান্ছিত জটিলতার মুখোমুখি হতে পারেন। সিস্টেম প্রশাসককে যেকোন একটি অকার্যকর করে দিতে বলুন।", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> PHP LDAP মডিউল ইনস্টল করা নেই, ব্যাকএন্ড কাজ করবেনা। সিস্টেম প্রশাসককে এটি ইনস্টল করতে বলুন।", - "Connection Settings" : "সংযোগ নিয়ামকসমূহ", - "Configuration Active" : "কনফিগারেসন সক্রিয়", - "When unchecked, this configuration will be skipped." : "চেকমার্ক তুলে দিলে কনফিগারেসন এড়িয়ে যাবে।", - "Backup (Replica) Host" : "ব্যাকআপ (নকল) হোস্ট", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "একটি ঐচ্ছিক ব্যাকআপ হোস্ট দিন। এটি মূল LDAP/AD সার্ভারের নকল হবে।", - "Backup (Replica) Port" : "ব্যাকআপ (নকল) পোর্ট", - "Disable Main Server" : "মূল সার্ভারকে অকার্যকর কর", - "Only connect to the replica server." : "শুধুমাত্র নকল সার্ভারে সংযোগ দাও।", - "Turn off SSL certificate validation." : "SSL সনদপত্র যাচাইকরণ বন্ধ রাক।", - "Cache Time-To-Live" : "ক্যাশে টাইম-টু-লিভ", - "in seconds. A change empties the cache." : "সেকেন্ডে। কোন পরিবর্তন ক্যাসে খালি করবে।", - "Directory Settings" : "ডিরেক্টরি নিয়ামকসমূহ", - "User Display Name Field" : "ব্যবহারকারীর প্রদর্শিতব্য নামের ক্ষেত্র", - "The LDAP attribute to use to generate the user's display name." : "ব্যবহারকারীর প্রদর্শনীয় নাম তৈরি করার জন্য ব্যবহৃত LDAP বৈশিষ্ট্য।", - "Base User Tree" : "ভিত্তি ব্যবহারকারি বৃক্ষাকারে", - "Group Display Name Field" : "গোষ্ঠীর প্রদর্শিতব্য নামের ক্ষেত্র", - "Base Group Tree" : "ভিত্তি গোষ্ঠী বৃক্ষাকারে", - "Group Search Attributes" : "গ্রুপ খোঁজার বৈশিষ্ট্য", - "Group-Member association" : "গোষ্ঠী-সদস্য সংস্থাপন", - "Nested Groups" : "একতাবদ্ধ গোষ্ঠিসমূহ", - "Special Attributes" : "বিশেষ বৈশিষ্ট্যসমূহ", - "Quota Field" : "কোটা", - "Quota Default" : "পূর্বনির্ধারিত কোটা", - "in bytes" : "বাইটে", - "Email Field" : "ইমেইল ক্ষেত্র", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "ব্যবহারকারী নামের জন্য ফাঁকা রাখুন (পূর্বনির্ধারিত)। অন্যথায়, LDAP/AD বৈশিষ্ট্য নির্ধারণ করুন।" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/bs.js b/apps/user_ldap/l10n/bs.js deleted file mode 100644 index a30255595fe..00000000000 --- a/apps/user_ldap/l10n/bs.js +++ /dev/null @@ -1,12 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "Korisnici", - "Groups" : "Grupe", - "Help" : "Pomoć", - "Port" : "Priključak", - "Password" : "Lozinka", - "Continue" : "Nastavi", - "Advanced" : "Napredno" -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_ldap/l10n/bs.json b/apps/user_ldap/l10n/bs.json deleted file mode 100644 index 3172f54cf89..00000000000 --- a/apps/user_ldap/l10n/bs.json +++ /dev/null @@ -1,10 +0,0 @@ -{ "translations": { - "Users" : "Korisnici", - "Groups" : "Grupe", - "Help" : "Pomoć", - "Port" : "Priključak", - "Password" : "Lozinka", - "Continue" : "Nastavi", - "Advanced" : "Napredno" -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ca.js b/apps/user_ldap/l10n/ca.js index 10063c7276a..f19ed3d3ef5 100644 --- a/apps/user_ldap/l10n/ca.js +++ b/apps/user_ldap/l10n/ca.js @@ -2,24 +2,25 @@ OC.L10N.register( "user_ldap", { "Failed to clear the mappings." : "No s’han pogut netejar les assignacions.", - "Failed to delete the server configuration" : "No s'han pogut suprimir els paràmetres del servidor", + "Failed to delete the server configuration" : "No s'han pogut suprimir la configuració del servidor", "Invalid configuration: Anonymous binding is not allowed." : "Configuració no vàlida: no es permet l'enllaç anònim.", "Valid configuration, connection established!" : "Configuració vàlida, connexió establerta!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuració vàlida, però no s'ha pogut enllaçar. Comproveu la configuració del servidor i les credencials.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuració no vàlida. Feu un cop d'ull als registres per obtenir més informació.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuració vàlida, però no s'ha pogut enllaçar. Comproveu els paràmetres del servidor i les credencials.", + "Invalid configuration: %s" : "Configuració no vàlida: %s", "No action specified" : "No heu especificat cap acció", "No configuration specified" : "No heu especificat cap configuració", "No data specified" : "No heu especificat cap dada", - " Could not set configuration %s" : "No s'ha pogut establir la configuració %s", + "Invalid data specified" : "Les dades especificades no són vàlides", + "Could not set configuration %1$s to %2$s" : "No s'ha pogut establir la configuració %1$s a %2$s", "Action does not exist" : "L'acció no existeix", - "Renewing …" : "Renovant ...", + "Renewing …" : "Renovant …", "Very weak password" : "Contrasenya massa feble", "Weak password" : "Contrasenya feble", "So-so password" : "Contrasenya passable", "Good password" : "Contrasenya bona", "Strong password" : "Contrasenya forta", "The Base DN appears to be wrong" : "El DN de base sembla estar equivocat", - "Testing configuration…" : "Probant configuració...", + "Testing configuration…" : "Probant configuració…", "Configuration incorrect" : "Configuració incorrecte", "Configuration incomplete" : "Configuració incompleta", "Configuration OK" : "Configuració correcte", @@ -27,41 +28,61 @@ OC.L10N.register( "Select object classes" : "Seleccioneu les classes dels objectes", "Please check the credentials, they seem to be wrong." : "Comproveu les credencials, semblen estar equivocades.", "Please specify the port, it could not be auto-detected." : "Especifiqueu el port, no s'ha pogut detectar automàticament.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no es pot detectar automàticament, reviseu les credencials, l'amfitrió i el port.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no es pot detectar automàticament, reviseu les credencials, el servidor i el port.", "Could not detect Base DN, please enter it manually." : "No s'ha pogut detectar Base DN, introduïu-lo manualment.", "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No s'ha trobat cap objecte a la Base DN donada. Reviseu.", - "More than 1,000 directory entries available." : "Hi ha més de 1.000 entrades de directoris disponibles.", + "More than 1,000 directory entries available." : "Hi ha més de 1.000 entrades de directori disponibles.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Hi ha {objectsFound} entrades disponibles al DN de base proporcionat","Hi ha {objectsFound} entrades disponibles al DN de base proporcionat"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Hi ha hagut un error. Comproveu la base DN, així com la configuració de connexió i les credencials.", - "Do you really want to delete the current Server Configuration?" : "Segur que voleu suprimir els paràmetres actuals del servidor?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Hi ha hagut un error. Comproveu la base DN, així com la paràmetres de connexió i les credencials.", + "Do you really want to delete the current Server Configuration?" : "Segur que voleu suprimir la Configuració actual del Servidor?", "Confirm Deletion" : "Confirma l'eliminació", "Mappings cleared successfully!" : "S'han netejat les assignacions amb èxit!", "Error while clearing the mappings." : "S'ha produït un error en eliminar les assignacions.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "L'enllaç anònim no està permès. Proporcioneu un DN d'usuari i contrasenya.", "LDAP Operations error. Anonymous bind might not be allowed." : "Error d'operacions LDAP. L'enllaç anònim no es pot permetre.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "S'ha produït un error en desar. Assegureu-vos que la base de dades està en Operació. Torneu a carregar abans de continuar.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Si canvieu el mode, activareu les consultes LDAP automàtiques. Depenent de la vostra mida LDAP, poden trigar una estona. Voleu canviar el mode?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Si canvieu el mode, habilitareu les consultes LDAP automàtiques. Depenent de la vostra mida LDAP, poden trigar una estona. Voleu canviar el mode?", "Mode switch" : "Canvia el mode", "Select attributes" : "Seleccioneu els atributs", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Usuari no trobat. Comproveu els vostres atributs d'inici de sessió i el vostre nom d'usuari. Filtre eficaç (per copiar i enganxar per a la validació de la línia de comandaments):<br/>", - "User found and settings verified." : "S'ha trobat l'usuari i s'ha verificat la configuració.", + "User found and settings verified." : "S'ha trobat l'usuari i s'han verificat els paràmetres.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Penseu a reduir la vostra cerca, ja que ha inclòs molts usuaris, només el primer dels quals podrà iniciar sessió.", - "An unspecified error occurred. Please check log and settings." : "S'ha produït un error no especificat. Verifiqueu el registre i la configuració.", + "An unspecified error occurred. Please check log and settings." : "S'ha produït un error no especificat. Verifiqueu el registre i els paràmetres.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtre de cerca no és vàlid, probablement a causa de problemes de sintaxi com el nombre impar de parèntesis oberts i tancats. Reviseu.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "S'ha produït un error de connexió a LDAP/AD. Comproveu el servidor, el port i les credencials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posició \"%uid\". Se substituirà pel nom d'inici de sessió en consultar LDAP/AD.", "Please provide a login name to test against" : "Proporcioneu un nom d'inici de sessió per provar-ho", - "Password change rejected. Hint: " : "El canvi de contrasenya s'ha rebutjat. Pista:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El quadre de grup s'ha desactivat perquè el servidor LDAP/AD no admet memberOf.", + "Password change rejected. Hint: %s" : "S'ha rebutjat el canvi de contrasenya. Pista: %s", + "Mandatory field \"%s\" left empty" : "El camp obligatori \"%s\" s'ha deixat buit", + "A password is given, but not an LDAP agent" : "Es dóna una contrasenya, però no un agent LDAP", + "No password is given for the user agent" : "No es dóna cap contrasenya per a l'agent d'usuari", + "No LDAP base DN was given" : "No s'ha donat cap DN base LDAP", + "User base DN is not a subnode of global base DN" : "El DN base d'usuari no és un subnode del DN base global", + "Group base DN is not a subnode of global base DN" : "El DN base del grup no és un subnode del DN base global", "Please login with the new password" : "Inicieu sessió amb la nova contrasenya", "LDAP User backend" : "Rerefons d'usuari LDAP", "Your password will expire tomorrow." : "La contrasenya caducarà demà.", "Your password will expire today." : "La contrasenya caducarà avui.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La vostra contrasenya expirarà en %n dies.","La vostra contrasenya expirarà d'aquí %n dies."], - "_%s group found_::_%s groups found_" : ["S'ha trobat %s grup","S'han trobat %s grups"], - "_%s user found_::_%s users found_" : ["S'ha trobat %s usuari","S'han trobat %s usuaris"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No s'ha pogut detectar l'atribut del nom de visualització de l'usuari. Si us plau, especifiqueu-vos a la configuració LDAP avançada.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La vostra contrasenya expirarà en %n dies.","La vostra contrasenya caducarà d'aquí %n dies."], + "LDAP/AD integration" : "Integració LDAP/AD", + "LDAP Connection" : "Connexió LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Ha fallat l'enllaç per a aquesta configuració LDAP: %s","Ha fallat l'enllaç per %n configuracions LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["No s'ha pogut cercar aquesta configuració LDAP: %s"," No s’han pogut cercar %n configuracions LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Hi ha una configuració LDAP inactiva: %s","Hi han %n configuracions LDAP inactives: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["L'enllaç i la cerca funciona a la connexió LDAP configurada (%s)","L’enllaç i la cerca funciona a totes les %n connexions LDAP configurades (%s)"], + "Invalid LDAP UUIDs" : "UUID no vàlid", + "None found" : "No s'ha trobat cap", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "S'han trobat UUID no vàlids de comptes o grups LDAP. Reviseu el vostre paràmetre d'\"Anul·lació de la detecció d'UUID\" a la part Expert de la configuració LDAP i utilitzeu \"occ ldap:update-uuid\" per actualitzar-los.", + "_%n group found_::_%n groups found_" : ["S'ha trobat %n grup","S’han trobat %n grups"], + "> 1000 groups found" : "> 1000 grups trobats", + "> 1000 users found" : "> 1000 usuaris trobats", + "_%n user found_::_%n users found_" : ["S'ha trobat %n usuari","S’han trobat %n usuaris"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No s'ha pogut detectar l'atribut del nom de visualització de l'usuari. Si us plau, especifiqueu-vos als paràmetres de LDAP avançats.", "Could not find the desired feature" : "La característica desitjada no s'ha trobat", - "Invalid Host" : "Ordinador central no vàlid", - "LDAP user and group backend" : "Usuari LDAP i grup de suport", + "Invalid Host" : "Servidor no vàlid", + "LDAP user and group backend" : "Usuari LDAP i grup de rerefons", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Aquesta aplicació permet als administradors connectar Nextcloud a un directori d'usuari basat en LDAP.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aquest aplicació permet als administradors connectar Nextcloud a un directori LDAP per autenticació i subministrament d'usuaris, grups i atributs d'usuari. Els administradors poden configurar aquesta aplicació per connectar a un o més directoris LDAP o ActiveDirectories (AD) a través de la interfície LDAP. Amb les consultes i filtres adequats es poden extreure i importar a Nextcloud atributs d'usuari com la quota, adreça de correu, avatar, pertinença a grups i més.\n\nUn usuari accedeix a Nextcloud amb les seves credencials LDAP o AD, i rep accés gràcies a l'autenticació gestionada pel servidor LDAP / AD. Nextcloud en cap moment emmagatzema la contrasenya LDAP o AD, ans al contrari, un cop l'usuari s'ha identificat correctament Nextcloud emprarà variables de sessió per desar només el ID de l'usuari. Podeu trobar més informació a la documentació sobre gestió d'usuaris i grups LDAP.", "Test Configuration" : "Comprovació de la configuració", @@ -72,21 +93,25 @@ OC.L10N.register( "Search groups" : "Buscar grups", "Available groups" : "Grups disponibles", "Selected groups" : "Grups seleccionats", - "Edit LDAP Query" : "Editeu la consulta LDAP", + "Edit LDAP Query" : "Edició de la consulta LDAP", "LDAP Filter:" : "Filtre LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtre especifica quins grups LDAP haurien de tenir accés a la instància %s.", - "Verify settings and count the groups" : "Comprova la configuració i compta els grups", - "When logging in, %s will find the user based on the following attributes:" : "Quan s'accedeixi, %s cercarà l'usuari segons aquests atributs:", + "Verify settings and count the groups" : "Comprova els paràmetres i compta els grups", + "When logging in, %s will find the user based on the following attributes:" : "Quan s'accedeixi, %s trobarà l'usuari segons aquests atributs:", + "LDAP/AD Username:" : "Nom d'usuari LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permet inici de sessió amb el nom d'usuari LDAP/AD, que és \"uid\" o \"sAMAccountName\" i es detectarà.", + "LDAP/AD Email Address:" : "Adreça de correu electrònic LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permet l'inici de sessió emprant l'atribut adreça de correu. S'accepten \"mail\" i \"mailPrimaryAddress\" .", "Other Attributes:" : "Altres atributs:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defineix el filtre a aplicar quan s'inicia sessió. \"%%uid\" reemplaça el nom d'usuari en l'acció d'identificar-se. Exemple \"uid=%%uid\"", "Test Loginname" : "Nom d'usuari de prova", - "Verify settings" : "Comprova la configuració", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta rebre un DN per al nom d'inici de sessió donat i el filtre d'inici de sessió actual", + "Verify settings" : "Comprova els paràmetres", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Afegeix una nova configuració", - "Copy current configuration into new directory binding" : "Copia l'actual configuració en la nova connexió", - "Delete the current configuration" : "Esborra la configuració actual", - "Host" : "Equip remot", + "Copy current configuration into new directory binding" : "Copia l'actual configuració en la nova connexió al directori", + "Delete the current configuration" : "Suprimeix la configuració actual", + "Host" : "Servidor", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Podeu ometre el protocol, si no requeriu SSL. Si ho requeriu llavors comenceu amb ldaps://", "Port" : "Port", "Detect Port" : "Detecta port", @@ -101,16 +126,16 @@ OC.L10N.register( "Test Base DN" : "Prova el DN de base", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticions LDAP automàtiques. És millor per configuracions grans, però requereix tenir certs coneixements de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introducció manual de filtres LDAP (recomanat per a directoris grans)", - "Listing and searching for users is constrained by these criteria:" : "La consulta i cerca per part dels usuaris és restringida pels següents criteris:", + "Listing and searching for users is constrained by these criteria:" : "Llistat i cerca per part dels usuaris és restringida pels següents criteris:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classes d'objectes més comunes pels usuaris són organizationalPerson, person, user, i inetOrgPerson. Si no esteu segurs de quina classe d'objecte escollir llavors consulteu el vostre administrador de directori.", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtre especifica quins usuaris LDAP haurien de tenir accés a la instància %s", - "Verify settings and count users" : "Verifica configuracions i compta usuaris", - "Saving" : "Desant...", + "The filter specifies which LDAP users shall have access to the %s instance." : "El filtre especifica quins usuaris LDAP haurien de tenir accés a la instància %s.", + "Verify settings and count users" : "Verifica paràmetres i compta usuaris", + "Saving" : "S'està desant", "Back" : "Enrere", "Continue" : "Continua", "Please renew your password." : "Heu de renovar la vostra contrasenya.", "An internal error occurred." : "Hi ha hagut un error intern inesperat.", - "Please try again or contact your administrator." : "Proveu un altre cop o contacteu al vostre administrador.", + "Please try again or contact your administrator." : "Torneu-ho a provar o contacteu al vostre administrador.", "Current password" : "Contrasenya actual", "New password" : "Nova contrasenya", "Renew password" : "Renova la contrasenya", @@ -118,77 +143,96 @@ OC.L10N.register( "Cancel" : "Cancel·la", "Server" : "Servidor", "Users" : "Usuaris", - "Login Attributes" : "Atributs d'accés", + "Login Attributes" : "Atributs d'inici de sessió", "Groups" : "Grups", "Expert" : "Expert", "Advanced" : "Avançat", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avís:</b> El mòdul PHP LDAP no està instal·lat, el dorsal no funcionarà. Demaneu a l'administrador del sistema que l'instal·li.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avís:</b> El mòdul PHP LDAP no està instal·lat, el rerefons no funcionarà. Demaneu a l'administrador del sistema que l'instal·li.", "Connection Settings" : "Paràmetres de connexió", "Configuration Active" : "Configuració activa", "When unchecked, this configuration will be skipped." : "Si està desmarcat, aquesta configuració s'ometrà.", - "Backup (Replica) Host" : "Màquina de còpia de serguretat (rèplica)", + "Backup (Replica) Host" : "Servidor de còpia de seguretat (rèplica)", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Afegiu una màquina de còpia de seguretat opcional. Ha de ser una rèplica del servidor LDAP/AD principal.", "Backup (Replica) Port" : "Port de la còpia de seguretat (rèplica)", - "Disable Main Server" : "Desactiva el servidor principal", + "Disable Main Server" : "Inhabilita el servidor principal", "Only connect to the replica server." : "Connecta només al servidor rèplica.", "Turn off SSL certificate validation." : "Desactiva la validació de certificat SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No es recomana, useu-ho només com a prova! Importeu el certificat SSL del servidor LDAP al servidor %s només si la connexió funciona amb aquesta opció.", "Cache Time-To-Live" : "Memòria cau Time-To-Live", "in seconds. A change empties the cache." : "en segons. Un canvi buidarà la memòria cau.", - "Directory Settings" : "Configuracio de carpetes", + "Directory Settings" : "Paràmetres de carpetes", "User Display Name Field" : "Camp per mostrar el nom d'usuari", "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP a usar per generar el nom a mostrar de l'usuari.", "2nd User Display Name Field" : "Camp del 2n nom d'usuari a mostrar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atribut LDAP per ser afegit al nom a mostrar entre parèntesis. Esdevé en quelcom així: »Oriol Junqueras (oriol.junqueras@exemple.cat)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atribut LDAP per ser afegit al nom a mostrar entre parèntesis. Esdevé en quelcom així: »Oriol Mas (oriol.mas@exemple.cat)«.", "Base User Tree" : "Arbre base d'usuaris", "One User Base DN per line" : "Una DN Base d'Usuari per línia", "User Search Attributes" : "Atributs de cerca d'usuari", "Optional; one attribute per line" : "Opcional; Un atribut per línia", + "Disable users missing from LDAP" : "Inhabilita els usuaris que falten a LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quan estigui activat, es desactivaran els usuaris importats des de LDAP que després faltin", "Group Display Name Field" : "Camp per mostrar el nom del grup", "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP a usar per generar el nom a mostrar del grup.", "Base Group Tree" : "Arbre base de grups", "One Group Base DN per line" : "Una DN Base de Grup per línia", "Group Search Attributes" : "Atributs de cerca de grup", "Group-Member association" : "Associació membres-grup", - "Dynamic Group Member URL" : "URL del Dynamic Group Member", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atribut LDAP que en objectes de Grup conté un URL de cerca LDAP que determina quins objectes pertanyen al grup. (Si es deixa en blanc es desactiva la funcionalitat de pertinença dinàmica a grups)", + "Dynamic Group Member URL" : "URL del Membre de Grup Dinàmic", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atribut LDAP que en objectes de Grup conté un URL de cerca LDAP que determina quins objectes pertanyen al grup. (Si es deixa el paràmetre en blanc es desactiva la funcionalitat de pertinença dinàmica a grups)", "Nested Groups" : "Grups imbricats", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quan està activat, els grups que contenen grups estan permesos. (Només funciona si l'atribut del grup membre conté DNs.)", "Paging chunksize" : "Mida de la pàgina", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mida usada per cerques LDAP paginades que podrien retornar respostes de volcat com enumeració d'usuari o grup. (Establint-ho a 0 desactiva les cerques LDAP paginades en aquestes situacions.)", - "Enable LDAP password changes per user" : "Activa el canvi de contrasenya LDAP pels usuaris", + "Enable LDAP password changes per user" : "Habilita el canvi de contrasenya LDAP pels usuaris", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permet als usuaris LDAP canviar la seva contrasenya i permet als Súper administradors i Administradors de grup canviar les contrasenyes dels seus usuaris LDAP. Només funciona quan les polítiques del control d'accés es configuren de igual manera al servidor LDAP. Com les contrasenyes s'envien en text pla (no xifrat) al servidor LDAP, s'ha d'usar transport xifrat i s'hauria de configurar el servidor LDAP per usar resum de contrasenyes (\"hashing\").", "(New password is sent as plain text to LDAP)" : "(La nova contrasenya s'envia com a text pla al servidor LDAP)", - "Default password policy DN" : "DN de la política de contrasenya predeterminada", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN d'una política de contrasenya predeterminada que serà emprada per a la gestió de la caducitat de contrasenyes. Només funciona quan està activat el canvi de contrasenyes per part dels usuaris i només és compatible amb OpenLDAP. Deixeu buit aquest camp per desactivar aquesta gestió de contrasenyes caducades.", + "Default password policy DN" : "DN de la política de contrasenya per defecte", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN d'una política de contrasenya predeterminada que serà emprada per a la gestió de la caducitat de contrasenyes. Només funciona quan està habilitat el canvi de contrasenyes per part dels usuaris i només és compatible amb OpenLDAP. Deixeu buit aquest camp per desactivar aquesta gestió de contrasenyes caducades.", "Special Attributes" : "Atributs especials", "Quota Field" : "Camp de quota", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixeu buit per usar la quota predeterminada pels usuaris, O si no, indiqueu un atribut LDAP/AD.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixeu buit per usar la quota per defecte pels usuaris, O si no, indiqueu un atribut LDAP/AD.", "Quota Default" : "Quota per defecte", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobreescriu la quota predeterminada pels usuaris LDAP que no tenen una quota establerta en el camp Quota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobreescriu la quota per defecte pels usuaris LDAP que no tenen una quota establerta en el camp Quota.", "Email Field" : "Camp de correu electrònic", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Estableix l'adreça de correu a partir del seu atribut LDAP. Deixeu buit pel comportament predeterminat.", "User Home Folder Naming Rule" : "Norma per anomenar la carpeta arrel d'usuari", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixar buit pel nom d'usuari (per defecte). Altrament, especificar un atribut LDAP/AD.", - "\"$home\" Placeholder Field" : "Camp de text variable per \"$home\" ", + "\"$home\" Placeholder Field" : "Camp de marcador de posició \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "En la configuració d'un emmagatzematge extern es reemplaçarà $home amb el valor de l'atribut especificat", + "User Profile Attributes" : "Atributs del perfil d'usuari", + "Phone Field" : "Camp de telèfon", + "User profile Phone will be set from the specified attribute" : "Perfil d'usuari El telèfon s'establirà a partir de l'atribut especificat", + "Website Field" : "Camp del lloc web", + "User profile Website will be set from the specified attribute" : "Perfil d'usuari Lloc web s'establirà a partir de l'atribut especificat", + "Address Field" : "Camp d’adreça", + "User profile Address will be set from the specified attribute" : "Perfil d'usuari L'adreça s'establirà a partir de l'atribut especificat", + "Twitter Field" : "Camp de Twitter", + "User profile Twitter will be set from the specified attribute" : "El perfil d'usuari de Twitter s'establirà a partir de l'atribut especificat", + "Fediverse Field" : "Camp Fediverse", + "User profile Fediverse will be set from the specified attribute" : "El perfil d'usuari Fediverse s'establirà a partir de l'atribut especificat", + "Organisation Field" : "Camp de l'organització", + "User profile Organisation will be set from the specified attribute" : "Organització del Perfil d'usuari s'establirà a partir de l'atribut especificat", + "Role Field" : "Camp de rol", + "User profile Role will be set from the specified attribute" : "El rol del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Headline Field" : "Camp de titular", + "User profile Headline will be set from the specified attribute" : "El títol del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Biography Field" : "Camp de Biografia", + "User profile Biography will be set from the specified attribute" : "La biografia del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Birthdate Field" : "Camp de data de naixement", + "User profile Date of birth will be set from the specified attribute" : "La Data de naixement al perfil d’usuari s'establirà a partir de l'atribut especificat", + "Pronouns Field" : "Camp de pronoms", + "User profile Pronouns will be set from the specified attribute" : "Els pronoms al Perfil d’usuari s’establiran a partir de l'atribut especificat", "Internal Username" : "Nom d'usuari intern", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Per defecte, el nom d'usuari intern es crearà a partir de l'atribut UUID. S'assegura que el nom d'usuari és únic i que els caràcters no s'han de convertir. El nom d'usuari intern té la restricció que només es permeten aquests caràcters: [a-zA-Z0-9_.@-]. Altres caràcters es substitueixen per la seva correspondència ASCII o simplement s'ometen. En les col·lisions, s'afegirà/augmentarà un nombre. El nom d'usuari intern s'utilitza per identificar un usuari internament. També és el nom per defecte de la carpeta d'inici de l'usuari. També forma part dels URL remots, per exemple, per a tots els serveis DAV. Amb aquest paràmetre, es pot anul·lar el comportament per defecte. Els canvis només tindran efecte en els usuaris LDAP (afegits) recentment assignats. Deixeu-lo buit per al comportament per defecte.", "Internal Username Attribute:" : "Atribut nom d'usuari intern:", "Override UUID detection" : "Sobrescriu la detecció UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defecte, owncloud autodetecta l'atribut UUID. L'atribut UUID s'utilitza per identificar usuaris i grups de forma indubtable. També el nom d'usuari intern es crearà en base a la UUIS, si no heu especificat res diferent a dalt. Podeu sobreescriure l'arranjament i passar l'atribut que desitgeu. Heu d'assegurar-vos que l'atribut que escolliu pot ser recollit tant pels usuaris com pels grups i que és únic. Deixeu-ho en blanc si preferiu el comportament per defecte. els canvis s'aplicaran als usuaris i grups LDAP mapats de nou (afegits).", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defecte, owncloud autodetecta l'atribut UUID. L'atribut UUID s'utilitza per identificar usuaris i grups automàticament. També el nom d'usuari intern es crearà en base a la UUID, si no heu especificat res diferent a dalt. Podeu sobreescriure el paràmetre i passar l'atribut que desitgeu. Heu d'assegurar-vos que l'atribut que escolliu pot ser recollit tant pels usuaris com pels grups i que és únic. Deixeu-ho en blanc si preferiu el comportament per defecte. els canvis s'aplicaran als usuaris i grups LDAP mapats de nou (afegits).", "UUID Attribute for Users:" : "Atribut UUID per Usuaris:", "UUID Attribute for Groups:" : "Atribut UUID per Grups:", "Username-LDAP User Mapping" : "Mapatge d'usuari Nom d'usuari-LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Els noms d'usuari son emprats per emmagatzemar i assignar metadades. Per tal d'identificar i reconèixer amb precisió als usuaris, cada usuari LDAP té un nom d'usuari intern. Això requereix una assignació de noms d'usuari interns per a cada un dels usuaris LDAP. Al nom d'usuari creat s'assigna el UUID de l'usuari LDAP. A més el DN es guarda en memòria cau per a reduir la interacció amb LDAP, però no s'utilitza per a identificació. Si el DN canvia, es trobaran els canvis. El nom d'usuari intern s'utilitza arreu. Netejar el mapa d'assignacions deixaria restes per totes bandes. Netejar el mapa d'assignacions no és que sigui sensible a la configuració, sinó que afecta a totes les configuracions LDAP! Mai netegeu el mapa d'assignacions en un entorn de producció, només en escenaris de proves o experimentals.", "Clear Username-LDAP User Mapping" : "Elimina el mapatge d'usuari Nom d'usuari-LDAP", "Clear Groupname-LDAP Group Mapping" : "Suprimeix el mapatge de grup Nom de grup-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "S'ha produït un error de connexió a LDAP / AD, consulteu l'amfitrió, el port i les credencials.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el text variable \"%u id\". Es reemplaçarà amb el nom d'usuari quan consulteu LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El quadre del grup s'ha desactivat, perquè el servidor LDAP / AD no admet memberOf.", - "LDAP / AD integration" : "Integració LDAP / AD", - "LDAP / AD Username:" : "Usuari LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permet l'inici de sessió emprant el nom d'usuari LDAP / AD, que és \"uid\" o bé \"sAMAccountName\" i serà detectat.", - "LDAP / AD Email Address:" : "Adreça de correu LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defecte el nom d'usuari intern es crearà a partir de l'atribut UUID. Això assegura que el nom d'usuari sigui únic i que no calgui conversió de caràcters. El nom d'usuari intern té com a restricció que només es permeten aquests caràcters: [ a-zA-Z0-9_.@- ]. Altres caràcters són reemplaçats amb la seva correspondència ASCII o bé s'ometen. Si hi coincidència amb un altre usuari existent llavors s'afegeix o incrementa un número al final. El nom d'usuari intern s'usa per a identificar a un usuari internament. Alhora que és el nom predeterminat per la carpeta de l'usuari. També forma part de URLs per a ús remot, per exemple pels serveis *DAV (webDAV, etc...). Amb aquest atribut, es pot sobreescriure el comportament predeterminat. Deixeu-lo buit per assumir el comportament predeterminat. Els canvis només tindran efecte quan s'afegeixin/assignin nous usuaris LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Configuració no vàlida. Feu un cop d'ull als registres per obtenir més informació." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ca.json b/apps/user_ldap/l10n/ca.json index a55dc716219..86c945a684b 100644 --- a/apps/user_ldap/l10n/ca.json +++ b/apps/user_ldap/l10n/ca.json @@ -1,23 +1,24 @@ { "translations": { "Failed to clear the mappings." : "No s’han pogut netejar les assignacions.", - "Failed to delete the server configuration" : "No s'han pogut suprimir els paràmetres del servidor", + "Failed to delete the server configuration" : "No s'han pogut suprimir la configuració del servidor", "Invalid configuration: Anonymous binding is not allowed." : "Configuració no vàlida: no es permet l'enllaç anònim.", "Valid configuration, connection established!" : "Configuració vàlida, connexió establerta!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuració vàlida, però no s'ha pogut enllaçar. Comproveu la configuració del servidor i les credencials.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuració no vàlida. Feu un cop d'ull als registres per obtenir més informació.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuració vàlida, però no s'ha pogut enllaçar. Comproveu els paràmetres del servidor i les credencials.", + "Invalid configuration: %s" : "Configuració no vàlida: %s", "No action specified" : "No heu especificat cap acció", "No configuration specified" : "No heu especificat cap configuració", "No data specified" : "No heu especificat cap dada", - " Could not set configuration %s" : "No s'ha pogut establir la configuració %s", + "Invalid data specified" : "Les dades especificades no són vàlides", + "Could not set configuration %1$s to %2$s" : "No s'ha pogut establir la configuració %1$s a %2$s", "Action does not exist" : "L'acció no existeix", - "Renewing …" : "Renovant ...", + "Renewing …" : "Renovant …", "Very weak password" : "Contrasenya massa feble", "Weak password" : "Contrasenya feble", "So-so password" : "Contrasenya passable", "Good password" : "Contrasenya bona", "Strong password" : "Contrasenya forta", "The Base DN appears to be wrong" : "El DN de base sembla estar equivocat", - "Testing configuration…" : "Probant configuració...", + "Testing configuration…" : "Probant configuració…", "Configuration incorrect" : "Configuració incorrecte", "Configuration incomplete" : "Configuració incompleta", "Configuration OK" : "Configuració correcte", @@ -25,41 +26,61 @@ "Select object classes" : "Seleccioneu les classes dels objectes", "Please check the credentials, they seem to be wrong." : "Comproveu les credencials, semblen estar equivocades.", "Please specify the port, it could not be auto-detected." : "Especifiqueu el port, no s'ha pogut detectar automàticament.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no es pot detectar automàticament, reviseu les credencials, l'amfitrió i el port.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no es pot detectar automàticament, reviseu les credencials, el servidor i el port.", "Could not detect Base DN, please enter it manually." : "No s'ha pogut detectar Base DN, introduïu-lo manualment.", "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No s'ha trobat cap objecte a la Base DN donada. Reviseu.", - "More than 1,000 directory entries available." : "Hi ha més de 1.000 entrades de directoris disponibles.", + "More than 1,000 directory entries available." : "Hi ha més de 1.000 entrades de directori disponibles.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Hi ha {objectsFound} entrades disponibles al DN de base proporcionat","Hi ha {objectsFound} entrades disponibles al DN de base proporcionat"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Hi ha hagut un error. Comproveu la base DN, així com la configuració de connexió i les credencials.", - "Do you really want to delete the current Server Configuration?" : "Segur que voleu suprimir els paràmetres actuals del servidor?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Hi ha hagut un error. Comproveu la base DN, així com la paràmetres de connexió i les credencials.", + "Do you really want to delete the current Server Configuration?" : "Segur que voleu suprimir la Configuració actual del Servidor?", "Confirm Deletion" : "Confirma l'eliminació", "Mappings cleared successfully!" : "S'han netejat les assignacions amb èxit!", "Error while clearing the mappings." : "S'ha produït un error en eliminar les assignacions.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "L'enllaç anònim no està permès. Proporcioneu un DN d'usuari i contrasenya.", "LDAP Operations error. Anonymous bind might not be allowed." : "Error d'operacions LDAP. L'enllaç anònim no es pot permetre.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "S'ha produït un error en desar. Assegureu-vos que la base de dades està en Operació. Torneu a carregar abans de continuar.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Si canvieu el mode, activareu les consultes LDAP automàtiques. Depenent de la vostra mida LDAP, poden trigar una estona. Voleu canviar el mode?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Si canvieu el mode, habilitareu les consultes LDAP automàtiques. Depenent de la vostra mida LDAP, poden trigar una estona. Voleu canviar el mode?", "Mode switch" : "Canvia el mode", "Select attributes" : "Seleccioneu els atributs", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Usuari no trobat. Comproveu els vostres atributs d'inici de sessió i el vostre nom d'usuari. Filtre eficaç (per copiar i enganxar per a la validació de la línia de comandaments):<br/>", - "User found and settings verified." : "S'ha trobat l'usuari i s'ha verificat la configuració.", + "User found and settings verified." : "S'ha trobat l'usuari i s'han verificat els paràmetres.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Penseu a reduir la vostra cerca, ja que ha inclòs molts usuaris, només el primer dels quals podrà iniciar sessió.", - "An unspecified error occurred. Please check log and settings." : "S'ha produït un error no especificat. Verifiqueu el registre i la configuració.", + "An unspecified error occurred. Please check log and settings." : "S'ha produït un error no especificat. Verifiqueu el registre i els paràmetres.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtre de cerca no és vàlid, probablement a causa de problemes de sintaxi com el nombre impar de parèntesis oberts i tancats. Reviseu.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "S'ha produït un error de connexió a LDAP/AD. Comproveu el servidor, el port i les credencials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posició \"%uid\". Se substituirà pel nom d'inici de sessió en consultar LDAP/AD.", "Please provide a login name to test against" : "Proporcioneu un nom d'inici de sessió per provar-ho", - "Password change rejected. Hint: " : "El canvi de contrasenya s'ha rebutjat. Pista:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El quadre de grup s'ha desactivat perquè el servidor LDAP/AD no admet memberOf.", + "Password change rejected. Hint: %s" : "S'ha rebutjat el canvi de contrasenya. Pista: %s", + "Mandatory field \"%s\" left empty" : "El camp obligatori \"%s\" s'ha deixat buit", + "A password is given, but not an LDAP agent" : "Es dóna una contrasenya, però no un agent LDAP", + "No password is given for the user agent" : "No es dóna cap contrasenya per a l'agent d'usuari", + "No LDAP base DN was given" : "No s'ha donat cap DN base LDAP", + "User base DN is not a subnode of global base DN" : "El DN base d'usuari no és un subnode del DN base global", + "Group base DN is not a subnode of global base DN" : "El DN base del grup no és un subnode del DN base global", "Please login with the new password" : "Inicieu sessió amb la nova contrasenya", "LDAP User backend" : "Rerefons d'usuari LDAP", "Your password will expire tomorrow." : "La contrasenya caducarà demà.", "Your password will expire today." : "La contrasenya caducarà avui.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La vostra contrasenya expirarà en %n dies.","La vostra contrasenya expirarà d'aquí %n dies."], - "_%s group found_::_%s groups found_" : ["S'ha trobat %s grup","S'han trobat %s grups"], - "_%s user found_::_%s users found_" : ["S'ha trobat %s usuari","S'han trobat %s usuaris"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No s'ha pogut detectar l'atribut del nom de visualització de l'usuari. Si us plau, especifiqueu-vos a la configuració LDAP avançada.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La vostra contrasenya expirarà en %n dies.","La vostra contrasenya caducarà d'aquí %n dies."], + "LDAP/AD integration" : "Integració LDAP/AD", + "LDAP Connection" : "Connexió LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Ha fallat l'enllaç per a aquesta configuració LDAP: %s","Ha fallat l'enllaç per %n configuracions LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["No s'ha pogut cercar aquesta configuració LDAP: %s"," No s’han pogut cercar %n configuracions LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Hi ha una configuració LDAP inactiva: %s","Hi han %n configuracions LDAP inactives: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["L'enllaç i la cerca funciona a la connexió LDAP configurada (%s)","L’enllaç i la cerca funciona a totes les %n connexions LDAP configurades (%s)"], + "Invalid LDAP UUIDs" : "UUID no vàlid", + "None found" : "No s'ha trobat cap", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "S'han trobat UUID no vàlids de comptes o grups LDAP. Reviseu el vostre paràmetre d'\"Anul·lació de la detecció d'UUID\" a la part Expert de la configuració LDAP i utilitzeu \"occ ldap:update-uuid\" per actualitzar-los.", + "_%n group found_::_%n groups found_" : ["S'ha trobat %n grup","S’han trobat %n grups"], + "> 1000 groups found" : "> 1000 grups trobats", + "> 1000 users found" : "> 1000 usuaris trobats", + "_%n user found_::_%n users found_" : ["S'ha trobat %n usuari","S’han trobat %n usuaris"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No s'ha pogut detectar l'atribut del nom de visualització de l'usuari. Si us plau, especifiqueu-vos als paràmetres de LDAP avançats.", "Could not find the desired feature" : "La característica desitjada no s'ha trobat", - "Invalid Host" : "Ordinador central no vàlid", - "LDAP user and group backend" : "Usuari LDAP i grup de suport", + "Invalid Host" : "Servidor no vàlid", + "LDAP user and group backend" : "Usuari LDAP i grup de rerefons", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Aquesta aplicació permet als administradors connectar Nextcloud a un directori d'usuari basat en LDAP.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aquest aplicació permet als administradors connectar Nextcloud a un directori LDAP per autenticació i subministrament d'usuaris, grups i atributs d'usuari. Els administradors poden configurar aquesta aplicació per connectar a un o més directoris LDAP o ActiveDirectories (AD) a través de la interfície LDAP. Amb les consultes i filtres adequats es poden extreure i importar a Nextcloud atributs d'usuari com la quota, adreça de correu, avatar, pertinença a grups i més.\n\nUn usuari accedeix a Nextcloud amb les seves credencials LDAP o AD, i rep accés gràcies a l'autenticació gestionada pel servidor LDAP / AD. Nextcloud en cap moment emmagatzema la contrasenya LDAP o AD, ans al contrari, un cop l'usuari s'ha identificat correctament Nextcloud emprarà variables de sessió per desar només el ID de l'usuari. Podeu trobar més informació a la documentació sobre gestió d'usuaris i grups LDAP.", "Test Configuration" : "Comprovació de la configuració", @@ -70,21 +91,25 @@ "Search groups" : "Buscar grups", "Available groups" : "Grups disponibles", "Selected groups" : "Grups seleccionats", - "Edit LDAP Query" : "Editeu la consulta LDAP", + "Edit LDAP Query" : "Edició de la consulta LDAP", "LDAP Filter:" : "Filtre LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtre especifica quins grups LDAP haurien de tenir accés a la instància %s.", - "Verify settings and count the groups" : "Comprova la configuració i compta els grups", - "When logging in, %s will find the user based on the following attributes:" : "Quan s'accedeixi, %s cercarà l'usuari segons aquests atributs:", + "Verify settings and count the groups" : "Comprova els paràmetres i compta els grups", + "When logging in, %s will find the user based on the following attributes:" : "Quan s'accedeixi, %s trobarà l'usuari segons aquests atributs:", + "LDAP/AD Username:" : "Nom d'usuari LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permet inici de sessió amb el nom d'usuari LDAP/AD, que és \"uid\" o \"sAMAccountName\" i es detectarà.", + "LDAP/AD Email Address:" : "Adreça de correu electrònic LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permet l'inici de sessió emprant l'atribut adreça de correu. S'accepten \"mail\" i \"mailPrimaryAddress\" .", "Other Attributes:" : "Altres atributs:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defineix el filtre a aplicar quan s'inicia sessió. \"%%uid\" reemplaça el nom d'usuari en l'acció d'identificar-se. Exemple \"uid=%%uid\"", "Test Loginname" : "Nom d'usuari de prova", - "Verify settings" : "Comprova la configuració", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta rebre un DN per al nom d'inici de sessió donat i el filtre d'inici de sessió actual", + "Verify settings" : "Comprova els paràmetres", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Afegeix una nova configuració", - "Copy current configuration into new directory binding" : "Copia l'actual configuració en la nova connexió", - "Delete the current configuration" : "Esborra la configuració actual", - "Host" : "Equip remot", + "Copy current configuration into new directory binding" : "Copia l'actual configuració en la nova connexió al directori", + "Delete the current configuration" : "Suprimeix la configuració actual", + "Host" : "Servidor", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Podeu ometre el protocol, si no requeriu SSL. Si ho requeriu llavors comenceu amb ldaps://", "Port" : "Port", "Detect Port" : "Detecta port", @@ -99,16 +124,16 @@ "Test Base DN" : "Prova el DN de base", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticions LDAP automàtiques. És millor per configuracions grans, però requereix tenir certs coneixements de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introducció manual de filtres LDAP (recomanat per a directoris grans)", - "Listing and searching for users is constrained by these criteria:" : "La consulta i cerca per part dels usuaris és restringida pels següents criteris:", + "Listing and searching for users is constrained by these criteria:" : "Llistat i cerca per part dels usuaris és restringida pels següents criteris:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classes d'objectes més comunes pels usuaris són organizationalPerson, person, user, i inetOrgPerson. Si no esteu segurs de quina classe d'objecte escollir llavors consulteu el vostre administrador de directori.", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtre especifica quins usuaris LDAP haurien de tenir accés a la instància %s", - "Verify settings and count users" : "Verifica configuracions i compta usuaris", - "Saving" : "Desant...", + "The filter specifies which LDAP users shall have access to the %s instance." : "El filtre especifica quins usuaris LDAP haurien de tenir accés a la instància %s.", + "Verify settings and count users" : "Verifica paràmetres i compta usuaris", + "Saving" : "S'està desant", "Back" : "Enrere", "Continue" : "Continua", "Please renew your password." : "Heu de renovar la vostra contrasenya.", "An internal error occurred." : "Hi ha hagut un error intern inesperat.", - "Please try again or contact your administrator." : "Proveu un altre cop o contacteu al vostre administrador.", + "Please try again or contact your administrator." : "Torneu-ho a provar o contacteu al vostre administrador.", "Current password" : "Contrasenya actual", "New password" : "Nova contrasenya", "Renew password" : "Renova la contrasenya", @@ -116,77 +141,96 @@ "Cancel" : "Cancel·la", "Server" : "Servidor", "Users" : "Usuaris", - "Login Attributes" : "Atributs d'accés", + "Login Attributes" : "Atributs d'inici de sessió", "Groups" : "Grups", "Expert" : "Expert", "Advanced" : "Avançat", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avís:</b> El mòdul PHP LDAP no està instal·lat, el dorsal no funcionarà. Demaneu a l'administrador del sistema que l'instal·li.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Avís:</b> El mòdul PHP LDAP no està instal·lat, el rerefons no funcionarà. Demaneu a l'administrador del sistema que l'instal·li.", "Connection Settings" : "Paràmetres de connexió", "Configuration Active" : "Configuració activa", "When unchecked, this configuration will be skipped." : "Si està desmarcat, aquesta configuració s'ometrà.", - "Backup (Replica) Host" : "Màquina de còpia de serguretat (rèplica)", + "Backup (Replica) Host" : "Servidor de còpia de seguretat (rèplica)", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Afegiu una màquina de còpia de seguretat opcional. Ha de ser una rèplica del servidor LDAP/AD principal.", "Backup (Replica) Port" : "Port de la còpia de seguretat (rèplica)", - "Disable Main Server" : "Desactiva el servidor principal", + "Disable Main Server" : "Inhabilita el servidor principal", "Only connect to the replica server." : "Connecta només al servidor rèplica.", "Turn off SSL certificate validation." : "Desactiva la validació de certificat SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No es recomana, useu-ho només com a prova! Importeu el certificat SSL del servidor LDAP al servidor %s només si la connexió funciona amb aquesta opció.", "Cache Time-To-Live" : "Memòria cau Time-To-Live", "in seconds. A change empties the cache." : "en segons. Un canvi buidarà la memòria cau.", - "Directory Settings" : "Configuracio de carpetes", + "Directory Settings" : "Paràmetres de carpetes", "User Display Name Field" : "Camp per mostrar el nom d'usuari", "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP a usar per generar el nom a mostrar de l'usuari.", "2nd User Display Name Field" : "Camp del 2n nom d'usuari a mostrar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atribut LDAP per ser afegit al nom a mostrar entre parèntesis. Esdevé en quelcom així: »Oriol Junqueras (oriol.junqueras@exemple.cat)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atribut LDAP per ser afegit al nom a mostrar entre parèntesis. Esdevé en quelcom així: »Oriol Mas (oriol.mas@exemple.cat)«.", "Base User Tree" : "Arbre base d'usuaris", "One User Base DN per line" : "Una DN Base d'Usuari per línia", "User Search Attributes" : "Atributs de cerca d'usuari", "Optional; one attribute per line" : "Opcional; Un atribut per línia", + "Disable users missing from LDAP" : "Inhabilita els usuaris que falten a LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quan estigui activat, es desactivaran els usuaris importats des de LDAP que després faltin", "Group Display Name Field" : "Camp per mostrar el nom del grup", "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP a usar per generar el nom a mostrar del grup.", "Base Group Tree" : "Arbre base de grups", "One Group Base DN per line" : "Una DN Base de Grup per línia", "Group Search Attributes" : "Atributs de cerca de grup", "Group-Member association" : "Associació membres-grup", - "Dynamic Group Member URL" : "URL del Dynamic Group Member", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atribut LDAP que en objectes de Grup conté un URL de cerca LDAP que determina quins objectes pertanyen al grup. (Si es deixa en blanc es desactiva la funcionalitat de pertinença dinàmica a grups)", + "Dynamic Group Member URL" : "URL del Membre de Grup Dinàmic", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atribut LDAP que en objectes de Grup conté un URL de cerca LDAP que determina quins objectes pertanyen al grup. (Si es deixa el paràmetre en blanc es desactiva la funcionalitat de pertinença dinàmica a grups)", "Nested Groups" : "Grups imbricats", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quan està activat, els grups que contenen grups estan permesos. (Només funciona si l'atribut del grup membre conté DNs.)", "Paging chunksize" : "Mida de la pàgina", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mida usada per cerques LDAP paginades que podrien retornar respostes de volcat com enumeració d'usuari o grup. (Establint-ho a 0 desactiva les cerques LDAP paginades en aquestes situacions.)", - "Enable LDAP password changes per user" : "Activa el canvi de contrasenya LDAP pels usuaris", + "Enable LDAP password changes per user" : "Habilita el canvi de contrasenya LDAP pels usuaris", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permet als usuaris LDAP canviar la seva contrasenya i permet als Súper administradors i Administradors de grup canviar les contrasenyes dels seus usuaris LDAP. Només funciona quan les polítiques del control d'accés es configuren de igual manera al servidor LDAP. Com les contrasenyes s'envien en text pla (no xifrat) al servidor LDAP, s'ha d'usar transport xifrat i s'hauria de configurar el servidor LDAP per usar resum de contrasenyes (\"hashing\").", "(New password is sent as plain text to LDAP)" : "(La nova contrasenya s'envia com a text pla al servidor LDAP)", - "Default password policy DN" : "DN de la política de contrasenya predeterminada", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN d'una política de contrasenya predeterminada que serà emprada per a la gestió de la caducitat de contrasenyes. Només funciona quan està activat el canvi de contrasenyes per part dels usuaris i només és compatible amb OpenLDAP. Deixeu buit aquest camp per desactivar aquesta gestió de contrasenyes caducades.", + "Default password policy DN" : "DN de la política de contrasenya per defecte", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN d'una política de contrasenya predeterminada que serà emprada per a la gestió de la caducitat de contrasenyes. Només funciona quan està habilitat el canvi de contrasenyes per part dels usuaris i només és compatible amb OpenLDAP. Deixeu buit aquest camp per desactivar aquesta gestió de contrasenyes caducades.", "Special Attributes" : "Atributs especials", "Quota Field" : "Camp de quota", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixeu buit per usar la quota predeterminada pels usuaris, O si no, indiqueu un atribut LDAP/AD.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixeu buit per usar la quota per defecte pels usuaris, O si no, indiqueu un atribut LDAP/AD.", "Quota Default" : "Quota per defecte", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobreescriu la quota predeterminada pels usuaris LDAP que no tenen una quota establerta en el camp Quota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobreescriu la quota per defecte pels usuaris LDAP que no tenen una quota establerta en el camp Quota.", "Email Field" : "Camp de correu electrònic", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Estableix l'adreça de correu a partir del seu atribut LDAP. Deixeu buit pel comportament predeterminat.", "User Home Folder Naming Rule" : "Norma per anomenar la carpeta arrel d'usuari", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixar buit pel nom d'usuari (per defecte). Altrament, especificar un atribut LDAP/AD.", - "\"$home\" Placeholder Field" : "Camp de text variable per \"$home\" ", + "\"$home\" Placeholder Field" : "Camp de marcador de posició \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "En la configuració d'un emmagatzematge extern es reemplaçarà $home amb el valor de l'atribut especificat", + "User Profile Attributes" : "Atributs del perfil d'usuari", + "Phone Field" : "Camp de telèfon", + "User profile Phone will be set from the specified attribute" : "Perfil d'usuari El telèfon s'establirà a partir de l'atribut especificat", + "Website Field" : "Camp del lloc web", + "User profile Website will be set from the specified attribute" : "Perfil d'usuari Lloc web s'establirà a partir de l'atribut especificat", + "Address Field" : "Camp d’adreça", + "User profile Address will be set from the specified attribute" : "Perfil d'usuari L'adreça s'establirà a partir de l'atribut especificat", + "Twitter Field" : "Camp de Twitter", + "User profile Twitter will be set from the specified attribute" : "El perfil d'usuari de Twitter s'establirà a partir de l'atribut especificat", + "Fediverse Field" : "Camp Fediverse", + "User profile Fediverse will be set from the specified attribute" : "El perfil d'usuari Fediverse s'establirà a partir de l'atribut especificat", + "Organisation Field" : "Camp de l'organització", + "User profile Organisation will be set from the specified attribute" : "Organització del Perfil d'usuari s'establirà a partir de l'atribut especificat", + "Role Field" : "Camp de rol", + "User profile Role will be set from the specified attribute" : "El rol del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Headline Field" : "Camp de titular", + "User profile Headline will be set from the specified attribute" : "El títol del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Biography Field" : "Camp de Biografia", + "User profile Biography will be set from the specified attribute" : "La biografia del perfil d'usuari s'establirà a partir de l'atribut especificat", + "Birthdate Field" : "Camp de data de naixement", + "User profile Date of birth will be set from the specified attribute" : "La Data de naixement al perfil d’usuari s'establirà a partir de l'atribut especificat", + "Pronouns Field" : "Camp de pronoms", + "User profile Pronouns will be set from the specified attribute" : "Els pronoms al Perfil d’usuari s’establiran a partir de l'atribut especificat", "Internal Username" : "Nom d'usuari intern", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Per defecte, el nom d'usuari intern es crearà a partir de l'atribut UUID. S'assegura que el nom d'usuari és únic i que els caràcters no s'han de convertir. El nom d'usuari intern té la restricció que només es permeten aquests caràcters: [a-zA-Z0-9_.@-]. Altres caràcters es substitueixen per la seva correspondència ASCII o simplement s'ometen. En les col·lisions, s'afegirà/augmentarà un nombre. El nom d'usuari intern s'utilitza per identificar un usuari internament. També és el nom per defecte de la carpeta d'inici de l'usuari. També forma part dels URL remots, per exemple, per a tots els serveis DAV. Amb aquest paràmetre, es pot anul·lar el comportament per defecte. Els canvis només tindran efecte en els usuaris LDAP (afegits) recentment assignats. Deixeu-lo buit per al comportament per defecte.", "Internal Username Attribute:" : "Atribut nom d'usuari intern:", "Override UUID detection" : "Sobrescriu la detecció UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defecte, owncloud autodetecta l'atribut UUID. L'atribut UUID s'utilitza per identificar usuaris i grups de forma indubtable. També el nom d'usuari intern es crearà en base a la UUIS, si no heu especificat res diferent a dalt. Podeu sobreescriure l'arranjament i passar l'atribut que desitgeu. Heu d'assegurar-vos que l'atribut que escolliu pot ser recollit tant pels usuaris com pels grups i que és únic. Deixeu-ho en blanc si preferiu el comportament per defecte. els canvis s'aplicaran als usuaris i grups LDAP mapats de nou (afegits).", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defecte, owncloud autodetecta l'atribut UUID. L'atribut UUID s'utilitza per identificar usuaris i grups automàticament. També el nom d'usuari intern es crearà en base a la UUID, si no heu especificat res diferent a dalt. Podeu sobreescriure el paràmetre i passar l'atribut que desitgeu. Heu d'assegurar-vos que l'atribut que escolliu pot ser recollit tant pels usuaris com pels grups i que és únic. Deixeu-ho en blanc si preferiu el comportament per defecte. els canvis s'aplicaran als usuaris i grups LDAP mapats de nou (afegits).", "UUID Attribute for Users:" : "Atribut UUID per Usuaris:", "UUID Attribute for Groups:" : "Atribut UUID per Grups:", "Username-LDAP User Mapping" : "Mapatge d'usuari Nom d'usuari-LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Els noms d'usuari son emprats per emmagatzemar i assignar metadades. Per tal d'identificar i reconèixer amb precisió als usuaris, cada usuari LDAP té un nom d'usuari intern. Això requereix una assignació de noms d'usuari interns per a cada un dels usuaris LDAP. Al nom d'usuari creat s'assigna el UUID de l'usuari LDAP. A més el DN es guarda en memòria cau per a reduir la interacció amb LDAP, però no s'utilitza per a identificació. Si el DN canvia, es trobaran els canvis. El nom d'usuari intern s'utilitza arreu. Netejar el mapa d'assignacions deixaria restes per totes bandes. Netejar el mapa d'assignacions no és que sigui sensible a la configuració, sinó que afecta a totes les configuracions LDAP! Mai netegeu el mapa d'assignacions en un entorn de producció, només en escenaris de proves o experimentals.", "Clear Username-LDAP User Mapping" : "Elimina el mapatge d'usuari Nom d'usuari-LDAP", "Clear Groupname-LDAP Group Mapping" : "Suprimeix el mapatge de grup Nom de grup-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "S'ha produït un error de connexió a LDAP / AD, consulteu l'amfitrió, el port i les credencials.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el text variable \"%u id\". Es reemplaçarà amb el nom d'usuari quan consulteu LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El quadre del grup s'ha desactivat, perquè el servidor LDAP / AD no admet memberOf.", - "LDAP / AD integration" : "Integració LDAP / AD", - "LDAP / AD Username:" : "Usuari LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permet l'inici de sessió emprant el nom d'usuari LDAP / AD, que és \"uid\" o bé \"sAMAccountName\" i serà detectat.", - "LDAP / AD Email Address:" : "Adreça de correu LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defecte el nom d'usuari intern es crearà a partir de l'atribut UUID. Això assegura que el nom d'usuari sigui únic i que no calgui conversió de caràcters. El nom d'usuari intern té com a restricció que només es permeten aquests caràcters: [ a-zA-Z0-9_.@- ]. Altres caràcters són reemplaçats amb la seva correspondència ASCII o bé s'ometen. Si hi coincidència amb un altre usuari existent llavors s'afegeix o incrementa un número al final. El nom d'usuari intern s'usa per a identificar a un usuari internament. Alhora que és el nom predeterminat per la carpeta de l'usuari. També forma part de URLs per a ús remot, per exemple pels serveis *DAV (webDAV, etc...). Amb aquest atribut, es pot sobreescriure el comportament predeterminat. Deixeu-lo buit per assumir el comportament predeterminat. Els canvis només tindran efecte quan s'afegeixin/assignin nous usuaris LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Configuració no vàlida. Feu un cop d'ull als registres per obtenir més informació." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/cs.js b/apps/user_ldap/l10n/cs.js index 36cbfdfd5f5..57912e46adf 100644 --- a/apps/user_ldap/l10n/cs.js +++ b/apps/user_ldap/l10n/cs.js @@ -6,16 +6,17 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Neplatné nastavení: Anonymní navázání není umožněno.", "Valid configuration, connection established!" : "Nastavení je v pořádku a spojení bylo navázáno.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Nastavení je v pořádku, ale spojení se nezdařilo. Zkontrolujte nastavení serveru a přihlašovací údaje.", - "Invalid configuration. Please have a look at the logs for further details." : "Neplatné nastavení. Podrobnosti naleznete v záznamu událostí.", + "Invalid configuration: %s" : "Neplatné nastavení: %s", "No action specified" : "Neurčena žádná akce", "No configuration specified" : "Neurčeno žádné nastavení", "No data specified" : "Neurčena žádná data", - " Could not set configuration %s" : "Nelze nastavit konfiguraci %s", + "Invalid data specified" : "Zadána neplatná data", + "Could not set configuration %1$s to %2$s" : "Nepodařilo se nastavit konfiguraci %1$s na %2$s", "Action does not exist" : "Tato akce neexistuje", "Renewing …" : "Obnovování…", "Very weak password" : "Velmi snadno prolomitelné heslo", "Weak password" : "Snadno prolomitelné heslo", - "So-so password" : "Přijatelné heslo", + "So-so password" : "Ještě použitelné heslo", "Good password" : "Dobré heslo", "Strong password" : "Odolné heslo", "The Base DN appears to be wrong" : "Base DN se nezdá být pořádku", @@ -24,22 +25,22 @@ OC.L10N.register( "Configuration incomplete" : "Nastavení není dokončené", "Configuration OK" : "Nastavení v pořádku", "Select groups" : "Vyberte skupiny", - "Select object classes" : "Vyberte objektové třídy", + "Select object classes" : "Vyberte třídy objektů", "Please check the credentials, they seem to be wrong." : "Ověřte své přihlašovací údaje, zdají se být neplatné.", "Please specify the port, it could not be auto-detected." : "Zadejte port, nepodařilo se ho zjistit automaticky.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nelze automaticky detekovat, ověřte prosím přihlašovací údaje, host a port.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Základ DN se nepodařilo automaticky zjistit – ověřte zadání přihlašovacích údajů, hostitele a portu.", "Could not detect Base DN, please enter it manually." : "Nedaří se automaticky zjistit Base DN – zadejte ho ručně.", "{nthServer}. Server" : "{nthServer}. Server", - "No object found in the given Base DN. Please revise." : "V zadané Base DN nebyl objekt nalezen. Ověřte.", + "No object found in the given Base DN. Please revise." : "V zadaném základu DN nebyl objekt nalezen. Ověřte to.", "More than 1,000 directory entries available." : "Je dostupných více než 1000 položek adresáře kontaktů.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} položka k dispozici v rámci poskytnuté Base DN","{objectsFound} položky k dispozici v rámci poskytnuté Base DN","{objectsFound} položek k dispozici v rámci poskytnuté Base DN","{objectsFound} položky k dispozici v rámci poskytnuté Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověře prosím Base DN společně s nastavením připojení a přihlašovacími údaji.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověřte základ DN, stejně tak nastavení připojení a přihlašovací údaje.", "Do you really want to delete the current Server Configuration?" : "Opravdu chcete stávající nastavení pro server smazat?", "Confirm Deletion" : "Potvrdit smazání", "Mappings cleared successfully!" : "Mapování úspěšně vyčištěna!", "Error while clearing the mappings." : "Chyba při čištění mapování.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymní bind není povolen. Zadejte User DN a Heslo.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Chyba LDAP operace. Anonymní bind nejspíše není povolen.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Chyba LDAP operace. Anonymní navázání (bind) nejspíše není povoleno.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Ukládání se nezdařilo. Ujistěte se, že databáze funguje. Načtěte znovu, než budete pokračovat.", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Přepnutí režimu povolí automatické LDAP dotazy. V závislosti na velikosti vašeho LDAP může vyhledávání chvíli trvat. Opravdu si přejete přepnout mód?", "Mode switch" : "Přepnutí režimu", @@ -48,22 +49,39 @@ OC.L10N.register( "User found and settings verified." : "Uživatel nalezen a nastavení ověřena.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Zvažte zúžení vyhledávání, protože to stávající zahrnuje mnoho uživatelů, ze kterých se bude schopen přihlásit pouze první.", "An unspecified error occurred. Please check log and settings." : "Došlo k nespecifikované chybě. Zkontrolujte nastavení a soubor se záznamem událostí.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání není platný, pravděpodobně z důvodu chybné syntaxe, jako třeba neuzavřené závorky. Ověřte to.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Došlo k chybě připojení k LDAP/AD, zkontrolujte prosím host, port a přihlašovací údaje.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Zástupný symbol „%uid“ chybí. Při dotatzu na LDAP/AD bude nahrazen přihlašovacím jménem.", "Please provide a login name to test against" : "Zadejte přihlašovací jméno, vůči kterému vyzkoušet", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Skupinová kolonka bylo vypnuta, protože LDAP/AD server nepodporuje memberOf.", - "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ", + "Password change rejected. Hint: %s" : "Změna hesla zamítnuta. Nápověda: %s", + "Mandatory field \"%s\" left empty" : "Nezbytná kolonka „%s“ nevyplněna", + "A password is given, but not an LDAP agent" : "Heslo je zadáno, ale nikoli LDAP agent", + "No password is given for the user agent" : "Pro uživatelského agenta nezadáno žádné heslo", + "No LDAP base DN was given" : "Nezadáno LDAP základ DN", + "User base DN is not a subnode of global base DN" : "Základ DN uživatele není dílčím uzlem globálního základu DN", + "Group base DN is not a subnode of global base DN" : "Základ DN skupiny není dílčím uzlem globálního základu DN", + "Login filter does not contain %s placeholder." : "Filtr přihlášení neobsahuje zástupné vyjádření %s.", "Please login with the new password" : "Přihlaste se pomocí nového hesla", "LDAP User backend" : "Podpůrná vrstva pro uživatele z LDAP", "Your password will expire tomorrow." : "Platnost hesla zítra skončí.", "Your password will expire today." : "Platnost hesla dnes končí.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Platnost hesla skončí za %n den.","Platnost hesla skončí za %n dny.","Platnost hesla skončí za %n dnů.","Platnost hesla skončí za %n dny."], "LDAP/AD integration" : "Napojení na LDAP/AD", - "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin","nalezeny %s skupiny"], - "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů","nalezeni %s uživatelé"], + "LDAP Connection" : "LDAP spojení", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Navazování se pro toto nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Hledání se pro toto nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Je zde neaktivní nastavení pro LDAP: %s","Jsou zde neaktivní nastavení pro LDAP: %s","Je zde neaktivních nastavení pro LDAP: %s","Jsou zde neaktivní nastavení pro LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Navazování a vyhledávání funguje na nastaveném LDAP spojení (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)"], + "Invalid LDAP UUIDs" : "Neplatné LDAP UUID identif.", + "None found" : "Žádné nenalezeno", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Nalezeny neplatné UUID identifikátory účtů nebo skupin. Zkontrolujte svá nastavení „Přebít zjišťování UUID identifikátorů“ v části pro odborníky nastavení pro LDAP a identifikátory pak zaktualizujte příkazem „ldap:update-uuid“.", + "_%n group found_::_%n groups found_" : ["nalezena %n skupina","nalezeny %n skupiny","nalezeno %n skupin","nalezeny %n skupiny"], + "> 1000 groups found" : "nalezeno více než 1 000 skupin", + "> 1000 users found" : "nalezeno více než 1 000 uživatelů", + "_%n user found_::_%n users found_" : ["nalezen %n uživatel","nalezeni %n uživatelé","nalezeno %n uživatelů","nalezeni %n uživatelé"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nedaří se zjistit atribut pro zobrazení jména uživatele. Upřesněte ho sami v rozšířeném nastavení LDAP.", - "Could not find the desired feature" : "Nelze nalézt požadovanou vlastnost", + "Could not find the desired feature" : "Požadovanou vlastnost se nepodařilo nalézt", "Invalid Host" : "Neplatný hostitel", "LDAP user and group backend" : "Podpůrná vrstva pro uživatele a skupiny z LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Tato aplikace umožňuje správcům připojit Nextcloud na adresář uživatelů založený na LDAP.", @@ -80,14 +98,15 @@ OC.L10N.register( "LDAP Filter:" : "LDAP filtr:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", "Verify settings and count the groups" : "Ověřit nastavení a spočítat skupiny", - "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, %s bude hledat uživatele na základě následujících atributů:", + "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, bude %s hledat uživatele na základě následujících atributů:", "LDAP/AD Username:" : "LDAP/AD uživatelské jméno:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje přihlašování pomocí LDAP/AD uživatelského jména, což je buď „uid“ nebo „sAMAccountName“ a bude zjištěno.", "LDAP/AD Email Address:" : "E-mailová adresa z LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Umožňuje přihlašování pomocí atributu e-mail. Je možné použít „mail“ a „mailPrimaryAddress“.", "Other Attributes:" : "Další atributy:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definuje filtr který použít při pokusu o přihlášení. „%%uid“ je nahrazeno uživatelským jménem z přihlašovací akce. Příklad: „uid=%%uid“", - "Test Loginname" : "Testovací přihlašovací jméno", + "Test Loginname" : "Vyzkoušet přihlašovací jméno", + "Attempts to receive a DN for the given loginname and the current login filter" : "Pokusy získat rozlišené jméno (DN) pro dané přihlašovací jméno a stávající filtr přihlášení", "Verify settings" : "Ověřit nastavení", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Přidat nové nastavení", @@ -98,19 +117,19 @@ OC.L10N.register( "Port" : "Port", "Detect Port" : "Zjistit port", "User DN" : "Uživatelské DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN klientského uživatele, ke kterému tvoříte vazbu, např. uid=agent,dc=example,dc=com. Pro anonymní přístup ponechte DN a heslo prázdné.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN klientského uživatele, ke kterému má být vytvořena vazba, např. uid=agent,dc=example,dc=com. Pro anonymní přístup ponechte DN a heslo prázdné.", "Password" : "Heslo", "For anonymous access, leave DN and Password empty." : "Pro anonymní přístup ponechte údaje DN and heslo prázdné.", "Save Credentials" : "Uložit přihlašovací údaje", "One Base DN per line" : "Každé základní DN na samostatném řádku", - "You can specify Base DN for users and groups in the Advanced tab" : "V rozšířeném nastavení můžete určit základní DN pro uživatele a skupiny", + "You can specify Base DN for users and groups in the Advanced tab" : "Základ DN pro uživatele a skupiny je možné zadat v panelu Pokročilé", "Detect Base DN" : "Zjistitit Base DN", - "Test Base DN" : "Test Base DN", + "Test Base DN" : "Vyzkoušet základ DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zabraňuje automatickým LDAP požadavkům. Výhodné pro velká nasazení, ale vyžaduje znalosti o LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučeno pro obsáhlé adresáře kontaktů)", "Listing and searching for users is constrained by these criteria:" : "Získávání a vyhledávání uživatelů je omezeno následujícími kritérii:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Nejčastější třídy objektů pro uživatele jsou organizationalPerson, person, user a inetOrgPerson. Pokud si nejste jisti které třídy objektů zvolit, obraťte se na správce svého adresáře kontaktů.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé z LDAP mají mít přístup k instanci %s.", "Verify settings and count users" : "Ověřit nastavení a spočítat uživatele", "Saving" : "Ukládá se", "Back" : "Zpět", @@ -129,7 +148,7 @@ OC.L10N.register( "Groups" : "Skupiny", "Expert" : "Expertní", "Advanced" : "Pokročilé", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte prosím správce systému, aby jej nainstaloval.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte správce systému, aby ho nainstaloval.", "Connection Settings" : "Nastavení spojení", "Configuration Active" : "Nastavení aktivní", "When unchecked, this configuration will be skipped." : "Pokud není zaškrtnuto, bude toto nastavení přeskočeno.", @@ -139,10 +158,10 @@ OC.L10N.register( "Disable Main Server" : "Zakázat hlavní server", "Only connect to the replica server." : "Připojit jen k záložnímu serveru.", "Turn off SSL certificate validation." : "Vypnout ověřování SSL certifikátu.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nedoporučuje se, určeno pouze k testovacímu použití. Pokud spojení funguje jen s touto volbou, importujte SSL certifikát vašeho LDAP serveru na server %s.", - "Cache Time-To-Live" : "TTL vyrovnávací paměti", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nedoporučuje se, určeno pouze k použití pro testy! Pokud spojení funguje pouze s touto volbou, naimportujte SSL certifikát vašeho LDAP serveru na %s server.", + "Cache Time-To-Live" : "Doba platnosti mezipaměti", "in seconds. A change empties the cache." : "v sekundách. Změna vyprázdní mezipaměť.", - "Directory Settings" : "Nastavení adresáře kontaktů", + "Directory Settings" : "Nastavení adresáře", "User Display Name Field" : "Kolonka zobrazovaného jména uživatele", "The LDAP attribute to use to generate the user's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména uživatele.", "2nd User Display Name Field" : "Druhá kolonka zobrazovaného jména uživatele", @@ -151,8 +170,10 @@ OC.L10N.register( "One User Base DN per line" : "Jedna uživatelská základní DN na řádku", "User Search Attributes" : "Atributy vyhledávání uživatelů", "Optional; one attribute per line" : "Volitelné, každý atribut na zvlášť řádek", + "Disable users missing from LDAP" : "Znepřístupnit uživatelské účty, které se nenachází v LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Pokud zapnuto, uživatelské účty naimportovaní z LDAP, kteří pak budou chybět, budou znepřístupněny.", "Group Display Name Field" : "Kolonka zobrazovaného názvu skupiny", - "The LDAP attribute to use to generate the groups's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména skupiny.", + "The LDAP attribute to use to generate the groups's display name." : "LDAP atribut, který použít k vytvoření zobrazovaného názvu skupiny.", "Base Group Tree" : "Základ stromu skupin", "One Group Base DN per line" : "Jedna skupinová základní DN na řádku", "Group Search Attributes" : "Atributy vyhledávání skupin", @@ -160,9 +181,9 @@ OC.L10N.register( "Dynamic Group Member URL" : "URL člena dynamické skupiny", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "LDAP atribut, který obsahuje pro skupinu objektů vyhledávací LDAP URL, která určuje které objekty patří do skupiny. (Prázdné nastavení vypne funkci člena dynamické skupiny.)", "Nested Groups" : "Vnořené skupiny", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které obsahují jiné skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které samy obsahují další skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN názvy.)", "Paging chunksize" : "Velikost bloku stránkování", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, které může vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, která mohou vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)", "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro jednotlivé uživatele", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super správcům a správcům skupin měnit hesla jejich LDAP uživatelům. Funguje pouze, pokud jsou na LDAP serveru příslušně nastaveny zásady řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čitelné podobě, je třeba pro pro transport použít šifrování a na LDAP serveru by mělo být nastaveno ukládání hesel v podobě jejich otisků (hash).", "(New password is sent as plain text to LDAP)" : "(Nové heslo je do LDAP zasláno jako čitelný text)", @@ -179,24 +200,40 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pokud chcete použít uživatelské jméno (výchozí), nevyplňujte. Jinak zadejte LDAP/AD atribut.", "\"$home\" Placeholder Field" : "Výplňová kolonka „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu", + "User Profile Attributes" : "Atributy uživatelského profilu", + "Phone Field" : "Kolonka s telefonním číslem", + "User profile Phone will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Telefon u uživatelského profilu", + "Website Field" : "Kolonka webové stránky", + "User profile Website will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa Webových stránek u uživatelského profilu", + "Address Field" : "Kolonka adresa", + "User profile Address will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Adresa u uživatelského profilu", + "Twitter Field" : "Kolonka Twitter", + "User profile Twitter will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa na Twitteru u uživatelského profilu", + "Fediverse Field" : "Kolonka Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa v rámci Fediverse u uživatelského profilu", + "Organisation Field" : "Kolonka organizace", + "User profile Organisation will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Organizace u uživatelského profilu", + "Role Field" : "Kolonka role", + "User profile Role will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Role u uživatelského profilu", + "Headline Field" : "Kolonka nadpis", + "User profile Headline will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Nadpis u uživatelského profilu", + "Biography Field" : "Kolonka životopis", + "User profile Biography will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Životopis u uživatelského profilu", + "Birthdate Field" : "Kolonka Narozeniny", + "User profile Date of birth will be set from the specified attribute" : "Datum narození v profilu uživatele bude nastaveno ze zadaného atributu", + "Pronouns Field" : "Kolonka pro zájmena", + "User profile Pronouns will be set from the specified attribute" : "Zájmeno v profilu uživatele bude nastaveno ze zadaného atributu", "Internal Username" : "Interní uživatelské jméno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. ", "Internal Username Attribute:" : "Atribut interního uživatelského jména:", - "Override UUID detection" : "Nastavit ručně UUID atribut", + "Override UUID detection" : "Nastavit UUID atribut ručně", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Ve výchozím nastavení je UUID atribut nalezen automaticky. UUID atribut je používán pro nezpochybnitelnou identifikaci uživatelů a skupin z LDAP. Navíc je na základě UUID tvořeno také interní uživatelské jméno, pokud není nastaveno jinak. Můžete výchozí nastavení přepsat a použít atribut, který sami zvolíte. Musíte se ale ujistit, že atribut, který vyberete, bude uveden jak u uživatelů, tak i u skupin a je unikátní. Ponechte prázdné pro výchozí chování. Změna bude mít vliv jen na nově namapované (přidané) uživatele a skupiny z LDAP.", "UUID Attribute for Users:" : "UUID atribut pro uživatele:", "UUID Attribute for Groups:" : "UUID atribut pro skupiny:", "Username-LDAP User Mapping" : "Mapování uživatelských jmen z LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Uživatelská jména slouží k ukládání a přiřazování metadat. Pro přesnou identifikaci a rozpoznávání uživatelů, každý LDAP uživatel má vnitřní uživatelské jméno. Toto vyžaduje mapování uživatelského jména na LDAP uživatele. Krom toho je uložen do mezipaměti rozlišený název aby se omezila interakce s LDAP, ale není používáno pro identifikaci. Pokud se DN změní, změny budou nalezeny. Vnitřní uživatelské jméno bude použito nade všechno. Čištění mapování bude mít pozůstatky všude. Čištění mapování není citlivé na nastavení, postihuje všechny LDAP nastavení. Nikdy nečistěte mapování v produkčním prostředí, pouze v testovací nebo experimentální fázi.", - "Clear Username-LDAP User Mapping" : "Zrušit mapování uživatelských jmen LDAPu", - "Clear Groupname-LDAP Group Mapping" : "Zrušit mapování názvů skupin LDAPu", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Zástupný symbol „%uid“ chybí. Při dotatzu na LDAP / AD bude nahrazen přihlašovacím jménem.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.", - "LDAP / AD integration" : "LDAP / AD propojení", - "LDAP / AD Username:" : "LDAP / AD uživatelské jméno:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje přihlašování pomocí LDAP/AD uživatelského jména, což je buď „uid“ nebo „sAMAccountName“ a bude zjištěno.", - "LDAP / AD Email Address:" : "E-mailová adresa z LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP." + "Clear Username-LDAP User Mapping" : "Zrušit mapování uživatelských jmen v LDAP", + "Clear Groupname-LDAP Group Mapping" : "Zrušit mapování názvů skupin na LDAP", + "Invalid configuration. Please have a look at the logs for further details." : "Neplatné nastavení. Podrobnosti naleznete v záznamu událostí." }, "nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/user_ldap/l10n/cs.json b/apps/user_ldap/l10n/cs.json index efea5e028f5..60d09fdf3e5 100644 --- a/apps/user_ldap/l10n/cs.json +++ b/apps/user_ldap/l10n/cs.json @@ -4,16 +4,17 @@ "Invalid configuration: Anonymous binding is not allowed." : "Neplatné nastavení: Anonymní navázání není umožněno.", "Valid configuration, connection established!" : "Nastavení je v pořádku a spojení bylo navázáno.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Nastavení je v pořádku, ale spojení se nezdařilo. Zkontrolujte nastavení serveru a přihlašovací údaje.", - "Invalid configuration. Please have a look at the logs for further details." : "Neplatné nastavení. Podrobnosti naleznete v záznamu událostí.", + "Invalid configuration: %s" : "Neplatné nastavení: %s", "No action specified" : "Neurčena žádná akce", "No configuration specified" : "Neurčeno žádné nastavení", "No data specified" : "Neurčena žádná data", - " Could not set configuration %s" : "Nelze nastavit konfiguraci %s", + "Invalid data specified" : "Zadána neplatná data", + "Could not set configuration %1$s to %2$s" : "Nepodařilo se nastavit konfiguraci %1$s na %2$s", "Action does not exist" : "Tato akce neexistuje", "Renewing …" : "Obnovování…", "Very weak password" : "Velmi snadno prolomitelné heslo", "Weak password" : "Snadno prolomitelné heslo", - "So-so password" : "Přijatelné heslo", + "So-so password" : "Ještě použitelné heslo", "Good password" : "Dobré heslo", "Strong password" : "Odolné heslo", "The Base DN appears to be wrong" : "Base DN se nezdá být pořádku", @@ -22,22 +23,22 @@ "Configuration incomplete" : "Nastavení není dokončené", "Configuration OK" : "Nastavení v pořádku", "Select groups" : "Vyberte skupiny", - "Select object classes" : "Vyberte objektové třídy", + "Select object classes" : "Vyberte třídy objektů", "Please check the credentials, they seem to be wrong." : "Ověřte své přihlašovací údaje, zdají se být neplatné.", "Please specify the port, it could not be auto-detected." : "Zadejte port, nepodařilo se ho zjistit automaticky.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nelze automaticky detekovat, ověřte prosím přihlašovací údaje, host a port.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Základ DN se nepodařilo automaticky zjistit – ověřte zadání přihlašovacích údajů, hostitele a portu.", "Could not detect Base DN, please enter it manually." : "Nedaří se automaticky zjistit Base DN – zadejte ho ručně.", "{nthServer}. Server" : "{nthServer}. Server", - "No object found in the given Base DN. Please revise." : "V zadané Base DN nebyl objekt nalezen. Ověřte.", + "No object found in the given Base DN. Please revise." : "V zadaném základu DN nebyl objekt nalezen. Ověřte to.", "More than 1,000 directory entries available." : "Je dostupných více než 1000 položek adresáře kontaktů.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} položka k dispozici v rámci poskytnuté Base DN","{objectsFound} položky k dispozici v rámci poskytnuté Base DN","{objectsFound} položek k dispozici v rámci poskytnuté Base DN","{objectsFound} položky k dispozici v rámci poskytnuté Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověře prosím Base DN společně s nastavením připojení a přihlašovacími údaji.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Došlo k chybě. Ověřte základ DN, stejně tak nastavení připojení a přihlašovací údaje.", "Do you really want to delete the current Server Configuration?" : "Opravdu chcete stávající nastavení pro server smazat?", "Confirm Deletion" : "Potvrdit smazání", "Mappings cleared successfully!" : "Mapování úspěšně vyčištěna!", "Error while clearing the mappings." : "Chyba při čištění mapování.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymní bind není povolen. Zadejte User DN a Heslo.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Chyba LDAP operace. Anonymní bind nejspíše není povolen.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Chyba LDAP operace. Anonymní navázání (bind) nejspíše není povoleno.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Ukládání se nezdařilo. Ujistěte se, že databáze funguje. Načtěte znovu, než budete pokračovat.", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Přepnutí režimu povolí automatické LDAP dotazy. V závislosti na velikosti vašeho LDAP může vyhledávání chvíli trvat. Opravdu si přejete přepnout mód?", "Mode switch" : "Přepnutí režimu", @@ -46,22 +47,39 @@ "User found and settings verified." : "Uživatel nalezen a nastavení ověřena.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Zvažte zúžení vyhledávání, protože to stávající zahrnuje mnoho uživatelů, ze kterých se bude schopen přihlásit pouze první.", "An unspecified error occurred. Please check log and settings." : "Došlo k nespecifikované chybě. Zkontrolujte nastavení a soubor se záznamem událostí.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání není platný, pravděpodobně z důvodu chybné syntaxe, jako třeba neuzavřené závorky. Ověřte to.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Došlo k chybě připojení k LDAP/AD, zkontrolujte prosím host, port a přihlašovací údaje.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Zástupný symbol „%uid“ chybí. Při dotatzu na LDAP/AD bude nahrazen přihlašovacím jménem.", "Please provide a login name to test against" : "Zadejte přihlašovací jméno, vůči kterému vyzkoušet", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Skupinová kolonka bylo vypnuta, protože LDAP/AD server nepodporuje memberOf.", - "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ", + "Password change rejected. Hint: %s" : "Změna hesla zamítnuta. Nápověda: %s", + "Mandatory field \"%s\" left empty" : "Nezbytná kolonka „%s“ nevyplněna", + "A password is given, but not an LDAP agent" : "Heslo je zadáno, ale nikoli LDAP agent", + "No password is given for the user agent" : "Pro uživatelského agenta nezadáno žádné heslo", + "No LDAP base DN was given" : "Nezadáno LDAP základ DN", + "User base DN is not a subnode of global base DN" : "Základ DN uživatele není dílčím uzlem globálního základu DN", + "Group base DN is not a subnode of global base DN" : "Základ DN skupiny není dílčím uzlem globálního základu DN", + "Login filter does not contain %s placeholder." : "Filtr přihlášení neobsahuje zástupné vyjádření %s.", "Please login with the new password" : "Přihlaste se pomocí nového hesla", "LDAP User backend" : "Podpůrná vrstva pro uživatele z LDAP", "Your password will expire tomorrow." : "Platnost hesla zítra skončí.", "Your password will expire today." : "Platnost hesla dnes končí.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Platnost hesla skončí za %n den.","Platnost hesla skončí za %n dny.","Platnost hesla skončí za %n dnů.","Platnost hesla skončí za %n dny."], "LDAP/AD integration" : "Napojení na LDAP/AD", - "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin","nalezeny %s skupiny"], - "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů","nalezeni %s uživatelé"], + "LDAP Connection" : "LDAP spojení", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Navazování se pro toto nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s","Navazování se pro tato nastavení LDAP nezdařilo: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Hledání se pro toto nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s","Hledání se pro tato nastavení LDAP nezdařilo: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Je zde neaktivní nastavení pro LDAP: %s","Jsou zde neaktivní nastavení pro LDAP: %s","Je zde neaktivních nastavení pro LDAP: %s","Jsou zde neaktivní nastavení pro LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Navazování a vyhledávání funguje na nastaveném LDAP spojení (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)","Navazování a vyhledávání funguje na všech %n nastavených LDAP spojeních (%s)"], + "Invalid LDAP UUIDs" : "Neplatné LDAP UUID identif.", + "None found" : "Žádné nenalezeno", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Nalezeny neplatné UUID identifikátory účtů nebo skupin. Zkontrolujte svá nastavení „Přebít zjišťování UUID identifikátorů“ v části pro odborníky nastavení pro LDAP a identifikátory pak zaktualizujte příkazem „ldap:update-uuid“.", + "_%n group found_::_%n groups found_" : ["nalezena %n skupina","nalezeny %n skupiny","nalezeno %n skupin","nalezeny %n skupiny"], + "> 1000 groups found" : "nalezeno více než 1 000 skupin", + "> 1000 users found" : "nalezeno více než 1 000 uživatelů", + "_%n user found_::_%n users found_" : ["nalezen %n uživatel","nalezeni %n uživatelé","nalezeno %n uživatelů","nalezeni %n uživatelé"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nedaří se zjistit atribut pro zobrazení jména uživatele. Upřesněte ho sami v rozšířeném nastavení LDAP.", - "Could not find the desired feature" : "Nelze nalézt požadovanou vlastnost", + "Could not find the desired feature" : "Požadovanou vlastnost se nepodařilo nalézt", "Invalid Host" : "Neplatný hostitel", "LDAP user and group backend" : "Podpůrná vrstva pro uživatele a skupiny z LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Tato aplikace umožňuje správcům připojit Nextcloud na adresář uživatelů založený na LDAP.", @@ -78,14 +96,15 @@ "LDAP Filter:" : "LDAP filtr:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", "Verify settings and count the groups" : "Ověřit nastavení a spočítat skupiny", - "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, %s bude hledat uživatele na základě následujících atributů:", + "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, bude %s hledat uživatele na základě následujících atributů:", "LDAP/AD Username:" : "LDAP/AD uživatelské jméno:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje přihlašování pomocí LDAP/AD uživatelského jména, což je buď „uid“ nebo „sAMAccountName“ a bude zjištěno.", "LDAP/AD Email Address:" : "E-mailová adresa z LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Umožňuje přihlašování pomocí atributu e-mail. Je možné použít „mail“ a „mailPrimaryAddress“.", "Other Attributes:" : "Další atributy:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definuje filtr který použít při pokusu o přihlášení. „%%uid“ je nahrazeno uživatelským jménem z přihlašovací akce. Příklad: „uid=%%uid“", - "Test Loginname" : "Testovací přihlašovací jméno", + "Test Loginname" : "Vyzkoušet přihlašovací jméno", + "Attempts to receive a DN for the given loginname and the current login filter" : "Pokusy získat rozlišené jméno (DN) pro dané přihlašovací jméno a stávající filtr přihlášení", "Verify settings" : "Ověřit nastavení", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Přidat nové nastavení", @@ -96,19 +115,19 @@ "Port" : "Port", "Detect Port" : "Zjistit port", "User DN" : "Uživatelské DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN klientského uživatele, ke kterému tvoříte vazbu, např. uid=agent,dc=example,dc=com. Pro anonymní přístup ponechte DN a heslo prázdné.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN klientského uživatele, ke kterému má být vytvořena vazba, např. uid=agent,dc=example,dc=com. Pro anonymní přístup ponechte DN a heslo prázdné.", "Password" : "Heslo", "For anonymous access, leave DN and Password empty." : "Pro anonymní přístup ponechte údaje DN and heslo prázdné.", "Save Credentials" : "Uložit přihlašovací údaje", "One Base DN per line" : "Každé základní DN na samostatném řádku", - "You can specify Base DN for users and groups in the Advanced tab" : "V rozšířeném nastavení můžete určit základní DN pro uživatele a skupiny", + "You can specify Base DN for users and groups in the Advanced tab" : "Základ DN pro uživatele a skupiny je možné zadat v panelu Pokročilé", "Detect Base DN" : "Zjistitit Base DN", - "Test Base DN" : "Test Base DN", + "Test Base DN" : "Vyzkoušet základ DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zabraňuje automatickým LDAP požadavkům. Výhodné pro velká nasazení, ale vyžaduje znalosti o LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučeno pro obsáhlé adresáře kontaktů)", "Listing and searching for users is constrained by these criteria:" : "Získávání a vyhledávání uživatelů je omezeno následujícími kritérii:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Nejčastější třídy objektů pro uživatele jsou organizationalPerson, person, user a inetOrgPerson. Pokud si nejste jisti které třídy objektů zvolit, obraťte se na správce svého adresáře kontaktů.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé z LDAP mají mít přístup k instanci %s.", "Verify settings and count users" : "Ověřit nastavení a spočítat uživatele", "Saving" : "Ukládá se", "Back" : "Zpět", @@ -127,7 +146,7 @@ "Groups" : "Skupiny", "Expert" : "Expertní", "Advanced" : "Pokročilé", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte prosím správce systému, aby jej nainstaloval.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte správce systému, aby ho nainstaloval.", "Connection Settings" : "Nastavení spojení", "Configuration Active" : "Nastavení aktivní", "When unchecked, this configuration will be skipped." : "Pokud není zaškrtnuto, bude toto nastavení přeskočeno.", @@ -137,10 +156,10 @@ "Disable Main Server" : "Zakázat hlavní server", "Only connect to the replica server." : "Připojit jen k záložnímu serveru.", "Turn off SSL certificate validation." : "Vypnout ověřování SSL certifikátu.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nedoporučuje se, určeno pouze k testovacímu použití. Pokud spojení funguje jen s touto volbou, importujte SSL certifikát vašeho LDAP serveru na server %s.", - "Cache Time-To-Live" : "TTL vyrovnávací paměti", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nedoporučuje se, určeno pouze k použití pro testy! Pokud spojení funguje pouze s touto volbou, naimportujte SSL certifikát vašeho LDAP serveru na %s server.", + "Cache Time-To-Live" : "Doba platnosti mezipaměti", "in seconds. A change empties the cache." : "v sekundách. Změna vyprázdní mezipaměť.", - "Directory Settings" : "Nastavení adresáře kontaktů", + "Directory Settings" : "Nastavení adresáře", "User Display Name Field" : "Kolonka zobrazovaného jména uživatele", "The LDAP attribute to use to generate the user's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména uživatele.", "2nd User Display Name Field" : "Druhá kolonka zobrazovaného jména uživatele", @@ -149,8 +168,10 @@ "One User Base DN per line" : "Jedna uživatelská základní DN na řádku", "User Search Attributes" : "Atributy vyhledávání uživatelů", "Optional; one attribute per line" : "Volitelné, každý atribut na zvlášť řádek", + "Disable users missing from LDAP" : "Znepřístupnit uživatelské účty, které se nenachází v LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Pokud zapnuto, uživatelské účty naimportovaní z LDAP, kteří pak budou chybět, budou znepřístupněny.", "Group Display Name Field" : "Kolonka zobrazovaného názvu skupiny", - "The LDAP attribute to use to generate the groups's display name." : "LDAP atribut použitý k vytvoření zobrazovaného jména skupiny.", + "The LDAP attribute to use to generate the groups's display name." : "LDAP atribut, který použít k vytvoření zobrazovaného názvu skupiny.", "Base Group Tree" : "Základ stromu skupin", "One Group Base DN per line" : "Jedna skupinová základní DN na řádku", "Group Search Attributes" : "Atributy vyhledávání skupin", @@ -158,9 +179,9 @@ "Dynamic Group Member URL" : "URL člena dynamické skupiny", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "LDAP atribut, který obsahuje pro skupinu objektů vyhledávací LDAP URL, která určuje které objekty patří do skupiny. (Prázdné nastavení vypne funkci člena dynamické skupiny.)", "Nested Groups" : "Vnořené skupiny", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které obsahují jiné skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Pokud zapnuto, je možno používat skupiny, které samy obsahují další skupiny. (Funguje pouze pokud atribut člena skupiny obsahuje DN názvy.)", "Paging chunksize" : "Velikost bloku stránkování", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, které může vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Velikost bloku použitá pro stránkování vyhledávání v LDAP, která mohou vracet objemné výsledky jako třeba výčet uživatelů či skupin. (Nastavení na 0 zakáže stránkovaná vyhledávání pro tyto situace.)", "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro jednotlivé uživatele", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super správcům a správcům skupin měnit hesla jejich LDAP uživatelům. Funguje pouze, pokud jsou na LDAP serveru příslušně nastaveny zásady řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čitelné podobě, je třeba pro pro transport použít šifrování a na LDAP serveru by mělo být nastaveno ukládání hesel v podobě jejich otisků (hash).", "(New password is sent as plain text to LDAP)" : "(Nové heslo je do LDAP zasláno jako čitelný text)", @@ -177,24 +198,40 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pokud chcete použít uživatelské jméno (výchozí), nevyplňujte. Jinak zadejte LDAP/AD atribut.", "\"$home\" Placeholder Field" : "Výplňová kolonka „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home bude v nastavení externího úložiště nahrazeno hodnotou zadaného atributu", + "User Profile Attributes" : "Atributy uživatelského profilu", + "Phone Field" : "Kolonka s telefonním číslem", + "User profile Phone will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Telefon u uživatelského profilu", + "Website Field" : "Kolonka webové stránky", + "User profile Website will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa Webových stránek u uživatelského profilu", + "Address Field" : "Kolonka adresa", + "User profile Address will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Adresa u uživatelského profilu", + "Twitter Field" : "Kolonka Twitter", + "User profile Twitter will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa na Twitteru u uživatelského profilu", + "Fediverse Field" : "Kolonka Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Ze zadaného atributu bude nastavena adresa v rámci Fediverse u uživatelského profilu", + "Organisation Field" : "Kolonka organizace", + "User profile Organisation will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Organizace u uživatelského profilu", + "Role Field" : "Kolonka role", + "User profile Role will be set from the specified attribute" : "Ze zadaného atributu bude nastavena Role u uživatelského profilu", + "Headline Field" : "Kolonka nadpis", + "User profile Headline will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Nadpis u uživatelského profilu", + "Biography Field" : "Kolonka životopis", + "User profile Biography will be set from the specified attribute" : "Ze zadaného atributu bude nastaven Životopis u uživatelského profilu", + "Birthdate Field" : "Kolonka Narozeniny", + "User profile Date of birth will be set from the specified attribute" : "Datum narození v profilu uživatele bude nastaveno ze zadaného atributu", + "Pronouns Field" : "Kolonka pro zájmena", + "User profile Pronouns will be set from the specified attribute" : "Zájmeno v profilu uživatele bude nastaveno ze zadaného atributu", "Internal Username" : "Interní uživatelské jméno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. ", "Internal Username Attribute:" : "Atribut interního uživatelského jména:", - "Override UUID detection" : "Nastavit ručně UUID atribut", + "Override UUID detection" : "Nastavit UUID atribut ručně", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Ve výchozím nastavení je UUID atribut nalezen automaticky. UUID atribut je používán pro nezpochybnitelnou identifikaci uživatelů a skupin z LDAP. Navíc je na základě UUID tvořeno také interní uživatelské jméno, pokud není nastaveno jinak. Můžete výchozí nastavení přepsat a použít atribut, který sami zvolíte. Musíte se ale ujistit, že atribut, který vyberete, bude uveden jak u uživatelů, tak i u skupin a je unikátní. Ponechte prázdné pro výchozí chování. Změna bude mít vliv jen na nově namapované (přidané) uživatele a skupiny z LDAP.", "UUID Attribute for Users:" : "UUID atribut pro uživatele:", "UUID Attribute for Groups:" : "UUID atribut pro skupiny:", "Username-LDAP User Mapping" : "Mapování uživatelských jmen z LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Uživatelská jména slouží k ukládání a přiřazování metadat. Pro přesnou identifikaci a rozpoznávání uživatelů, každý LDAP uživatel má vnitřní uživatelské jméno. Toto vyžaduje mapování uživatelského jména na LDAP uživatele. Krom toho je uložen do mezipaměti rozlišený název aby se omezila interakce s LDAP, ale není používáno pro identifikaci. Pokud se DN změní, změny budou nalezeny. Vnitřní uživatelské jméno bude použito nade všechno. Čištění mapování bude mít pozůstatky všude. Čištění mapování není citlivé na nastavení, postihuje všechny LDAP nastavení. Nikdy nečistěte mapování v produkčním prostředí, pouze v testovací nebo experimentální fázi.", - "Clear Username-LDAP User Mapping" : "Zrušit mapování uživatelských jmen LDAPu", - "Clear Groupname-LDAP Group Mapping" : "Zrušit mapování názvů skupin LDAPu", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Zástupný symbol „%uid“ chybí. Při dotatzu na LDAP / AD bude nahrazen přihlašovacím jménem.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.", - "LDAP / AD integration" : "LDAP / AD propojení", - "LDAP / AD Username:" : "LDAP / AD uživatelské jméno:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje přihlašování pomocí LDAP/AD uživatelského jména, což je buď „uid“ nebo „sAMAccountName“ a bude zjištěno.", - "LDAP / AD Email Address:" : "E-mailová adresa z LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Ve výchozím nastavení bude interní uživatelské jméno vytvořeno z atributu UUID. To zajišťuje, že je uživatelské jméno unikátní a znaky nemusí být převáděny. Interní uživatelské jméno má omezení, podle kterého jsou povoleny jen následující znaky [ a-zA-Z0-9_.@- ]. Ostatní znaky jsou nahrazeny jejich protějšky z ASCII nebo prostě vynechány. Při konfliktech bude přidáno/zvýšeno číslo. Interní uživatelské jméno slouží pro interní identifikaci uživatele. Je také výchozím názvem domovského adresáře uživatele. Je také součástí URL, např. pro služby *DAV. Tímto nastavením může být výchozí chování změněno. Ponechte ho prázdné, pokud chcete zachovat výchozí nastavení. Změny se projeví pouze u nově namapovaných (přidaných) uživatelů LDAP." + "Clear Username-LDAP User Mapping" : "Zrušit mapování uživatelských jmen v LDAP", + "Clear Groupname-LDAP Group Mapping" : "Zrušit mapování názvů skupin na LDAP", + "Invalid configuration. Please have a look at the logs for further details." : "Neplatné nastavení. Podrobnosti naleznete v záznamu událostí." },"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/cy_GB.js b/apps/user_ldap/l10n/cy_GB.js deleted file mode 100644 index 3d47b3b4e66..00000000000 --- a/apps/user_ldap/l10n/cy_GB.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "Defnyddwyr", - "Groups" : "Grwpiau", - "Help" : "Cymorth", - "Password" : "Cyfrinair", - "Advanced" : "Uwch" -}, -"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/apps/user_ldap/l10n/cy_GB.json b/apps/user_ldap/l10n/cy_GB.json deleted file mode 100644 index 8140e36f49d..00000000000 --- a/apps/user_ldap/l10n/cy_GB.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "Users" : "Defnyddwyr", - "Groups" : "Grwpiau", - "Help" : "Cymorth", - "Password" : "Cyfrinair", - "Advanced" : "Uwch" -},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js index fc292ef7157..0c909bddbf0 100644 --- a/apps/user_ldap/l10n/da.js +++ b/apps/user_ldap/l10n/da.js @@ -1,192 +1,239 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "Mislykkedes med at rydde delingerne.", - "Failed to delete the server configuration" : "Kunne ikke slette server konfigurationen", + "Failed to clear the mappings." : "Det lykkedes ikke at rydde tilknytningen.", + "Failed to delete the server configuration" : "Kunne ikke slette serverkonfigurationen", "Invalid configuration: Anonymous binding is not allowed." : "Ugyldig konfiguration: Anonym binding er ikke tilladt.", "Valid configuration, connection established!" : "Gyldig konfiguration, forbindelse etableret!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Gyldig konfiguration, men forbindelsen mislykkedes. Tjek venligst serverens indstillinger og brugeroplysninger.", - "Invalid configuration. Please have a look at the logs for further details." : "Ikke gyldig konfiguration. Kig venligst på logfilerne for mere information.", - "No action specified" : "Der er ikke angivet en handling", - "No configuration specified" : "Der er ikke angivet en konfiguration", - "No data specified" : "Der er ikke angivet data", - " Could not set configuration %s" : "Kunne ikke indstille konfigurationen %s", - "Action does not exist" : "Handlingen findes ikke", - "Renewing …" : "Fornyer...", - "Very weak password" : "Meget svagt password", - "Weak password" : "Svagt password", - "So-so password" : "Jævnt password", - "Good password" : "Godt password", - "Strong password" : "Stærkt password", - "The Base DN appears to be wrong" : "Base DN'et ser ud til at være forkert", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Gyldig konfiguration, men binding mislykkedes. Tjek serverindstillingerne og legitimationerne.", + "Invalid configuration: %s" : "Ugyldig konfiguration: %s", + "No action specified" : "Ingen handling angivet", + "No configuration specified" : "Ingen konfiguration angivet", + "No data specified" : "Ingen data angivet", + "Invalid data specified" : "Ugyldige data angivet", + "Could not set configuration %1$s to %2$s" : "Kunne ikke indstille konfigurationen %1$s til %2$s", + "Action does not exist" : "Handling eksisterer ikke", + "Renewing …" : "Fornyer ...", + "Very weak password" : "Meget svag adgangskode", + "Weak password" : "Svækket adgangskode", + "So-so password" : "So-so adgangskode", + "Good password" : "God adgangskode", + "Strong password" : "Stærk adgangskode", + "The Base DN appears to be wrong" : "Base DN synes at være forkert", "Testing configuration…" : "Tester konfiguration...", - "Configuration incorrect" : "Konfigurationen er ikke korrekt", - "Configuration incomplete" : "Konfigurationen er ikke komplet", - "Configuration OK" : "Konfigurationen er OK", + "Configuration incorrect" : "Konfiguration forkert", + "Configuration incomplete" : "Konfiguration ufuldstændig", + "Configuration OK" : "Konfiguration OK", "Select groups" : "Vælg grupper", "Select object classes" : "Vælg objektklasser", - "Please check the credentials, they seem to be wrong." : "Tjek venligst brugeroplysningerne - de ser ud til at være forkerte.", - "Please specify the port, it could not be auto-detected." : "Angiv venligst porten - den kunne ikke registreres automatisk.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN kunne ikke registreres automatisk - gennemse venligst brugeroplysningerne, vært og port.", - "Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.", - "{nthServer}. Server" : "{nthServer}. server", - "No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.", - "More than 1,000 directory entries available." : "Mere end 1.000 mappeposter tilgængelige", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} objekter tilgængelige indenfor den angivne Base DN","{objectsFound} objekter tilgængelige indenfor den angivne Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.", - "Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?", + "Please check the credentials, they seem to be wrong." : "Tjek venligst legitimationerne.", + "Please specify the port, it could not be auto-detected." : "Angiv porten, den kunne ikke detekteres automatisk.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN kunne ikke detekteres automatisk, skal du revidere legitimation, vært og port.", + "Could not detect Base DN, please enter it manually." : "Kunne ikke detektere Base DN, skal du indtaste det manuelt.", + "{nthServer}. Server" : "{nthServer}. Server", + "No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne base DN. Vær venlig at revidere.", + "More than 1,000 directory entries available." : "Mere end 1.000 mappeindgange til rådighed.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} indgang tilgængelig i den givne Base DN","{objectsFound} poster tilgængelige inden for den givne Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN samt tilslutningsindstillinger og legitimationsoplysninger.", + "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle server konfiguration?", "Confirm Deletion" : "Bekræft sletning", - "Mappings cleared successfully!" : "Tilknytningerne blev ryddet af vejen!", + "Mappings cleared successfully!" : "Mappings ryddet med succes!", "Error while clearing the mappings." : "Fejl under rydning af tilknytninger.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonyme bindinger tillades ikke. Angiv venligst et User DN og adgangskode.", - "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP-driftsfejl. Anonyme bindinger tillades muligvis ikke.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lagringen mislykkedes. Sørg venligst for at databasen er i drift. Genindlæs for der fortsættes.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Skift af tilstanden vil betyde aktivering af automatiske LDAP-forespørgsler. Afhængig af størrelsen på din LDAP, vil det kunne tage noget tid. Ønsker du stadig at ændre tilstanden?", - "Mode switch" : "Skift af tilstand", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonym binding er ikke tilladt. Giv venligst en bruger DN og adgangskode.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operationsfejl. Anonym binding er måske ikke tilladt.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Gemning mislykkedes. Sørg for, at databasen er i drift. Genindlæs før du fortsætter.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Skifter tilstand vil aktivere automatisk LDAP forespørgsler. Afhængig af din LDAP størrelse kan de tage et stykke tid. Vil du stadig skifte tilstand?", + "Mode switch" : "Tilstandsafbryder", "Select attributes" : "Vælg attributter", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Bruger blev ikke fundet. Tjek venligst dine login-attributter og brugernavnet. Gældende filter (til kopiér-og-indsæt for validering via kommandolinje): <br/>", - "User found and settings verified." : "Bruger blev fundetog indstillingerne bekræftet.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at lave en mere præcis søgning pga. den rammer mange brugere og kun den første er i stand til at logge ind.", - "An unspecified error occurred. Please check log and settings." : "Der skete en uspecificeret fejl . Tjek log og indstillinger.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt - sandsynligvis på grund af problemer med syntaksen, såsom et ulige antal åbne og lukkede parenteser. Gennemse venligst. ", - "Please provide a login name to test against" : "Angiv venligst et loginnavn for at teste mod", - "Password change rejected. Hint: " : "Kodeord ændring afvist. Hint:", - "Please login with the new password" : "Log venligst ind med dit nye password", - "LDAP User backend" : "LDAP Bruger-backend", - "Your password will expire tomorrow." : "Dit password udløber i morgen.", - "Your password will expire today." : "Dit password udløber i dag.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dit password udløber om en dag.","Dit password udløber om %n dage."], - "_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"], - "_%s user found_::_%s users found_" : ["Der blev fundet %s bruger","Der blev fundet %s brugere"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke registrere navneattributten for visning af bruger. Angiv den venligst selv i de avancerede LDAP-indstillinger.", - "Could not find the desired feature" : "Fandt ikke den ønskede funktion", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Brugeren ikke fundet. Tjek venligst dine login attributter og brugernavn. Effektiv filter (til copy- and - paste til kommandolinjevalidering): < br / >", + "User found and settings verified." : "Bruger fundet og indstillinger verificeret.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at indsnævre din søgning, som det omfattede mange brugere, kun den første af dem vil være i stand til at logge ind.", + "An unspecified error occurred. Please check log and settings." : "En uspecificeret fejl opstod. Tjek log og indstillinger.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt, sandsynligvis på grund af syntaksspørgsmål som ulige antal åbne og lukkede parenteser. Vær venlig at revidere.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "En forbindelsesfejl til LDAP / AD opstod. Tjek vært, havn og legitimation.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Placeholderen \"%u ID\" mangler. Det vil blive erstattet med login navn, når du forespørger LDAP / AD.", + "Please provide a login name to test against" : "Angiv et login navn at teste mod", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Gruppefeltet var deaktiveret, fordi LDAP / AD-serveren ikke understøtter memberOf.", + "Password change rejected. Hint: %s" : "Adgangskodeændring afvist. Hint: %s", + "Mandatory field \"%s\" left empty" : "Obligatorisk felt \"%s\" efterladt tom", + "A password is given, but not an LDAP agent" : "En adgangskode er givet, men ikke en LDAP agent", + "No password is given for the user agent" : "Ingen adgangskode er givet for brugeren agent", + "No LDAP base DN was given" : "Ingen LDAP base DN blev givet", + "User base DN is not a subnode of global base DN" : "Brugerbase DN er ikke en subnode af global base DN", + "Group base DN is not a subnode of global base DN" : "Group base DN er ikke en subnode af global base DN", + "Login filter does not contain %s placeholder." : "Login filter indeholder ikke %s pladsholder.", + "Please login with the new password" : "Log ind med den nye adgangskode", + "LDAP User backend" : "LDAP Brugermotor", + "Your password will expire tomorrow." : "Din adgangskode udløber i morgen.", + "Your password will expire today." : "Din adgangskode udløber i dag.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Din adgangskode udløber inden for %n dag.","Din adgangskode udløber inden for %n dage."], + "LDAP/AD integration" : "LDAP / AD integration", + "LDAP Connection" : "LDAP forbindelse", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Binding mislykkedes for denne LDAP- konfiguration:% s","Binding mislykkedes for %n LDAP- konfigurationer: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Søgning mislykkedes for denne LDAP- konfiguration:% s","Søgning mislykkedes for %n LDAP- konfigurationer: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Der er en inaktiv LDAP- konfiguration:% s","Der er %n inaktive LDAP- konfigurationer: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Binding og søgning virker på den konfigurerede LDAP- forbindelse (% s)","Binding og søgning virker på alle %n konfigurerede LDAP- forbindelser (%s)"], + "Invalid LDAP UUIDs" : "Ugyldige LDAP UUID 'er", + "None found" : "Ingen fundet", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ugyldige UUID 'er for LDAP-konti eller -grupper er fundet. Du bedes gennemgå dine \"Override UUID Detection\" indstillinger i Expert del af LDAP konfiguration og bruge \"occ ldap: update- uuid\" til at opdatere dem.", + "_%n group found_::_%n groups found_" : [" %n gruppe fundet"," %n grupper fundet"], + "> 1000 groups found" : "> 1000 grupper fundet", + "> 1000 users found" : "> 1000 brugere fundet", + "_%n user found_::_%n users found_" : [" %n bruger fundet"," %n brugere fundet"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke detektere brugernavn attribut. Angiv det selv i avancerede LDAP-indstillinger.", + "Could not find the desired feature" : "Kunne ikke finde den ønskede funktion", "Invalid Host" : "Ugyldig vært", - "LDAP user and group backend" : "LDAP bruger og gruppe backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Denne applikation tillader administrator at forbinde Nextcloud til et LDAP bruger kartotek", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Denne applikation tillader administrator at forbinde Nextcloud til et LDAP bruger kartotek som foretager godkendelse og overførsel af brugere, grupper og bruger egenskaber. Adminstrator kan via LDAP bruger græsnsefladen konfigurere denne applikation til at forbinde til et eller flere LDAP kartoteker eller Active Directories. Egenskaber så som bruger kvota, email, avatar billeder, gruppe tilhørsforhold og andet kan blive overført til nextcloud fra et bibliotek med med de korrekte forspørgsler og filtre. \n\nEn bruger logger ind i Nextcloud med deres LDAP eller AD legitimation og får adgang baseret på en legitimationsforspørgsel håndteret til den tilsluttede LDAP eller AD server. Nextcloud gemmer ikke LDAP eller AD password, men bruger disse til at legitimere en bruger og opsætter en bruger ID for brugerens ophold. Mere information er tilgængelig i LDAP bruger og Group Backend dokumentationen.", - "Test Configuration" : "Test konfigurationen", + "LDAP user and group backend" : "LDAP- bruger og gruppe-motor", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Dette program gør det muligt for administratorer at forbinde Nextcloud til en LDAP- baseret brugermappe.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Dette program gør det muligt for administratorer at forbinde Nextcloud til en LDAP- baseret brugermappe for autentificering og levering brugere, grupper og brugerattributter. Administrerer kan indstille dette program til at oprette forbindelse til en eller flere LDAP- mapper eller aktive mapper via en LDAP- grænseflade. Attributter såsom brugerkvote, e-mail, avatar billeder, gruppe medlemskaber og mere kan trækkes ind Nextcloud fra en mappe med de relevante forespørgsler og filtre.\n\nEn bruger logger ind på Nextcloud med deres LDAP- eller AD-legitimationsoplysninger og får adgang baseret på en autentificeringsanmodning, der håndteres af LDAP- eller AD-serveren. Nextcloud ikke gemme LDAP- eller AD-adgangskoder, snarere disse legitimationsoplysninger bruges til at autentificere en bruger og derefter Nextcloud bruger en session for brugeren ID. Mere information er tilgængelig i LDAP User and Group Backend dokumentation.", + "Test Configuration" : "Prøvningsindstilling", "Help" : "Hjælp", - "Groups meeting these criteria are available in %s:" : "Grupper som opfylder disse kriterier er tilgængelige i %s:", + "Groups meeting these criteria are available in %s:" : "Grupper, der opfylder disse kriterier, er tilgængelige i %s:", "Only these object classes:" : "Kun disse objektklasser:", "Only from these groups:" : "Kun fra disse grupper:", - "Search groups" : "Søg grupper", + "Search groups" : "Søgegrupper", "Available groups" : "Tilgængelige grupper", - "Selected groups" : "Valgte grupper", - "Edit LDAP Query" : "Redigér LDAP-forespørgsel", - "LDAP Filter:" : "LDAP-filter:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver hvilke LDAP-grupper, der skal have adgang til instansen %s.", - "Verify settings and count the groups" : "Verificér indstillinger og optællingsgrupper", - "When logging in, %s will find the user based on the following attributes:" : "Når der logges ind, så vil %s finde brugeren baseret på følgende attributter:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e-mailattribut. Mail og \"mailPrimaryAddress\" vil være tilladt.", + "Selected groups" : "Udvalgte grupper", + "Edit LDAP Query" : "Redigér LDAP Forespørgsel", + "LDAP Filter:" : "LDAP- filter:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver, hvilke LDAP- grupper der skal have adgang til %s eksemplet.", + "Verify settings and count the groups" : "Verificer indstillinger og tæl grupperne", + "When logging in, %s will find the user based on the following attributes:" : "Når du logger ind, vil %s finde brugeren baseret på følgende egenskaber:", + "LDAP/AD Username:" : "LDAP / AD Brugernavn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP / AD brugernavn, som er enten \"uid\" eller \"SAMAccountName\" og vil blive opdaget.", + "LDAP/AD Email Address:" : "LDAP / AD E-mail adresse:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e- mail- attribut. \"mail\" og \"mailPrimaryAddress\" tilladt.", "Other Attributes:" : "Andre attributter:", - "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer filtret der anvendes, når der er forsøg på at logge ind. \"%%uid\" erstattter brugernavnet i login-handlingen. Eksempel: \"uid=%%uid\"", - "Test Loginname" : "Test loginnavn", - "Verify settings" : "Kontrollér indstillinger", - "%s. Server:" : "%s. server:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer det filter der skal anvendes, når login er forsøgt. \"%% uid\" erstatter brugernavnet i login-handlingen. Eksempel: \"uid =%% uid\"", + "Test Loginname" : "Test af loginnavn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Forsøg på at modtage en DN for det givne lognavn og det aktuelle login-filter", + "Verify settings" : "Verificér indstillinger", + "%s. Server:" : "%s. Server:", "Add a new configuration" : "Tilføj en ny konfiguration", - "Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration ind i en ny mappetilknytning", + "Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration til ny mappebinding", "Delete the current configuration" : "Slet den aktuelle konfiguration", "Host" : "Vært", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kan udelade protokollen, medmindre du skal bruge SSL. Start i så fald med ldaps://", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kan udelade protokollen, medmindre du har brug for SSL. Hvis ja, begynd med ldaps: / /", "Port" : "Port", - "Detect Port" : "Registrér port", + "Detect Port" : "Detektér port", "User DN" : "Bruger DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken forbindelsen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.", - "Password" : "Kodeord", - "For anonymous access, leave DN and Password empty." : "For anonym adgang, skal du lade DN og Adgangskode tomme.", - "Save Credentials" : "Gem brugeroplysninger", - "One Base DN per line" : "Ét Base DN per linje", - "You can specify Base DN for users and groups in the Advanced tab" : "Du kan specificere base DN for brugere og grupper i fanen Advanceret", - "Detect Base DN" : "Registrér Base DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN for klientbrugeren, som bindingen skal udføres med, f.eks. uid = agent, DC = eksempel, DC = com. For anonym adgang, lad DN og Password tom.", + "Password" : "Adgangskode", + "For anonymous access, leave DN and Password empty." : "For anonym adgang, lad DN og Password tom.", + "Save Credentials" : "Gem afstemning", + "One Base DN per line" : "One Base DN pr. linje", + "You can specify Base DN for users and groups in the Advanced tab" : "Du kan angive Base DN for brugere og grupper i fanebladet Avanceret", + "Detect Base DN" : "Detektér base DN", "Test Base DN" : "Test Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatiske LDAP-forespørgsler. Bedre på større opsætninger, men kræver en del LDAP-kendskab.", - "Manually enter LDAP filters (recommended for large directories)" : "Angiv LDAP-filtre manuelt (anbefales til større kataloger)", - "Listing and searching for users is constrained by these criteria:" : "Listning og søgning af brugere er begrænset af følgende kriterier:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De fleste gængse objektklasser for brugere er organizationalPerson, person, user og inetOrgPerson. Hvis du ikker er sikker på hvilken objektklasse, der skal vælges, så tal med administratoren af dit katalog.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver hvilke LDAP-brugere, der skal have adgang til %s-instansen.", - "Verify settings and count users" : "Kontrollér indstillinger og optalte brugere", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatisk LDAP anmodninger. Bedre for større opsætninger, men kræver noget LDAP viden.", + "Manually enter LDAP filters (recommended for large directories)" : "Indtast LDAP- filtre manuelt (anbefales til store mapper)", + "Listing and searching for users is constrained by these criteria:" : "Lister og søgning efter brugere er begrænset af disse kriterier:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De mest almindelige objektklasser for brugere er organisationalPerson, person, bruger og inetOrgPerson. Hvis du ikke er sikker på hvilken objektklasse du skal vælge, bedes du konsultere din mappe- admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver, hvilke LDAP-brugere der skal have adgang til %s instansen.", + "Verify settings and count users" : "Verificér indstillinger og tæller brugere", "Saving" : "Gemmer", "Back" : "Tilbage", - "Continue" : "Videre", - "Please renew your password." : "Nulstil venligst dit password.", + "Continue" : "Fortsæt", + "Please renew your password." : "Venligst forny din adgangskode.", "An internal error occurred." : "Der opstod en intern fejl.", - "Please try again or contact your administrator." : "Prøv venligst igen eller kontakt din administrator.", - "Current password" : "Nuværende password", - "New password" : "Nyt password", - "Renew password" : "Forny venligst password", - "Wrong password." : "Forkert password.", + "Please try again or contact your administrator." : "Prøv igen eller kontakt din administrator.", + "Current password" : "Nuværende adgangskode", + "New password" : "Ny adgangskode", + "Renew password" : "Forny adgangskode", + "Wrong password." : "Forkert adgangskode.", "Cancel" : "Annullér", "Server" : "Server", "Users" : "Brugere", - "Login Attributes" : "Login-attributter", + "Login Attributes" : "Login attributter", "Groups" : "Grupper", "Expert" : "Ekspert", "Advanced" : "Avanceret", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP-modulet LDAP er ikke installeret - backend'en vil ikke fungere. Anmod venligst din systemadministrator om at installere det.", - "Connection Settings" : "Forbindelsesindstillinger ", - "Configuration Active" : "Konfiguration er aktiv", - "When unchecked, this configuration will be skipped." : "Hvis der ikke er markeret, så springes denne konfiguration over.", - "Backup (Replica) Host" : "Vært for sikkerhedskopier (replika)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Angiv valgfrit en vært for sikkerhedskopiering. Dette skal være en replikering af den primære LDAP/AD-server.", - "Backup (Replica) Port" : "Port for sikkerhedskopi (replika)", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "< b > Advarsel: < / b > PHP LDAP modulet er ikke installeret, bagenden vil ikke virke. Bed din systemadministrator om at installere den.", + "Connection Settings" : "Forbindelsesindstillinger", + "Configuration Active" : "Indstillingsaktiv", + "When unchecked, this configuration will be skipped." : "Når denne indstilling ikke er markeret, vil den blive sprunget over.", + "Backup (Replica) Host" : "Backup (Replica) vært", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Giv en ekstra backup vært. Det skal være en kopi af hovedserveren LDAP / AD.", + "Backup (Replica) Port" : "Backup (Replica) Port", "Disable Main Server" : "Deaktivér hovedserver", - "Only connect to the replica server." : "Forbind kun til replika serveren.", - "Turn off SSL certificate validation." : "Deaktivér validering af SSL-certifikat.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Anbefales ikke - bruges kun til testformål! Hvis forbindelse udelukkende fungerer med dette tilvalg, så importér LDAP-serverens SSL-certifikat i din %s-server.", - "Cache Time-To-Live" : "Cache levetid", - "in seconds. A change empties the cache." : "i sekunder. En ændring vil tømme cachen.", + "Only connect to the replica server." : "Kun forbindelse til replikaserveren.", + "Turn off SSL certificate validation." : "Sluk validering af SSL-certifikater.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Ikke anbefalet, brug det kun til test! Hvis forbindelsen kun virker med denne indstilling, importeres LDAP- serverens SSL-certifikat i din %s server.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "om få sekunder. En forandring tømmer cachen.", "Directory Settings" : "Mappeindstillinger", - "User Display Name Field" : "Vist brugernavn felt", - "The LDAP attribute to use to generate the user's display name." : "LDAP-attributten som skal bruges til at oprette brugerens viste navn.", - "2nd User Display Name Field" : "Felt for af 2. brugers viste navn", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Valgfri. En LDAP-attribut som tilføjes til vist navn inde i kantede anførselstegn. Giver eks. »John Doe (john.doe@example.org)«.", - "Base User Tree" : "Base Bruger Træ", - "One User Base DN per line" : "Én bruger-Base DN per linje", - "User Search Attributes" : "Attributter for brugersøgning", - "Optional; one attribute per line" : "Valgfrit; én attribut per linje", - "Group Display Name Field" : "Navnefelt for gruppevisning", - "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributten som skal bruges til at oprette gruppens viste navn.", - "Base Group Tree" : "Base Group Tree", - "One Group Base DN per line" : "Ét gruppe-Base DN per linje", - "Group Search Attributes" : "Attributter for gruppesøgning", - "Group-Member association" : "Guppemedlem forening", - "Dynamic Group Member URL" : "URL for dynamisk gruppemedlem", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Den LDAP-attribut, som på gruppeobjekter indeholder en URL for LDAP-søgning, der afgør hvilke objekter som tilhører gruppen. (En værdiløs indstilling deaktiverer funktionalitet for dynamisk gruppemedlemskab.)", - "Nested Groups" : "Indlejrede grupper", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når slået til, så vil grupper som rummer grupper blive understøttet. (Dette fungerer kun, hvis attributten for gruppemedlem indeholder DN'er.)", - "Paging chunksize" : "Fragmentstørrelse for sideinddeling", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Fragmentstørrelse som bruges til sideinddelte LDAP-søgninger, der kan returnere omfattende resultater såsom bruger eller gruppe-optælling. (Angivelse til 0 vil slå sideinddelte LDAP-søgninger fra for disse situationer.)", - "Enable LDAP password changes per user" : "Aktivér ændringer i LDAP-adgangskoder per bruger", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Tillader at LDAP-brugere kan ændre deres adgangskode og tillader Superadministratorer og Gruppeadministratorer, at ændre adgangskoden for deres LDAP-brugere. Dette virker kun, hvis rettigheder for adgangskontrol er konfigureret tilsvarende på LDAP-serveren. Da adgangskoder sendes som klartekst til LDAP-serveren, så skal der anvendes en transportkryptering, samtidig som der bør være konfigureret således, at der sker en hashing af adgangskoder på LDAP-serveren.", - "(New password is sent as plain text to LDAP)" : "(Ny adgangskode sendes som klartekst til LDAP)", - "Default password policy DN" : "Standard password politik DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN for en standard password politik vil blive brugt til at håndtere udløb af password. Virker kun når LDAP password ændringer pr. bruger er aktiveret og understøtter kun OpenLDAP. Efterlad tom for at deaktivere håndtering password udløb.", - "Special Attributes" : "Specielle attributter", - "Quota Field" : "Kvote Felt", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Lad stå tom for brugerens standardkvota. Alternativt angives en LDAP/AD-attribut.", - "Quota Default" : "Standard for kvota", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Tilsidesætter standardkvota for LDAP-brugere, der ikke har fået angivet en kvota i feltet Kvota.", - "Email Field" : "Felt for e-mail", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Angiver brugerens e-mail fra deres LDAP-attribut. Lad stå tom for standardadfærd.", - "User Home Folder Naming Rule" : "Navneregel for brugerens hjemmemappe", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en ekstern lager konfiguration vil blive ombyttet med indholdet af den specificerede attribut", - "Internal Username" : "Internt Brugernavn", - "Internal Username Attribute:" : "Internt attribut for brugernavn:", - "Override UUID detection" : "Tilsidesæt UUID-detektering", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som udgangspunkt registreres UUID-attributten automatisk. UUID-attributten bruges til entydig identificering af LDAP-brugere og -grupper. I tillæg vil det interne brugernavn blive oprettes på basis af UUID'et, hvis andet ikke angives ovenfor. Du kan tilsidesætte indstillingen og angive en attribut efter eget valg. Du skal sørge for at dén attribut du selv vælger, kan hentes for både brugere og grupper, samt at den er unik. Lad stå tom for standardadfærd. Ændringer vil kun påvirke nyilgt kortlagte (tilføjede) LDAP-brugere og -grupper.", - "UUID Attribute for Users:" : "UUID-attribut for brugere:", - "UUID Attribute for Groups:" : "UUID-attribut for grupper:", - "Username-LDAP User Mapping" : "Kortlægning mellem brugernavn og LDAP-bruger", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brugernavne bruges til at lagre og tildele metadata. For at kunne identificere og genkende brugere præcist, vil hver LDAP-bruger få oprettet et internt brugernavn. Det oprettede brugernavn svarer til UUID'et for LDAP-brugeren. I tillæg mellemlagres DN'et for at mindske LDAP-interaktioner, men det mellemlagrede benyttes ikke til identifikation. Hvis DN'et ændres, vil ændringerne blive registreret. Det interne brugernavn anvendes overalt. Hvis kortlægningerne ryddes, så vil der være rester overalt. Rydning af kortlægningerne er ikke konfigurationssensitivt - det påvirker alle LDAP-konfigurationer! Ryd aldrig kortlægningerne i et produktionsmiljø, kun i et teststadie eller eksperimentelt stadie.", - "Clear Username-LDAP User Mapping" : "Ryd kortlægning mellem brugernavn og LDAP-bruger", - "Clear Groupname-LDAP Group Mapping" : "Ryd kortlægning mellem gruppenavn og LDAP-gruppe", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Der opstod en forbindelsesfejl til LDAP/AD - tjek venligst vært, port og brugeroplysninger.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Pladsholderen for %uid mangler. Den vil blive erstattes med loginnavnet, når LDAP/AD forespørges.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen var slået fra, fordi LDAP/AD-serveren ikke understøtter memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP/AD-brugernavn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP/AD-brugernavnet, hvilket enten er et uid eller »samaccountname«, og vil blive detekteret.", - "LDAP / AD Email Address:" : "E-mailadresser for LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som udgangspunkt bliver det interne brugernavn oprettet ud fra UUID-attributten. Dette sikrer at brugernavnet er unikt og at ikke nødvendigt at konvertere tegn. Det interne brugernavn har den begrænsning, at alene følgende tegn tillades: [ a-zA-Z0-9_.@- ]. Andre tegn bliver erstattet med deres ASCI-korrespondent eller simpelthen udeladt. I tilfælde af kollisioner tilføjes/forøges et tal. Det interne brugernavn bruges til at identificere en bruger internt. Dette er også standardnavnet for en brugers hjemmemappe. Det er også en del af fjern-URL'er, eks. for alle *DAV-tjenester. Med denne indstilling kan standardadfærden tilsidesættes. Lad den stå tom for standardadfærden. Ændringer vil alene påvirke nyligt kortlagte (tilføjede) LDAP-brugere." + "User Display Name Field" : "Brugervisningsnavnefelt", + "The LDAP attribute to use to generate the user's display name." : "LDAP attributten der skal bruges til at generere brugerens visningsnavn.", + "2nd User Display Name Field" : "2. brugervisningsnavnefelt", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Valgfrit. En LDAP-attribut, der skal tilføjes til visningsnavnet i parentes. Resultater i f.eks. \"John Doe (john.doe @ example.org)\".", + "Base User Tree" : "Base brugertræ", + "One User Base DN per line" : "One User Base DN per linje", + "User Search Attributes" : "Brugersøgningsattributter", + "Optional; one attribute per line" : "Valgfrit; én attribut pr. linje", + "Disable users missing from LDAP" : "Deaktiver brugere mangler fra LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Når der tændes, vil brugere importeret fra LDAP, som så mangler, blive deaktiveret", + "Group Display Name Field" : "Gruppevisning Navnefelt", + "The LDAP attribute to use to generate the groups's display name." : "LDAP attributten der skal bruges til at generere gruppernes visningsnavn.", + "Base Group Tree" : "Base gruppe træ", + "One Group Base DN per line" : "One Group Base DN pr. linje", + "Group Search Attributes" : "Gruppesøgeattributter", + "Group-Member association" : "Sammenslutning af medlemmer", + "Dynamic Group Member URL" : "Name", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Den LDAP attribut, der på gruppe objekter indeholder en LDAP søgning URL, der bestemmer, hvad objekter tilhører gruppen. (En tom indstilling deaktiverer dynamisk gruppemedlemskab funktionalitet.)", + "Nested Groups" : "Indfødte grupper", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når de er tændt, understøttes grupper som indeholder grupper. (Virker kun, hvis attributten for gruppemedlemmer indeholder DNs.)", + "Paging chunksize" : "Sidestørrelse", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize bruges til sidestillede LDAP søgninger, der kan returnere store resultater som bruger eller gruppe optælling. (Indstiller det 0 deaktiverer bilagte LDAP søgninger i disse situationer.)", + "Enable LDAP password changes per user" : "Aktivér ændringer af LDAP- adgangskode pr. bruger", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Tillad LDAP-brugere at ændre deres adgangskode og tillade Super Administratorer og Group Administratorer at ændre adgangskoden for deres LDAP-brugere. Fungerer kun når adgangskontrolpolitikker er konfigureret i overensstemmelse hermed på LDAP- serveren. Da adgangskoder sendes i klartekst til LDAP- serveren, skal der bruges transportkryptering og password hashing skal indstilles på LDAP- serveren.", + "(New password is sent as plain text to LDAP)" : "(Ny adgangskode sendes som almindelig tekst til LDAP)", + "Default password policy DN" : "Standard kodeordspolitik DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN for en standard kodeord politik, der vil blive brugt til kodeord udløbshåndtering. Fungerer kun når LDAP- kodeord ændres per bruger er aktiveret og understøttes kun af OpenLDAP. Lad tom for at deaktivere password udløbshåndtering.", + "Special Attributes" : "Særlige attributter", + "Quota Field" : "Kontingentfelt", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Efterlad tom for brugerens standardkvote. Ellers angives en LDAP- / AD-attribut.", + "Quota Default" : "Kvotestandard", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Overskrid standardkvote for LDAP-brugere, der ikke har en kvote fastsat i kvotefeltet.", + "Email Field" : "E-mail felt", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Sæt brugerens e-mail fra deres LDAP attribut. Lad den stå tom for standardadfærd.", + "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Efterlad tomt for brugernavn (standard). Ellers angives en LDAP- / AD-attribut.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en ekstern lagerkonfiguration vil blive erstattet med værdien af den angivne attribut", + "User Profile Attributes" : "Brugerprofilattributter", + "Phone Field" : "Telefon felt", + "User profile Phone will be set from the specified attribute" : "Brugerprofil Telefonen vil blive sat fra den angivne attribut", + "Website Field" : "Webstedsfelt", + "User profile Website will be set from the specified attribute" : "Brugerprofil Websted vil blive sat fra den angivne attribut", + "Address Field" : "Adresse felt", + "User profile Address will be set from the specified attribute" : "Brugerprofiladresse vil blive sat fra den angivne attribut", + "Twitter Field" : "Twitter felt", + "User profile Twitter will be set from the specified attribute" : "Brugerprofil Twitter vil blive sat fra den angivne attribut", + "Fediverse Field" : "Fediverse felt", + "User profile Fediverse will be set from the specified attribute" : "Brugerprofil Fediverse vil blive sat fra den angivne attribut", + "Organisation Field" : "Organisationsfelt", + "User profile Organisation will be set from the specified attribute" : "Brugerprofil Organisation vil blive sat fra den angivne attribut", + "Role Field" : "Rollefelt", + "User profile Role will be set from the specified attribute" : "Brugerprofil Rolle vil blive sat fra den angivne attribut", + "Headline Field" : "Overstreg felt", + "User profile Headline will be set from the specified attribute" : "Brugerprofil Overskrift vil blive sat fra den angivne attribut", + "Biography Field" : "Biografifelt", + "User profile Biography will be set from the specified attribute" : "Brugerprofil Biografi vil blive sat fra den angivne attribut", + "Birthdate Field" : "Fødselsdato felt", + "User profile Date of birth will be set from the specified attribute" : "Brugerprofil Fødselsdato vil blive sat fra den angivne attribut", + "Pronouns Field" : "Pronounsfelt", + "User profile Pronouns will be set from the specified attribute" : "Brugerprofil Pronouns vil blive sat fra den angivne attribut", + "Internal Username" : "Intern brugernavn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard vil det interne brugernavn blive oprettet fra UUID attributten. Det sikrer, at brugernavnet er unikt og tegn behøver ikke at blive konverteret. Det interne brugernavn har den begrænsning, at kun disse tegn er tilladt: [a- zA- Z0- 9 _. @ -]. Andre tegn erstattes med deres ASCII-korrespondance eller udelades simpelthen. Ved kollisioner vil et antal blive tilføjet / forøget. Det interne brugernavn bruges til at identificere en bruger internt. Det er også standardnavnet for brugerens hjemmemappe. Det er også en del af eksterne webadresser, for eksempel for alle DAV-tjenester. Med denne indstilling kan standardadfærden tilsidesættes. Ændringer vil kun have virkning på nykortlagte (tilføjede) LDAP-brugere. Lad det stå tomt for standardadfærd.", + "Internal Username Attribute:" : "Intern brugernavn Attribut:", + "Override UUID detection" : "Tilsidesæt UUID detektering", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard detekteres UUID- attributten automatisk. UUID attributten bruges til uden tvivl at identificere LDAP-brugere og grupper. Også, vil det interne brugernavn blive oprettet baseret på UUID, hvis ikke angivet ellers ovenfor. Du kan tilsidesætte indstillingen og videregive en attribut efter dit valg. Du skal sørge for, at attributten for dit valg kan hentes for både brugere og grupper, og det er unikt. Lad det stå tomt for standardadfærd. Ændringer vil kun have virkning på nykortlagte (tilføjede) LDAP-brugere og grupper.", + "UUID Attribute for Users:" : "UUID Attribut for brugere:", + "UUID Attribute for Groups:" : "UUID Attribut for grupper:", + "Username-LDAP User Mapping" : "Brugernavn - LDAP Brugerkortlægning", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brugernavne bruges til at gemme og tildele metadata. For præcist at identificere og genkende brugere, vil hver LDAP-bruger have et internt brugernavn. Dette kræver en kortlægning fra brugernavn til LDAP-bruger. Det oprettede brugernavn er kortlagt til UUID for LDAP-brugeren. Derudover er DN cache så godt at reducere LDAP interaktion, men det bruges ikke til identifikation. Hvis DN ændres, vil ændringerne blive fundet. Det interne brugernavn bruges over det hele. Rydning af tilknytninger vil have rester overalt. Rydning af tilknytninger er ikke konfiguration følsom, det påvirker alle LDAP konfigurationer! Ryd aldrig maskerne i et produktionsmiljø, kun i et test- eller forsøgsstadium.", + "Clear Username-LDAP User Mapping" : "Ryd brugernavn-LDAP-brugertilknytning", + "Clear Groupname-LDAP Group Mapping" : "Ryd gruppenavn-LDAP-gruppetilknytning", + "Invalid configuration. Please have a look at the logs for further details." : "Ugyldig konfiguration. Se venligst logfilerne for yderligere oplysninger." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json index fa0d56dfa2a..99ad292499e 100644 --- a/apps/user_ldap/l10n/da.json +++ b/apps/user_ldap/l10n/da.json @@ -1,190 +1,237 @@ { "translations": { - "Failed to clear the mappings." : "Mislykkedes med at rydde delingerne.", - "Failed to delete the server configuration" : "Kunne ikke slette server konfigurationen", + "Failed to clear the mappings." : "Det lykkedes ikke at rydde tilknytningen.", + "Failed to delete the server configuration" : "Kunne ikke slette serverkonfigurationen", "Invalid configuration: Anonymous binding is not allowed." : "Ugyldig konfiguration: Anonym binding er ikke tilladt.", "Valid configuration, connection established!" : "Gyldig konfiguration, forbindelse etableret!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Gyldig konfiguration, men forbindelsen mislykkedes. Tjek venligst serverens indstillinger og brugeroplysninger.", - "Invalid configuration. Please have a look at the logs for further details." : "Ikke gyldig konfiguration. Kig venligst på logfilerne for mere information.", - "No action specified" : "Der er ikke angivet en handling", - "No configuration specified" : "Der er ikke angivet en konfiguration", - "No data specified" : "Der er ikke angivet data", - " Could not set configuration %s" : "Kunne ikke indstille konfigurationen %s", - "Action does not exist" : "Handlingen findes ikke", - "Renewing …" : "Fornyer...", - "Very weak password" : "Meget svagt password", - "Weak password" : "Svagt password", - "So-so password" : "Jævnt password", - "Good password" : "Godt password", - "Strong password" : "Stærkt password", - "The Base DN appears to be wrong" : "Base DN'et ser ud til at være forkert", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Gyldig konfiguration, men binding mislykkedes. Tjek serverindstillingerne og legitimationerne.", + "Invalid configuration: %s" : "Ugyldig konfiguration: %s", + "No action specified" : "Ingen handling angivet", + "No configuration specified" : "Ingen konfiguration angivet", + "No data specified" : "Ingen data angivet", + "Invalid data specified" : "Ugyldige data angivet", + "Could not set configuration %1$s to %2$s" : "Kunne ikke indstille konfigurationen %1$s til %2$s", + "Action does not exist" : "Handling eksisterer ikke", + "Renewing …" : "Fornyer ...", + "Very weak password" : "Meget svag adgangskode", + "Weak password" : "Svækket adgangskode", + "So-so password" : "So-so adgangskode", + "Good password" : "God adgangskode", + "Strong password" : "Stærk adgangskode", + "The Base DN appears to be wrong" : "Base DN synes at være forkert", "Testing configuration…" : "Tester konfiguration...", - "Configuration incorrect" : "Konfigurationen er ikke korrekt", - "Configuration incomplete" : "Konfigurationen er ikke komplet", - "Configuration OK" : "Konfigurationen er OK", + "Configuration incorrect" : "Konfiguration forkert", + "Configuration incomplete" : "Konfiguration ufuldstændig", + "Configuration OK" : "Konfiguration OK", "Select groups" : "Vælg grupper", "Select object classes" : "Vælg objektklasser", - "Please check the credentials, they seem to be wrong." : "Tjek venligst brugeroplysningerne - de ser ud til at være forkerte.", - "Please specify the port, it could not be auto-detected." : "Angiv venligst porten - den kunne ikke registreres automatisk.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN kunne ikke registreres automatisk - gennemse venligst brugeroplysningerne, vært og port.", - "Could not detect Base DN, please enter it manually." : "Kunne ikke registrere Base DN - angiv den venligst manuelt.", - "{nthServer}. Server" : "{nthServer}. server", - "No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne Base DN. Gennemse venligst.", - "More than 1,000 directory entries available." : "Mere end 1.000 mappeposter tilgængelige", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} objekter tilgængelige indenfor den angivne Base DN","{objectsFound} objekter tilgængelige indenfor den angivne Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN, såvel som forbindelsesindstillingerne og brugeroplysningerne.", - "Do you really want to delete the current Server Configuration?" : "Ønsker du virkelig at slette den nuværende Server Konfiguration?", + "Please check the credentials, they seem to be wrong." : "Tjek venligst legitimationerne.", + "Please specify the port, it could not be auto-detected." : "Angiv porten, den kunne ikke detekteres automatisk.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN kunne ikke detekteres automatisk, skal du revidere legitimation, vært og port.", + "Could not detect Base DN, please enter it manually." : "Kunne ikke detektere Base DN, skal du indtaste det manuelt.", + "{nthServer}. Server" : "{nthServer}. Server", + "No object found in the given Base DN. Please revise." : "Intet objekt fundet i den givne base DN. Vær venlig at revidere.", + "More than 1,000 directory entries available." : "Mere end 1.000 mappeindgange til rådighed.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} indgang tilgængelig i den givne Base DN","{objectsFound} poster tilgængelige inden for den givne Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Der opstod en fejl. Tjek venligst Base DN samt tilslutningsindstillinger og legitimationsoplysninger.", + "Do you really want to delete the current Server Configuration?" : "Vil du virkelig slette den aktuelle server konfiguration?", "Confirm Deletion" : "Bekræft sletning", - "Mappings cleared successfully!" : "Tilknytningerne blev ryddet af vejen!", + "Mappings cleared successfully!" : "Mappings ryddet med succes!", "Error while clearing the mappings." : "Fejl under rydning af tilknytninger.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonyme bindinger tillades ikke. Angiv venligst et User DN og adgangskode.", - "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP-driftsfejl. Anonyme bindinger tillades muligvis ikke.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lagringen mislykkedes. Sørg venligst for at databasen er i drift. Genindlæs for der fortsættes.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Skift af tilstanden vil betyde aktivering af automatiske LDAP-forespørgsler. Afhængig af størrelsen på din LDAP, vil det kunne tage noget tid. Ønsker du stadig at ændre tilstanden?", - "Mode switch" : "Skift af tilstand", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonym binding er ikke tilladt. Giv venligst en bruger DN og adgangskode.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operationsfejl. Anonym binding er måske ikke tilladt.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Gemning mislykkedes. Sørg for, at databasen er i drift. Genindlæs før du fortsætter.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Skifter tilstand vil aktivere automatisk LDAP forespørgsler. Afhængig af din LDAP størrelse kan de tage et stykke tid. Vil du stadig skifte tilstand?", + "Mode switch" : "Tilstandsafbryder", "Select attributes" : "Vælg attributter", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Bruger blev ikke fundet. Tjek venligst dine login-attributter og brugernavnet. Gældende filter (til kopiér-og-indsæt for validering via kommandolinje): <br/>", - "User found and settings verified." : "Bruger blev fundetog indstillingerne bekræftet.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at lave en mere præcis søgning pga. den rammer mange brugere og kun den første er i stand til at logge ind.", - "An unspecified error occurred. Please check log and settings." : "Der skete en uspecificeret fejl . Tjek log og indstillinger.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt - sandsynligvis på grund af problemer med syntaksen, såsom et ulige antal åbne og lukkede parenteser. Gennemse venligst. ", - "Please provide a login name to test against" : "Angiv venligst et loginnavn for at teste mod", - "Password change rejected. Hint: " : "Kodeord ændring afvist. Hint:", - "Please login with the new password" : "Log venligst ind med dit nye password", - "LDAP User backend" : "LDAP Bruger-backend", - "Your password will expire tomorrow." : "Dit password udløber i morgen.", - "Your password will expire today." : "Dit password udløber i dag.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dit password udløber om en dag.","Dit password udløber om %n dage."], - "_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"], - "_%s user found_::_%s users found_" : ["Der blev fundet %s bruger","Der blev fundet %s brugere"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke registrere navneattributten for visning af bruger. Angiv den venligst selv i de avancerede LDAP-indstillinger.", - "Could not find the desired feature" : "Fandt ikke den ønskede funktion", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Brugeren ikke fundet. Tjek venligst dine login attributter og brugernavn. Effektiv filter (til copy- and - paste til kommandolinjevalidering): < br / >", + "User found and settings verified." : "Bruger fundet og indstillinger verificeret.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvej at indsnævre din søgning, som det omfattede mange brugere, kun den første af dem vil være i stand til at logge ind.", + "An unspecified error occurred. Please check log and settings." : "En uspecificeret fejl opstod. Tjek log og indstillinger.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søgefilteret er ugyldigt, sandsynligvis på grund af syntaksspørgsmål som ulige antal åbne og lukkede parenteser. Vær venlig at revidere.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "En forbindelsesfejl til LDAP / AD opstod. Tjek vært, havn og legitimation.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Placeholderen \"%u ID\" mangler. Det vil blive erstattet med login navn, når du forespørger LDAP / AD.", + "Please provide a login name to test against" : "Angiv et login navn at teste mod", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Gruppefeltet var deaktiveret, fordi LDAP / AD-serveren ikke understøtter memberOf.", + "Password change rejected. Hint: %s" : "Adgangskodeændring afvist. Hint: %s", + "Mandatory field \"%s\" left empty" : "Obligatorisk felt \"%s\" efterladt tom", + "A password is given, but not an LDAP agent" : "En adgangskode er givet, men ikke en LDAP agent", + "No password is given for the user agent" : "Ingen adgangskode er givet for brugeren agent", + "No LDAP base DN was given" : "Ingen LDAP base DN blev givet", + "User base DN is not a subnode of global base DN" : "Brugerbase DN er ikke en subnode af global base DN", + "Group base DN is not a subnode of global base DN" : "Group base DN er ikke en subnode af global base DN", + "Login filter does not contain %s placeholder." : "Login filter indeholder ikke %s pladsholder.", + "Please login with the new password" : "Log ind med den nye adgangskode", + "LDAP User backend" : "LDAP Brugermotor", + "Your password will expire tomorrow." : "Din adgangskode udløber i morgen.", + "Your password will expire today." : "Din adgangskode udløber i dag.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Din adgangskode udløber inden for %n dag.","Din adgangskode udløber inden for %n dage."], + "LDAP/AD integration" : "LDAP / AD integration", + "LDAP Connection" : "LDAP forbindelse", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Binding mislykkedes for denne LDAP- konfiguration:% s","Binding mislykkedes for %n LDAP- konfigurationer: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Søgning mislykkedes for denne LDAP- konfiguration:% s","Søgning mislykkedes for %n LDAP- konfigurationer: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Der er en inaktiv LDAP- konfiguration:% s","Der er %n inaktive LDAP- konfigurationer: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Binding og søgning virker på den konfigurerede LDAP- forbindelse (% s)","Binding og søgning virker på alle %n konfigurerede LDAP- forbindelser (%s)"], + "Invalid LDAP UUIDs" : "Ugyldige LDAP UUID 'er", + "None found" : "Ingen fundet", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ugyldige UUID 'er for LDAP-konti eller -grupper er fundet. Du bedes gennemgå dine \"Override UUID Detection\" indstillinger i Expert del af LDAP konfiguration og bruge \"occ ldap: update- uuid\" til at opdatere dem.", + "_%n group found_::_%n groups found_" : [" %n gruppe fundet"," %n grupper fundet"], + "> 1000 groups found" : "> 1000 grupper fundet", + "> 1000 users found" : "> 1000 brugere fundet", + "_%n user found_::_%n users found_" : [" %n bruger fundet"," %n brugere fundet"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke detektere brugernavn attribut. Angiv det selv i avancerede LDAP-indstillinger.", + "Could not find the desired feature" : "Kunne ikke finde den ønskede funktion", "Invalid Host" : "Ugyldig vært", - "LDAP user and group backend" : "LDAP bruger og gruppe backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Denne applikation tillader administrator at forbinde Nextcloud til et LDAP bruger kartotek", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Denne applikation tillader administrator at forbinde Nextcloud til et LDAP bruger kartotek som foretager godkendelse og overførsel af brugere, grupper og bruger egenskaber. Adminstrator kan via LDAP bruger græsnsefladen konfigurere denne applikation til at forbinde til et eller flere LDAP kartoteker eller Active Directories. Egenskaber så som bruger kvota, email, avatar billeder, gruppe tilhørsforhold og andet kan blive overført til nextcloud fra et bibliotek med med de korrekte forspørgsler og filtre. \n\nEn bruger logger ind i Nextcloud med deres LDAP eller AD legitimation og får adgang baseret på en legitimationsforspørgsel håndteret til den tilsluttede LDAP eller AD server. Nextcloud gemmer ikke LDAP eller AD password, men bruger disse til at legitimere en bruger og opsætter en bruger ID for brugerens ophold. Mere information er tilgængelig i LDAP bruger og Group Backend dokumentationen.", - "Test Configuration" : "Test konfigurationen", + "LDAP user and group backend" : "LDAP- bruger og gruppe-motor", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Dette program gør det muligt for administratorer at forbinde Nextcloud til en LDAP- baseret brugermappe.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Dette program gør det muligt for administratorer at forbinde Nextcloud til en LDAP- baseret brugermappe for autentificering og levering brugere, grupper og brugerattributter. Administrerer kan indstille dette program til at oprette forbindelse til en eller flere LDAP- mapper eller aktive mapper via en LDAP- grænseflade. Attributter såsom brugerkvote, e-mail, avatar billeder, gruppe medlemskaber og mere kan trækkes ind Nextcloud fra en mappe med de relevante forespørgsler og filtre.\n\nEn bruger logger ind på Nextcloud med deres LDAP- eller AD-legitimationsoplysninger og får adgang baseret på en autentificeringsanmodning, der håndteres af LDAP- eller AD-serveren. Nextcloud ikke gemme LDAP- eller AD-adgangskoder, snarere disse legitimationsoplysninger bruges til at autentificere en bruger og derefter Nextcloud bruger en session for brugeren ID. Mere information er tilgængelig i LDAP User and Group Backend dokumentation.", + "Test Configuration" : "Prøvningsindstilling", "Help" : "Hjælp", - "Groups meeting these criteria are available in %s:" : "Grupper som opfylder disse kriterier er tilgængelige i %s:", + "Groups meeting these criteria are available in %s:" : "Grupper, der opfylder disse kriterier, er tilgængelige i %s:", "Only these object classes:" : "Kun disse objektklasser:", "Only from these groups:" : "Kun fra disse grupper:", - "Search groups" : "Søg grupper", + "Search groups" : "Søgegrupper", "Available groups" : "Tilgængelige grupper", - "Selected groups" : "Valgte grupper", - "Edit LDAP Query" : "Redigér LDAP-forespørgsel", - "LDAP Filter:" : "LDAP-filter:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver hvilke LDAP-grupper, der skal have adgang til instansen %s.", - "Verify settings and count the groups" : "Verificér indstillinger og optællingsgrupper", - "When logging in, %s will find the user based on the following attributes:" : "Når der logges ind, så vil %s finde brugeren baseret på følgende attributter:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e-mailattribut. Mail og \"mailPrimaryAddress\" vil være tilladt.", + "Selected groups" : "Udvalgte grupper", + "Edit LDAP Query" : "Redigér LDAP Forespørgsel", + "LDAP Filter:" : "LDAP- filter:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret angiver, hvilke LDAP- grupper der skal have adgang til %s eksemplet.", + "Verify settings and count the groups" : "Verificer indstillinger og tæl grupperne", + "When logging in, %s will find the user based on the following attributes:" : "Når du logger ind, vil %s finde brugeren baseret på følgende egenskaber:", + "LDAP/AD Username:" : "LDAP / AD Brugernavn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP / AD brugernavn, som er enten \"uid\" eller \"SAMAccountName\" og vil blive opdaget.", + "LDAP/AD Email Address:" : "LDAP / AD E-mail adresse:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillader login mod en e- mail- attribut. \"mail\" og \"mailPrimaryAddress\" tilladt.", "Other Attributes:" : "Andre attributter:", - "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer filtret der anvendes, når der er forsøg på at logge ind. \"%%uid\" erstattter brugernavnet i login-handlingen. Eksempel: \"uid=%%uid\"", - "Test Loginname" : "Test loginnavn", - "Verify settings" : "Kontrollér indstillinger", - "%s. Server:" : "%s. server:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer det filter der skal anvendes, når login er forsøgt. \"%% uid\" erstatter brugernavnet i login-handlingen. Eksempel: \"uid =%% uid\"", + "Test Loginname" : "Test af loginnavn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Forsøg på at modtage en DN for det givne lognavn og det aktuelle login-filter", + "Verify settings" : "Verificér indstillinger", + "%s. Server:" : "%s. Server:", "Add a new configuration" : "Tilføj en ny konfiguration", - "Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration ind i en ny mappetilknytning", + "Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration til ny mappebinding", "Delete the current configuration" : "Slet den aktuelle konfiguration", "Host" : "Vært", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kan udelade protokollen, medmindre du skal bruge SSL. Start i så fald med ldaps://", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kan udelade protokollen, medmindre du har brug for SSL. Hvis ja, begynd med ldaps: / /", "Port" : "Port", - "Detect Port" : "Registrér port", + "Detect Port" : "Detektér port", "User DN" : "Bruger DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN'et for klientbrugeren, for hvilken forbindelsen skal foretages, eks. uid=agent,dc=eksempel,dc=com. For anonym adgang lades DN og Password stå tomme.", - "Password" : "Kodeord", - "For anonymous access, leave DN and Password empty." : "For anonym adgang, skal du lade DN og Adgangskode tomme.", - "Save Credentials" : "Gem brugeroplysninger", - "One Base DN per line" : "Ét Base DN per linje", - "You can specify Base DN for users and groups in the Advanced tab" : "Du kan specificere base DN for brugere og grupper i fanen Advanceret", - "Detect Base DN" : "Registrér Base DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN for klientbrugeren, som bindingen skal udføres med, f.eks. uid = agent, DC = eksempel, DC = com. For anonym adgang, lad DN og Password tom.", + "Password" : "Adgangskode", + "For anonymous access, leave DN and Password empty." : "For anonym adgang, lad DN og Password tom.", + "Save Credentials" : "Gem afstemning", + "One Base DN per line" : "One Base DN pr. linje", + "You can specify Base DN for users and groups in the Advanced tab" : "Du kan angive Base DN for brugere og grupper i fanebladet Avanceret", + "Detect Base DN" : "Detektér base DN", "Test Base DN" : "Test Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatiske LDAP-forespørgsler. Bedre på større opsætninger, men kræver en del LDAP-kendskab.", - "Manually enter LDAP filters (recommended for large directories)" : "Angiv LDAP-filtre manuelt (anbefales til større kataloger)", - "Listing and searching for users is constrained by these criteria:" : "Listning og søgning af brugere er begrænset af følgende kriterier:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De fleste gængse objektklasser for brugere er organizationalPerson, person, user og inetOrgPerson. Hvis du ikker er sikker på hvilken objektklasse, der skal vælges, så tal med administratoren af dit katalog.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver hvilke LDAP-brugere, der skal have adgang til %s-instansen.", - "Verify settings and count users" : "Kontrollér indstillinger og optalte brugere", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undgår automatisk LDAP anmodninger. Bedre for større opsætninger, men kræver noget LDAP viden.", + "Manually enter LDAP filters (recommended for large directories)" : "Indtast LDAP- filtre manuelt (anbefales til store mapper)", + "Listing and searching for users is constrained by these criteria:" : "Lister og søgning efter brugere er begrænset af disse kriterier:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "De mest almindelige objektklasser for brugere er organisationalPerson, person, bruger og inetOrgPerson. Hvis du ikke er sikker på hvilken objektklasse du skal vælge, bedes du konsultere din mappe- admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret angiver, hvilke LDAP-brugere der skal have adgang til %s instansen.", + "Verify settings and count users" : "Verificér indstillinger og tæller brugere", "Saving" : "Gemmer", "Back" : "Tilbage", - "Continue" : "Videre", - "Please renew your password." : "Nulstil venligst dit password.", + "Continue" : "Fortsæt", + "Please renew your password." : "Venligst forny din adgangskode.", "An internal error occurred." : "Der opstod en intern fejl.", - "Please try again or contact your administrator." : "Prøv venligst igen eller kontakt din administrator.", - "Current password" : "Nuværende password", - "New password" : "Nyt password", - "Renew password" : "Forny venligst password", - "Wrong password." : "Forkert password.", + "Please try again or contact your administrator." : "Prøv igen eller kontakt din administrator.", + "Current password" : "Nuværende adgangskode", + "New password" : "Ny adgangskode", + "Renew password" : "Forny adgangskode", + "Wrong password." : "Forkert adgangskode.", "Cancel" : "Annullér", "Server" : "Server", "Users" : "Brugere", - "Login Attributes" : "Login-attributter", + "Login Attributes" : "Login attributter", "Groups" : "Grupper", "Expert" : "Ekspert", "Advanced" : "Avanceret", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP-modulet LDAP er ikke installeret - backend'en vil ikke fungere. Anmod venligst din systemadministrator om at installere det.", - "Connection Settings" : "Forbindelsesindstillinger ", - "Configuration Active" : "Konfiguration er aktiv", - "When unchecked, this configuration will be skipped." : "Hvis der ikke er markeret, så springes denne konfiguration over.", - "Backup (Replica) Host" : "Vært for sikkerhedskopier (replika)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Angiv valgfrit en vært for sikkerhedskopiering. Dette skal være en replikering af den primære LDAP/AD-server.", - "Backup (Replica) Port" : "Port for sikkerhedskopi (replika)", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "< b > Advarsel: < / b > PHP LDAP modulet er ikke installeret, bagenden vil ikke virke. Bed din systemadministrator om at installere den.", + "Connection Settings" : "Forbindelsesindstillinger", + "Configuration Active" : "Indstillingsaktiv", + "When unchecked, this configuration will be skipped." : "Når denne indstilling ikke er markeret, vil den blive sprunget over.", + "Backup (Replica) Host" : "Backup (Replica) vært", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Giv en ekstra backup vært. Det skal være en kopi af hovedserveren LDAP / AD.", + "Backup (Replica) Port" : "Backup (Replica) Port", "Disable Main Server" : "Deaktivér hovedserver", - "Only connect to the replica server." : "Forbind kun til replika serveren.", - "Turn off SSL certificate validation." : "Deaktivér validering af SSL-certifikat.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Anbefales ikke - bruges kun til testformål! Hvis forbindelse udelukkende fungerer med dette tilvalg, så importér LDAP-serverens SSL-certifikat i din %s-server.", - "Cache Time-To-Live" : "Cache levetid", - "in seconds. A change empties the cache." : "i sekunder. En ændring vil tømme cachen.", + "Only connect to the replica server." : "Kun forbindelse til replikaserveren.", + "Turn off SSL certificate validation." : "Sluk validering af SSL-certifikater.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Ikke anbefalet, brug det kun til test! Hvis forbindelsen kun virker med denne indstilling, importeres LDAP- serverens SSL-certifikat i din %s server.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "om få sekunder. En forandring tømmer cachen.", "Directory Settings" : "Mappeindstillinger", - "User Display Name Field" : "Vist brugernavn felt", - "The LDAP attribute to use to generate the user's display name." : "LDAP-attributten som skal bruges til at oprette brugerens viste navn.", - "2nd User Display Name Field" : "Felt for af 2. brugers viste navn", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Valgfri. En LDAP-attribut som tilføjes til vist navn inde i kantede anførselstegn. Giver eks. »John Doe (john.doe@example.org)«.", - "Base User Tree" : "Base Bruger Træ", - "One User Base DN per line" : "Én bruger-Base DN per linje", - "User Search Attributes" : "Attributter for brugersøgning", - "Optional; one attribute per line" : "Valgfrit; én attribut per linje", - "Group Display Name Field" : "Navnefelt for gruppevisning", - "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributten som skal bruges til at oprette gruppens viste navn.", - "Base Group Tree" : "Base Group Tree", - "One Group Base DN per line" : "Ét gruppe-Base DN per linje", - "Group Search Attributes" : "Attributter for gruppesøgning", - "Group-Member association" : "Guppemedlem forening", - "Dynamic Group Member URL" : "URL for dynamisk gruppemedlem", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Den LDAP-attribut, som på gruppeobjekter indeholder en URL for LDAP-søgning, der afgør hvilke objekter som tilhører gruppen. (En værdiløs indstilling deaktiverer funktionalitet for dynamisk gruppemedlemskab.)", - "Nested Groups" : "Indlejrede grupper", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når slået til, så vil grupper som rummer grupper blive understøttet. (Dette fungerer kun, hvis attributten for gruppemedlem indeholder DN'er.)", - "Paging chunksize" : "Fragmentstørrelse for sideinddeling", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Fragmentstørrelse som bruges til sideinddelte LDAP-søgninger, der kan returnere omfattende resultater såsom bruger eller gruppe-optælling. (Angivelse til 0 vil slå sideinddelte LDAP-søgninger fra for disse situationer.)", - "Enable LDAP password changes per user" : "Aktivér ændringer i LDAP-adgangskoder per bruger", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Tillader at LDAP-brugere kan ændre deres adgangskode og tillader Superadministratorer og Gruppeadministratorer, at ændre adgangskoden for deres LDAP-brugere. Dette virker kun, hvis rettigheder for adgangskontrol er konfigureret tilsvarende på LDAP-serveren. Da adgangskoder sendes som klartekst til LDAP-serveren, så skal der anvendes en transportkryptering, samtidig som der bør være konfigureret således, at der sker en hashing af adgangskoder på LDAP-serveren.", - "(New password is sent as plain text to LDAP)" : "(Ny adgangskode sendes som klartekst til LDAP)", - "Default password policy DN" : "Standard password politik DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN for en standard password politik vil blive brugt til at håndtere udløb af password. Virker kun når LDAP password ændringer pr. bruger er aktiveret og understøtter kun OpenLDAP. Efterlad tom for at deaktivere håndtering password udløb.", - "Special Attributes" : "Specielle attributter", - "Quota Field" : "Kvote Felt", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Lad stå tom for brugerens standardkvota. Alternativt angives en LDAP/AD-attribut.", - "Quota Default" : "Standard for kvota", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Tilsidesætter standardkvota for LDAP-brugere, der ikke har fået angivet en kvota i feltet Kvota.", - "Email Field" : "Felt for e-mail", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Angiver brugerens e-mail fra deres LDAP-attribut. Lad stå tom for standardadfærd.", - "User Home Folder Naming Rule" : "Navneregel for brugerens hjemmemappe", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en ekstern lager konfiguration vil blive ombyttet med indholdet af den specificerede attribut", - "Internal Username" : "Internt Brugernavn", - "Internal Username Attribute:" : "Internt attribut for brugernavn:", - "Override UUID detection" : "Tilsidesæt UUID-detektering", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som udgangspunkt registreres UUID-attributten automatisk. UUID-attributten bruges til entydig identificering af LDAP-brugere og -grupper. I tillæg vil det interne brugernavn blive oprettes på basis af UUID'et, hvis andet ikke angives ovenfor. Du kan tilsidesætte indstillingen og angive en attribut efter eget valg. Du skal sørge for at dén attribut du selv vælger, kan hentes for både brugere og grupper, samt at den er unik. Lad stå tom for standardadfærd. Ændringer vil kun påvirke nyilgt kortlagte (tilføjede) LDAP-brugere og -grupper.", - "UUID Attribute for Users:" : "UUID-attribut for brugere:", - "UUID Attribute for Groups:" : "UUID-attribut for grupper:", - "Username-LDAP User Mapping" : "Kortlægning mellem brugernavn og LDAP-bruger", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brugernavne bruges til at lagre og tildele metadata. For at kunne identificere og genkende brugere præcist, vil hver LDAP-bruger få oprettet et internt brugernavn. Det oprettede brugernavn svarer til UUID'et for LDAP-brugeren. I tillæg mellemlagres DN'et for at mindske LDAP-interaktioner, men det mellemlagrede benyttes ikke til identifikation. Hvis DN'et ændres, vil ændringerne blive registreret. Det interne brugernavn anvendes overalt. Hvis kortlægningerne ryddes, så vil der være rester overalt. Rydning af kortlægningerne er ikke konfigurationssensitivt - det påvirker alle LDAP-konfigurationer! Ryd aldrig kortlægningerne i et produktionsmiljø, kun i et teststadie eller eksperimentelt stadie.", - "Clear Username-LDAP User Mapping" : "Ryd kortlægning mellem brugernavn og LDAP-bruger", - "Clear Groupname-LDAP Group Mapping" : "Ryd kortlægning mellem gruppenavn og LDAP-gruppe", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Der opstod en forbindelsesfejl til LDAP/AD - tjek venligst vært, port og brugeroplysninger.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Pladsholderen for %uid mangler. Den vil blive erstattes med loginnavnet, når LDAP/AD forespørges.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen var slået fra, fordi LDAP/AD-serveren ikke understøtter memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP/AD-brugernavn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillader login mod LDAP/AD-brugernavnet, hvilket enten er et uid eller »samaccountname«, og vil blive detekteret.", - "LDAP / AD Email Address:" : "E-mailadresser for LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som udgangspunkt bliver det interne brugernavn oprettet ud fra UUID-attributten. Dette sikrer at brugernavnet er unikt og at ikke nødvendigt at konvertere tegn. Det interne brugernavn har den begrænsning, at alene følgende tegn tillades: [ a-zA-Z0-9_.@- ]. Andre tegn bliver erstattet med deres ASCI-korrespondent eller simpelthen udeladt. I tilfælde af kollisioner tilføjes/forøges et tal. Det interne brugernavn bruges til at identificere en bruger internt. Dette er også standardnavnet for en brugers hjemmemappe. Det er også en del af fjern-URL'er, eks. for alle *DAV-tjenester. Med denne indstilling kan standardadfærden tilsidesættes. Lad den stå tom for standardadfærden. Ændringer vil alene påvirke nyligt kortlagte (tilføjede) LDAP-brugere." + "User Display Name Field" : "Brugervisningsnavnefelt", + "The LDAP attribute to use to generate the user's display name." : "LDAP attributten der skal bruges til at generere brugerens visningsnavn.", + "2nd User Display Name Field" : "2. brugervisningsnavnefelt", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Valgfrit. En LDAP-attribut, der skal tilføjes til visningsnavnet i parentes. Resultater i f.eks. \"John Doe (john.doe @ example.org)\".", + "Base User Tree" : "Base brugertræ", + "One User Base DN per line" : "One User Base DN per linje", + "User Search Attributes" : "Brugersøgningsattributter", + "Optional; one attribute per line" : "Valgfrit; én attribut pr. linje", + "Disable users missing from LDAP" : "Deaktiver brugere mangler fra LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Når der tændes, vil brugere importeret fra LDAP, som så mangler, blive deaktiveret", + "Group Display Name Field" : "Gruppevisning Navnefelt", + "The LDAP attribute to use to generate the groups's display name." : "LDAP attributten der skal bruges til at generere gruppernes visningsnavn.", + "Base Group Tree" : "Base gruppe træ", + "One Group Base DN per line" : "One Group Base DN pr. linje", + "Group Search Attributes" : "Gruppesøgeattributter", + "Group-Member association" : "Sammenslutning af medlemmer", + "Dynamic Group Member URL" : "Name", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Den LDAP attribut, der på gruppe objekter indeholder en LDAP søgning URL, der bestemmer, hvad objekter tilhører gruppen. (En tom indstilling deaktiverer dynamisk gruppemedlemskab funktionalitet.)", + "Nested Groups" : "Indfødte grupper", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Når de er tændt, understøttes grupper som indeholder grupper. (Virker kun, hvis attributten for gruppemedlemmer indeholder DNs.)", + "Paging chunksize" : "Sidestørrelse", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize bruges til sidestillede LDAP søgninger, der kan returnere store resultater som bruger eller gruppe optælling. (Indstiller det 0 deaktiverer bilagte LDAP søgninger i disse situationer.)", + "Enable LDAP password changes per user" : "Aktivér ændringer af LDAP- adgangskode pr. bruger", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Tillad LDAP-brugere at ændre deres adgangskode og tillade Super Administratorer og Group Administratorer at ændre adgangskoden for deres LDAP-brugere. Fungerer kun når adgangskontrolpolitikker er konfigureret i overensstemmelse hermed på LDAP- serveren. Da adgangskoder sendes i klartekst til LDAP- serveren, skal der bruges transportkryptering og password hashing skal indstilles på LDAP- serveren.", + "(New password is sent as plain text to LDAP)" : "(Ny adgangskode sendes som almindelig tekst til LDAP)", + "Default password policy DN" : "Standard kodeordspolitik DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN for en standard kodeord politik, der vil blive brugt til kodeord udløbshåndtering. Fungerer kun når LDAP- kodeord ændres per bruger er aktiveret og understøttes kun af OpenLDAP. Lad tom for at deaktivere password udløbshåndtering.", + "Special Attributes" : "Særlige attributter", + "Quota Field" : "Kontingentfelt", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Efterlad tom for brugerens standardkvote. Ellers angives en LDAP- / AD-attribut.", + "Quota Default" : "Kvotestandard", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Overskrid standardkvote for LDAP-brugere, der ikke har en kvote fastsat i kvotefeltet.", + "Email Field" : "E-mail felt", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Sæt brugerens e-mail fra deres LDAP attribut. Lad den stå tom for standardadfærd.", + "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Efterlad tomt for brugernavn (standard). Ellers angives en LDAP- / AD-attribut.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en ekstern lagerkonfiguration vil blive erstattet med værdien af den angivne attribut", + "User Profile Attributes" : "Brugerprofilattributter", + "Phone Field" : "Telefon felt", + "User profile Phone will be set from the specified attribute" : "Brugerprofil Telefonen vil blive sat fra den angivne attribut", + "Website Field" : "Webstedsfelt", + "User profile Website will be set from the specified attribute" : "Brugerprofil Websted vil blive sat fra den angivne attribut", + "Address Field" : "Adresse felt", + "User profile Address will be set from the specified attribute" : "Brugerprofiladresse vil blive sat fra den angivne attribut", + "Twitter Field" : "Twitter felt", + "User profile Twitter will be set from the specified attribute" : "Brugerprofil Twitter vil blive sat fra den angivne attribut", + "Fediverse Field" : "Fediverse felt", + "User profile Fediverse will be set from the specified attribute" : "Brugerprofil Fediverse vil blive sat fra den angivne attribut", + "Organisation Field" : "Organisationsfelt", + "User profile Organisation will be set from the specified attribute" : "Brugerprofil Organisation vil blive sat fra den angivne attribut", + "Role Field" : "Rollefelt", + "User profile Role will be set from the specified attribute" : "Brugerprofil Rolle vil blive sat fra den angivne attribut", + "Headline Field" : "Overstreg felt", + "User profile Headline will be set from the specified attribute" : "Brugerprofil Overskrift vil blive sat fra den angivne attribut", + "Biography Field" : "Biografifelt", + "User profile Biography will be set from the specified attribute" : "Brugerprofil Biografi vil blive sat fra den angivne attribut", + "Birthdate Field" : "Fødselsdato felt", + "User profile Date of birth will be set from the specified attribute" : "Brugerprofil Fødselsdato vil blive sat fra den angivne attribut", + "Pronouns Field" : "Pronounsfelt", + "User profile Pronouns will be set from the specified attribute" : "Brugerprofil Pronouns vil blive sat fra den angivne attribut", + "Internal Username" : "Intern brugernavn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard vil det interne brugernavn blive oprettet fra UUID attributten. Det sikrer, at brugernavnet er unikt og tegn behøver ikke at blive konverteret. Det interne brugernavn har den begrænsning, at kun disse tegn er tilladt: [a- zA- Z0- 9 _. @ -]. Andre tegn erstattes med deres ASCII-korrespondance eller udelades simpelthen. Ved kollisioner vil et antal blive tilføjet / forøget. Det interne brugernavn bruges til at identificere en bruger internt. Det er også standardnavnet for brugerens hjemmemappe. Det er også en del af eksterne webadresser, for eksempel for alle DAV-tjenester. Med denne indstilling kan standardadfærden tilsidesættes. Ændringer vil kun have virkning på nykortlagte (tilføjede) LDAP-brugere. Lad det stå tomt for standardadfærd.", + "Internal Username Attribute:" : "Intern brugernavn Attribut:", + "Override UUID detection" : "Tilsidesæt UUID detektering", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard detekteres UUID- attributten automatisk. UUID attributten bruges til uden tvivl at identificere LDAP-brugere og grupper. Også, vil det interne brugernavn blive oprettet baseret på UUID, hvis ikke angivet ellers ovenfor. Du kan tilsidesætte indstillingen og videregive en attribut efter dit valg. Du skal sørge for, at attributten for dit valg kan hentes for både brugere og grupper, og det er unikt. Lad det stå tomt for standardadfærd. Ændringer vil kun have virkning på nykortlagte (tilføjede) LDAP-brugere og grupper.", + "UUID Attribute for Users:" : "UUID Attribut for brugere:", + "UUID Attribute for Groups:" : "UUID Attribut for grupper:", + "Username-LDAP User Mapping" : "Brugernavn - LDAP Brugerkortlægning", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brugernavne bruges til at gemme og tildele metadata. For præcist at identificere og genkende brugere, vil hver LDAP-bruger have et internt brugernavn. Dette kræver en kortlægning fra brugernavn til LDAP-bruger. Det oprettede brugernavn er kortlagt til UUID for LDAP-brugeren. Derudover er DN cache så godt at reducere LDAP interaktion, men det bruges ikke til identifikation. Hvis DN ændres, vil ændringerne blive fundet. Det interne brugernavn bruges over det hele. Rydning af tilknytninger vil have rester overalt. Rydning af tilknytninger er ikke konfiguration følsom, det påvirker alle LDAP konfigurationer! Ryd aldrig maskerne i et produktionsmiljø, kun i et test- eller forsøgsstadium.", + "Clear Username-LDAP User Mapping" : "Ryd brugernavn-LDAP-brugertilknytning", + "Clear Groupname-LDAP Group Mapping" : "Ryd gruppenavn-LDAP-gruppetilknytning", + "Invalid configuration. Please have a look at the logs for further details." : "Ugyldig konfiguration. Se venligst logfilerne for yderligere oplysninger." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index c153437384b..37546227625 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -6,20 +6,21 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Die Konfiguration ist ungültig: anonymes Binden ist nicht erlaubt. ", "Valid configuration, connection established!" : "Gültige Konfiguration, Verbindung hergestellt!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig, aber der LDAP-Bind ist fehlgeschlagen. Bitte überprüfe die Servereinstellungen und Anmeldeinformationen. ", - "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Einzelheiten findest Du in den Logdateien.", + "Invalid configuration: %s" : "Ungültige Konfiguration: %s", "No action specified" : "Keine Aktion angegeben", "No configuration specified" : "Keine Konfiguration angegeben", "No data specified" : "Keine Daten angegeben", - " Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden", + "Invalid data specified" : "Ungültige Daten angegeben", + "Could not set configuration %1$s to %2$s" : "Die Konfiguration %1$s konnte nicht auf %2$s gesetzt werden", "Action does not exist" : "Aktion existiert nicht", - "Renewing …" : "Erneuere…", + "Renewing …" : "Erneuere …", "Very weak password" : "Sehr schwaches Passwort", "Weak password" : "Schwaches Passwort", "So-so password" : "Passables Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", "The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein", - "Testing configuration…" : "Teste Konfiguration…", + "Testing configuration…" : "Teste Konfiguration …", "Configuration incorrect" : "Konfiguration falsch", "Configuration incomplete" : "Konfiguration unvollständig", "Configuration OK" : "Konfiguration OK", @@ -33,40 +34,57 @@ OC.L10N.register( "No object found in the given Base DN. Please revise." : "Keine Objekte in der Base-DN gefunden, bitte überprüfen.", "More than 1,000 directory entries available." : "Mehr als 1.000 Einträge stehen zur Verfügung.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} Eintrag in der angegebenen Base DN verfügbar","{objectsFound} Einträge in der angegebenen Base DN verfügbar"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte die Base DN sowie die Verbindungs- und Anmeldeeinstellungen überprüfen.", - "Do you really want to delete the current Server Configuration?" : "Möchtest Du die aktuelle Serverkonfiguration wirklich löschen?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfe die Base DN sowie die Verbindungs- und Anmeldeeinstellungen.", + "Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?", "Confirm Deletion" : "Löschen bestätigen", - "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", + "Mappings cleared successfully!" : "Zuordnungen gelöscht!", "Error while clearing the mappings." : "Fehler beim Löschen der Zuordnungen.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous Bind ist nicht erlaubt. Bitte eine Benutzer-DN und ein Passwort angeben.", "LDAP Operations error. Anonymous bind might not be allowed." : "Fehler in den LDAP-Operationen. Anonymes binden ist scheinbar nicht erlaubt.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Speichern fehlgeschlagen. Bitte stelle sicher, dass die Datenbank in Betrieb ist. Bitte lade vor dem Fortfahren neu.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Das Umschalten des Modus ermöglicht automatische LDAP-Abfragen. Abhängig von Deiner LDAP-Größe können diese einige Zeit in Anspruch nehmen. Soll wirklich derModus gewechselt werden?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Das Umschalten des Modus ermöglicht automatische LDAP-Abfragen. Abhängig von deiner LDAP-Größe können diese einige Zeit in Anspruch nehmen. Soll wirklich der Modus gewechselt werden?", "Mode switch" : "Modus wechseln", "Select attributes" : "Attribute auswählen", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Benutzer nicht gefunden. Bitte überprüfe Deine Anmelde-Attribute und Deinen Benutzernamen. Gültige Filter (zum Kopieren und Einfügen bei der Überprüfung auf der Kommandozeile): <br/>", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Benutzer nicht gefunden. Bitte die Anmelde-Attribute und den Benutzernamen überprüfen. Gültige Filter (zum Kopieren und Einfügen bei der Überprüfung auf der Kommandozeile): <br/>", "User found and settings verified." : "Benutzer gefunden und Einstellungen überprüft.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Erwäge es, Deine Suche einzugrenzen, da sie viele Benutzer umfaßte. Nur der erste wird sich anmelden können.", - "An unspecified error occurred. Please check log and settings." : "Es ist ein nicht näher spezifizierter Fehler aufgetreten. Bitte prüfe die Logdatei und Einstellungen.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Der Suchfilter ist ungültig, möglicherweise bestehen Eingabefehler wie z.B. eine ungerade Anzahl von geöffneten und geschlossenen Klammern. Bitte überarbeiten.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Bitte in Erwägung ziehen, die Suche einzugrenzen, da sie viele Benutzer umfaßt. Nur der erste wird sich anmelden können.", + "An unspecified error occurred. Please check log and settings." : "Es ist ein nicht näher spezifizierter Fehler aufgetreten. Bitte die Logdatei und die Einstellungen überprüfen.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Der Suchfilter ist ungültig, möglicherweise bestehen Eingabefehler wie z. B. eine ungerade Anzahl von geöffneten und geschlossenen Klammern. Bitte überarbeiten.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten. Bitte Host, Port und Anmeldeinformationen überprüfen.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", - "Please provide a login name to test against" : "Bitte gib einen Benutzernamen an, um gegen diesen zu testen", + "Please provide a login name to test against" : "Bitte einen Benutzernamen eingeben, um gegen diesen zu testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP/AD-Server memberOf nicht unterstützt.", - "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", + "Password change rejected. Hint: %s" : "Passwortänderung verweigert. Hinweis: %s", + "Mandatory field \"%s\" left empty" : "Pflichtfeld \"%s\" leer gelassen", + "A password is given, but not an LDAP agent" : "Es wurde ein Passwort, aber kein LDAP-Agent eingegeben", + "No password is given for the user agent" : "Für den User-Agenten wurde kein Passwort angegeben", + "No LDAP base DN was given" : "Es wurde keine LDAP-Basis-DN eingegeben", + "User base DN is not a subnode of global base DN" : "Der Benutzer-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Group base DN is not a subnode of global base DN" : "Der Gruppen-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Login filter does not contain %s placeholder." : "Der Anmeldefilter enthält keinen %s-Platzhalter", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", "LDAP User backend" : "LDAP Benutzer-Backend", "Your password will expire tomorrow." : "Dein Passwort läuft morgen ab", "Your password will expire today." : "Dein Passwort läuft heute ab", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"], "LDAP/AD integration" : "LDAP/AD-Integration", - "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], - "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "LDAP Connection" : "LDAP-Verbindung", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindung für diese LDAP-Konfiguration fehlgeschlagen: %s","Bindung für %n LDAP-Konfigurationen fehlgeschlagen: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Die Suche für diese LDAP-Konfigurationen ist fehlgeschlagen: %s","Die Suche für %n LDAP-Konfigurationen ist fehlgeschlagen: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Es gibt eine inaktive LDAP-Konfiguration: %s","Es gibt %n inaktive LDAP-Konfigurationen: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Bindung und Suchen funktioniert auf allen der %nkonfigurierten LDAP-Verbindungen (%s)"], + "Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs", + "None found" : "Keine gefunden", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte die \"UUID-Erkennung überschreiben\"-Einstellungen im Expertenteil der LDAP-Konfiguration überprüfen und \"occ ldap:update-uuid\" verwenden, um sie zu aktualisieren.", + "_%n group found_::_%n groups found_" : ["%n Gruppe gefunden","%n Gruppen gefunden"], + "> 1000 groups found" : "Mehr als 1000 Gruppen gefunden", + "> 1000 users found" : "Mehr als 1000 Benutzer gefunden", + "_%n user found_::_%n users found_" : ["%n Benutzer gefunden","%n Benutzer gefunden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Das Anzeigename-Attribut des Benutzers konnte nicht gefunden werden. Bitte gib es selbst in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Die gewünschte Funktion konnte nicht gefunden werden", "Invalid Host" : "Ungültiger Host", "LDAP user and group backend" : "LDAP Benutzer- und Gruppen-Backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es Administratoren Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es der Administration, Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontigent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User and Group Backend\"-Dokumentation.", "Test Configuration" : "Testkonfiguration", "Help" : "Hilfe", @@ -88,39 +106,40 @@ OC.L10N.register( "Other Attributes:" : "Andere Attribute:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. \"%%uid\" ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", "Test Loginname" : "Anmeldenamen testen", + "Attempts to receive a DN for the given loginname and the current login filter" : "Es wird versucht, einen DN für den angegebenen Anmeldenamen und den aktuellen Anmeldefilter zu erhalten", "Verify settings" : "Einstellungen überprüfen", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Neue Konfiguration hinzufügen", "Copy current configuration into new directory binding" : "Aktuelle Konfiguration in eine neues Verzeichnis-Bind kopieren", "Delete the current configuration" : "Aktuelle Konfiguration löschen", "Host" : "Host", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kannst das Protokoll auslassen, es sei denn, Du benötigst SSL. In diesem Fall mit ldaps:// beginnen.", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kannst das Protokoll auslassen, es sei denn, du benötigst SSL. In diesem Fall mit ldaps:// beginnen.", "Port" : "Port", "Detect Port" : "Port ermitteln", "User DN" : "Benutzer-DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers, mit dem der LDAP-Bind durchgeführt werden soll, z.B. uid=agent,dc=example,dc=com. Für anonymen Zugriff DN und Passwort leerlassen.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers, mit dem der LDAP-Bind durchgeführt werden soll, z. B. uid=agent,dc=example,dc=com. Für anonymen Zugriff DN und Passwort leerlassen.", "Password" : "Passwort", "For anonymous access, leave DN and Password empty." : "Lasse die Felder DN und Passwort für anonymen Zugang leer.", "Save Credentials" : "Zugangsdaten speichern", "One Base DN per line" : "Einen Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : "Base DN für Benutzer und Gruppen kann im Reiter „Fortgeschritten“ angegeben werden", + "You can specify Base DN for users and groups in the Advanced tab" : "Die Basis-DN für Benutzer und Gruppen kann im Reiter \"Fortgeschritten\" eingegeben werden", "Detect Base DN" : "Base DN ermitteln", "Test Base DN" : "Base DN testen", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Verhindert automatische LDAP-Anfragen. Besser geeignet für größere Installationen, benötigt aber erweiterte LDAP-Kenntnisse.", "Manually enter LDAP filters (recommended for large directories)" : "LDAP-Filter manuell eingeben (empfohlen für große Verzeichnisse)", "Listing and searching for users is constrained by these criteria:" : "Auflistung und Suche nach Nutzern ist eingeschränkt durch folgende Kriterien:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Die häufigsten Objektklassen für Benutzer sind organizationalPerson, person, user und inetOrgPerson. Wenn Du nicht sicher bist, welche Objektklasse Du wählen sollst, frage bitte Deinen Verzeichnis-Administrator.", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Die häufigsten Objektklassen für Benutzer sind organizationalPerson, person, user und inetOrgPerson. Wenn du nicht sicher bist, welche Objektklasse du wählen sollst, frage bitte deinen Verzeichnis-Administrator.", "The filter specifies which LDAP users shall have access to the %s instance." : "Der Filter gibt an, welche LDAP-Benutzer Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count users" : "Einstellungen überprüfen und Benutzer zählen", "Saving" : "Speichern", "Back" : "Zurück", "Continue" : "Fortsetzen", - "Please renew your password." : "Bitte erneuere Dein Passwort", + "Please renew your password." : "Bitte dein Passwort erneuern", "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.", - "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere den Administrator.", + "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere die Administration.", "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", - "Renew password" : "Bitte erneuere Dein Passwort", + "Renew password" : "Passwort erneuern", "Wrong password." : "Falsches Passwort.", "Cancel" : "Abbrechen", "Server" : "Server", @@ -129,28 +148,30 @@ OC.L10N.register( "Groups" : "Gruppen", "Expert" : "Experte", "Advanced" : "Fortgeschritten", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktiere Deinen Systemadministrator und bitte ihn um die Installation des Moduls.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte die Systemadministration kontaktieren und diese um die Installation des Moduls bitten.", "Connection Settings" : "Verbindungseinstellungen", "Configuration Active" : "Konfiguration aktiv", "When unchecked, this configuration will be skipped." : "Konfiguration wird übersprungen, wenn nicht angehakt.", "Backup (Replica) Host" : "Backup-Host (Kopie)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Gib einen optionalen Backup-Host an. Es muss sich um eine Kopie des Haupt-LDAP/AD-Servers handeln.", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Optionalen Backup-Host eingeben. Es muss sich um eine Kopie des Haupt-LDAP/AD-Servers handeln.", "Backup (Replica) Port" : "Port des Backup-Hosts (Kopie)", "Disable Main Server" : "Hauptserver deaktivieren", "Only connect to the replica server." : "Nur zum Replikat-Server verbinden.", "Turn off SSL certificate validation." : "Schalte die SSL-Zertifikatsprüfung aus.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, das SSL-Zertifikat des LDAP-Servers in Deinen %s Server importieren.", - "Cache Time-To-Live" : "Speichere Time-To-Live zwischen", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, das SSL-Zertifikat des LDAP-Servers in deinen %s Server importieren.", + "Cache Time-To-Live" : "Time-To-Live zwischenspeichern", "in seconds. A change empties the cache." : "in Sekunden. Eine Änderung leert den Cache.", "Directory Settings" : "Ordnereinstellungen", "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens des Benutzers.", "2nd User Display Name Field" : "2. Benutzeranzeigename Feld", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »Erika Mustermann (erika.mustermann@beispiel.de)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut, um den Namen in Klammern anzuzeigen. Beispiel: »Erika Mustermann (erika.mustermann@beispiel.de)«.", "Base User Tree" : "Basis-Benutzerbaum", "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", "User Search Attributes" : "Benutzersucheigenschaften", "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", + "Disable users missing from LDAP" : "Benutzer deaktivieren, die in LDAP fehlen", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Wenn aktiviert, werden aus LDAP importierte und dann hier fehlende Benutzer deaktiviert", "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.", "Base Group Tree" : "Basis-Gruppenbaum", @@ -161,11 +182,11 @@ OC.L10N.register( "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\")", "Nested Groups" : "Verschachtelte Gruppen", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)", - "Paging chunksize" : "Seitenstücke (Paging chunksize)", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", + "Paging chunksize" : "Paging Chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Die Blockgröße für seitenweise LDAP-Suchen, die umfangreiche Ergebnisse wie Benutzer- oder Gruppenaufzählungen zurückgeben können. (Wenn Sie den Wert auf 0 setzen, werden seitenweise LDAP-Suchen in diesen Situationen deaktiviert.)", "Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. Dies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.", - "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", + "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wird als Klartext an LDAP gesendet)", "Default password policy DN" : "Standard Passwort-Regeln DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Die DN einer Standard-Passwort-Policy, welche für den Umgang mit ablaufenden Passwörtern verwendet wird. Dies funktioniert nur wenn Passwort-Änderungen pro Benutzer via LDAP und OpenLDAP aktiviert sind. Leer lassen, um die Passwortablaufbehandlung zu deaktivieren.", "Special Attributes" : "Spezielle Eigenschaften", @@ -174,13 +195,36 @@ OC.L10N.register( "Quota Default" : "Standardkontingent", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standardkontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : " E-Mail-Adresse des Benutzers über sein LDAP-Attribut festlegen. Für das Standardverhalten, Feld leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls trage ein LDAP/AD-Attribut ein.", "\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt", + "User Profile Attributes" : "Benutzerprofilattribute", + "Phone Field" : "Telefonfeld", + "User profile Phone will be set from the specified attribute" : "Benutzerprofil Telefon wird aus dem angegebenen Attribut festgelegt", + "Website Field" : "Webseiten-Feld", + "User profile Website will be set from the specified attribute" : "Benutzerprofil Webseite wird aus dem angegebenen Attribut festgelegt", + "Address Field" : "Adressfeld", + "User profile Address will be set from the specified attribute" : "Benutzerprofil-Adresse wird aus dem angegebenen Attribut festgelegt", + "Twitter Field" : "X-Feld", + "User profile Twitter will be set from the specified attribute" : "Benutzerprofil X wird aus dem angegebenen Attribut festgelegt", + "Fediverse Field" : "Fediverse-Feld", + "User profile Fediverse will be set from the specified attribute" : "Benutzerprofil Fediverse wird aus dem angegebenen Attribut festgelegt", + "Organisation Field" : "Organisationsfeld", + "User profile Organisation will be set from the specified attribute" : "Benutzerprofil Organisation wird aus dem angegebenen Attribut festgelegt", + "Role Field" : "Rollenfeld", + "User profile Role will be set from the specified attribute" : "Benutzerprofil Rolle wird anhand des angegebenen Attributs festgelegt\n ", + "Headline Field" : "Überschriftenfeld", + "User profile Headline will be set from the specified attribute" : "Benutzerprofil Überschrift wird aus dem angegebenen Attribut festgelegt", + "Biography Field" : "Biografisches Feld", + "User profile Biography will be set from the specified attribute" : "Benutzerprofil Biografie wird aus dem angegebenen Attribut festgelegt", + "Birthdate Field" : "Geburtstagsfeld", + "User profile Date of birth will be set from the specified attribute" : "Das Geburtsdatum des Profils wird aus dem angegebenen Attribut ermittelt", + "Pronouns Field" : "Pronomenfeld", + "User profile Pronouns will be set from the specified attribute" : "Profil-Pronomen werden aus dem angegebenen Attribut festgelegt", "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lasse das Eingabefeld leer.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lasse das Eingabefeld leer.", "Internal Username Attribute:" : "Attribut für interne Benutzernamen:", "Override UUID detection" : "UUID-Erkennung überschreiben", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmäßig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Außerdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Es muss allerdings sichergestellt werden, dass die gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Freilassen, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu »gemappte« (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Die Benutzernamen werden genutzt, um Metadaten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung des Benutzernamens zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit dem LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen gefunden. Der interne Benutzername wird überall verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste zurück. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Lösche niemals die Zuordnungen in einer produktiven Umgebung. Lösche die Zuordnungen nur in einer Test- oder Experimentierumgebung.", "Clear Username-LDAP User Mapping" : "LDAP-Benutzernamenzuordnung löschen", "Clear Groupname-LDAP Group Mapping" : "LDAP-Gruppennamenzuordnung löschen", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten, bitte Host, Port und Anmeldeinformationen überprüfen.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Der %uid - Platzhalter fehlt. Dieser wird mit dem Anmeldenamen beim Abfragen von LDAP / AD ersetzt.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", - "LDAP / AD integration" : "LDAP / AD Integration", - "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Erlaubt die Anmeldung gegen den LDAP/AD-Benutzernamen, der entweder \"uid\" oder \"sAMAccountName\" ist, und erkannt wird.", - "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lasse das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus." + "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Einzelheiten findest du in den Logdateien." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index 1ff345cf2c7..801f94a3907 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -4,20 +4,21 @@ "Invalid configuration: Anonymous binding is not allowed." : "Die Konfiguration ist ungültig: anonymes Binden ist nicht erlaubt. ", "Valid configuration, connection established!" : "Gültige Konfiguration, Verbindung hergestellt!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig, aber der LDAP-Bind ist fehlgeschlagen. Bitte überprüfe die Servereinstellungen und Anmeldeinformationen. ", - "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Einzelheiten findest Du in den Logdateien.", + "Invalid configuration: %s" : "Ungültige Konfiguration: %s", "No action specified" : "Keine Aktion angegeben", "No configuration specified" : "Keine Konfiguration angegeben", "No data specified" : "Keine Daten angegeben", - " Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden", + "Invalid data specified" : "Ungültige Daten angegeben", + "Could not set configuration %1$s to %2$s" : "Die Konfiguration %1$s konnte nicht auf %2$s gesetzt werden", "Action does not exist" : "Aktion existiert nicht", - "Renewing …" : "Erneuere…", + "Renewing …" : "Erneuere …", "Very weak password" : "Sehr schwaches Passwort", "Weak password" : "Schwaches Passwort", "So-so password" : "Passables Passwort", "Good password" : "Gutes Passwort", "Strong password" : "Starkes Passwort", "The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein", - "Testing configuration…" : "Teste Konfiguration…", + "Testing configuration…" : "Teste Konfiguration …", "Configuration incorrect" : "Konfiguration falsch", "Configuration incomplete" : "Konfiguration unvollständig", "Configuration OK" : "Konfiguration OK", @@ -31,40 +32,57 @@ "No object found in the given Base DN. Please revise." : "Keine Objekte in der Base-DN gefunden, bitte überprüfen.", "More than 1,000 directory entries available." : "Mehr als 1.000 Einträge stehen zur Verfügung.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} Eintrag in der angegebenen Base DN verfügbar","{objectsFound} Einträge in der angegebenen Base DN verfügbar"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ein Fehler ist aufgetreten. Bitte die Base DN sowie die Verbindungs- und Anmeldeeinstellungen überprüfen.", - "Do you really want to delete the current Server Configuration?" : "Möchtest Du die aktuelle Serverkonfiguration wirklich löschen?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfe die Base DN sowie die Verbindungs- und Anmeldeeinstellungen.", + "Do you really want to delete the current Server Configuration?" : "Soll die aktuelle Serverkonfiguration wirklich gelöscht werden?", "Confirm Deletion" : "Löschen bestätigen", - "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", + "Mappings cleared successfully!" : "Zuordnungen gelöscht!", "Error while clearing the mappings." : "Fehler beim Löschen der Zuordnungen.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous Bind ist nicht erlaubt. Bitte eine Benutzer-DN und ein Passwort angeben.", "LDAP Operations error. Anonymous bind might not be allowed." : "Fehler in den LDAP-Operationen. Anonymes binden ist scheinbar nicht erlaubt.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Speichern fehlgeschlagen. Bitte stelle sicher, dass die Datenbank in Betrieb ist. Bitte lade vor dem Fortfahren neu.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Das Umschalten des Modus ermöglicht automatische LDAP-Abfragen. Abhängig von Deiner LDAP-Größe können diese einige Zeit in Anspruch nehmen. Soll wirklich derModus gewechselt werden?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Das Umschalten des Modus ermöglicht automatische LDAP-Abfragen. Abhängig von deiner LDAP-Größe können diese einige Zeit in Anspruch nehmen. Soll wirklich der Modus gewechselt werden?", "Mode switch" : "Modus wechseln", "Select attributes" : "Attribute auswählen", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Benutzer nicht gefunden. Bitte überprüfe Deine Anmelde-Attribute und Deinen Benutzernamen. Gültige Filter (zum Kopieren und Einfügen bei der Überprüfung auf der Kommandozeile): <br/>", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Benutzer nicht gefunden. Bitte die Anmelde-Attribute und den Benutzernamen überprüfen. Gültige Filter (zum Kopieren und Einfügen bei der Überprüfung auf der Kommandozeile): <br/>", "User found and settings verified." : "Benutzer gefunden und Einstellungen überprüft.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Erwäge es, Deine Suche einzugrenzen, da sie viele Benutzer umfaßte. Nur der erste wird sich anmelden können.", - "An unspecified error occurred. Please check log and settings." : "Es ist ein nicht näher spezifizierter Fehler aufgetreten. Bitte prüfe die Logdatei und Einstellungen.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Der Suchfilter ist ungültig, möglicherweise bestehen Eingabefehler wie z.B. eine ungerade Anzahl von geöffneten und geschlossenen Klammern. Bitte überarbeiten.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Bitte in Erwägung ziehen, die Suche einzugrenzen, da sie viele Benutzer umfaßt. Nur der erste wird sich anmelden können.", + "An unspecified error occurred. Please check log and settings." : "Es ist ein nicht näher spezifizierter Fehler aufgetreten. Bitte die Logdatei und die Einstellungen überprüfen.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Der Suchfilter ist ungültig, möglicherweise bestehen Eingabefehler wie z. B. eine ungerade Anzahl von geöffneten und geschlossenen Klammern. Bitte überarbeiten.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten. Bitte Host, Port und Anmeldeinformationen überprüfen.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", - "Please provide a login name to test against" : "Bitte gib einen Benutzernamen an, um gegen diesen zu testen", + "Please provide a login name to test against" : "Bitte einen Benutzernamen eingeben, um gegen diesen zu testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP/AD-Server memberOf nicht unterstützt.", - "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", + "Password change rejected. Hint: %s" : "Passwortänderung verweigert. Hinweis: %s", + "Mandatory field \"%s\" left empty" : "Pflichtfeld \"%s\" leer gelassen", + "A password is given, but not an LDAP agent" : "Es wurde ein Passwort, aber kein LDAP-Agent eingegeben", + "No password is given for the user agent" : "Für den User-Agenten wurde kein Passwort angegeben", + "No LDAP base DN was given" : "Es wurde keine LDAP-Basis-DN eingegeben", + "User base DN is not a subnode of global base DN" : "Der Benutzer-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Group base DN is not a subnode of global base DN" : "Der Gruppen-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Login filter does not contain %s placeholder." : "Der Anmeldefilter enthält keinen %s-Platzhalter", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", "LDAP User backend" : "LDAP Benutzer-Backend", "Your password will expire tomorrow." : "Dein Passwort läuft morgen ab", "Your password will expire today." : "Dein Passwort läuft heute ab", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"], "LDAP/AD integration" : "LDAP/AD-Integration", - "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], - "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "LDAP Connection" : "LDAP-Verbindung", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindung für diese LDAP-Konfiguration fehlgeschlagen: %s","Bindung für %n LDAP-Konfigurationen fehlgeschlagen: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Die Suche für diese LDAP-Konfigurationen ist fehlgeschlagen: %s","Die Suche für %n LDAP-Konfigurationen ist fehlgeschlagen: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Es gibt eine inaktive LDAP-Konfiguration: %s","Es gibt %n inaktive LDAP-Konfigurationen: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Bindung und Suchen funktioniert auf allen der %nkonfigurierten LDAP-Verbindungen (%s)"], + "Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs", + "None found" : "Keine gefunden", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte die \"UUID-Erkennung überschreiben\"-Einstellungen im Expertenteil der LDAP-Konfiguration überprüfen und \"occ ldap:update-uuid\" verwenden, um sie zu aktualisieren.", + "_%n group found_::_%n groups found_" : ["%n Gruppe gefunden","%n Gruppen gefunden"], + "> 1000 groups found" : "Mehr als 1000 Gruppen gefunden", + "> 1000 users found" : "Mehr als 1000 Benutzer gefunden", + "_%n user found_::_%n users found_" : ["%n Benutzer gefunden","%n Benutzer gefunden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Das Anzeigename-Attribut des Benutzers konnte nicht gefunden werden. Bitte gib es selbst in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Die gewünschte Funktion konnte nicht gefunden werden", "Invalid Host" : "Ungültiger Host", "LDAP user and group backend" : "LDAP Benutzer- und Gruppen-Backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es Administratoren Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es der Administration, Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontigent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User and Group Backend\"-Dokumentation.", "Test Configuration" : "Testkonfiguration", "Help" : "Hilfe", @@ -86,39 +104,40 @@ "Other Attributes:" : "Andere Attribute:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. \"%%uid\" ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", "Test Loginname" : "Anmeldenamen testen", + "Attempts to receive a DN for the given loginname and the current login filter" : "Es wird versucht, einen DN für den angegebenen Anmeldenamen und den aktuellen Anmeldefilter zu erhalten", "Verify settings" : "Einstellungen überprüfen", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Neue Konfiguration hinzufügen", "Copy current configuration into new directory binding" : "Aktuelle Konfiguration in eine neues Verzeichnis-Bind kopieren", "Delete the current configuration" : "Aktuelle Konfiguration löschen", "Host" : "Host", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kannst das Protokoll auslassen, es sei denn, Du benötigst SSL. In diesem Fall mit ldaps:// beginnen.", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Du kannst das Protokoll auslassen, es sei denn, du benötigst SSL. In diesem Fall mit ldaps:// beginnen.", "Port" : "Port", "Detect Port" : "Port ermitteln", "User DN" : "Benutzer-DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers, mit dem der LDAP-Bind durchgeführt werden soll, z.B. uid=agent,dc=example,dc=com. Für anonymen Zugriff DN und Passwort leerlassen.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers, mit dem der LDAP-Bind durchgeführt werden soll, z. B. uid=agent,dc=example,dc=com. Für anonymen Zugriff DN und Passwort leerlassen.", "Password" : "Passwort", "For anonymous access, leave DN and Password empty." : "Lasse die Felder DN und Passwort für anonymen Zugang leer.", "Save Credentials" : "Zugangsdaten speichern", "One Base DN per line" : "Einen Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : "Base DN für Benutzer und Gruppen kann im Reiter „Fortgeschritten“ angegeben werden", + "You can specify Base DN for users and groups in the Advanced tab" : "Die Basis-DN für Benutzer und Gruppen kann im Reiter \"Fortgeschritten\" eingegeben werden", "Detect Base DN" : "Base DN ermitteln", "Test Base DN" : "Base DN testen", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Verhindert automatische LDAP-Anfragen. Besser geeignet für größere Installationen, benötigt aber erweiterte LDAP-Kenntnisse.", "Manually enter LDAP filters (recommended for large directories)" : "LDAP-Filter manuell eingeben (empfohlen für große Verzeichnisse)", "Listing and searching for users is constrained by these criteria:" : "Auflistung und Suche nach Nutzern ist eingeschränkt durch folgende Kriterien:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Die häufigsten Objektklassen für Benutzer sind organizationalPerson, person, user und inetOrgPerson. Wenn Du nicht sicher bist, welche Objektklasse Du wählen sollst, frage bitte Deinen Verzeichnis-Administrator.", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Die häufigsten Objektklassen für Benutzer sind organizationalPerson, person, user und inetOrgPerson. Wenn du nicht sicher bist, welche Objektklasse du wählen sollst, frage bitte deinen Verzeichnis-Administrator.", "The filter specifies which LDAP users shall have access to the %s instance." : "Der Filter gibt an, welche LDAP-Benutzer Zugriff auf die %s-Instanz haben sollen.", "Verify settings and count users" : "Einstellungen überprüfen und Benutzer zählen", "Saving" : "Speichern", "Back" : "Zurück", "Continue" : "Fortsetzen", - "Please renew your password." : "Bitte erneuere Dein Passwort", + "Please renew your password." : "Bitte dein Passwort erneuern", "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.", - "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere den Administrator.", + "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere die Administration.", "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", - "Renew password" : "Bitte erneuere Dein Passwort", + "Renew password" : "Passwort erneuern", "Wrong password." : "Falsches Passwort.", "Cancel" : "Abbrechen", "Server" : "Server", @@ -127,28 +146,30 @@ "Groups" : "Gruppen", "Expert" : "Experte", "Advanced" : "Fortgeschritten", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktiere Deinen Systemadministrator und bitte ihn um die Installation des Moduls.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte die Systemadministration kontaktieren und diese um die Installation des Moduls bitten.", "Connection Settings" : "Verbindungseinstellungen", "Configuration Active" : "Konfiguration aktiv", "When unchecked, this configuration will be skipped." : "Konfiguration wird übersprungen, wenn nicht angehakt.", "Backup (Replica) Host" : "Backup-Host (Kopie)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Gib einen optionalen Backup-Host an. Es muss sich um eine Kopie des Haupt-LDAP/AD-Servers handeln.", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Optionalen Backup-Host eingeben. Es muss sich um eine Kopie des Haupt-LDAP/AD-Servers handeln.", "Backup (Replica) Port" : "Port des Backup-Hosts (Kopie)", "Disable Main Server" : "Hauptserver deaktivieren", "Only connect to the replica server." : "Nur zum Replikat-Server verbinden.", "Turn off SSL certificate validation." : "Schalte die SSL-Zertifikatsprüfung aus.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, das SSL-Zertifikat des LDAP-Servers in Deinen %s Server importieren.", - "Cache Time-To-Live" : "Speichere Time-To-Live zwischen", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, das SSL-Zertifikat des LDAP-Servers in deinen %s Server importieren.", + "Cache Time-To-Live" : "Time-To-Live zwischenspeichern", "in seconds. A change empties the cache." : "in Sekunden. Eine Änderung leert den Cache.", "Directory Settings" : "Ordnereinstellungen", "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens des Benutzers.", "2nd User Display Name Field" : "2. Benutzeranzeigename Feld", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »Erika Mustermann (erika.mustermann@beispiel.de)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut, um den Namen in Klammern anzuzeigen. Beispiel: »Erika Mustermann (erika.mustermann@beispiel.de)«.", "Base User Tree" : "Basis-Benutzerbaum", "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", "User Search Attributes" : "Benutzersucheigenschaften", "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", + "Disable users missing from LDAP" : "Benutzer deaktivieren, die in LDAP fehlen", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Wenn aktiviert, werden aus LDAP importierte und dann hier fehlende Benutzer deaktiviert", "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.", "Base Group Tree" : "Basis-Gruppenbaum", @@ -159,11 +180,11 @@ "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Ein LDAP-Attribut von Gruppenobjekten, das eine LDAP Such-URL enthält die festlegt welche Objekte zu der Gruppe gehören. (Ein leeres Feld deaktiviert die Funktion \"Dynamisch Gruppenzugehörigkeit\")", "Nested Groups" : "Verschachtelte Gruppen", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)", - "Paging chunksize" : "Seitenstücke (Paging chunksize)", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", + "Paging chunksize" : "Paging Chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Die Blockgröße für seitenweise LDAP-Suchen, die umfangreiche Ergebnisse wie Benutzer- oder Gruppenaufzählungen zurückgeben können. (Wenn Sie den Wert auf 0 setzen, werden seitenweise LDAP-Suchen in diesen Situationen deaktiviert.)", "Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. Dies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.", - "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", + "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wird als Klartext an LDAP gesendet)", "Default password policy DN" : "Standard Passwort-Regeln DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Die DN einer Standard-Passwort-Policy, welche für den Umgang mit ablaufenden Passwörtern verwendet wird. Dies funktioniert nur wenn Passwort-Änderungen pro Benutzer via LDAP und OpenLDAP aktiviert sind. Leer lassen, um die Passwortablaufbehandlung zu deaktivieren.", "Special Attributes" : "Spezielle Eigenschaften", @@ -172,13 +193,36 @@ "Quota Default" : "Standardkontingent", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standardkontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : " E-Mail-Adresse des Benutzers über sein LDAP-Attribut festlegen. Für das Standardverhalten, Feld leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls trage ein LDAP/AD-Attribut ein.", "\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt", + "User Profile Attributes" : "Benutzerprofilattribute", + "Phone Field" : "Telefonfeld", + "User profile Phone will be set from the specified attribute" : "Benutzerprofil Telefon wird aus dem angegebenen Attribut festgelegt", + "Website Field" : "Webseiten-Feld", + "User profile Website will be set from the specified attribute" : "Benutzerprofil Webseite wird aus dem angegebenen Attribut festgelegt", + "Address Field" : "Adressfeld", + "User profile Address will be set from the specified attribute" : "Benutzerprofil-Adresse wird aus dem angegebenen Attribut festgelegt", + "Twitter Field" : "X-Feld", + "User profile Twitter will be set from the specified attribute" : "Benutzerprofil X wird aus dem angegebenen Attribut festgelegt", + "Fediverse Field" : "Fediverse-Feld", + "User profile Fediverse will be set from the specified attribute" : "Benutzerprofil Fediverse wird aus dem angegebenen Attribut festgelegt", + "Organisation Field" : "Organisationsfeld", + "User profile Organisation will be set from the specified attribute" : "Benutzerprofil Organisation wird aus dem angegebenen Attribut festgelegt", + "Role Field" : "Rollenfeld", + "User profile Role will be set from the specified attribute" : "Benutzerprofil Rolle wird anhand des angegebenen Attributs festgelegt\n ", + "Headline Field" : "Überschriftenfeld", + "User profile Headline will be set from the specified attribute" : "Benutzerprofil Überschrift wird aus dem angegebenen Attribut festgelegt", + "Biography Field" : "Biografisches Feld", + "User profile Biography will be set from the specified attribute" : "Benutzerprofil Biografie wird aus dem angegebenen Attribut festgelegt", + "Birthdate Field" : "Geburtstagsfeld", + "User profile Date of birth will be set from the specified attribute" : "Das Geburtsdatum des Profils wird aus dem angegebenen Attribut ermittelt", + "Pronouns Field" : "Pronomenfeld", + "User profile Pronouns will be set from the specified attribute" : "Profil-Pronomen werden aus dem angegebenen Attribut festgelegt", "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lasse das Eingabefeld leer.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lasse das Eingabefeld leer.", "Internal Username Attribute:" : "Attribut für interne Benutzernamen:", "Override UUID detection" : "UUID-Erkennung überschreiben", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmäßig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Außerdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Es muss allerdings sichergestellt werden, dass die gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Freilassen, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu »gemappte« (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Die Benutzernamen werden genutzt, um Metadaten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung des Benutzernamens zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit dem LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen gefunden. Der interne Benutzername wird überall verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste zurück. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Lösche niemals die Zuordnungen in einer produktiven Umgebung. Lösche die Zuordnungen nur in einer Test- oder Experimentierumgebung.", "Clear Username-LDAP User Mapping" : "LDAP-Benutzernamenzuordnung löschen", "Clear Groupname-LDAP Group Mapping" : "LDAP-Gruppennamenzuordnung löschen", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten, bitte Host, Port und Anmeldeinformationen überprüfen.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Der %uid - Platzhalter fehlt. Dieser wird mit dem Anmeldenamen beim Abfragen von LDAP / AD ersetzt.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", - "LDAP / AD integration" : "LDAP / AD Integration", - "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Erlaubt die Anmeldung gegen den LDAP/AD-Benutzernamen, der entweder \"uid\" oder \"sAMAccountName\" ist, und erkannt wird.", - "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lasse das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus." + "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Einzelheiten findest du in den Logdateien." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js index b5ad342c221..142a82913d8 100644 --- a/apps/user_ldap/l10n/de_DE.js +++ b/apps/user_ldap/l10n/de_DE.js @@ -1,16 +1,17 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "Löschen der Zuordnungen fehlgeschlagen.", - "Failed to delete the server configuration" : "Löschen der Serverkonfiguration fehlgeschlagen", + "Failed to clear the mappings." : "Die Zuordnungen konnten nicht gelöscht werden.", + "Failed to delete the server configuration" : "Die Serverkonfiguration konnte nicht gelöscht werden", "Invalid configuration: Anonymous binding is not allowed." : "Die Konfiguration ist ungültig: anonymes Binden ist nicht erlaubt. ", "Valid configuration, connection established!" : "Gültige Konfiguration, Verbindung hergestellt!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig, aber der LDAP-Bind ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen. ", - "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Details finden Sie in den Protokolldateien. ", + "Invalid configuration: %s" : "Ungültige Konfiguration: %s", "No action specified" : "Keine Aktion angegeben", "No configuration specified" : "Keine Konfiguration angegeben", "No data specified" : "Keine Daten angegeben", - " Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden", + "Invalid data specified" : "Ungültige Daten angegeben", + "Could not set configuration %1$s to %2$s" : "Die Konfiguration %1$s konnte nicht auf %2$s gesetzt werden", "Action does not exist" : "Aktion existiert nicht", "Renewing …" : "Erneuere …", "Very weak password" : "Sehr schwaches Passwort", @@ -36,7 +37,7 @@ OC.L10N.register( "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfen Sie die Base DN wie auch die Verbindungseinstellungen und Anmeldeinformationen.", "Do you really want to delete the current Server Configuration?" : "Möchten Sie die aktuelle Serverkonfiguration wirklich löschen?", "Confirm Deletion" : "Löschen bestätigen", - "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", + "Mappings cleared successfully!" : "Zuordnungen gelöscht!", "Error while clearing the mappings." : "Fehler beim Löschen der Zuordnungen.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous Bind ist nicht erlaubt. Bitte geben Sie eine Benutzer-DN und ein Passwort angeben.", "LDAP Operations error. Anonymous bind might not be allowed." : "Fehler in den LDAP-Operationen. Anonymous Bind ist anscheinend nicht erlaubt.", @@ -53,21 +54,38 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", "Please provide a login name to test against" : "Bitte geben Sie einen Benutzernamen an, um gegen diesen zu testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP/AD-Server memberOf nicht unterstützt.", - "Password change rejected. Hint: " : "Passwortänderung verweigert. Hinweis:", + "Password change rejected. Hint: %s" : "Passwortänderung verweigert. Hinweis: %s", + "Mandatory field \"%s\" left empty" : "Pflichtfeld \"%s\" leer gelassen", + "A password is given, but not an LDAP agent" : "Es wurde ein Passwort, aber kein LDAP-Agent eingegeben", + "No password is given for the user agent" : "Für den User-Agenten wurde kein Passwort angegeben", + "No LDAP base DN was given" : "Es wurde keine LDAP-Basis-DN angegeben", + "User base DN is not a subnode of global base DN" : "Der Benutzer-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Group base DN is not a subnode of global base DN" : "Der Gruppen-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Login filter does not contain %s placeholder." : "Der Anmeldefilter enthält keinen %s-Platzhalter", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", "LDAP User backend" : "LDAP Benutzer-Backend", "Your password will expire tomorrow." : "Ihr Passwort läuft morgen ab.", "Your password will expire today." : "Ihr Passwort läuft heute ab.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tag ab.","Ihr Passwort läuft in %n Tagen ab."], "LDAP/AD integration" : "LDAP/AD-Integration", - "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], - "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "LDAP Connection" : "LDAP-Verbindung", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindung für diese LDAP-Konfiguration fehlgeschlagen: %s","Bindung für %n LDAP-Konfigurationen fehlgeschlagen: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Die Suche für diese LDAP-Konfigurationen ist fehlgeschlagen: %s","Die Suche für %n LDAP-Konfigurationen ist fehlgeschlagen: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Es gibt eine inaktive LDAP-Konfiguration: %s","Es gibt %n inaktive LDAP-Konfigurationen: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Bindung und Suchen funktioniert auf allen der %nkonfigurierten LDAP-Verbindungen (%s)"], + "Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs", + "None found" : "Keine gefunden", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfen Sie Ihre \"UUID-Erkennung überschreiben\"-Einstellungen im Expertenteil der LDAP-Konfiguration und verwenden Sie \"occ ldap:update-uuid\", um sie zu aktualisieren.", + "_%n group found_::_%n groups found_" : ["%n Gruppe gefunden","%n Gruppen gefunden"], + "> 1000 groups found" : "Mehr als 1000 Gruppen gefunden", + "> 1000 users found" : "Mehr als 1000 Benutzer gefunden", + "_%n user found_::_%n users found_" : ["%n Benutzer gefunden","%n Benutzer gefunden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Das Anzeigename-Attribut des Benutzers konnte nicht gefunden werden. Bitte geben Sie es selbst in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Die gewünschte Funktion konnte nicht gefunden werden", "Invalid Host" : "Ungültiger Host", "LDAP user and group backend" : "LDAP Benutzer- und Gruppen-Backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es Administratoren, Nextcloud mit einem LDAP-basierten Benutzerverzeichnis zu verbinden.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontingent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User and Group Backend\"-Dokumentation.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es der Administration, Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontingent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User und Group Backend\"-Dokumentation.", "Test Configuration" : "Testkonfiguration", "Help" : "Hilfe", "Groups meeting these criteria are available in %s:" : "Gruppen, auf die diese Kriterien zutreffen, sind verfügbar in %s:", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "Andere Attribute:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. \"%%uid\" ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", "Test Loginname" : "Anmeldenamen testen", + "Attempts to receive a DN for the given loginname and the current login filter" : "Es wird versucht, einen DN für den angegebenen Anmeldenamen und den aktuellen Anmeldefilter zu erhalten", "Verify settings" : "Einstellungen überprüfen", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Fügen Sie eine neue Konfiguration hinzu.", @@ -103,7 +122,7 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.", "Save Credentials" : "Zugangsdaten speichern", "One Base DN per line" : "Einen Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : " Sie können die Basis-DN für Benutzer und Gruppen im Reiter „Fortgeschritten“ angeben", + "You can specify Base DN for users and groups in the Advanced tab" : " Sie können die Basis-DN für Benutzer und Gruppen im Reiter \"Fortgeschritten\" angeben", "Detect Base DN" : "Base-DN ermitteln", "Test Base DN" : "Base DN testen", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Verhindert automatische LDAP-Anfragen. Besser geeignet für größere Installationen, benötigt aber erweiterte LDAP-Kenntnisse.", @@ -117,7 +136,7 @@ OC.L10N.register( "Continue" : "Fortsetzen", "Please renew your password." : "Bitte erneuern Sie Ihr Passwort.", "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.", - "Please try again or contact your administrator." : "Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", + "Please try again or contact your administrator." : "Bitte erneut versuchen oder kontaktieren Sie Ihre Administration.", "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Renew password" : "Passwort erneuern", @@ -129,7 +148,7 @@ OC.L10N.register( "Groups" : "Gruppen", "Expert" : "Experte", "Advanced" : "Fortgeschritten", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktieren Sie Ihren Systemadministrator und bitten Sie um die Installation des Moduls.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktieren Sie Ihre Systemadministration und bitten Sie sie um die Installation des Moduls.", "Connection Settings" : "Verbindungseinstellungen", "Configuration Active" : "Konfiguration aktiv", "When unchecked, this configuration will be skipped." : "Konfiguration wird übersprungen, wenn nicht angehakt.", @@ -146,11 +165,13 @@ OC.L10N.register( "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens des Benutzers.", "2nd User Display Name Field" : "2. Benutzeranzeigename Feld", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »John Doe (john.doe@example.org)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut, um den Namen in Klammern anzuzeigen. Beispiel: »Max Mustermann (max.mustermann@beispiel.de)«.", "Base User Tree" : "Basis-Benutzerbaum", "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", "User Search Attributes" : "Benutzersucheigenschaften", "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", + "Disable users missing from LDAP" : "Benutzer deaktivieren, die in LDAP fehlen", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Beim Einschalten werden aus LDAP importierte und dann hier fehlende Benutzer deaktiviert", "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.", "Base Group Tree" : "Basis-Gruppenbaum", @@ -162,7 +183,7 @@ OC.L10N.register( "Nested Groups" : "Verschachtelte Gruppen", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)", "Paging chunksize" : "Seitenstücke (Paging chunksize)", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung \"0\" deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", "Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. \nDies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.", "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", "\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt", + "User Profile Attributes" : "Benutzerprofilattribute", + "Phone Field" : "Telefonfeld", + "User profile Phone will be set from the specified attribute" : "Benutzerprofil Telefon wird aus dem angegebenen Attribut festgelegt", + "Website Field" : "Webseiten-Feld", + "User profile Website will be set from the specified attribute" : "Benutzerprofil Webseite wird aus dem angegebenen Attribut festgelegt", + "Address Field" : "Adressfeld", + "User profile Address will be set from the specified attribute" : "Benutzerprofil Adresse wird aus dem angegebenen Attribut festgelegt", + "Twitter Field" : "Twitter-Feld", + "User profile Twitter will be set from the specified attribute" : "Benutzerprofil Twitter wird aus dem angegebenen Attribut festgelegt", + "Fediverse Field" : "Fediverse-Feld", + "User profile Fediverse will be set from the specified attribute" : "Benutzerprofil Fediverse wird aus dem angegebenen Attribut festgelegt", + "Organisation Field" : "Organisationsfeld", + "User profile Organisation will be set from the specified attribute" : "Benutzerprofil Organisation wird aus dem angegebenen Attribut festgelegt", + "Role Field" : "Rollenfeld", + "User profile Role will be set from the specified attribute" : "Benutzerprofil Rolle wird anhand des angegebenen Attributs festgelegt\n ", + "Headline Field" : "Überschriftenfeld", + "User profile Headline will be set from the specified attribute" : "Benutzerprofil Überschrift wird aus dem angegebenen Attribut festgelegt", + "Biography Field" : "Biografisches Feld", + "User profile Biography will be set from the specified attribute" : "Benutzerprofil Biografie wird aus dem angegebenen Attribut festgelegt", + "Birthdate Field" : "Geburtstagsfeld", + "User profile Date of birth will be set from the specified attribute" : "Das Geburtsdatum des Benutzerprofils wird aus dem angegebenen Attribut ermittelt", + "Pronouns Field" : "Pronomenfeld", + "User profile Pronouns will be set from the specified attribute" : "Benutzerprofil-Pronomen werden aus dem angegebenen Attribut festgelegt", "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lassen Sie das Eingabefeld leer.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lassen Sie das Eingabefeld leer.", "Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:", "Override UUID detection" : "UUID-Erkennung überschreiben", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmäßig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Außerdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie müssen allerdings sicherstellen, dass Ihre gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Benutzernamen dienen zum Speichern und Zuweisen von Metadaten. Um Benutzer eindeutig zu identifizieren und zu erkennen, besitzt jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung des jeweiligen Benutzernamens zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzers zugeordnet. Darüber hinaus wird der DN auch zwischengespeichert, um die Interaktion über LDAP zu reduzieren, was aber nicht zur Identifikation dient. Ändert sich der DN, werden die Änderungen gefunden. Der interne Benutzername wird durchgängig verwendet. Ein Löschen der Zuordnungen führt zum systemweiten Verbleib von Restdaten. Es bleibt nicht auf eine einzelne Konfiguration beschränkt, sondern wirkt sich auf alle LDAP-Konfigurationen aus! Löschen Sie die Zuordnungen nie innerhalb einer Produktivumgebung, sondern nur in einer Test- oder Experimentierumgebung.", "Clear Username-LDAP User Mapping" : "Lösche LDAP-Benutzernamenzuordnung", "Clear Groupname-LDAP Group Mapping" : "Lösche LDAP-Gruppennamenzuordnung", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten, bitte überprüfen Sie Host, Port und Anmeldeinformationen.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", - "LDAP / AD integration" : "LDAP/AD-Integration", - "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Erlaubt die Anmeldung gegen den LDAP/AD-Benutzernamen, der entweder \"uid\" oder \"sAMAccountName\" ist, und erkannt wird.", - "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lassen Sie das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus." + "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Details finden Sie in den Protokolldateien. " }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json index 95ebc222e78..c8bcf0d8640 100644 --- a/apps/user_ldap/l10n/de_DE.json +++ b/apps/user_ldap/l10n/de_DE.json @@ -1,14 +1,15 @@ { "translations": { - "Failed to clear the mappings." : "Löschen der Zuordnungen fehlgeschlagen.", - "Failed to delete the server configuration" : "Löschen der Serverkonfiguration fehlgeschlagen", + "Failed to clear the mappings." : "Die Zuordnungen konnten nicht gelöscht werden.", + "Failed to delete the server configuration" : "Die Serverkonfiguration konnte nicht gelöscht werden", "Invalid configuration: Anonymous binding is not allowed." : "Die Konfiguration ist ungültig: anonymes Binden ist nicht erlaubt. ", "Valid configuration, connection established!" : "Gültige Konfiguration, Verbindung hergestellt!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig, aber der LDAP-Bind ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen. ", - "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Details finden Sie in den Protokolldateien. ", + "Invalid configuration: %s" : "Ungültige Konfiguration: %s", "No action specified" : "Keine Aktion angegeben", "No configuration specified" : "Keine Konfiguration angegeben", "No data specified" : "Keine Daten angegeben", - " Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden", + "Invalid data specified" : "Ungültige Daten angegeben", + "Could not set configuration %1$s to %2$s" : "Die Konfiguration %1$s konnte nicht auf %2$s gesetzt werden", "Action does not exist" : "Aktion existiert nicht", "Renewing …" : "Erneuere …", "Very weak password" : "Sehr schwaches Passwort", @@ -34,7 +35,7 @@ "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Es ist ein Fehler aufgetreten. Bitte überprüfen Sie die Base DN wie auch die Verbindungseinstellungen und Anmeldeinformationen.", "Do you really want to delete the current Server Configuration?" : "Möchten Sie die aktuelle Serverkonfiguration wirklich löschen?", "Confirm Deletion" : "Löschen bestätigen", - "Mappings cleared successfully!" : "Zuordnungen erfolgreich gelöscht!", + "Mappings cleared successfully!" : "Zuordnungen gelöscht!", "Error while clearing the mappings." : "Fehler beim Löschen der Zuordnungen.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous Bind ist nicht erlaubt. Bitte geben Sie eine Benutzer-DN und ein Passwort angeben.", "LDAP Operations error. Anonymous bind might not be allowed." : "Fehler in den LDAP-Operationen. Anonymous Bind ist anscheinend nicht erlaubt.", @@ -51,21 +52,38 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", "Please provide a login name to test against" : "Bitte geben Sie einen Benutzernamen an, um gegen diesen zu testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP/AD-Server memberOf nicht unterstützt.", - "Password change rejected. Hint: " : "Passwortänderung verweigert. Hinweis:", + "Password change rejected. Hint: %s" : "Passwortänderung verweigert. Hinweis: %s", + "Mandatory field \"%s\" left empty" : "Pflichtfeld \"%s\" leer gelassen", + "A password is given, but not an LDAP agent" : "Es wurde ein Passwort, aber kein LDAP-Agent eingegeben", + "No password is given for the user agent" : "Für den User-Agenten wurde kein Passwort angegeben", + "No LDAP base DN was given" : "Es wurde keine LDAP-Basis-DN angegeben", + "User base DN is not a subnode of global base DN" : "Der Benutzer-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Group base DN is not a subnode of global base DN" : "Der Gruppen-Basis-DN ist kein Unterknoten des globalen Basis-DN", + "Login filter does not contain %s placeholder." : "Der Anmeldefilter enthält keinen %s-Platzhalter", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", "LDAP User backend" : "LDAP Benutzer-Backend", "Your password will expire tomorrow." : "Ihr Passwort läuft morgen ab.", "Your password will expire today." : "Ihr Passwort läuft heute ab.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tag ab.","Ihr Passwort läuft in %n Tagen ab."], "LDAP/AD integration" : "LDAP/AD-Integration", - "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], - "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "LDAP Connection" : "LDAP-Verbindung", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindung für diese LDAP-Konfiguration fehlgeschlagen: %s","Bindung für %n LDAP-Konfigurationen fehlgeschlagen: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Die Suche für diese LDAP-Konfigurationen ist fehlgeschlagen: %s","Die Suche für %n LDAP-Konfigurationen ist fehlgeschlagen: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Es gibt eine inaktive LDAP-Konfiguration: %s","Es gibt %n inaktive LDAP-Konfigurationen: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindung und Suche funktionieren mit der eingerichteten LDAP-Verbindung (%s)","Bindung und Suchen funktioniert auf allen der %nkonfigurierten LDAP-Verbindungen (%s)"], + "Invalid LDAP UUIDs" : "Ungültige LDAP-UUIDs", + "None found" : "Keine gefunden", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Es wurden ungültige UUIDs von LDAP-Konten oder -Gruppen gefunden. Bitte überprüfen Sie Ihre \"UUID-Erkennung überschreiben\"-Einstellungen im Expertenteil der LDAP-Konfiguration und verwenden Sie \"occ ldap:update-uuid\", um sie zu aktualisieren.", + "_%n group found_::_%n groups found_" : ["%n Gruppe gefunden","%n Gruppen gefunden"], + "> 1000 groups found" : "Mehr als 1000 Gruppen gefunden", + "> 1000 users found" : "Mehr als 1000 Benutzer gefunden", + "_%n user found_::_%n users found_" : ["%n Benutzer gefunden","%n Benutzer gefunden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Das Anzeigename-Attribut des Benutzers konnte nicht gefunden werden. Bitte geben Sie es selbst in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Die gewünschte Funktion konnte nicht gefunden werden", "Invalid Host" : "Ungültiger Host", "LDAP user and group backend" : "LDAP Benutzer- und Gruppen-Backend", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es Administratoren, Nextcloud mit einem LDAP-basierten Benutzerverzeichnis zu verbinden.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontingent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User and Group Backend\"-Dokumentation.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Diese App ermöglicht es der Administration, Nextcloud mit einem LDAP-basiertem Nutzerverzeichnis zu verbinden.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Diese App ermöglicht es Administratoren Nextcloud mit einem auf LDAP basierenden Nutzerverzeichnis zu verbinden um so die Anmeldung, Nutzer, Gruppen und Berechtigungen zu konfigurieren. Administratoren können die App so einrichten, dass sie sich mit einem oder mehreren LDAP-Verzeichnissen oder Active-Directories über eine LDAP-Schnittstelle verbindet. Attribute wie Speicherkontingent, E-Mail, Avatare, Gruppenmitgliedschaft usw. können von einem Verzeichnis mit den dazugehörigen Anfragen und Filtern bezogen werden\n\nDer Nutzer meldet sich an der Nextclud mit seinen LDAP oder AD Anmeldedaten an. und erhält Zugriff durch eine Authentifizierungsanfrage am LDAP- oder AD-Server. Nextcloud speichert und verwendet nicht die LDAP- oder AD-Zugangsdaten sondern verwendet eine Sitzungs-ID für die jeweilige Nutzer-ID. Weitere Infos in der \"LDAP User und Group Backend\"-Dokumentation.", "Test Configuration" : "Testkonfiguration", "Help" : "Hilfe", "Groups meeting these criteria are available in %s:" : "Gruppen, auf die diese Kriterien zutreffen, sind verfügbar in %s:", @@ -86,6 +104,7 @@ "Other Attributes:" : "Andere Attribute:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. \"%%uid\" ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", "Test Loginname" : "Anmeldenamen testen", + "Attempts to receive a DN for the given loginname and the current login filter" : "Es wird versucht, einen DN für den angegebenen Anmeldenamen und den aktuellen Anmeldefilter zu erhalten", "Verify settings" : "Einstellungen überprüfen", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Fügen Sie eine neue Konfiguration hinzu.", @@ -101,7 +120,7 @@ "For anonymous access, leave DN and Password empty." : "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.", "Save Credentials" : "Zugangsdaten speichern", "One Base DN per line" : "Einen Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : " Sie können die Basis-DN für Benutzer und Gruppen im Reiter „Fortgeschritten“ angeben", + "You can specify Base DN for users and groups in the Advanced tab" : " Sie können die Basis-DN für Benutzer und Gruppen im Reiter \"Fortgeschritten\" angeben", "Detect Base DN" : "Base-DN ermitteln", "Test Base DN" : "Base DN testen", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Verhindert automatische LDAP-Anfragen. Besser geeignet für größere Installationen, benötigt aber erweiterte LDAP-Kenntnisse.", @@ -115,7 +134,7 @@ "Continue" : "Fortsetzen", "Please renew your password." : "Bitte erneuern Sie Ihr Passwort.", "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.", - "Please try again or contact your administrator." : "Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", + "Please try again or contact your administrator." : "Bitte erneut versuchen oder kontaktieren Sie Ihre Administration.", "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Renew password" : "Passwort erneuern", @@ -127,7 +146,7 @@ "Groups" : "Gruppen", "Expert" : "Experte", "Advanced" : "Fortgeschritten", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktieren Sie Ihren Systemadministrator und bitten Sie um die Installation des Moduls.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warnung:</b> Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitte kontaktieren Sie Ihre Systemadministration und bitten Sie sie um die Installation des Moduls.", "Connection Settings" : "Verbindungseinstellungen", "Configuration Active" : "Konfiguration aktiv", "When unchecked, this configuration will be skipped." : "Konfiguration wird übersprungen, wenn nicht angehakt.", @@ -144,11 +163,13 @@ "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens des Benutzers.", "2nd User Display Name Field" : "2. Benutzeranzeigename Feld", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut um den Namen in Klammern anzuzeigen. Beispiel: »John Doe (john.doe@example.org)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. Ein hinzuzufügendes LDAP-Attribut, um den Namen in Klammern anzuzeigen. Beispiel: »Max Mustermann (max.mustermann@beispiel.de)«.", "Base User Tree" : "Basis-Benutzerbaum", "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", "User Search Attributes" : "Benutzersucheigenschaften", "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", + "Disable users missing from LDAP" : "Benutzer deaktivieren, die in LDAP fehlen", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Beim Einschalten werden aus LDAP importierte und dann hier fehlende Benutzer deaktiviert", "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Erzeugung des Anzeigenamens der Gruppen.", "Base Group Tree" : "Basis-Gruppenbaum", @@ -160,7 +181,7 @@ "Nested Groups" : "Verschachtelte Gruppen", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Wenn aktiviert, werden Gruppen, die Gruppen enthalten, unterstützt. (Funktioniert nur, wenn das Merkmal des Gruppenmitgliedes den Domain-Namen enthält.)", "Paging chunksize" : "Seitenstücke (Paging chunksize)", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung \"0\" deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).", "Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. \nDies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.", "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", "\"$home\" Placeholder Field" : "\"$home\" Platzhalter-Feld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in der Konfiguration eines extern angeschlossenen Speichers wird mit dem Wert des angegebenen Attributs ersetzt", + "User Profile Attributes" : "Benutzerprofilattribute", + "Phone Field" : "Telefonfeld", + "User profile Phone will be set from the specified attribute" : "Benutzerprofil Telefon wird aus dem angegebenen Attribut festgelegt", + "Website Field" : "Webseiten-Feld", + "User profile Website will be set from the specified attribute" : "Benutzerprofil Webseite wird aus dem angegebenen Attribut festgelegt", + "Address Field" : "Adressfeld", + "User profile Address will be set from the specified attribute" : "Benutzerprofil Adresse wird aus dem angegebenen Attribut festgelegt", + "Twitter Field" : "Twitter-Feld", + "User profile Twitter will be set from the specified attribute" : "Benutzerprofil Twitter wird aus dem angegebenen Attribut festgelegt", + "Fediverse Field" : "Fediverse-Feld", + "User profile Fediverse will be set from the specified attribute" : "Benutzerprofil Fediverse wird aus dem angegebenen Attribut festgelegt", + "Organisation Field" : "Organisationsfeld", + "User profile Organisation will be set from the specified attribute" : "Benutzerprofil Organisation wird aus dem angegebenen Attribut festgelegt", + "Role Field" : "Rollenfeld", + "User profile Role will be set from the specified attribute" : "Benutzerprofil Rolle wird anhand des angegebenen Attributs festgelegt\n ", + "Headline Field" : "Überschriftenfeld", + "User profile Headline will be set from the specified attribute" : "Benutzerprofil Überschrift wird aus dem angegebenen Attribut festgelegt", + "Biography Field" : "Biografisches Feld", + "User profile Biography will be set from the specified attribute" : "Benutzerprofil Biografie wird aus dem angegebenen Attribut festgelegt", + "Birthdate Field" : "Geburtstagsfeld", + "User profile Date of birth will be set from the specified attribute" : "Das Geburtsdatum des Benutzerprofils wird aus dem angegebenen Attribut ermittelt", + "Pronouns Field" : "Pronomenfeld", + "User profile Pronouns will be set from the specified attribute" : "Benutzerprofil-Pronomen werden aus dem angegebenen Attribut festgelegt", "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lassen Sie das Eingabefeld leer.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standardmäßig wird der interne Benutzername aus dem UUID-Attribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [a-zA-Z0-9_.@-]. Andere Zeichen werden durch ihre ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist außerdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Beispiel für alle DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten geändert werden. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus. Für die Standardeinstellung lassen Sie das Eingabefeld leer.", "Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:", "Override UUID detection" : "UUID-Erkennung überschreiben", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmäßig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Außerdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie müssen allerdings sicherstellen, dass Ihre gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Benutzernamen dienen zum Speichern und Zuweisen von Metadaten. Um Benutzer eindeutig zu identifizieren und zu erkennen, besitzt jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung des jeweiligen Benutzernamens zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzers zugeordnet. Darüber hinaus wird der DN auch zwischengespeichert, um die Interaktion über LDAP zu reduzieren, was aber nicht zur Identifikation dient. Ändert sich der DN, werden die Änderungen gefunden. Der interne Benutzername wird durchgängig verwendet. Ein Löschen der Zuordnungen führt zum systemweiten Verbleib von Restdaten. Es bleibt nicht auf eine einzelne Konfiguration beschränkt, sondern wirkt sich auf alle LDAP-Konfigurationen aus! Löschen Sie die Zuordnungen nie innerhalb einer Produktivumgebung, sondern nur in einer Test- oder Experimentierumgebung.", "Clear Username-LDAP User Mapping" : "Lösche LDAP-Benutzernamenzuordnung", "Clear Groupname-LDAP Group Mapping" : "Lösche LDAP-Gruppennamenzuordnung", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Es ist ein Verbindungsfehler zum LDAP/AD aufgetreten, bitte überprüfen Sie Host, Port und Anmeldeinformationen.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Der \"%u id\" Platzhalter fehlt. Er wird durch den Anmeldenamen ersetzt, wenn LDAP/AD abgefragt wird.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", - "LDAP / AD integration" : "LDAP/AD-Integration", - "LDAP / AD Username:" : "LDAP-/AD-Benutzername:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Erlaubt die Anmeldung gegen den LDAP/AD-Benutzernamen, der entweder \"uid\" oder \"sAMAccountName\" ist, und erkannt wird.", - "LDAP / AD Email Address:" : "LDAP-/AD-E-Mail-Adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmäßig wird der interne Benutzername aus dem UUID-Atribut erstellt. So wird sichergestellt, dass der Benutzername einmalig ist und Zeichen nicht konvertiert werden müssen. Für den internen Benutzernamen sind nur folgende Zeichen zulässig: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mit ihrer ASCII-Entsprechung ersetzt oder einfach weggelassen. Bei Kollisionen wird eine Nummer hinzugefügt/erhöht. Der interne Benutzername wird verwendet, um den Benutzer intern zu identifizieren. Er ist ausserdem der Standardname für den Stamm-Ordner des Benutzers. Darüber hinaus ist er Teil der URLs für den Zugriff, zum Bespiel für alle *DAV-Dienste. Mit dieser Einstellung, kann das Standardverhalten geändert werden. Für die Standardeinstellung, lassen Sie das Eingabefeld leer. Änderungen wirken sich nur auf neu eingetragene (hinzugefügte) LDAP-Benutzer aus." + "Invalid configuration. Please have a look at the logs for further details." : "Die Konfiguration ist ungültig. Weitere Details finden Sie in den Protokolldateien. " },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/el.js b/apps/user_ldap/l10n/el.js index dc9f0e08adf..bb4bebdc29c 100644 --- a/apps/user_ldap/l10n/el.js +++ b/apps/user_ldap/l10n/el.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Μη έγκυρη διαμόρφωση: Δεν επιτρέπεται ανώνυμη δέσμευση.", "Valid configuration, connection established!" : "Επιτυχής ρύθμιση, συνδεθήκατε με επιτυχία", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Έγκυρη διαμόρφωση, αλλά η σύνδεση απέτυχε. Ελέγξτε τις ρυθμίσεις διακομιστή και τα διαπιστευτήρια.", - "Invalid configuration. Please have a look at the logs for further details." : "Μη έγκυρη διαμόρφωση. Παρακαλώ ρίξτε μια ματιά στα αρχεία καταγραφής για περισσότερες λεπτομέρειες.", "No action specified" : "Καμμία εντολή δεν προσδιορίστηκε", "No configuration specified" : "Καμμία διαμόρφωση δεν προσδιορίστηκε", "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", - " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", "Renewing …" : "Ανανέωση ...", "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", @@ -53,21 +51,22 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Το σύμβολο υποκατάστασης \"%uid\" λείπει. Θα αντικατασταθεί με το όνομα login κατά την υποβολή ερωτήματος LDAP/AD.", "Please provide a login name to test against" : "Παρακαλούμε δώστε ένα όνομα σύνδεσης για να γίνει δοκιμή", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Το κουτί ομάδας απενεργοποιήθηκε, επειδή ο LDAP/APD διακομιστής δεν υποστηρίζει memberOf.", - "Password change rejected. Hint: " : "Η αλλαγή του συνθηματικού απέτυχε. Υπόδειξη:", "Please login with the new password" : "Παρακαλώ κάντε είσοδο με το νέο συνθηματικό", "LDAP User backend" : "LDAP Σύστημα υποστήριξης χρήστη", "Your password will expire tomorrow." : "Το συνθηματικό σας θα λήξει αύριο.", "Your password will expire today." : "Το συνθηματικό σας λήγει σήμερα.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Το συνθηματικό σας θα λήξει σε %n ημέρα.","Το συνθηματικό σας θα λήξει σε %n ημέρες."], "LDAP/AD integration" : "LDAP/AD ενσωμάτωση ", - "_%s group found_::_%s groups found_" : ["%s ομάδα βρέθηκε","%s ομάδες βρέθηκαν"], - "_%s user found_::_%s users found_" : ["%s χρήστης βρέθηκε","%s χρήστες βρέθηκαν"], + "_%n group found_::_%n groups found_" : ["βρέθηκε %n ομάδα","βρέθηκαν %n ομάδες"], + "> 1000 groups found" : "Βρέθηκαν > 1000 ομάδες", + "> 1000 users found" : "Βρέθηκαν > 1000 χρήστες", + "_%n user found_::_%n users found_" : ["βρέθηκε %n χρήστης","βρέθηκαν %n χρήστες"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Δεν ήταν δυνατή η ανίχνευση της ιδιότητας του εμφανιζόμενου ονόματος χρήστη . Παρακαλώ προσδιορίστε στις προηγμένες ρυθμίσεις LDAP", "Could not find the desired feature" : "Αδυναμία εύρεσης επιθυμητού χαρακτηριστικού", "Invalid Host" : "Άκυρος εξυπηρετητής", "LDAP user and group backend" : "LDAP Σύστημα υποστήριξης χρήστη και ομάδος", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Η εφαρμογή επιτρέπει την σύνδεση διαχειριστών Nextcloud στον κατάλογο χρήστη LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Αυτή η εφαρμογή επιτρέπει στους διαχειριστές να συνδέουν το Nextcloud με έναν κατάλογο χρηστών που βασίζεται στο LDAP για τον έλεγχο ταυτότητας και την παροχή χαρακτηριστικών, ομάδων και χρηστών. Οι διαχειριστές μπορούν να ρυθμίσουν αυτήν την εφαρμογή ώστε να συνδέονται σε έναν ή περισσότερους καταλόγους LDAP ή Active Directories μέσω διεπαφής LDAP. Χαρακτηριστικά όπως η ποσόστωση των χρηστών, τα μηνύματα ηλεκτρονικού ταχυδρομείου, οι εικόνες των avatar, η συμμετοχή σε ομάδες και άλλα μπορούν να τραβηχτούν στο Nextcloud από έναν κατάλογο με τα κατάλληλα ερωτήματα και φίλτρα.\n\nΈνας χρήστης συνδέεται στο Nextcloud με τα διαπιστευτήριά του LDAP ή του AD και του παρέχεται πρόσβαση βάσει μιας αίτησης ελέγχου ταυτότητας που χειρίζεται ο διακομιστής LDAP ή AD. Το Nextcloud δεν αποθηκεύει κωδικούς πρόσβασης LDAP ή AD, αλλά αυτά τα διαπιστευτήρια χρησιμοποιούνται για τον έλεγχο ταυτότητας ενός χρήστη και στη συνέχεια το Nextcloud χρησιμοποιεί μια περίοδο σύνδεσης για το αναγνωριστικό χρήστη. Περισσότερες πληροφορίες είναι διαθέσιμες στην τεκμηρίωση του χρήστη LDAP και της ομάδας Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Αυτή η εφαρμογή επιτρέπει στους διαχειριστές να συνδέουν το Nextcloud με έναν κατάλογο χρηστών που βασίζεται στο LDAP για τον έλεγχο ταυτότητας και την παροχή χαρακτηριστικών, ομάδων και χρηστών. Οι διαχειριστές μπορούν να ρυθμίσουν αυτήν την εφαρμογή ώστε να συνδέονται σε έναν ή περισσότερους καταλόγους LDAP ή Active Directories μέσω διεπαφής LDAP. Χαρακτηριστικά όπως η ποσόστωση των χρηστών, τα μηνύματα ηλεκτρονικού ταχυδρομείου, οι εικόνες των άβαταρ, η συμμετοχή σε ομάδες και άλλα μπορούν να τραβηχτούν στο Nextcloud από έναν κατάλογο με τα κατάλληλα ερωτήματα και φίλτρα.\n\nΈνας χρήστης συνδέεται στο Nextcloud με τα διαπιστευτήριά του LDAP ή του AD και του παρέχεται πρόσβαση βάσει μιας αίτησης ελέγχου ταυτότητας που χειρίζεται ο διακομιστής LDAP ή AD. Το Nextcloud δεν αποθηκεύει κωδικούς πρόσβασης LDAP ή AD, αλλά αυτά τα διαπιστευτήρια χρησιμοποιούνται για τον έλεγχο ταυτότητας ενός χρήστη και στη συνέχεια το Nextcloud χρησιμοποιεί μια περίοδο σύνδεσης για το αναγνωριστικό χρήστη. Περισσότερες πληροφορίες είναι διαθέσιμες στην τεκμηρίωση του χρήστη LDAP και της ομάδας Backend.", "Test Configuration" : "Δοκιμαστικές ρυθμίσεις", "Help" : "Βοήθεια", "Groups meeting these criteria are available in %s:" : "Οι ομάδες που πληρούν τα κριτήρια είναι διαθέσιμες σε %s:", @@ -180,7 +179,7 @@ OC.L10N.register( "\"$home\" Placeholder Field" : "\"$home\" Πεδίο Δέσμευσης", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Το $home σε μια ρύθμιση εξωτερικού χώρου αποθήκευσης θα αντικατασταθεί με την τιμή του καθορισμένου χαρακτηριστικού", "Internal Username" : "Εσωτερικό Όνομα Χρήστη", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το UUID γνώρισμα από προεπιλογή. Αυτό εξασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να τροποποιηθούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό της χρήσης μόνο των συγκεκριμένων χαρακτήρων: [a-zA-Z0-9_.@-]. Άλλοι χαρακτήρες αντικαθίστανται με τις ASCII αντιστοιχίες τους ή απλά απορρίπτονται. Σε περίπτωση σύγκρουσης ένας αριθμός θα προστεθεί/αυξηθεί. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την αναγνώριση ενός χρήστη εσωτερικά. Είναι επίσης το προεπιλεγμένο όνομα για τον φάκελο αρχικής του χρήστη. Είναι επιπλέον ένα μέρος απομακρυσμένων συνδέσμων, για παράδειγμα για όλες τις *DAV υπηρεσίες. Με αυτή τη ρύθμιση, η προεπιλεγμένη συμπεριφορά μπορεί να παρακαμφθεί. Τυχόν αλλαγές θα έχουν επίδραση μόνο σε νέους χαρτογραφημένους (εισαχθέντες) LDAP χρήστες. Αφήστε το κενό για την προεπιλεγμένη συμπεριφορά.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Από προεπιλογή, το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το χαρακτηριστικό UUID. Αυτό διασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να μετατραπούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό ότι επιτρέπονται μόνο αυτοί οι χαρακτήρες: [a-zA-Z0-9_.@-]. Άλλοι χαρακτήρες αντικαθίστανται με την ASCII αντιστοιχία τους ή απλώς παραλείπονται. Σε περίπτωση σύγκρουσης προστίθεται/αυξάνεται ένας αριθμός. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την εσωτερική αναγνώριση ενός χρήστη. Είναι επίσης το προεπιλεγμένο όνομα για τον αρχικό φάκελο του χρήστη. Αποτελεί επίσης μέρος των απομακρυσμένων διευθύνσεων URL, για παράδειγμα για όλες τις υπηρεσίες DAV. Με αυτή τη ρύθμιση, η προεπιλεγμένη συμπεριφορά μπορεί να παρακαμφθεί. Οι αλλαγές θα έχουν αποτέλεσμα μόνο σε πρόσφατα αντιστοιχισμένους (προστιθέμενους) χρήστες LDAP. Αφήστε το κενό για προεπιλεγμένη συμπεριφορά.", "Internal Username Attribute:" : "Ιδιότητα Εσωτερικού Ονόματος Χρήστη:", "Override UUID detection" : "Παράκαμψη ανίχνευσης UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Από προεπιλογή, το χαρακτηριστικό UUID εντοπίζεται αυτόματα. Το χαρακτηριστικό UUID χρησιμοποιείται για την αναγνώριση χωρίς αμφιβολία χρηστών και ομάδων LDAP. Επίσης, το εσωτερικό όνομα χρήστη θα δημιουργηθεί με βάση το UUID, εφόσον δεν ορίζεται διαφορετικά ανωτέρω. Μπορείτε να παρακάμψετε τη ρύθμιση και να ορίσετε ένα χαρακτηριστικό της επιλογής σας. Θα πρέπει να βεβαιωθείτε ότι το χαρακτηριστικό της επιλογής σας μπορεί να ληφθεί για τους χρήστες και τις ομάδες και ότι είναι μοναδικό. Αφήστε το κενό για την προεπιλεγμένη λειτουργία. Οι αλλαγές θα έχουν ισχύ μόνο σε πρόσφατα αντιστοιχισμένους (προστιθέμενους) χρήστες και ομάδες LDAP.", @@ -190,13 +189,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Τα ονόματα χρηστών χρησιμοποιούνται για την αποθήκευση και την εκχώρηση μεταδεδομένων. Προκειμένου να εντοπιστούν και να αναγνωριστούν με ακρίβεια οι χρήστες, κάθε ένας του LDAP θα έχει ένα εσωτερικό όνομα. Αυτό απαιτεί μια αντιστοίχιση από όνομα χρήστη σε χρήστη LDAP. Το τελικό όνομα χρήστη αντιστοιχίζεται στο UUID του χρήστη LDAP. Επιπλέον, αποθηκεύεται προσωρινά το DN για τη μείωση της αλληλεπίδρασης LDAP, αλλά δεν χρησιμοποιείται για αναγνώριση. Εάν αλλάξει το DN, οι αλλαγές θα βρεθούν. Το εσωτερικό όνομα χρήστη χρησιμοποιείται παντού. Η εκκαθάριση των αντιστοιχίσεων θα έχει υπολείμματα παντού. Η εκκαθάριση των αντιστοιχιών δεν είναι ευαίσθητη στη διαμόρφωση, επηρεάζει όλες τις διαμορφώσεις LDAP! Μην εκκαθαρίζετε ποτέ τις αντιστοιχίσεις σε τρέχων σύστημα, μόνο σε δοκιμαστικό ή πειραματικό στάδιο.", "Clear Username-LDAP User Mapping" : "Διαγραφή αντιστοίχησης Ονόματος Χρήστη LDAP-Χρήστη", "Clear Groupname-LDAP Group Mapping" : "Διαγραφή αντιστοίχησης Ονόματος Ομάδας-LDAP Ομάδας", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Προέκυψε σφάλμα σύνδεσης στο LDAP / AD, παρακαλούμε ελέγξτε διακομιστή θύρα και διαπιστευτήρια.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Η δέσμευση \"%uid\" απουσιάζει. Θα αντικατασταθεί με το όνομα σύνδεσης κατά το ερώτημα LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Το πεδίο ομάδας απενεργοποιήθηκε επειδή ο διακομιστής LDAP / AD δεν υποστηρίζει το memberOf.", - "LDAP / AD integration" : "LDAP / AD ενσωμάτωση", - "LDAP / AD Username:" : "Όνομα χρήστη LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Επιτρέπει σύνδεση με το όνομα χρήστη στο LDAP / AD, το οποίο είναι είτε \"uid\" ή \"sΑΜΑccountΝame\" και θα ανιχνευθεί.", - "LDAP / AD Email Address:" : "Διεύθυνση ηλ. ταχυδρομείου LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Από προεπιλογή, το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το χαρακτηριστικό UUID. Εξασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να μετατραπούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό ότι επιτρέπονται μόνο οι χαρακτήρες: [a-zA-Z0-9 _. @ -]. Άλλοι χαρακτήρες αντικαθίστανται με την μορφή ASCII ή απλά παραλείπονται. Στις διενέξεις θα προστεθεί / αυξηθεί ένας αριθμός. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την εσωτερική αναγνώριση ενός χρήστη. Είναι επίσης το προεπιλεγμένο όνομα για τον αρχικό φάκελο του χρήστη. Είναι επίσης μέρος απομακρυσμένων διευθύνσεων URL, για παράδειγμα για όλες τις υπηρεσίες * DAV. Με αυτήν τη ρύθμιση, η προεπιλεγμένη μπορεί να αντικατασταθεί. Αφήστε το κενό για την προεπιλεγμένη ρύθμιση. Οι αλλαγές θα επηρεάσουν μόνο τους νέους χρήστες που έχουν αντιστοιχιστεί (προστεθεί) στο LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Μη έγκυρη διαμόρφωση. Παρακαλώ ρίξτε μια ματιά στα αρχεία καταγραφής για περισσότερες λεπτομέρειες." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/el.json b/apps/user_ldap/l10n/el.json index 4a115456c93..6caed219c56 100644 --- a/apps/user_ldap/l10n/el.json +++ b/apps/user_ldap/l10n/el.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Μη έγκυρη διαμόρφωση: Δεν επιτρέπεται ανώνυμη δέσμευση.", "Valid configuration, connection established!" : "Επιτυχής ρύθμιση, συνδεθήκατε με επιτυχία", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Έγκυρη διαμόρφωση, αλλά η σύνδεση απέτυχε. Ελέγξτε τις ρυθμίσεις διακομιστή και τα διαπιστευτήρια.", - "Invalid configuration. Please have a look at the logs for further details." : "Μη έγκυρη διαμόρφωση. Παρακαλώ ρίξτε μια ματιά στα αρχεία καταγραφής για περισσότερες λεπτομέρειες.", "No action specified" : "Καμμία εντολή δεν προσδιορίστηκε", "No configuration specified" : "Καμμία διαμόρφωση δεν προσδιορίστηκε", "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", - " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", "Renewing …" : "Ανανέωση ...", "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", @@ -51,21 +49,22 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Το σύμβολο υποκατάστασης \"%uid\" λείπει. Θα αντικατασταθεί με το όνομα login κατά την υποβολή ερωτήματος LDAP/AD.", "Please provide a login name to test against" : "Παρακαλούμε δώστε ένα όνομα σύνδεσης για να γίνει δοκιμή", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Το κουτί ομάδας απενεργοποιήθηκε, επειδή ο LDAP/APD διακομιστής δεν υποστηρίζει memberOf.", - "Password change rejected. Hint: " : "Η αλλαγή του συνθηματικού απέτυχε. Υπόδειξη:", "Please login with the new password" : "Παρακαλώ κάντε είσοδο με το νέο συνθηματικό", "LDAP User backend" : "LDAP Σύστημα υποστήριξης χρήστη", "Your password will expire tomorrow." : "Το συνθηματικό σας θα λήξει αύριο.", "Your password will expire today." : "Το συνθηματικό σας λήγει σήμερα.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Το συνθηματικό σας θα λήξει σε %n ημέρα.","Το συνθηματικό σας θα λήξει σε %n ημέρες."], "LDAP/AD integration" : "LDAP/AD ενσωμάτωση ", - "_%s group found_::_%s groups found_" : ["%s ομάδα βρέθηκε","%s ομάδες βρέθηκαν"], - "_%s user found_::_%s users found_" : ["%s χρήστης βρέθηκε","%s χρήστες βρέθηκαν"], + "_%n group found_::_%n groups found_" : ["βρέθηκε %n ομάδα","βρέθηκαν %n ομάδες"], + "> 1000 groups found" : "Βρέθηκαν > 1000 ομάδες", + "> 1000 users found" : "Βρέθηκαν > 1000 χρήστες", + "_%n user found_::_%n users found_" : ["βρέθηκε %n χρήστης","βρέθηκαν %n χρήστες"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Δεν ήταν δυνατή η ανίχνευση της ιδιότητας του εμφανιζόμενου ονόματος χρήστη . Παρακαλώ προσδιορίστε στις προηγμένες ρυθμίσεις LDAP", "Could not find the desired feature" : "Αδυναμία εύρεσης επιθυμητού χαρακτηριστικού", "Invalid Host" : "Άκυρος εξυπηρετητής", "LDAP user and group backend" : "LDAP Σύστημα υποστήριξης χρήστη και ομάδος", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Η εφαρμογή επιτρέπει την σύνδεση διαχειριστών Nextcloud στον κατάλογο χρήστη LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Αυτή η εφαρμογή επιτρέπει στους διαχειριστές να συνδέουν το Nextcloud με έναν κατάλογο χρηστών που βασίζεται στο LDAP για τον έλεγχο ταυτότητας και την παροχή χαρακτηριστικών, ομάδων και χρηστών. Οι διαχειριστές μπορούν να ρυθμίσουν αυτήν την εφαρμογή ώστε να συνδέονται σε έναν ή περισσότερους καταλόγους LDAP ή Active Directories μέσω διεπαφής LDAP. Χαρακτηριστικά όπως η ποσόστωση των χρηστών, τα μηνύματα ηλεκτρονικού ταχυδρομείου, οι εικόνες των avatar, η συμμετοχή σε ομάδες και άλλα μπορούν να τραβηχτούν στο Nextcloud από έναν κατάλογο με τα κατάλληλα ερωτήματα και φίλτρα.\n\nΈνας χρήστης συνδέεται στο Nextcloud με τα διαπιστευτήριά του LDAP ή του AD και του παρέχεται πρόσβαση βάσει μιας αίτησης ελέγχου ταυτότητας που χειρίζεται ο διακομιστής LDAP ή AD. Το Nextcloud δεν αποθηκεύει κωδικούς πρόσβασης LDAP ή AD, αλλά αυτά τα διαπιστευτήρια χρησιμοποιούνται για τον έλεγχο ταυτότητας ενός χρήστη και στη συνέχεια το Nextcloud χρησιμοποιεί μια περίοδο σύνδεσης για το αναγνωριστικό χρήστη. Περισσότερες πληροφορίες είναι διαθέσιμες στην τεκμηρίωση του χρήστη LDAP και της ομάδας Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Αυτή η εφαρμογή επιτρέπει στους διαχειριστές να συνδέουν το Nextcloud με έναν κατάλογο χρηστών που βασίζεται στο LDAP για τον έλεγχο ταυτότητας και την παροχή χαρακτηριστικών, ομάδων και χρηστών. Οι διαχειριστές μπορούν να ρυθμίσουν αυτήν την εφαρμογή ώστε να συνδέονται σε έναν ή περισσότερους καταλόγους LDAP ή Active Directories μέσω διεπαφής LDAP. Χαρακτηριστικά όπως η ποσόστωση των χρηστών, τα μηνύματα ηλεκτρονικού ταχυδρομείου, οι εικόνες των άβαταρ, η συμμετοχή σε ομάδες και άλλα μπορούν να τραβηχτούν στο Nextcloud από έναν κατάλογο με τα κατάλληλα ερωτήματα και φίλτρα.\n\nΈνας χρήστης συνδέεται στο Nextcloud με τα διαπιστευτήριά του LDAP ή του AD και του παρέχεται πρόσβαση βάσει μιας αίτησης ελέγχου ταυτότητας που χειρίζεται ο διακομιστής LDAP ή AD. Το Nextcloud δεν αποθηκεύει κωδικούς πρόσβασης LDAP ή AD, αλλά αυτά τα διαπιστευτήρια χρησιμοποιούνται για τον έλεγχο ταυτότητας ενός χρήστη και στη συνέχεια το Nextcloud χρησιμοποιεί μια περίοδο σύνδεσης για το αναγνωριστικό χρήστη. Περισσότερες πληροφορίες είναι διαθέσιμες στην τεκμηρίωση του χρήστη LDAP και της ομάδας Backend.", "Test Configuration" : "Δοκιμαστικές ρυθμίσεις", "Help" : "Βοήθεια", "Groups meeting these criteria are available in %s:" : "Οι ομάδες που πληρούν τα κριτήρια είναι διαθέσιμες σε %s:", @@ -178,7 +177,7 @@ "\"$home\" Placeholder Field" : "\"$home\" Πεδίο Δέσμευσης", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Το $home σε μια ρύθμιση εξωτερικού χώρου αποθήκευσης θα αντικατασταθεί με την τιμή του καθορισμένου χαρακτηριστικού", "Internal Username" : "Εσωτερικό Όνομα Χρήστη", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το UUID γνώρισμα από προεπιλογή. Αυτό εξασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να τροποποιηθούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό της χρήσης μόνο των συγκεκριμένων χαρακτήρων: [a-zA-Z0-9_.@-]. Άλλοι χαρακτήρες αντικαθίστανται με τις ASCII αντιστοιχίες τους ή απλά απορρίπτονται. Σε περίπτωση σύγκρουσης ένας αριθμός θα προστεθεί/αυξηθεί. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την αναγνώριση ενός χρήστη εσωτερικά. Είναι επίσης το προεπιλεγμένο όνομα για τον φάκελο αρχικής του χρήστη. Είναι επιπλέον ένα μέρος απομακρυσμένων συνδέσμων, για παράδειγμα για όλες τις *DAV υπηρεσίες. Με αυτή τη ρύθμιση, η προεπιλεγμένη συμπεριφορά μπορεί να παρακαμφθεί. Τυχόν αλλαγές θα έχουν επίδραση μόνο σε νέους χαρτογραφημένους (εισαχθέντες) LDAP χρήστες. Αφήστε το κενό για την προεπιλεγμένη συμπεριφορά.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Από προεπιλογή, το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το χαρακτηριστικό UUID. Αυτό διασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να μετατραπούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό ότι επιτρέπονται μόνο αυτοί οι χαρακτήρες: [a-zA-Z0-9_.@-]. Άλλοι χαρακτήρες αντικαθίστανται με την ASCII αντιστοιχία τους ή απλώς παραλείπονται. Σε περίπτωση σύγκρουσης προστίθεται/αυξάνεται ένας αριθμός. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την εσωτερική αναγνώριση ενός χρήστη. Είναι επίσης το προεπιλεγμένο όνομα για τον αρχικό φάκελο του χρήστη. Αποτελεί επίσης μέρος των απομακρυσμένων διευθύνσεων URL, για παράδειγμα για όλες τις υπηρεσίες DAV. Με αυτή τη ρύθμιση, η προεπιλεγμένη συμπεριφορά μπορεί να παρακαμφθεί. Οι αλλαγές θα έχουν αποτέλεσμα μόνο σε πρόσφατα αντιστοιχισμένους (προστιθέμενους) χρήστες LDAP. Αφήστε το κενό για προεπιλεγμένη συμπεριφορά.", "Internal Username Attribute:" : "Ιδιότητα Εσωτερικού Ονόματος Χρήστη:", "Override UUID detection" : "Παράκαμψη ανίχνευσης UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Από προεπιλογή, το χαρακτηριστικό UUID εντοπίζεται αυτόματα. Το χαρακτηριστικό UUID χρησιμοποιείται για την αναγνώριση χωρίς αμφιβολία χρηστών και ομάδων LDAP. Επίσης, το εσωτερικό όνομα χρήστη θα δημιουργηθεί με βάση το UUID, εφόσον δεν ορίζεται διαφορετικά ανωτέρω. Μπορείτε να παρακάμψετε τη ρύθμιση και να ορίσετε ένα χαρακτηριστικό της επιλογής σας. Θα πρέπει να βεβαιωθείτε ότι το χαρακτηριστικό της επιλογής σας μπορεί να ληφθεί για τους χρήστες και τις ομάδες και ότι είναι μοναδικό. Αφήστε το κενό για την προεπιλεγμένη λειτουργία. Οι αλλαγές θα έχουν ισχύ μόνο σε πρόσφατα αντιστοιχισμένους (προστιθέμενους) χρήστες και ομάδες LDAP.", @@ -188,13 +187,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Τα ονόματα χρηστών χρησιμοποιούνται για την αποθήκευση και την εκχώρηση μεταδεδομένων. Προκειμένου να εντοπιστούν και να αναγνωριστούν με ακρίβεια οι χρήστες, κάθε ένας του LDAP θα έχει ένα εσωτερικό όνομα. Αυτό απαιτεί μια αντιστοίχιση από όνομα χρήστη σε χρήστη LDAP. Το τελικό όνομα χρήστη αντιστοιχίζεται στο UUID του χρήστη LDAP. Επιπλέον, αποθηκεύεται προσωρινά το DN για τη μείωση της αλληλεπίδρασης LDAP, αλλά δεν χρησιμοποιείται για αναγνώριση. Εάν αλλάξει το DN, οι αλλαγές θα βρεθούν. Το εσωτερικό όνομα χρήστη χρησιμοποιείται παντού. Η εκκαθάριση των αντιστοιχίσεων θα έχει υπολείμματα παντού. Η εκκαθάριση των αντιστοιχιών δεν είναι ευαίσθητη στη διαμόρφωση, επηρεάζει όλες τις διαμορφώσεις LDAP! Μην εκκαθαρίζετε ποτέ τις αντιστοιχίσεις σε τρέχων σύστημα, μόνο σε δοκιμαστικό ή πειραματικό στάδιο.", "Clear Username-LDAP User Mapping" : "Διαγραφή αντιστοίχησης Ονόματος Χρήστη LDAP-Χρήστη", "Clear Groupname-LDAP Group Mapping" : "Διαγραφή αντιστοίχησης Ονόματος Ομάδας-LDAP Ομάδας", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Προέκυψε σφάλμα σύνδεσης στο LDAP / AD, παρακαλούμε ελέγξτε διακομιστή θύρα και διαπιστευτήρια.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Η δέσμευση \"%uid\" απουσιάζει. Θα αντικατασταθεί με το όνομα σύνδεσης κατά το ερώτημα LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Το πεδίο ομάδας απενεργοποιήθηκε επειδή ο διακομιστής LDAP / AD δεν υποστηρίζει το memberOf.", - "LDAP / AD integration" : "LDAP / AD ενσωμάτωση", - "LDAP / AD Username:" : "Όνομα χρήστη LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Επιτρέπει σύνδεση με το όνομα χρήστη στο LDAP / AD, το οποίο είναι είτε \"uid\" ή \"sΑΜΑccountΝame\" και θα ανιχνευθεί.", - "LDAP / AD Email Address:" : "Διεύθυνση ηλ. ταχυδρομείου LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Από προεπιλογή, το εσωτερικό όνομα χρήστη θα δημιουργηθεί από το χαρακτηριστικό UUID. Εξασφαλίζει ότι το όνομα χρήστη είναι μοναδικό και οι χαρακτήρες δεν χρειάζεται να μετατραπούν. Το εσωτερικό όνομα χρήστη έχει τον περιορισμό ότι επιτρέπονται μόνο οι χαρακτήρες: [a-zA-Z0-9 _. @ -]. Άλλοι χαρακτήρες αντικαθίστανται με την μορφή ASCII ή απλά παραλείπονται. Στις διενέξεις θα προστεθεί / αυξηθεί ένας αριθμός. Το εσωτερικό όνομα χρήστη χρησιμοποιείται για την εσωτερική αναγνώριση ενός χρήστη. Είναι επίσης το προεπιλεγμένο όνομα για τον αρχικό φάκελο του χρήστη. Είναι επίσης μέρος απομακρυσμένων διευθύνσεων URL, για παράδειγμα για όλες τις υπηρεσίες * DAV. Με αυτήν τη ρύθμιση, η προεπιλεγμένη μπορεί να αντικατασταθεί. Αφήστε το κενό για την προεπιλεγμένη ρύθμιση. Οι αλλαγές θα επηρεάσουν μόνο τους νέους χρήστες που έχουν αντιστοιχιστεί (προστεθεί) στο LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Μη έγκυρη διαμόρφωση. Παρακαλώ ρίξτε μια ματιά στα αρχεία καταγραφής για περισσότερες λεπτομέρειες." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/en_GB.js b/apps/user_ldap/l10n/en_GB.js index 44aaa1d6a4e..550cc262cb5 100644 --- a/apps/user_ldap/l10n/en_GB.js +++ b/apps/user_ldap/l10n/en_GB.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", "Valid configuration, connection established!" : "Valid configuration, connection established!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", - "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details.", + "Invalid configuration: %s" : "Invalid configuration: %s", "No action specified" : "No action specified", "No configuration specified" : "No configuration specified", "No data specified" : "No data specified", - " Could not set configuration %s" : " Could not set configuration %s", + "Invalid data specified" : "Invalid data specified", + "Could not set configuration %1$s to %2$s" : "Could not set configuration %1$s to %2$s", "Action does not exist" : "Action does not exist", "Renewing …" : "Renewing …", "Very weak password" : "Very weak password", @@ -49,14 +50,36 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like an uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", "Please provide a login name to test against" : "Please provide a login name to test against", - "Password change rejected. Hint: " : "Password change rejected. Hint: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Password change rejected. Hint: %s" : "Password change rejected. Hint: %s", + "Mandatory field \"%s\" left empty" : "Mandatory field \"%s\" left empty", + "A password is given, but not an LDAP agent" : "A password is given, but not an LDAP agent", + "No password is given for the user agent" : "No password is given for the user agent", + "No LDAP base DN was given" : "No LDAP base DN was given", + "User base DN is not a subnode of global base DN" : "User base DN is not a subnode of global base DN", + "Group base DN is not a subnode of global base DN" : "Group base DN is not a subnode of global base DN", + "Login filter does not contain %s placeholder." : "Login filter does not contain %s placeholder.", "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Your password will expire tomorrow.", "Your password will expire today." : "Your password will expire today.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], - "_%s group found_::_%s groups found_" : ["%s group found","%s groups found"], - "_%s user found_::_%s users found_" : ["%s user found","%s users found"], + "LDAP/AD integration" : "LDAP/AD integration", + "LDAP Connection" : "Подключение LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Binding failed for this LDAP configuration: %s","Binding failed for %n LDAP configurations: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Searching failed for this LDAP configuration: %s","Searching failed for %n LDAP configurations: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["There is an inactive LDAP configuration: %s","There are %n inactive LDAP configurations: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Binding and searching works on the configured LDAP connection (%s)","Binding and searching works on all of the %n configured LDAP connections (%s)"], + "Invalid LDAP UUIDs" : "Invalid LDAP UUIDs", + "None found" : "None found", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them.", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "Invalid Host", @@ -76,10 +99,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", "Verify settings and count the groups" : "Verify settings and count the groups", "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", "Other Attributes:" : "Other Attributes:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", "Verify settings" : "Verify settings", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Add a new configuration", @@ -143,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "One User Base DN per line", "User Search Attributes" : "User Search Attributes", "Optional; one attribute per line" : "Optional; one attribute per line", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", "Group Display Name Field" : "Group Display Name Field", "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the group's display name.", "Base Group Tree" : "Base Group Tree", @@ -168,7 +197,34 @@ OC.L10N.register( "Email Field" : "Email Field", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "User Profile Attributes", + "Phone Field" : "Phone Field", + "User profile Phone will be set from the specified attribute" : "User profile Phone will be set from the specified attribute", + "Website Field" : "Website Field", + "User profile Website will be set from the specified attribute" : "User profile Website will be set from the specified attribute", + "Address Field" : "Address Field", + "User profile Address will be set from the specified attribute" : "User profile Address will be set from the specified attribute", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "User profile Twitter will be set from the specified attribute", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "User profile Fediverse will be set from the specified attribute", + "Organisation Field" : "Organisation Field", + "User profile Organisation will be set from the specified attribute" : "User profile Organisation will be set from the specified attribute", + "Role Field" : "Role Field", + "User profile Role will be set from the specified attribute" : "User profile Role will be set from the specified attribute", + "Headline Field" : "Headline Field", + "User profile Headline will be set from the specified attribute" : "User profile Headline will be set from the specified attribute", + "Biography Field" : "Biography Field", + "User profile Biography will be set from the specified attribute" : "User profile Biography will be set from the specified attribute", + "Birthdate Field" : "Birthdate Field", + "User profile Date of birth will be set from the specified attribute" : "User profile Date of birth will be set from the specified attribute", + "Pronouns Field" : "Pronouns Field", + "User profile Pronouns will be set from the specified attribute" : "User profile Pronouns will be set from the specified attribute", "Internal Username" : "Internal Username", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", "Internal Username Attribute:" : "Internal Username Attribute:", "Override UUID detection" : "Override UUID detection", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to unambiguously identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups.", @@ -178,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognise users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", "Clear Username-LDAP User Mapping" : "Clear Username-LDAP User Mapping", "Clear Groupname-LDAP Group Mapping" : "Clear Groupname-LDAP Group Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "A connection error to LDAP / AD occurred, please check host, port and credentials.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "The group box was disabled, because the LDAP / AD server does not support memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP / AD Username:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", - "LDAP / AD Email Address:" : "LDAP / AD Email Address:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/en_GB.json b/apps/user_ldap/l10n/en_GB.json index 74757b94b21..d516661ef41 100644 --- a/apps/user_ldap/l10n/en_GB.json +++ b/apps/user_ldap/l10n/en_GB.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", "Valid configuration, connection established!" : "Valid configuration, connection established!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", - "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details.", + "Invalid configuration: %s" : "Invalid configuration: %s", "No action specified" : "No action specified", "No configuration specified" : "No configuration specified", "No data specified" : "No data specified", - " Could not set configuration %s" : " Could not set configuration %s", + "Invalid data specified" : "Invalid data specified", + "Could not set configuration %1$s to %2$s" : "Could not set configuration %1$s to %2$s", "Action does not exist" : "Action does not exist", "Renewing …" : "Renewing …", "Very weak password" : "Very weak password", @@ -47,14 +48,36 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like an uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", "Please provide a login name to test against" : "Please provide a login name to test against", - "Password change rejected. Hint: " : "Password change rejected. Hint: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Password change rejected. Hint: %s" : "Password change rejected. Hint: %s", + "Mandatory field \"%s\" left empty" : "Mandatory field \"%s\" left empty", + "A password is given, but not an LDAP agent" : "A password is given, but not an LDAP agent", + "No password is given for the user agent" : "No password is given for the user agent", + "No LDAP base DN was given" : "No LDAP base DN was given", + "User base DN is not a subnode of global base DN" : "User base DN is not a subnode of global base DN", + "Group base DN is not a subnode of global base DN" : "Group base DN is not a subnode of global base DN", + "Login filter does not contain %s placeholder." : "Login filter does not contain %s placeholder.", "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Your password will expire tomorrow.", "Your password will expire today." : "Your password will expire today.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], - "_%s group found_::_%s groups found_" : ["%s group found","%s groups found"], - "_%s user found_::_%s users found_" : ["%s user found","%s users found"], + "LDAP/AD integration" : "LDAP/AD integration", + "LDAP Connection" : "Подключение LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Binding failed for this LDAP configuration: %s","Binding failed for %n LDAP configurations: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Searching failed for this LDAP configuration: %s","Searching failed for %n LDAP configurations: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["There is an inactive LDAP configuration: %s","There are %n inactive LDAP configurations: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Binding and searching works on the configured LDAP connection (%s)","Binding and searching works on all of the %n configured LDAP connections (%s)"], + "Invalid LDAP UUIDs" : "Invalid LDAP UUIDs", + "None found" : "None found", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them.", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "Invalid Host", @@ -74,10 +97,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", "Verify settings and count the groups" : "Verify settings and count the groups", "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", "Other Attributes:" : "Other Attributes:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", "Verify settings" : "Verify settings", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Add a new configuration", @@ -141,6 +168,8 @@ "One User Base DN per line" : "One User Base DN per line", "User Search Attributes" : "User Search Attributes", "Optional; one attribute per line" : "Optional; one attribute per line", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", "Group Display Name Field" : "Group Display Name Field", "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the group's display name.", "Base Group Tree" : "Base Group Tree", @@ -166,7 +195,34 @@ "Email Field" : "Email Field", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "User Profile Attributes", + "Phone Field" : "Phone Field", + "User profile Phone will be set from the specified attribute" : "User profile Phone will be set from the specified attribute", + "Website Field" : "Website Field", + "User profile Website will be set from the specified attribute" : "User profile Website will be set from the specified attribute", + "Address Field" : "Address Field", + "User profile Address will be set from the specified attribute" : "User profile Address will be set from the specified attribute", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "User profile Twitter will be set from the specified attribute", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "User profile Fediverse will be set from the specified attribute", + "Organisation Field" : "Organisation Field", + "User profile Organisation will be set from the specified attribute" : "User profile Organisation will be set from the specified attribute", + "Role Field" : "Role Field", + "User profile Role will be set from the specified attribute" : "User profile Role will be set from the specified attribute", + "Headline Field" : "Headline Field", + "User profile Headline will be set from the specified attribute" : "User profile Headline will be set from the specified attribute", + "Biography Field" : "Biography Field", + "User profile Biography will be set from the specified attribute" : "User profile Biography will be set from the specified attribute", + "Birthdate Field" : "Birthdate Field", + "User profile Date of birth will be set from the specified attribute" : "User profile Date of birth will be set from the specified attribute", + "Pronouns Field" : "Pronouns Field", + "User profile Pronouns will be set from the specified attribute" : "User profile Pronouns will be set from the specified attribute", "Internal Username" : "Internal Username", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", "Internal Username Attribute:" : "Internal Username Attribute:", "Override UUID detection" : "Override UUID detection", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to unambiguously identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behaviour. Changes will have effect only on newly mapped (added) LDAP users and groups.", @@ -176,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognise users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", "Clear Username-LDAP User Mapping" : "Clear Username-LDAP User Mapping", "Clear Groupname-LDAP Group Mapping" : "Clear Groupname-LDAP Group Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "A connection error to LDAP / AD occurred, please check host, port and credentials.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "The group box was disabled, because the LDAP / AD server does not support memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP / AD Username:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", - "LDAP / AD Email Address:" : "LDAP / AD Email Address:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/eo.js b/apps/user_ldap/l10n/eo.js deleted file mode 100644 index 25c880dbdc5..00000000000 --- a/apps/user_ldap/l10n/eo.js +++ /dev/null @@ -1,63 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to delete the server configuration" : "Malsukcesis forigo de la agordo de servilo", - "Action does not exist" : "Ago ne ekzistas", - "Configuration incorrect" : "La agordaro malĝustas", - "Configuration incomplete" : "La agordaro neplenas", - "Configuration OK" : "La agordaro ĝustas", - "Select groups" : "Elekti grupojn", - "Select object classes" : "Elekti objektoklasojn", - "{nthServer}. Server" : "{nthServer}. Servilo", - "Confirm Deletion" : "Konfirmi forigon", - "Select attributes" : "Elekti atribuojn", - "_%s group found_::_%s groups found_" : ["%s grupo troviĝis","%s grupoj troviĝis"], - "_%s user found_::_%s users found_" : ["%s uzanto troviĝis","%s uzanto troviĝis"], - "Invalid Host" : "Nevalida gastigo", - "Server" : "Servilo", - "Users" : "Uzantoj", - "Groups" : "Grupoj", - "Test Configuration" : "Provi agordon", - "Help" : "Helpo", - "Other Attributes:" : "Aliaj atribuoj:", - "1. Server" : "1. Servilo", - "%s. Server:" : "%s. Servilo:", - "Host" : "Gastigo", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Vi povas neglekti la protokolon, escepte se vi bezonas SSL-on. Tiuokaze, komencu per ldaps://", - "Port" : "Pordo", - "User DN" : "Uzanto-DN", - "Password" : "Pasvorto", - "For anonymous access, leave DN and Password empty." : "Por sennoman aliron, lasu DN-on kaj Pasvorton malplenaj.", - "Saving" : "Konservante", - "Back" : "Antaŭen", - "Continue" : "Daŭri", - "LDAP" : "LDAP", - "Expert" : "Sperta", - "Advanced" : "Progresinta", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Averto</b>: la PHP-modulo LDAP ne instalatas; la motoro ne funkcios. Bonvolu peti vian sistemadministranton instali ĝin.", - "Connection Settings" : "Agordo de konekto", - "Disable Main Server" : "Malkapabligi la ĉefan servilon", - "Turn off SSL certificate validation." : "Malkapabligi validkontrolon de SSL-atestiloj.", - "Cache Time-To-Live" : "Vivotempo de la kaŝmemoro", - "in seconds. A change empties the cache." : "sekunde. Ajna ŝanĝo malplenigas la kaŝmemoron.", - "Directory Settings" : "Agordo de dosierujo", - "User Display Name Field" : "Kampo de vidignomo de uzanto", - "Base User Tree" : "Baza uzantarbo", - "User Search Attributes" : "Atributoj de serĉo de uzanto", - "Optional; one attribute per line" : "Malnepra; po unu atribuo por linio", - "Group Display Name Field" : "Kampo de vidignomo de grupo", - "Base Group Tree" : "Baza gruparbo", - "Group Search Attributes" : "Atribuoj de gruposerĉo", - "Group-Member association" : "Asocio de grupo kaj membro", - "Nested Groups" : "Ingitaj grupoj", - "Special Attributes" : "Specialaj atribuoj", - "Quota Field" : "Kampo de kvoto", - "in bytes" : "duumoke", - "Email Field" : "Kampo de retpoŝto", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lasu malplena por uzantonomo (defaŭlto). Alie, specifu LDAP/AD-atributon.", - "Internal Username" : "Ena uzantonomo", - "Internal Username Attribute:" : "Atribuo de ena uzantonomo:", - "UUID Attribute for Users:" : "UUID-atribuo por uzantoj:", - "UUID Attribute for Groups:" : "UUID-atribuo por grupoj:" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/eo.json b/apps/user_ldap/l10n/eo.json deleted file mode 100644 index 37cdc4e2519..00000000000 --- a/apps/user_ldap/l10n/eo.json +++ /dev/null @@ -1,61 +0,0 @@ -{ "translations": { - "Failed to delete the server configuration" : "Malsukcesis forigo de la agordo de servilo", - "Action does not exist" : "Ago ne ekzistas", - "Configuration incorrect" : "La agordaro malĝustas", - "Configuration incomplete" : "La agordaro neplenas", - "Configuration OK" : "La agordaro ĝustas", - "Select groups" : "Elekti grupojn", - "Select object classes" : "Elekti objektoklasojn", - "{nthServer}. Server" : "{nthServer}. Servilo", - "Confirm Deletion" : "Konfirmi forigon", - "Select attributes" : "Elekti atribuojn", - "_%s group found_::_%s groups found_" : ["%s grupo troviĝis","%s grupoj troviĝis"], - "_%s user found_::_%s users found_" : ["%s uzanto troviĝis","%s uzanto troviĝis"], - "Invalid Host" : "Nevalida gastigo", - "Server" : "Servilo", - "Users" : "Uzantoj", - "Groups" : "Grupoj", - "Test Configuration" : "Provi agordon", - "Help" : "Helpo", - "Other Attributes:" : "Aliaj atribuoj:", - "1. Server" : "1. Servilo", - "%s. Server:" : "%s. Servilo:", - "Host" : "Gastigo", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Vi povas neglekti la protokolon, escepte se vi bezonas SSL-on. Tiuokaze, komencu per ldaps://", - "Port" : "Pordo", - "User DN" : "Uzanto-DN", - "Password" : "Pasvorto", - "For anonymous access, leave DN and Password empty." : "Por sennoman aliron, lasu DN-on kaj Pasvorton malplenaj.", - "Saving" : "Konservante", - "Back" : "Antaŭen", - "Continue" : "Daŭri", - "LDAP" : "LDAP", - "Expert" : "Sperta", - "Advanced" : "Progresinta", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Averto</b>: la PHP-modulo LDAP ne instalatas; la motoro ne funkcios. Bonvolu peti vian sistemadministranton instali ĝin.", - "Connection Settings" : "Agordo de konekto", - "Disable Main Server" : "Malkapabligi la ĉefan servilon", - "Turn off SSL certificate validation." : "Malkapabligi validkontrolon de SSL-atestiloj.", - "Cache Time-To-Live" : "Vivotempo de la kaŝmemoro", - "in seconds. A change empties the cache." : "sekunde. Ajna ŝanĝo malplenigas la kaŝmemoron.", - "Directory Settings" : "Agordo de dosierujo", - "User Display Name Field" : "Kampo de vidignomo de uzanto", - "Base User Tree" : "Baza uzantarbo", - "User Search Attributes" : "Atributoj de serĉo de uzanto", - "Optional; one attribute per line" : "Malnepra; po unu atribuo por linio", - "Group Display Name Field" : "Kampo de vidignomo de grupo", - "Base Group Tree" : "Baza gruparbo", - "Group Search Attributes" : "Atribuoj de gruposerĉo", - "Group-Member association" : "Asocio de grupo kaj membro", - "Nested Groups" : "Ingitaj grupoj", - "Special Attributes" : "Specialaj atribuoj", - "Quota Field" : "Kampo de kvoto", - "in bytes" : "duumoke", - "Email Field" : "Kampo de retpoŝto", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lasu malplena por uzantonomo (defaŭlto). Alie, specifu LDAP/AD-atributon.", - "Internal Username" : "Ena uzantonomo", - "Internal Username Attribute:" : "Atribuo de ena uzantonomo:", - "UUID Attribute for Users:" : "UUID-atribuo por uzantoj:", - "UUID Attribute for Groups:" : "UUID-atribuo por grupoj:" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index 33c69d781af..280e68568c4 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.", "Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero falló el enlazado. Por favor compruebe los ajustes del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración no válida. Por favor, echa un vistazo al registro para más detalles.", + "Invalid configuration: %s" : "Configuración inválida: %s", "No action specified" : "No se ha especificado la acción", "No configuration specified" : "No se ha especificado la configuración", "No data specified" : "No se han especificado los datos", - " Could not set configuration %s" : "No se pudo establecer la configuración %s", + "Invalid data specified" : "Se especificaron datos inválidos", + "Could not set configuration %1$s to %2$s" : "No se pudo establecer la configuración %1$s a %2$s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando …", "Very weak password" : "Contraseña muy débil", @@ -30,9 +31,9 @@ OC.L10N.register( "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no puede ser detectada automáticamente, por favor revise credenciales, host y puerto.", "Could not detect Base DN, please enter it manually." : "No se ha podido detectar Base DN, por favor introdúzcala manualmente.", "{nthServer}. Server" : "{nthServer}. servidor", - "No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en la Base DN dada. Por favor revisar.", + "No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en el Base DN proporcionado. Por favor revisar.", "More than 1,000 directory entries available." : "Más de 1.000 entradas de directorios disponibles.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponible en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponible en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Un error ocurrió. Por favor revise la Base DN, también como la configuración de la conexión y credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente quieres eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar eliminación", @@ -53,15 +54,32 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP/AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP/AD no admite memberOf.", - "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", + "Password change rejected. Hint: %s" : "Se rechazó el cambio de contraseña. Pista: %s", + "Mandatory field \"%s\" left empty" : "El campo obligatorio \"%s\" se dejó en blanco", + "A password is given, but not an LDAP agent" : "Se proporcionó una contraseña, pero no un agente LDAP", + "No password is given for the user agent" : "No se proporcionó una contraseña para el agente de usuario", + "No LDAP base DN was given" : "No se proporcionó un DN base LDAP", + "User base DN is not a subnode of global base DN" : "El DN base de usuario no es un subnodo del DN base global", + "Group base DN is not a subnode of global base DN" : "El DN base de grupo no es un subnodo del DN base global", + "Login filter does not contain %s placeholder." : "El filtro de inicio de sesión no contiene el marcador de posición %s.", "Please login with the new password" : "Por favor, entra con la nueva contraseña", "LDAP User backend" : "Motor de usuarios LDAP", "Your password will expire tomorrow." : "Tu contraseña caducará mañana.", "Your password will expire today." : "Tu contraseña caducará hoy.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días."], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días.","Tu contraseña caducará dentro de %n días."], "LDAP/AD integration" : "Integración LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], + "LDAP Connection" : "Conexión LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["El inicio de sesión falló para esta configuración de LDAP: %s","El inicio de sesión falló para %n configuraciones de LDAP: %s","El inicio de sesión falló para %n configuraciones de LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Falló la búsqueda para esta configuración LDAP: %s","Falló la búsqueda para %n configuraciones LDAP: %s","Falló la búsqueda para %n configuraciones LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existe una configuración LDAP inactiva: %s","Existen %n configuraciones LDAP inactivas: %s","Existen %n configuraciones LDAP inactivas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["El inicio de sesión y la búsqueda funcionan para la conexión LDAP configurada (%s)","El inicio de sesión y la búsqueda funcionan para todas las %n conexiones de LDAP configuradas (%s)","El inicio de sesión y la búsqueda funcionan para todas las %n conexiones de LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUIDs LDAP inválidas", + "None found" : "Ninguno encontrado", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Se han encontrado UUIDs no válidos de cuentas o grupos LDAP. Por favor, compruebe la configuración de \"Anular detección de UUID\" en la sección de Experto de la configuración LDAP y use \"occ ldap:update-uuid\" para actualizarlos.", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "Se encontraron más de 1000 grupos", + "> 1000 users found" : "Se encontraron más de 1000 usuarios", + "_%n user found_::_%n users found_" : ["%n usuario encontrado ","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No se ha podido detectar el atributo del nombre ", "Could not find the desired feature" : "No se puede encontrar la función deseada.", "Invalid Host" : "Host no válido", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro que aplicar cuando se intenta el registro. \"%%uid\" reemplaza al nombre de usuario en la acción de registro. Ejemplo: \"uid=%%uid\"", "Test Loginname" : "Probar nombre de sesión", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta recibir un DN para el loginname dado y el filtro de ingreso actual", "Verify settings" : "Verificar configuración", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Agregar una nueva configuración", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "Un DN Base de Usuario por línea", "User Search Attributes" : "Atributos de la busqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por linea", + "Disable users missing from LDAP" : "Desactivar los usuarios ausentes en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Si se activa, los usuarios importados de LDAP no encontrados se desactivarán.", "Group Display Name Field" : "Campo de nombre de grupo a mostrar", "The LDAP attribute to use to generate the groups's display name." : "El campo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -164,39 +185,55 @@ OC.L10N.register( "Paging chunksize" : "Tamaño de los fragmentos de paginación", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño de los fragmentos usado para búsquedas LDAP paginadas que pueden devolver resultados voluminosos, como enumeración de usuarios o de grupos. (Si se establece en 0, se deshabilitan las búsquedas LDAP paginadas en esas situaciones.)", "Enable LDAP password changes per user" : "Permitir cambios de contraseñas LDAP por usuario", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. SOlo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. Solo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", "Default password policy DN" : "Política de contraseñas por defecto DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN de una política de contraseñas por defecto que será usado para el manejo de la expiración de contraseñas. Solo funciona cuando los cambios por usuario de la contraseña LDAP están habilitados y solo está aceptada por OpenLDAP. Déjala vacía para deshabilitar el manejo de expiración de contraseñas.", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Déjelo vacío para la cuota predeterminada del usuario. De lo contrario, especifique un atributo LDAP/AD.", "Quota Default" : "Cuota por defecto", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir la cuota predeterminada para usuarios LDAP que no tienen una cuota configurada en el Campo Cuota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir la cuota predeterminada para usuarios LDAP que no tienen una cuota establecida en el Campo Cuota.", "Email Field" : "E-mail", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Configurar el correo electrónico del usuario desde atributo LDAP. Déjelo vacío para comportamiento predeterminado.", "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", - "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deje vacío el nombre de usuario (por omisión). En otro caso, especifique un atributo LDAP/AD.", - "\"$home\" Placeholder Field" : "Campo reservado \"$home\"", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Déjelo vacío para utilizar el nombre de usuario (predeterminado). De lo contrario, especifique un atributo LDAP/AD.", + "\"$home\" Placeholder Field" : "Marcador de posición del Campo \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo será reemplazado con el valor del atributo especificado", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo Teléfono", + "User profile Phone will be set from the specified attribute" : "El teléfono en el perfil del usuario será definido desde el atributo especificado", + "Website Field" : "Campo sitio Web", + "User profile Website will be set from the specified attribute" : "El sitio Web en el perfil del usuario será definido desde el atributo especificado", + "Address Field" : "Campo Dirección", + "User profile Address will be set from the specified attribute" : "La Dirección en el perfil del usuario será definida desde el atributo especificado", + "Twitter Field" : "Campo Twitter", + "User profile Twitter will be set from the specified attribute" : "El alias de Twitter en el perfil del usuario será definido desde el atributo especificado", + "Fediverse Field" : "Campo Fediverso", + "User profile Fediverse will be set from the specified attribute" : "La identidad en el Fediverso en el perfil del usuario será definida desde el atributo especificado", + "Organisation Field" : "Campo Organización", + "User profile Organisation will be set from the specified attribute" : "La Organización en el perfil del usuario será definida desde el atributo especificado", + "Role Field" : "Campo Rol", + "User profile Role will be set from the specified attribute" : "El Rol en el perfil del usuario será definido desde el atributo especificado", + "Headline Field" : "Campo Título", + "User profile Headline will be set from the specified attribute" : "El Título en el perfil del usuario será definido desde el atributo especificado", + "Biography Field" : "Campo Biografía", + "User profile Biography will be set from the specified attribute" : "La Biografía en el perfil del usuario será definida desde el atributo especificado", + "Birthdate Field" : "Campo de Fecha de nacimiento", + "User profile Date of birth will be set from the specified attribute" : "La fecha de nacimiento en el perfil de usuario será asignada en base al atributo especificado", + "Pronouns Field" : "Campo Pronombres", + "User profile Pronouns will be set from the specified attribute" : "Los pronombres en el perfil de usuario se asignarán en base al atributo especificado", "Internal Username" : "Nombre de usuario interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesita convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios *DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesitará convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.", "Internal Username Attribute:" : "Atributo de nombre de usuario interno:", - "Override UUID detection" : "Sobrescribir la detección UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID es autodetectado. Este atributo es usado para identificar sin dudas a usuarios y grupos LDAP. Además, el nombre de usuario interno será creado basado en el UUID, si no ha sido especificado otro comportamiento arriba. Puedes sobrescribir la configuración y pasar un atributo de tu elección. Debes asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Déjalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", + "Override UUID detection" : "Anular la detección UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "De manera predeterminada, el atributo UUID se detecta automáticamente. El atributo UUID se utiliza para identificar inequívocamente a usuarios y grupos LDAP. Además, el nombre de usuario interno será creado basado en el UUID, si no ha sido especificado un comportamiento diferente más arriba. Puede sobrescribir la configuración y pasar un atributo de su elección. Debe asegurarse de que el atributo de su elección sea accesible tanto por usuarios como grupos y ser único. Déjelo en blanco para usar el comportamiento predeterminado. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", "UUID Attribute for Users:" : "Atributo UUID para usuarios:", "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", "Username-LDAP User Mapping" : "Asignación del Nombre de usuario de un usuario LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuario se usan para almacenar y asignar metadatos. Para identificar y reconocer con precisión a los usuarios, cada usuario de LDAP tendrá un nombre de usuario interno. Esto requiere una asignación de nombre de usuario a usuario de LDAP. El nombre de usuario creado se asigna al UUID del usuario de LDAP. Además, el DN también se almacena en caché para reducir la interacción de LDAP, pero no se utiliza para la identificación. Si el DN cambia, se encontrarán los cambios. El nombre de usuario interno se usa en todas partes. Limpiar las asignaciones tendrá sobras en todas partes. ¡Borrar las asignaciones no es sensible a la configuración, afecta todas las configuraciones de LDAP! Nunca borre las asignaciones en un entorno de producción, solo en una etapa de prueba o experimental.", "Clear Username-LDAP User Mapping" : "Borrar la asignación de los Nombres de usuario de los usuarios LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar la asignación de los Nombres de grupo de los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", - "LDAP / AD integration" : "Integración LDAP / AD", - "LDAP / AD Username:" : "Nombre de usuario LDAP /AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite registrarse contra el usuario LDAP / AD, que es o \"uid\" o \"sAMAccountName\" y será detectado.", - "LDAP / AD Email Address:" : "LDAP / AD dirección de correo electrónico:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesita convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios *DAV. Con esta configuración, se puede anular el comportamiento por defecto. Déjelo vacío para usar el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio." + "Invalid configuration. Please have a look at the logs for further details." : "Configuración no válida. Por favor, echa un vistazo al registro para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index aa7e77070ea..668dd84b489 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.", "Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero falló el enlazado. Por favor compruebe los ajustes del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración no válida. Por favor, echa un vistazo al registro para más detalles.", + "Invalid configuration: %s" : "Configuración inválida: %s", "No action specified" : "No se ha especificado la acción", "No configuration specified" : "No se ha especificado la configuración", "No data specified" : "No se han especificado los datos", - " Could not set configuration %s" : "No se pudo establecer la configuración %s", + "Invalid data specified" : "Se especificaron datos inválidos", + "Could not set configuration %1$s to %2$s" : "No se pudo establecer la configuración %1$s a %2$s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando …", "Very weak password" : "Contraseña muy débil", @@ -28,9 +29,9 @@ "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN no puede ser detectada automáticamente, por favor revise credenciales, host y puerto.", "Could not detect Base DN, please enter it manually." : "No se ha podido detectar Base DN, por favor introdúzcala manualmente.", "{nthServer}. Server" : "{nthServer}. servidor", - "No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en la Base DN dada. Por favor revisar.", + "No object found in the given Base DN. Please revise." : "No se encuentra ningún objeto en el Base DN proporcionado. Por favor revisar.", "More than 1,000 directory entries available." : "Más de 1.000 entradas de directorios disponibles.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponible en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponible en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada","{objectsFound} entradas disponibles en la base DN proporcionada"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Un error ocurrió. Por favor revise la Base DN, también como la configuración de la conexión y credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente quieres eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar eliminación", @@ -51,15 +52,32 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP/AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP/AD no admite memberOf.", - "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", + "Password change rejected. Hint: %s" : "Se rechazó el cambio de contraseña. Pista: %s", + "Mandatory field \"%s\" left empty" : "El campo obligatorio \"%s\" se dejó en blanco", + "A password is given, but not an LDAP agent" : "Se proporcionó una contraseña, pero no un agente LDAP", + "No password is given for the user agent" : "No se proporcionó una contraseña para el agente de usuario", + "No LDAP base DN was given" : "No se proporcionó un DN base LDAP", + "User base DN is not a subnode of global base DN" : "El DN base de usuario no es un subnodo del DN base global", + "Group base DN is not a subnode of global base DN" : "El DN base de grupo no es un subnodo del DN base global", + "Login filter does not contain %s placeholder." : "El filtro de inicio de sesión no contiene el marcador de posición %s.", "Please login with the new password" : "Por favor, entra con la nueva contraseña", "LDAP User backend" : "Motor de usuarios LDAP", "Your password will expire tomorrow." : "Tu contraseña caducará mañana.", "Your password will expire today." : "Tu contraseña caducará hoy.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días."], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña caducará dentro de %n día.","Tu contraseña caducará dentro de %n días.","Tu contraseña caducará dentro de %n días."], "LDAP/AD integration" : "Integración LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], + "LDAP Connection" : "Conexión LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["El inicio de sesión falló para esta configuración de LDAP: %s","El inicio de sesión falló para %n configuraciones de LDAP: %s","El inicio de sesión falló para %n configuraciones de LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Falló la búsqueda para esta configuración LDAP: %s","Falló la búsqueda para %n configuraciones LDAP: %s","Falló la búsqueda para %n configuraciones LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existe una configuración LDAP inactiva: %s","Existen %n configuraciones LDAP inactivas: %s","Existen %n configuraciones LDAP inactivas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["El inicio de sesión y la búsqueda funcionan para la conexión LDAP configurada (%s)","El inicio de sesión y la búsqueda funcionan para todas las %n conexiones de LDAP configuradas (%s)","El inicio de sesión y la búsqueda funcionan para todas las %n conexiones de LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUIDs LDAP inválidas", + "None found" : "Ninguno encontrado", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Se han encontrado UUIDs no válidos de cuentas o grupos LDAP. Por favor, compruebe la configuración de \"Anular detección de UUID\" en la sección de Experto de la configuración LDAP y use \"occ ldap:update-uuid\" para actualizarlos.", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "Se encontraron más de 1000 grupos", + "> 1000 users found" : "Se encontraron más de 1000 usuarios", + "_%n user found_::_%n users found_" : ["%n usuario encontrado ","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No se ha podido detectar el atributo del nombre ", "Could not find the desired feature" : "No se puede encontrar la función deseada.", "Invalid Host" : "Host no válido", @@ -86,6 +104,7 @@ "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro que aplicar cuando se intenta el registro. \"%%uid\" reemplaza al nombre de usuario en la acción de registro. Ejemplo: \"uid=%%uid\"", "Test Loginname" : "Probar nombre de sesión", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta recibir un DN para el loginname dado y el filtro de ingreso actual", "Verify settings" : "Verificar configuración", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Agregar una nueva configuración", @@ -149,6 +168,8 @@ "One User Base DN per line" : "Un DN Base de Usuario por línea", "User Search Attributes" : "Atributos de la busqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por linea", + "Disable users missing from LDAP" : "Desactivar los usuarios ausentes en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Si se activa, los usuarios importados de LDAP no encontrados se desactivarán.", "Group Display Name Field" : "Campo de nombre de grupo a mostrar", "The LDAP attribute to use to generate the groups's display name." : "El campo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -162,39 +183,55 @@ "Paging chunksize" : "Tamaño de los fragmentos de paginación", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño de los fragmentos usado para búsquedas LDAP paginadas que pueden devolver resultados voluminosos, como enumeración de usuarios o de grupos. (Si se establece en 0, se deshabilitan las búsquedas LDAP paginadas en esas situaciones.)", "Enable LDAP password changes per user" : "Permitir cambios de contraseñas LDAP por usuario", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. SOlo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. Solo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", "Default password policy DN" : "Política de contraseñas por defecto DN", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN de una política de contraseñas por defecto que será usado para el manejo de la expiración de contraseñas. Solo funciona cuando los cambios por usuario de la contraseña LDAP están habilitados y solo está aceptada por OpenLDAP. Déjala vacía para deshabilitar el manejo de expiración de contraseñas.", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Déjelo vacío para la cuota predeterminada del usuario. De lo contrario, especifique un atributo LDAP/AD.", "Quota Default" : "Cuota por defecto", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir la cuota predeterminada para usuarios LDAP que no tienen una cuota configurada en el Campo Cuota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir la cuota predeterminada para usuarios LDAP que no tienen una cuota establecida en el Campo Cuota.", "Email Field" : "E-mail", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Configurar el correo electrónico del usuario desde atributo LDAP. Déjelo vacío para comportamiento predeterminado.", "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", - "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deje vacío el nombre de usuario (por omisión). En otro caso, especifique un atributo LDAP/AD.", - "\"$home\" Placeholder Field" : "Campo reservado \"$home\"", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Déjelo vacío para utilizar el nombre de usuario (predeterminado). De lo contrario, especifique un atributo LDAP/AD.", + "\"$home\" Placeholder Field" : "Marcador de posición del Campo \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo será reemplazado con el valor del atributo especificado", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo Teléfono", + "User profile Phone will be set from the specified attribute" : "El teléfono en el perfil del usuario será definido desde el atributo especificado", + "Website Field" : "Campo sitio Web", + "User profile Website will be set from the specified attribute" : "El sitio Web en el perfil del usuario será definido desde el atributo especificado", + "Address Field" : "Campo Dirección", + "User profile Address will be set from the specified attribute" : "La Dirección en el perfil del usuario será definida desde el atributo especificado", + "Twitter Field" : "Campo Twitter", + "User profile Twitter will be set from the specified attribute" : "El alias de Twitter en el perfil del usuario será definido desde el atributo especificado", + "Fediverse Field" : "Campo Fediverso", + "User profile Fediverse will be set from the specified attribute" : "La identidad en el Fediverso en el perfil del usuario será definida desde el atributo especificado", + "Organisation Field" : "Campo Organización", + "User profile Organisation will be set from the specified attribute" : "La Organización en el perfil del usuario será definida desde el atributo especificado", + "Role Field" : "Campo Rol", + "User profile Role will be set from the specified attribute" : "El Rol en el perfil del usuario será definido desde el atributo especificado", + "Headline Field" : "Campo Título", + "User profile Headline will be set from the specified attribute" : "El Título en el perfil del usuario será definido desde el atributo especificado", + "Biography Field" : "Campo Biografía", + "User profile Biography will be set from the specified attribute" : "La Biografía en el perfil del usuario será definida desde el atributo especificado", + "Birthdate Field" : "Campo de Fecha de nacimiento", + "User profile Date of birth will be set from the specified attribute" : "La fecha de nacimiento en el perfil de usuario será asignada en base al atributo especificado", + "Pronouns Field" : "Campo Pronombres", + "User profile Pronouns will be set from the specified attribute" : "Los pronombres en el perfil de usuario se asignarán en base al atributo especificado", "Internal Username" : "Nombre de usuario interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesita convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios *DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesitará convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio. Déjelo vacío para usar el comportamiento por defecto.", "Internal Username Attribute:" : "Atributo de nombre de usuario interno:", - "Override UUID detection" : "Sobrescribir la detección UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID es autodetectado. Este atributo es usado para identificar sin dudas a usuarios y grupos LDAP. Además, el nombre de usuario interno será creado basado en el UUID, si no ha sido especificado otro comportamiento arriba. Puedes sobrescribir la configuración y pasar un atributo de tu elección. Debes asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Déjalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", + "Override UUID detection" : "Anular la detección UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "De manera predeterminada, el atributo UUID se detecta automáticamente. El atributo UUID se utiliza para identificar inequívocamente a usuarios y grupos LDAP. Además, el nombre de usuario interno será creado basado en el UUID, si no ha sido especificado un comportamiento diferente más arriba. Puede sobrescribir la configuración y pasar un atributo de su elección. Debe asegurarse de que el atributo de su elección sea accesible tanto por usuarios como grupos y ser único. Déjelo en blanco para usar el comportamiento predeterminado. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", "UUID Attribute for Users:" : "Atributo UUID para usuarios:", "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", "Username-LDAP User Mapping" : "Asignación del Nombre de usuario de un usuario LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuario se usan para almacenar y asignar metadatos. Para identificar y reconocer con precisión a los usuarios, cada usuario de LDAP tendrá un nombre de usuario interno. Esto requiere una asignación de nombre de usuario a usuario de LDAP. El nombre de usuario creado se asigna al UUID del usuario de LDAP. Además, el DN también se almacena en caché para reducir la interacción de LDAP, pero no se utiliza para la identificación. Si el DN cambia, se encontrarán los cambios. El nombre de usuario interno se usa en todas partes. Limpiar las asignaciones tendrá sobras en todas partes. ¡Borrar las asignaciones no es sensible a la configuración, afecta todas las configuraciones de LDAP! Nunca borre las asignaciones en un entorno de producción, solo en una etapa de prueba o experimental.", "Clear Username-LDAP User Mapping" : "Borrar la asignación de los Nombres de usuario de los usuarios LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar la asignación de los Nombres de grupo de los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", - "LDAP / AD integration" : "Integración LDAP / AD", - "LDAP / AD Username:" : "Nombre de usuario LDAP /AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite registrarse contra el usuario LDAP / AD, que es o \"uid\" o \"sAMAccountName\" y será detectado.", - "LDAP / AD Email Address:" : "LDAP / AD dirección de correo electrónico:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno será creado a partir del atributo UUID. Esto asegura que el nombre de usuario es único y no se necesita convertir los caracteres. El nombre de usuario interno tiene la restricción de que solo se admiten estos caracteres: [ a-zA-Z0-9_.@- ]. Otros caracteres son reemplazados por su correspondencia ASCII o simplemente omitidos. En caso de colisiones se añadirá/incrementará un número. El nombre de usuario interno se usa para identificar internamente a un usuario. Es también el nombre por defecto de la carpeta de inicio del usuario. También es parte de las URL remotas, por ejemplo para todos los servicios *DAV. Con esta configuración, se puede anular el comportamiento por defecto. Déjelo vacío para usar el comportamiento por defecto. Los cambios tendrán efecto solo en usuarios LDAP mapeados (añadidos) después del cambio." -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración no válida. Por favor, echa un vistazo al registro para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_419.js b/apps/user_ldap/l10n/es_419.js index a95693a3a3b..5bbe85d2791 100644 --- a/apps/user_ldap/l10n/es_419.js +++ b/apps/user_ldap/l10n/es_419.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_419.json b/apps/user_ldap/l10n/es_419.json index 3f1474461d3..942c0d81725 100644 --- a/apps/user_ldap/l10n/es_419.json +++ b/apps/user_ldap/l10n/es_419.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_AR.js b/apps/user_ldap/l10n/es_AR.js index fd8ab245675..2ed7f903b45 100644 --- a/apps/user_ldap/l10n/es_AR.js +++ b/apps/user_ldap/l10n/es_AR.js @@ -6,7 +6,6 @@ OC.L10N.register( "No action specified" : "No se ha especificado una acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -42,13 +41,10 @@ OC.L10N.register( "User found and settings verified." : "Usuario encontrado y configuraciones verificadas. ", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Favor de verificar. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Favor de iniciar sesion con la nueva contraseña", "Your password will expire tomorrow." : "Su contraseña expirará mañana.", "Your password will expire today." : "Su contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", "LDAP user and group backend" : "Backend de LDAP para usuario y grupo", @@ -162,13 +158,6 @@ OC.L10N.register( "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", "Username-LDAP User Mapping" : "Mapeo del Nombre del usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Nombres de usuario a los Usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, favor de verificar el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Nombre de usuario LDAP / AD", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP" }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_AR.json b/apps/user_ldap/l10n/es_AR.json index 33b8a95a6bf..0e44649f127 100644 --- a/apps/user_ldap/l10n/es_AR.json +++ b/apps/user_ldap/l10n/es_AR.json @@ -4,7 +4,6 @@ "No action specified" : "No se ha especificado una acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -40,13 +39,10 @@ "User found and settings verified." : "Usuario encontrado y configuraciones verificadas. ", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Favor de verificar. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Favor de iniciar sesion con la nueva contraseña", "Your password will expire tomorrow." : "Su contraseña expirará mañana.", "Your password will expire today." : "Su contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", "LDAP user and group backend" : "Backend de LDAP para usuario y grupo", @@ -160,13 +156,6 @@ "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", "Username-LDAP User Mapping" : "Mapeo del Nombre del usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Nombres de usuario a los Usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, favor de verificar el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Nombre de usuario LDAP / AD", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP" +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_CL.js b/apps/user_ldap/l10n/es_CL.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_CL.js +++ b/apps/user_ldap/l10n/es_CL.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_CL.json b/apps/user_ldap/l10n/es_CL.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_CL.json +++ b/apps/user_ldap/l10n/es_CL.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_CO.js b/apps/user_ldap/l10n/es_CO.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_CO.js +++ b/apps/user_ldap/l10n/es_CO.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_CO.json b/apps/user_ldap/l10n/es_CO.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_CO.json +++ b/apps/user_ldap/l10n/es_CO.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_CR.js b/apps/user_ldap/l10n/es_CR.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_CR.js +++ b/apps/user_ldap/l10n/es_CR.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_CR.json b/apps/user_ldap/l10n/es_CR.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_CR.json +++ b/apps/user_ldap/l10n/es_CR.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_DO.js b/apps/user_ldap/l10n/es_DO.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_DO.js +++ b/apps/user_ldap/l10n/es_DO.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_DO.json b/apps/user_ldap/l10n/es_DO.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_DO.json +++ b/apps/user_ldap/l10n/es_DO.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_EC.js b/apps/user_ldap/l10n/es_EC.js index 2767a66ef9d..3181235f7fe 100644 --- a/apps/user_ldap/l10n/es_EC.js +++ b/apps/user_ldap/l10n/es_EC.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Invalid data specified" : "Datos especificados no válidos", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +31,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -49,18 +48,26 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considera refinar la búsqueda, ya que abarca demasiados usuarios y solo el primero de ellos podrá iniciar sesión. ", "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Se produjo un error de conexión con LDAP/AD. Por favor, verifica el host, el puerto y las credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Se reemplazará con el nombre de inicio de sesión al consultar LDAP/AD.", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo está deshabilitado porque el servidor LDAP/AD no admite memberOf.", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", + "LDAP User backend" : "Backend de usuario LDAP", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], + "LDAP/AD integration" : "Integración LDAP/AD", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "Se encontraron más de 1000 grupos", + "> 1000 users found" : "Se encontraron más de 1000 usuarios", + "_%n user found_::_%n users found_" : ["%n usuario encontrado","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", "LDAP user and group backend" : "Backend de LDAP para usuario y grupo", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Esta aplicación permite a los administradores conectar Nextcloud a un directorio de usuarios basado en LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permite a los administradores conectar Nextcloud a un directorio de usuarios basado en LDAP para autenticación y provisión de usuarios, grupos y atributos de usuarios. Los administradores pueden configurar esta aplicación para conectarse a uno o más directorios LDAP o Active Directory a través de una interfaz LDAP. Atributos como la cuota de usuario, el correo electrónico, las imágenes de avatar, las membresías de grupo y más se pueden extraer en Nextcloud desde un directorio con las consultas y filtros adecuados.\n \n Un usuario inicia sesión en Nextcloud con sus credenciales de LDAP o AD y se le concede acceso en función de una solicitud de autenticación gestionada por el servidor LDAP o AD. Nextcloud no almacena contraseñas de LDAP o AD, en su lugar, estas credenciales se utilizan para autenticar a un usuario y luego Nextcloud utiliza una sesión para el ID de usuario. Obtén más información en la documentación de Backend de Usuarios y Grupos LDAP.", "Test Configuration" : "Probar configuración", "Help" : "Ayuda", "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen con los siguientes criterios están disponibles en %s:", @@ -74,10 +81,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", "Verify settings and count the groups" : "Verificar las configuraciones y contar los grupos", "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP/AD Username:" : "Usuario LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión con el nombre de usuario LDAP/AD, que es \"uid\" o \"sAMAccountName\" y se detectará automáticamente.", + "LDAP/AD Email Address:" : "Dirección de correo electrónico LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite iniciar sesión contra el atributo de email. \"mail\" y \"mailPrimaryAddresw\" está permitido. ", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta iniciar sesión. \"%% uid\" remplaza el usuario en la acción de inicio de sesión. Ejemplo: \"uid=%% uid\"", "Test Loginname" : "Probar nombre de usuario", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta obtener un DN para el nombre de inicio de sesión y el filtro de inicio de sesión actual", "Verify settings" : "Verificar configuraciones ", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Agregar una nueva configuración", @@ -141,6 +152,8 @@ OC.L10N.register( "One User Base DN per line" : "Un Usuario Base de DN por línea", "User Search Attributes" : "Atributos de búsqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Disable users missing from LDAP" : "Deshabilitar usuarios ausentes en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Cuando está activado, los usuarios importados de LDAP que luego estén ausentes se desactivarán", "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El atributo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -166,7 +179,30 @@ OC.L10N.register( "Email Field" : "Campo de correo electrónico", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Déjalo vacío para el comportamiento predeterminado. ", "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Déjalo vacío para el nombre de usuario (predeterminado). De lo contrario, especifica un atributo LDAP/AD.", + "\"$home\" Placeholder Field" : "Campo de marcador de posición \"$home\"", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo se reemplazará con el valor del atributo especificado", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "El perfil de usuario Teléfono se establecerá a partir del atributo especificado", + "Website Field" : "Campo de sitio web", + "User profile Website will be set from the specified attribute" : "El perfil de usuario Sitio web se establecerá a partir del atributo especificado", + "Address Field" : "Campo de dirección", + "User profile Address will be set from the specified attribute" : "El perfil de usuario Dirección se establecerá a partir del atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "El perfil de usuario Twitter se establecerá a partir del atributo especificado", + "Fediverse Field" : "Campo de Fediverse", + "User profile Fediverse will be set from the specified attribute" : "El perfil de usuario Fediverse se establecerá a partir del atributo especificado", + "Organisation Field" : "Campo de organización", + "User profile Organisation will be set from the specified attribute" : "El perfil de usuario Organización se establecerá a partir del atributo especificado", + "Role Field" : "Campo de rol", + "User profile Role will be set from the specified attribute" : "El perfil de usuario Rol se establecerá a partir del atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "El perfil de usuario Titular se establecerá a partir del atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "El perfil de usuario Biografía se establecerá a partir del atributo especificado", "Internal Username" : "Usuario interno", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De forma predeterminada, el nombre de usuario interno se creará a partir del atributo UUID. Se asegura de que el nombre de usuario sea único y no se necesite convertir caracteres. El nombre de usuario interno tiene la restricción de que solo se permiten estos caracteres: [a-zA-Z0-9_.@-]. Otros caracteres se reemplazan por su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/aumentará un número. El nombre de usuario interno se utiliza para identificar a un usuario internamente. También es el nombre predeterminado para la carpeta de inicio de usuario. También es parte de las URL remotas, por ejemplo, para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento predeterminado. Los cambios solo tendrán efecto en los usuarios LDAP mapeados (añadidos) recientemente. Déjalo vacío para el comportamiento predeterminado.", "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Anular la detección UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID se detecta automáticamente. Este atributo se usa para identificar, sin ninguna duda, a usuarios y grupos LDAP. Adicionalmente, el usuario interno se creará con base en el UUID, si no ha sido especificado otro comportamiento en la parte de arriba. Puedes anular la configuración y proporcionar el atributo que quieras. Debes asegurarte de que el atributo que quieres sea accesible por los usuarios y grupos y que sea único. Mantenlo vacío para tener el comportamiento predeterminado. Los cambios surtirán efecto sólo en los usuarios y grupos mapeados (agregados) nuevos a LDAP.", @@ -176,13 +212,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_EC.json b/apps/user_ldap/l10n/es_EC.json index b841a7bc612..a6942679af5 100644 --- a/apps/user_ldap/l10n/es_EC.json +++ b/apps/user_ldap/l10n/es_EC.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Invalid data specified" : "Datos especificados no válidos", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +29,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -47,18 +46,26 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considera refinar la búsqueda, ya que abarca demasiados usuarios y solo el primero de ellos podrá iniciar sesión. ", "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Se produjo un error de conexión con LDAP/AD. Por favor, verifica el host, el puerto y las credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Se reemplazará con el nombre de inicio de sesión al consultar LDAP/AD.", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo está deshabilitado porque el servidor LDAP/AD no admite memberOf.", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", + "LDAP User backend" : "Backend de usuario LDAP", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], + "LDAP/AD integration" : "Integración LDAP/AD", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "Se encontraron más de 1000 grupos", + "> 1000 users found" : "Se encontraron más de 1000 usuarios", + "_%n user found_::_%n users found_" : ["%n usuario encontrado","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", "LDAP user and group backend" : "Backend de LDAP para usuario y grupo", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Esta aplicación permite a los administradores conectar Nextcloud a un directorio de usuarios basado en LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permite a los administradores conectar Nextcloud a un directorio de usuarios basado en LDAP para autenticación y provisión de usuarios, grupos y atributos de usuarios. Los administradores pueden configurar esta aplicación para conectarse a uno o más directorios LDAP o Active Directory a través de una interfaz LDAP. Atributos como la cuota de usuario, el correo electrónico, las imágenes de avatar, las membresías de grupo y más se pueden extraer en Nextcloud desde un directorio con las consultas y filtros adecuados.\n \n Un usuario inicia sesión en Nextcloud con sus credenciales de LDAP o AD y se le concede acceso en función de una solicitud de autenticación gestionada por el servidor LDAP o AD. Nextcloud no almacena contraseñas de LDAP o AD, en su lugar, estas credenciales se utilizan para autenticar a un usuario y luego Nextcloud utiliza una sesión para el ID de usuario. Obtén más información en la documentación de Backend de Usuarios y Grupos LDAP.", "Test Configuration" : "Probar configuración", "Help" : "Ayuda", "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen con los siguientes criterios están disponibles en %s:", @@ -72,10 +79,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", "Verify settings and count the groups" : "Verificar las configuraciones y contar los grupos", "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP/AD Username:" : "Usuario LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión con el nombre de usuario LDAP/AD, que es \"uid\" o \"sAMAccountName\" y se detectará automáticamente.", + "LDAP/AD Email Address:" : "Dirección de correo electrónico LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite iniciar sesión contra el atributo de email. \"mail\" y \"mailPrimaryAddresw\" está permitido. ", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta iniciar sesión. \"%% uid\" remplaza el usuario en la acción de inicio de sesión. Ejemplo: \"uid=%% uid\"", "Test Loginname" : "Probar nombre de usuario", + "Attempts to receive a DN for the given loginname and the current login filter" : "Intenta obtener un DN para el nombre de inicio de sesión y el filtro de inicio de sesión actual", "Verify settings" : "Verificar configuraciones ", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Agregar una nueva configuración", @@ -139,6 +150,8 @@ "One User Base DN per line" : "Un Usuario Base de DN por línea", "User Search Attributes" : "Atributos de búsqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Disable users missing from LDAP" : "Deshabilitar usuarios ausentes en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Cuando está activado, los usuarios importados de LDAP que luego estén ausentes se desactivarán", "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El atributo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -164,7 +177,30 @@ "Email Field" : "Campo de correo electrónico", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Déjalo vacío para el comportamiento predeterminado. ", "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Déjalo vacío para el nombre de usuario (predeterminado). De lo contrario, especifica un atributo LDAP/AD.", + "\"$home\" Placeholder Field" : "Campo de marcador de posición \"$home\"", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home en una configuración de almacenamiento externo se reemplazará con el valor del atributo especificado", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "El perfil de usuario Teléfono se establecerá a partir del atributo especificado", + "Website Field" : "Campo de sitio web", + "User profile Website will be set from the specified attribute" : "El perfil de usuario Sitio web se establecerá a partir del atributo especificado", + "Address Field" : "Campo de dirección", + "User profile Address will be set from the specified attribute" : "El perfil de usuario Dirección se establecerá a partir del atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "El perfil de usuario Twitter se establecerá a partir del atributo especificado", + "Fediverse Field" : "Campo de Fediverse", + "User profile Fediverse will be set from the specified attribute" : "El perfil de usuario Fediverse se establecerá a partir del atributo especificado", + "Organisation Field" : "Campo de organización", + "User profile Organisation will be set from the specified attribute" : "El perfil de usuario Organización se establecerá a partir del atributo especificado", + "Role Field" : "Campo de rol", + "User profile Role will be set from the specified attribute" : "El perfil de usuario Rol se establecerá a partir del atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "El perfil de usuario Titular se establecerá a partir del atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "El perfil de usuario Biografía se establecerá a partir del atributo especificado", "Internal Username" : "Usuario interno", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De forma predeterminada, el nombre de usuario interno se creará a partir del atributo UUID. Se asegura de que el nombre de usuario sea único y no se necesite convertir caracteres. El nombre de usuario interno tiene la restricción de que solo se permiten estos caracteres: [a-zA-Z0-9_.@-]. Otros caracteres se reemplazan por su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/aumentará un número. El nombre de usuario interno se utiliza para identificar a un usuario internamente. También es el nombre predeterminado para la carpeta de inicio de usuario. También es parte de las URL remotas, por ejemplo, para todos los servicios DAV. Con esta configuración, se puede anular el comportamiento predeterminado. Los cambios solo tendrán efecto en los usuarios LDAP mapeados (añadidos) recientemente. Déjalo vacío para el comportamiento predeterminado.", "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Anular la detección UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID se detecta automáticamente. Este atributo se usa para identificar, sin ninguna duda, a usuarios y grupos LDAP. Adicionalmente, el usuario interno se creará con base en el UUID, si no ha sido especificado otro comportamiento en la parte de arriba. Puedes anular la configuración y proporcionar el atributo que quieras. Debes asegurarte de que el atributo que quieres sea accesible por los usuarios y grupos y que sea único. Mantenlo vacío para tener el comportamiento predeterminado. Los cambios surtirán efecto sólo en los usuarios y grupos mapeados (agregados) nuevos a LDAP.", @@ -174,13 +210,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_GT.js b/apps/user_ldap/l10n/es_GT.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_GT.js +++ b/apps/user_ldap/l10n/es_GT.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_GT.json b/apps/user_ldap/l10n/es_GT.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_GT.json +++ b/apps/user_ldap/l10n/es_GT.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_HN.js b/apps/user_ldap/l10n/es_HN.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_HN.js +++ b/apps/user_ldap/l10n/es_HN.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_HN.json b/apps/user_ldap/l10n/es_HN.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_HN.json +++ b/apps/user_ldap/l10n/es_HN.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_MX.js b/apps/user_ldap/l10n/es_MX.js index 4e58805da56..4e06ab492d4 100644 --- a/apps/user_ldap/l10n/es_MX.js +++ b/apps/user_ldap/l10n/es_MX.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Invalid data specified" : "Datos especificados inválidos", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +31,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -49,14 +48,23 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considera refinar la búsqueda, ya que abarca demasiados usuarios y solo el primero de ellos podrá iniciar sesión. ", "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ocurrió un error de conexión a LDAP/AD. Por favor, verifique el huésped, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Se reemplazará con el nombre de inicio de sesión al consultar LDAP/AD.", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo está deshabilitado porque el servidor LDAP/AD no admite \"memberOf\".", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", + "LDAP User backend" : "Backend de usuario LDAP", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], + "LDAP/AD integration" : "Integración LDAP/AD", + "LDAP Connection" : "Conexión LDAP", + "Invalid LDAP UUIDs" : "UUIDs de LDAP inválidas", + "None found" : "Ninguno encontrado", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "> 1000 grupos encontrados", + "> 1000 users found" : "> 1000 usuarios encontrados", + "_%n user found_::_%n users found_" : ["%n usuario encontrado","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -76,6 +84,8 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", "Verify settings and count the groups" : "Verificar las configuraciones y contar los grupos", "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP/AD Username:" : "Nombre de usuario LDAP/AD:", + "LDAP/AD Email Address:" : "Dirección de correo electrónico LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite iniciar sesión contra el atributo de email. \"mail\" y \"mailPrimaryAddresw\" está permitido. ", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta iniciar sesión. \"%% uid\" remplaza el usuario en la acción de inicio de sesión. Ejemplo: \"uid=%% uid\"", @@ -143,6 +153,7 @@ OC.L10N.register( "One User Base DN per line" : "Un Usuario Base de DN por línea", "User Search Attributes" : "Atributos de búsqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Disable users missing from LDAP" : "Desactivar los usuarios ausentes en LDAP", "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El atributo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -168,6 +179,25 @@ OC.L10N.register( "Email Field" : "Campo de correo electrónico", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Déjalo vacío para el comportamiento predeterminado. ", "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "El teléfono del perfil de usuario se establecerá desde el atributo especificado", + "Website Field" : "Campo de sitio web", + "User profile Website will be set from the specified attribute" : "El sitio web del perfil de usuario se establecerá desde el atributo especificado", + "Address Field" : "Campo de dirección", + "User profile Address will be set from the specified attribute" : "La dirección del perfil de usuario se establecerá desde el atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "El Twitter del perfil de usuario se establecerá desde el atributo especificado", + "Fediverse Field" : "Campo de fediverso", + "User profile Fediverse will be set from the specified attribute" : "El fediverso del perfil de usuario se establecerá desde el atributo especificado", + "Organisation Field" : "Campo de organización", + "User profile Organisation will be set from the specified attribute" : "La organización del perfil de usuario se establecerá desde el atributo especificado", + "Role Field" : "Campo de cargo", + "User profile Role will be set from the specified attribute" : "El cargo del perfil de usuario se establecerá desde el atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "El titular del perfil de usuario se establecerá desde el atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "La biografía del perfil de usuario se establecerá desde el atributo especificado", "Internal Username" : "Usuario interno", "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Anular la detección UUID", @@ -178,13 +208,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_MX.json b/apps/user_ldap/l10n/es_MX.json index ee7e3244953..74020cb5593 100644 --- a/apps/user_ldap/l10n/es_MX.json +++ b/apps/user_ldap/l10n/es_MX.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Invalid data specified" : "Datos especificados inválidos", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +29,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -47,14 +46,23 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considera refinar la búsqueda, ya que abarca demasiados usuarios y solo el primero de ellos podrá iniciar sesión. ", "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ocurrió un error de conexión a LDAP/AD. Por favor, verifique el huésped, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta el marcador de posición \"%uid\". Se reemplazará con el nombre de inicio de sesión al consultar LDAP/AD.", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "El cuadro de grupo está deshabilitado porque el servidor LDAP/AD no admite \"memberOf\".", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", + "LDAP User backend" : "Backend de usuario LDAP", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], + "LDAP/AD integration" : "Integración LDAP/AD", + "LDAP Connection" : "Conexión LDAP", + "Invalid LDAP UUIDs" : "UUIDs de LDAP inválidas", + "None found" : "Ninguno encontrado", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrados","%n grupos encontrados"], + "> 1000 groups found" : "> 1000 grupos encontrados", + "> 1000 users found" : "> 1000 usuarios encontrados", + "_%n user found_::_%n users found_" : ["%n usuario encontrado","%n usuarios encontrados","%n usuarios encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -74,6 +82,8 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", "Verify settings and count the groups" : "Verificar las configuraciones y contar los grupos", "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP/AD Username:" : "Nombre de usuario LDAP/AD:", + "LDAP/AD Email Address:" : "Dirección de correo electrónico LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite iniciar sesión contra el atributo de email. \"mail\" y \"mailPrimaryAddresw\" está permitido. ", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta iniciar sesión. \"%% uid\" remplaza el usuario en la acción de inicio de sesión. Ejemplo: \"uid=%% uid\"", @@ -141,6 +151,7 @@ "One User Base DN per line" : "Un Usuario Base de DN por línea", "User Search Attributes" : "Atributos de búsqueda de usuario", "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Disable users missing from LDAP" : "Desactivar los usuarios ausentes en LDAP", "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El atributo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", @@ -166,6 +177,25 @@ "Email Field" : "Campo de correo electrónico", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Déjalo vacío para el comportamiento predeterminado. ", "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "User Profile Attributes" : "Atributos del perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "El teléfono del perfil de usuario se establecerá desde el atributo especificado", + "Website Field" : "Campo de sitio web", + "User profile Website will be set from the specified attribute" : "El sitio web del perfil de usuario se establecerá desde el atributo especificado", + "Address Field" : "Campo de dirección", + "User profile Address will be set from the specified attribute" : "La dirección del perfil de usuario se establecerá desde el atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "El Twitter del perfil de usuario se establecerá desde el atributo especificado", + "Fediverse Field" : "Campo de fediverso", + "User profile Fediverse will be set from the specified attribute" : "El fediverso del perfil de usuario se establecerá desde el atributo especificado", + "Organisation Field" : "Campo de organización", + "User profile Organisation will be set from the specified attribute" : "La organización del perfil de usuario se establecerá desde el atributo especificado", + "Role Field" : "Campo de cargo", + "User profile Role will be set from the specified attribute" : "El cargo del perfil de usuario se establecerá desde el atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "El titular del perfil de usuario se establecerá desde el atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "La biografía del perfil de usuario se establecerá desde el atributo especificado", "Internal Username" : "Usuario interno", "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Anular la detección UUID", @@ -176,13 +206,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_NI.js b/apps/user_ldap/l10n/es_NI.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_NI.js +++ b/apps/user_ldap/l10n/es_NI.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_NI.json b/apps/user_ldap/l10n/es_NI.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_NI.json +++ b/apps/user_ldap/l10n/es_NI.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PA.js b/apps/user_ldap/l10n/es_PA.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_PA.js +++ b/apps/user_ldap/l10n/es_PA.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_PA.json b/apps/user_ldap/l10n/es_PA.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_PA.json +++ b/apps/user_ldap/l10n/es_PA.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PE.js b/apps/user_ldap/l10n/es_PE.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_PE.js +++ b/apps/user_ldap/l10n/es_PE.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_PE.json b/apps/user_ldap/l10n/es_PE.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_PE.json +++ b/apps/user_ldap/l10n/es_PE.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PR.js b/apps/user_ldap/l10n/es_PR.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_PR.js +++ b/apps/user_ldap/l10n/es_PR.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_PR.json b/apps/user_ldap/l10n/es_PR.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_PR.json +++ b/apps/user_ldap/l10n/es_PR.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PY.js b/apps/user_ldap/l10n/es_PY.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_PY.js +++ b/apps/user_ldap/l10n/es_PY.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_PY.json b/apps/user_ldap/l10n/es_PY.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_PY.json +++ b/apps/user_ldap/l10n/es_PY.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_SV.js b/apps/user_ldap/l10n/es_SV.js index 2767a66ef9d..e8b4c41e5cb 100644 --- a/apps/user_ldap/l10n/es_SV.js +++ b/apps/user_ldap/l10n/es_SV.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -32,7 +30,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -50,13 +48,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -176,13 +171,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_SV.json b/apps/user_ldap/l10n/es_SV.json index b841a7bc612..d45f025b43b 100644 --- a/apps/user_ldap/l10n/es_SV.json +++ b/apps/user_ldap/l10n/es_SV.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -30,7 +28,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Por favor verifica.", "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} registro disponible dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado","{objectsFound} registros disponibles dentro del DN base proporcionado"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Por favor verifica la DN Base, así como las configuraciones de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente deseas eliminar la configuración actual del servidor?", "Confirm Deletion" : "Confirmar el borrado", @@ -48,13 +46,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuarios son usados para almacenar y asignar metadatos. Para poder identificar y reconocer usuarios con precisión, cada usuario LDAP tendrá un nombre de usuario interno. Esto requiere una correspondencia de nombre de usuario a usuario LDAP. El nombre de usuario creado tiene una correspondencia al UUID del usuario LDAP. Adicionalmente, también se manda a cache el DN para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, los cambios serán encontrados. El nombre de usuario interno se usa intensivamente. Limpiar las correspondencias dejará restos en muhcos logares. ¡Limpiar las correspondencias no es sensitivo a la configuración, afecta a todas las configuraciones LDAP! Nunca limpies las correspondencias en un ambiente de producción, solo hazlo en los ambientes de pruebas o experimentación.", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/es_UY.js b/apps/user_ldap/l10n/es_UY.js index bf8cd01a879..fd1a560a19a 100644 --- a/apps/user_ldap/l10n/es_UY.js +++ b/apps/user_ldap/l10n/es_UY.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/es_UY.json b/apps/user_ldap/l10n/es_UY.json index ef8c35fa7f3..6bca1270581 100644 --- a/apps/user_ldap/l10n/es_UY.json +++ b/apps/user_ldap/l10n/es_UY.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuración inválida: La vinculación anónima no está permitida. ", "Valid configuration, connection established!" : "¡Configuración válida, conexión establecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuración válida, pero la vinculación falló. Por favor verifica la configuración del servidor y las credenciales.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles.", "No action specified" : "No se ha especificado alguna acción", "No configuration specified" : "No se ha especificado una configuración", "No data specified" : "No se han especificado datos", - " Could not set configuration %s" : "No fue posible establecer la configuración %s", "Action does not exist" : "La acción no existe", "Renewing …" : "Renovando ...", "Very weak password" : "Contraseña muy debil", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Se presentó un error inesperado. Por fvor verifica la bitácora y las configuraciones.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Por favor verifícalo. ", "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", - "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Por favor inicia sesion con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará el día de hoy. ", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. ","La contraseña expirará dentro de %n días. "], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No fue posible detectar el atributo del nombre a desplegar del usuario. Por favor especifícalo tú mismo en las configuraciones avanzadas de LDAP. ", "Could not find the desired feature" : "No fue posible encontrar la función deseada.", "Invalid Host" : "Servidor inválido", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Mapeo del Usuario al Usuario LDAP", "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Usuarios a los Usuarios-LDAP", "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, por favor verifica el servidor, puerto y credenciales. ", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el \"%uid\" del marcador de posición. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", - "LDAP / AD integration" : "Integración con LDAP / AD", - "LDAP / AD Username:" : "Usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite iniciar sesión contra el usuario LDAP / AD que es ya sea \"uid\" o \"sAMAccountName\" y será detectado. ", - "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el usuario interno se creará con base en el atributo UUID. Ésto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El usuario intenro tiene la restricción de que sólo permite los siguientes caracteres: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un número. El usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Déjalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. " -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuración inválida. Por favor verifica las bitácoras para más detalles." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/et_EE.js b/apps/user_ldap/l10n/et_EE.js index 3aef6cf288d..a024012d43d 100644 --- a/apps/user_ldap/l10n/et_EE.js +++ b/apps/user_ldap/l10n/et_EE.js @@ -4,19 +4,21 @@ OC.L10N.register( "Failed to clear the mappings." : "Vastenduste puhastamine ebaõnnestus.", "Failed to delete the server configuration" : "Serveri seadistuse kustutamine ebaõnnestus", "Invalid configuration: Anonymous binding is not allowed." : "Vale seadistus: anonüümne sidumine pole lubatud.", - "Valid configuration, connection established!" : "Valiidne seadistus, ühendus loodud!", - "Invalid configuration. Please have a look at the logs for further details." : "Vigane seadistus. Rohkema info jaoks vaadake logisid.", + "Valid configuration, connection established!" : "Korrektne seadistus, ühendus on loodud!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Seadistus on korrektne, kuid sidumine ei õnnestunud. Palun kontrolli serveri seadistusi ja ühenduse kasutajanime/salasõna.", + "Invalid configuration: %s" : "Vigane seadistus: %s", "No action specified" : "Tegevusi pole määratletud", "No configuration specified" : "Seadistust pole määratletud", "No data specified" : "Andmeid pole määratletud", - " Could not set configuration %s" : "Ei suutnud seadistada %s", + "Invalid data specified" : "Kirjeldatud on vigased andmed", + "Could not set configuration %1$s to %2$s" : "Ei õnnestunud muuta „%1$s“ seadistuse väärtuseks „%2$s“", "Action does not exist" : "Toimingut pole olemas", "Renewing …" : "Värskendamine ...", - "Very weak password" : "Väga nõrk parool", - "Weak password" : "Nõrk parool", - "So-so password" : "Enam-vähem sobiv parool", - "Good password" : "Hea parool", - "Strong password" : "Väga hea parool", + "Very weak password" : "Väga nõrk salasõna", + "Weak password" : "Nõrk salasõna", + "So-so password" : "Enam-vähem sobiv salasõna", + "Good password" : "Hea salasõna", + "Strong password" : "Väga hea salasõna", "The Base DN appears to be wrong" : "Näib, et Base DN on vale", "Testing configuration…" : "Seadistuse testimine", "Configuration incorrect" : "Seadistus on vigane", @@ -30,21 +32,35 @@ OC.L10N.register( "Could not detect Base DN, please enter it manually." : "BaasDN-i tuvastamine ebaõnnestus. Palun sisesta see käsitsi.", "{nthServer}. Server" : "{nthServer}. Server", "No object found in the given Base DN. Please revise." : "BaasDN-is ei leitu ühtegi objekti.", - "More than 1,000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi kirjet.", + "More than 1,000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogikirjet.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["„Base DN“ alusel on saadaval {objectsFound} kirje","„Base DN“ alusel on saadaval {objectsFound} kirjet"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Tekkis viga. Palun kontrolli, kas „Base DN“ on õige, ühendus toimib ning kasutajanimi/salasõna on korrektsed.", "Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?", "Confirm Deletion" : "Kinnita kustutamine", "Mappings cleared successfully!" : "Vastandused on eemaldatud!", - "Error while clearing the mappings." : "Tõrgeseose eemaldamisel.", + "Error while clearing the mappings." : "Viga vastanduse/seose eemaldamisel.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonüümne sidumine pole lubatud. Palun sisesta kasutaja „User DN“ ja salasõna.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP päringu viga. Anonüümne sidumine pole ilmselt lubatud.", "Mode switch" : "Režiimi lüliti", "Select attributes" : "Vali atribuudid", "User found and settings verified." : "Kasutaja leiti ja seaded on kontrollitud.", "Please provide a login name to test against" : "Palun sisesta kasutajanimi, mida testida", - "Please login with the new password" : "Palun logi uue parooliga sisse", - "Your password will expire tomorrow." : "Su parool aegub homme.", - "Your password will expire today." : "Su parool aegub täna.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su parool aegub %n päeva jooksul.","Su parool aegub %n päeva jooksul."], - "_%s group found_::_%s groups found_" : ["%s grupp leitud","%s gruppi leitud"], - "_%s user found_::_%s users found_" : ["%s kasutaja leitud","%s kasutajat leitud"], + "Password change rejected. Hint: %s" : "Salasõna muutmine polnud võimalik. Selgitus: %s", + "Mandatory field \"%s\" left empty" : "Kohustuslik väli „%s“ on jäänud tühjaks", + "Login filter does not contain %s placeholder." : "Kasutajanimede filtris puudub kohatäitja „%s“", + "Please login with the new password" : "Palun logi uue salasõnaga sisse", + "LDAP User backend" : "LPAD-i põhine tausteteenus kasutajate jaoks", + "Your password will expire tomorrow." : "Su salasõna aegub homme.", + "Your password will expire today." : "Su salasõna aegub täna.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su salasõna aegub %n päeva jooksul.","Su salasõna aegub %n päeva jooksul."], + "LDAP/AD integration" : "LDAP/AD lõiming", + "LDAP Connection" : "LDAP ühendus", + "Invalid LDAP UUIDs" : "Vigased LDAP UUID-d", + "None found" : "Mitte midagi ei leidu", + "_%n group found_::_%n groups found_" : ["Leidus %n grupp","Leidus %n gruppi"], + "> 1000 groups found" : "Leidus üle 1000 grupi", + "> 1000 users found" : "Leidus üle 1000 kasutaja", + "_%n user found_::_%n users found_" : ["Leidus %n kasutaja","Leidus %n kasutajat"], "Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust", "Invalid Host" : "Vigane server", "Test Configuration" : "Testi seadistust", @@ -54,7 +70,7 @@ OC.L10N.register( "Only from these groups:" : "Ainult neist gruppidest:", "Search groups" : "Otsi gruppe", "Available groups" : "Saadaolevad grupid", - "Selected groups" : "Validut grupid", + "Selected groups" : "Valitud grupid", "Edit LDAP Query" : "Muuda LDAP päringut", "LDAP Filter:" : "LDAP filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filter määrab millised LDAP grupid saavad ligipääsu sellele %s instantsile.", @@ -67,9 +83,9 @@ OC.L10N.register( "Port" : "Port", "Detect Port" : "Tuvasta port", "User DN" : "Kasutaja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", - "Password" : "Parool", - "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", + "Password" : "Salasõna", + "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", "Save Credentials" : "Salvesta kasutajaandmed", "One Base DN per line" : "Üks baas-DN rea kohta", "You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt", @@ -83,13 +99,13 @@ OC.L10N.register( "Saving" : "Salvestamine", "Back" : "Tagasi", "Continue" : "Jätka", - "Please renew your password." : "Palun uuenda oma parool.", + "Please renew your password." : "Palun uuenda oma salasõna.", "An internal error occurred." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Proovi uuesti või võta ühendust administraatoriga.", - "Current password" : "Praegune parool", - "New password" : "Uus parool", - "Renew password" : "Uuenda parooli", - "Wrong password." : "Vale parool.", + "Current password" : "Praegune salasõna", + "New password" : "Uus salasõna", + "Renew password" : "Uuenda salasõna", + "Wrong password." : "Vale salasõna.", "Cancel" : "Loobu", "Server" : "Server", "Users" : "Kasutajad", @@ -98,8 +114,8 @@ OC.L10N.register( "Expert" : "Ekspert", "Advanced" : "Täpsem", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Hoiatus:</b>PHP LDAP moodul pole paigaldatud ning LDAP kasutamine ei ole võimalik. Palu oma süsteeihaldurit see paigaldada.", - "Connection Settings" : "Ühenduse seaded", - "Configuration Active" : "Seadistus aktiivne", + "Connection Settings" : "Ühenduse seadistused", + "Configuration Active" : "Seadistus on aktiivne", "When unchecked, this configuration will be skipped." : "Kui on märkimata, siis seadistust ei kasutata.", "Backup (Replica) Host" : "Varuserver", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Lisa valikuline varuserver. See peab olema koopia peamisest LDAP/AD serverist.", @@ -142,8 +158,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "LDAP-Kasutajatunnus Kasutaja Vastendus", "Clear Username-LDAP User Mapping" : "Puhasta LDAP-Kasutajatunnus Kasutaja Vastendus", "Clear Groupname-LDAP Group Mapping" : "Puhasta LDAP-Grupinimi Grupp Vastendus", - "LDAP / AD integration" : "LDAP / AD integratsioon", - "LDAP / AD Username:" : "LDAP / AD kasutajanimi:", - "LDAP / AD Email Address:" : "LDAP / AD e-posti aadress:" + "Invalid configuration. Please have a look at the logs for further details." : "Vigane seadistus. Rohkema info jaoks vaadake logisid." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/et_EE.json b/apps/user_ldap/l10n/et_EE.json index cd28c561df0..3d90e2d17ce 100644 --- a/apps/user_ldap/l10n/et_EE.json +++ b/apps/user_ldap/l10n/et_EE.json @@ -2,19 +2,21 @@ "Failed to clear the mappings." : "Vastenduste puhastamine ebaõnnestus.", "Failed to delete the server configuration" : "Serveri seadistuse kustutamine ebaõnnestus", "Invalid configuration: Anonymous binding is not allowed." : "Vale seadistus: anonüümne sidumine pole lubatud.", - "Valid configuration, connection established!" : "Valiidne seadistus, ühendus loodud!", - "Invalid configuration. Please have a look at the logs for further details." : "Vigane seadistus. Rohkema info jaoks vaadake logisid.", + "Valid configuration, connection established!" : "Korrektne seadistus, ühendus on loodud!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Seadistus on korrektne, kuid sidumine ei õnnestunud. Palun kontrolli serveri seadistusi ja ühenduse kasutajanime/salasõna.", + "Invalid configuration: %s" : "Vigane seadistus: %s", "No action specified" : "Tegevusi pole määratletud", "No configuration specified" : "Seadistust pole määratletud", "No data specified" : "Andmeid pole määratletud", - " Could not set configuration %s" : "Ei suutnud seadistada %s", + "Invalid data specified" : "Kirjeldatud on vigased andmed", + "Could not set configuration %1$s to %2$s" : "Ei õnnestunud muuta „%1$s“ seadistuse väärtuseks „%2$s“", "Action does not exist" : "Toimingut pole olemas", "Renewing …" : "Värskendamine ...", - "Very weak password" : "Väga nõrk parool", - "Weak password" : "Nõrk parool", - "So-so password" : "Enam-vähem sobiv parool", - "Good password" : "Hea parool", - "Strong password" : "Väga hea parool", + "Very weak password" : "Väga nõrk salasõna", + "Weak password" : "Nõrk salasõna", + "So-so password" : "Enam-vähem sobiv salasõna", + "Good password" : "Hea salasõna", + "Strong password" : "Väga hea salasõna", "The Base DN appears to be wrong" : "Näib, et Base DN on vale", "Testing configuration…" : "Seadistuse testimine", "Configuration incorrect" : "Seadistus on vigane", @@ -28,21 +30,35 @@ "Could not detect Base DN, please enter it manually." : "BaasDN-i tuvastamine ebaõnnestus. Palun sisesta see käsitsi.", "{nthServer}. Server" : "{nthServer}. Server", "No object found in the given Base DN. Please revise." : "BaasDN-is ei leitu ühtegi objekti.", - "More than 1,000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi kirjet.", + "More than 1,000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogikirjet.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["„Base DN“ alusel on saadaval {objectsFound} kirje","„Base DN“ alusel on saadaval {objectsFound} kirjet"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Tekkis viga. Palun kontrolli, kas „Base DN“ on õige, ühendus toimib ning kasutajanimi/salasõna on korrektsed.", "Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?", "Confirm Deletion" : "Kinnita kustutamine", "Mappings cleared successfully!" : "Vastandused on eemaldatud!", - "Error while clearing the mappings." : "Tõrgeseose eemaldamisel.", + "Error while clearing the mappings." : "Viga vastanduse/seose eemaldamisel.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonüümne sidumine pole lubatud. Palun sisesta kasutaja „User DN“ ja salasõna.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP päringu viga. Anonüümne sidumine pole ilmselt lubatud.", "Mode switch" : "Režiimi lüliti", "Select attributes" : "Vali atribuudid", "User found and settings verified." : "Kasutaja leiti ja seaded on kontrollitud.", "Please provide a login name to test against" : "Palun sisesta kasutajanimi, mida testida", - "Please login with the new password" : "Palun logi uue parooliga sisse", - "Your password will expire tomorrow." : "Su parool aegub homme.", - "Your password will expire today." : "Su parool aegub täna.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su parool aegub %n päeva jooksul.","Su parool aegub %n päeva jooksul."], - "_%s group found_::_%s groups found_" : ["%s grupp leitud","%s gruppi leitud"], - "_%s user found_::_%s users found_" : ["%s kasutaja leitud","%s kasutajat leitud"], + "Password change rejected. Hint: %s" : "Salasõna muutmine polnud võimalik. Selgitus: %s", + "Mandatory field \"%s\" left empty" : "Kohustuslik väli „%s“ on jäänud tühjaks", + "Login filter does not contain %s placeholder." : "Kasutajanimede filtris puudub kohatäitja „%s“", + "Please login with the new password" : "Palun logi uue salasõnaga sisse", + "LDAP User backend" : "LPAD-i põhine tausteteenus kasutajate jaoks", + "Your password will expire tomorrow." : "Su salasõna aegub homme.", + "Your password will expire today." : "Su salasõna aegub täna.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Su salasõna aegub %n päeva jooksul.","Su salasõna aegub %n päeva jooksul."], + "LDAP/AD integration" : "LDAP/AD lõiming", + "LDAP Connection" : "LDAP ühendus", + "Invalid LDAP UUIDs" : "Vigased LDAP UUID-d", + "None found" : "Mitte midagi ei leidu", + "_%n group found_::_%n groups found_" : ["Leidus %n grupp","Leidus %n gruppi"], + "> 1000 groups found" : "Leidus üle 1000 grupi", + "> 1000 users found" : "Leidus üle 1000 kasutaja", + "_%n user found_::_%n users found_" : ["Leidus %n kasutaja","Leidus %n kasutajat"], "Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust", "Invalid Host" : "Vigane server", "Test Configuration" : "Testi seadistust", @@ -52,7 +68,7 @@ "Only from these groups:" : "Ainult neist gruppidest:", "Search groups" : "Otsi gruppe", "Available groups" : "Saadaolevad grupid", - "Selected groups" : "Validut grupid", + "Selected groups" : "Valitud grupid", "Edit LDAP Query" : "Muuda LDAP päringut", "LDAP Filter:" : "LDAP filter:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filter määrab millised LDAP grupid saavad ligipääsu sellele %s instantsile.", @@ -65,9 +81,9 @@ "Port" : "Port", "Detect Port" : "Tuvasta port", "User DN" : "Kasutaja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", - "Password" : "Parool", - "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", + "Password" : "Salasõna", + "For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja salasõna tühjaks.", "Save Credentials" : "Salvesta kasutajaandmed", "One Base DN per line" : "Üks baas-DN rea kohta", "You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt", @@ -81,13 +97,13 @@ "Saving" : "Salvestamine", "Back" : "Tagasi", "Continue" : "Jätka", - "Please renew your password." : "Palun uuenda oma parool.", + "Please renew your password." : "Palun uuenda oma salasõna.", "An internal error occurred." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Proovi uuesti või võta ühendust administraatoriga.", - "Current password" : "Praegune parool", - "New password" : "Uus parool", - "Renew password" : "Uuenda parooli", - "Wrong password." : "Vale parool.", + "Current password" : "Praegune salasõna", + "New password" : "Uus salasõna", + "Renew password" : "Uuenda salasõna", + "Wrong password." : "Vale salasõna.", "Cancel" : "Loobu", "Server" : "Server", "Users" : "Kasutajad", @@ -96,8 +112,8 @@ "Expert" : "Ekspert", "Advanced" : "Täpsem", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Hoiatus:</b>PHP LDAP moodul pole paigaldatud ning LDAP kasutamine ei ole võimalik. Palu oma süsteeihaldurit see paigaldada.", - "Connection Settings" : "Ühenduse seaded", - "Configuration Active" : "Seadistus aktiivne", + "Connection Settings" : "Ühenduse seadistused", + "Configuration Active" : "Seadistus on aktiivne", "When unchecked, this configuration will be skipped." : "Kui on märkimata, siis seadistust ei kasutata.", "Backup (Replica) Host" : "Varuserver", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Lisa valikuline varuserver. See peab olema koopia peamisest LDAP/AD serverist.", @@ -140,8 +156,6 @@ "Username-LDAP User Mapping" : "LDAP-Kasutajatunnus Kasutaja Vastendus", "Clear Username-LDAP User Mapping" : "Puhasta LDAP-Kasutajatunnus Kasutaja Vastendus", "Clear Groupname-LDAP Group Mapping" : "Puhasta LDAP-Grupinimi Grupp Vastendus", - "LDAP / AD integration" : "LDAP / AD integratsioon", - "LDAP / AD Username:" : "LDAP / AD kasutajanimi:", - "LDAP / AD Email Address:" : "LDAP / AD e-posti aadress:" + "Invalid configuration. Please have a look at the logs for further details." : "Vigane seadistus. Rohkema info jaoks vaadake logisid." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/eu.js b/apps/user_ldap/l10n/eu.js index 877edf2948b..0a488d9e0ba 100644 --- a/apps/user_ldap/l10n/eu.js +++ b/apps/user_ldap/l10n/eu.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Baliogabeko konfigurazioa. Lotura anonimoak ez dira onartzen.", "Valid configuration, connection established!" : "Baleko konfigurazioa, konexioa ezarri da!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Baleko konfigurazioa, baina lotura ez da ezarri. Egiaztatu zerbitzariaren ezarpenak eta kredentzialak.", - "Invalid configuration. Please have a look at the logs for further details." : "Baliogabeko konfigurazioa. Eman begirada bat egunkari-fitxategiei zehaztasun gehiagorako.", "No action specified" : "Ez da ekintzarik zehaztu", "No configuration specified" : "Ez da konfiguraziorik zehaztu", "No data specified" : "Ez da daturik zehaztu", - " Could not set configuration %s" : "Ezin izan da %s konfigurazioa ezarri", + "Invalid data specified" : "Zehaztutako datu baliogabeak", "Action does not exist" : "Ekintza ez da existitzen", "Renewing …" : "Berritzen ...", "Very weak password" : "Pasahitz oso ahula", @@ -53,15 +52,24 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u id\" leku-marka falta da. LDAP/AD kontsultatzerakoan saioa hasteko izenarekin ordezkatuko da.", "Please provide a login name to test against" : "Mesedez saioa hasteko izen bat eman probatu ahal izateko", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Taldeen sarrera desgaitu da, LDAP/AD zerbitzariak ez duelako memberOf onartzen.", - "Password change rejected. Hint: " : "Pasahitz aldaketa ukatu da. Aholkua:", "Please login with the new password" : "Mesedez hasi saioa pasahitz berriarekin", "LDAP User backend" : "LDAP erabiltzaileen atzealdea", "Your password will expire tomorrow." : "Zure pasahitza bihar iraungiko da.", "Your password will expire today." : "Zure pasahitza gaur iraungiko da.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Zure pasahitza egun %nean iraungiko da.","Zure pasahitza %n egunetan iraungiko da."], "LDAP/AD integration" : "LDAP/AD integrazioa", - "_%s group found_::_%s groups found_" : ["Talde %s aurkitu da","%s talde aurkitu dira"], - "_%s user found_::_%s users found_" : ["Erabiltzaile %s aurkitu da","%s erabiltzaile aurkitu dira"], + "LDAP Connection" : "LDAP konexioa", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Lotura egiteak huts egin du LDAP konfigurazio honentzat: %s","Lotura egiteak huts egin du %n LDAP konfigurazioentzat: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Bilaketak huts egin du LDAP konfigurazio honentzat: %s","Bilaketak huts egin du %n LDAP konfigurazioentzat: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Honako LDAP konfigurazioa inaktibo dago: %s","Honako %n LDAP konfigurazioak inaktibo daude: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Loturak eta bilaketak konfiguratutako LDAP konexioan funtzionatzen du (%s)","Loturak eta bilaketak konfiguratutako %n LDAP konexioetan funtzionatzen du (%s)"], + "Invalid LDAP UUIDs" : "Baliogabeko LDAP UUIDak", + "None found" : "Ez da batere aurkitu", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP kontu edo taldeen UUID baliogabeak aurkitu dira. Mesedez, errebisatu zure \"Gainidatzi UUID antzematea\" ezarpena, adituentzako LDAP konfigurazioan, eta erabili \"occ ldap:update-uuid\" eguneratu daitezen.", + "_%n group found_::_%n groups found_" : ["Talde %n aurkitu da","%n talde aurkitu dira"], + "> 1000 groups found" : "> 1000 talde aurkitu dira", + "> 1000 users found" : "> 1000 erabiltzaile aurkitu dira", + "_%n user found_::_%n users found_" : ["Erabiltzaile %n aurkitu da","%n erabiltzaile aurkitu dira"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Ezin izan da antzeman erabiltzailearen bistaratze izenaren atributua. Mesedez, zehaztu zeure burua LDAP ezarpen aurreratuetan.", "Could not find the desired feature" : "Ezin izan da nahi zen ezaugarria aurkitu", "Invalid Host" : "Baliogabeko ostalaria", @@ -74,7 +82,7 @@ OC.L10N.register( "Only these object classes:" : "Bakarrik objektu klase hauetakoak:", "Only from these groups:" : "Bakarrik talde hauetakoak:", "Search groups" : "Bilatu taldeak", - "Available groups" : "Eskuragarri dauden taldeak", + "Available groups" : "Talde erabilgarriak", "Selected groups" : "Hautatuko taldeak", "Edit LDAP Query" : "Editatu LDAP kontsulta", "LDAP Filter:" : "LDAP Iragazkia:", @@ -88,6 +96,7 @@ OC.L10N.register( "Other Attributes:" : "Bestelako atributuak:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Saioa hasten denean aplikatu beharreko iragazkia definitzen du. \"%% uid\" -ek erabiltzaile izena ordezkatzen du saio hasierako ekintzan. Adibidez: \"uid = %% uid\"", "Test Loginname" : "Egiaztatu Saioa hasteko izena", + "Attempts to receive a DN for the given loginname and the current login filter" : "Emandako saio-izenaren eta uneko saio-hasiera-iragazkiaren DN bat jasotzeko saiakera", "Verify settings" : "Egiaztatu ezarpenak", "%s. Server:" : "%s. Zerbitzaria:", "Add a new configuration" : "Gehitu konfigurazio berri bat", @@ -151,6 +160,8 @@ OC.L10N.register( "One User Base DN per line" : "Erabiltzaile DN oinarri bat lerroko", "User Search Attributes" : "Erabili Bilaketa Atributuak ", "Optional; one attribute per line" : "Aukerakoa; atributu bat lerro bakoitzeko", + "Disable users missing from LDAP" : "Desgaitu LDAPean ez dauden erabiltzaileak", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Gaitzean, ez dauden LDAPetik inportatutako erabiltzaileak desgaituko dira", "Group Display Name Field" : "Taldeen bistaratzeko izena duen eremua", "The LDAP attribute to use to generate the groups's display name." : "Taldearen bistaratze izena sortzeko erabiliko den LDAP atributua.", "Base Group Tree" : "Oinarrizko talde-zuhaitza", @@ -179,8 +190,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Utzi hutsik erabiltzaile izenarako (lehentsia). Bestela zehaztu LDAP/AD atributua.", "\"$home\" Placeholder Field" : "\"$home\" Leku-markaren eremua", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home kanpoko biltegiratze konfigurazio batean zehaztutako atributuaren balioarekin ordezkatuko da", + "User Profile Attributes" : "Erabiltzaile-profilaren ezaugarriak", + "Phone Field" : "Telefono eremua", + "User profile Phone will be set from the specified attribute" : "Erabiltzailearen profilaren Telefonoa zehaztutako ezaugarritik ezarriko da", + "Website Field" : "Webgune eremua", + "User profile Website will be set from the specified attribute" : "Erabiltzailearen profilaren Webgunea zehaztutako ezaugarritik ezarriko da", + "Address Field" : "Helbide eremua", + "User profile Address will be set from the specified attribute" : "Erabiltzailearen profilaren Helbidea zehaztutako ezaugarritik ezarriko da", + "Twitter Field" : "Twitter eremua", + "User profile Twitter will be set from the specified attribute" : "Erabiltzailearen profilaren Twitter-a zehaztutako ezaugarritik ezarriko da", + "Fediverse Field" : "Fedibertso eremua", + "User profile Fediverse will be set from the specified attribute" : "Erabiltzailearen profilaren Fedibertsoa zehaztutako ezaugarritik ezarriko da", + "Organisation Field" : "Erakunde eremua", + "User profile Organisation will be set from the specified attribute" : "Erabiltzailearen profilaren Erakundea zehaztutako ezaugarritik ezarriko da", + "Role Field" : "Rol eremua", + "User profile Role will be set from the specified attribute" : "Erabiltzailearen profilaren Rola zehaztutako ezaugarritik ezarriko da", + "Headline Field" : "Titulu-eremua", + "User profile Headline will be set from the specified attribute" : "Erabiltzailearen profilaren Titulua zehaztutako ezaugarritik ezarriko da", + "Biography Field" : "Biografia-eremua", + "User profile Biography will be set from the specified attribute" : "Erabiltzailearen profilaren Biografia zehaztutako ezaugarritik ezarriko da", + "Birthdate Field" : "Jaiotze data eremua", + "User profile Date of birth will be set from the specified attribute" : "Erabiltzailearen profila Jaiotze data zehaztutako atribututik ezarriko da", + "Pronouns Field" : "Izenordainen eremua", + "User profile Pronouns will be set from the specified attribute" : "Erabiltzailearen profilaren Izenordaina zehaztutako ezaugarritik ezarriko da", "Internal Username" : "Barneko erabiltzaile izena", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez *DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua. Utzi hutsik lehenetsitako portaerarako. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua. Utzi hutsik lehenetsitako portaerarako.", "Internal Username Attribute:" : "Baliogabeko Erabiltzaile Izen atributua", "Override UUID detection" : "Gainidatzi UUID antzematea", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Era lehenetsian, UUID atributua automatikoki atzematen da. UUID atributua LDAP erabiltzaleak eta taldeak dudik gabe identifikatzeko erabiltzen da. Gainera, barneko erabiltzaile-izena UUID atributuan oinarritua sortuko da bestelakorik zehazten ez bada. Ezarpenak alda daitezke eta bestelako atributua jar daiteke. Ziur egon behar duzu hautatzen duzun atributua erabiltzaile eta taldeek eskura dezaketela eta bakarra dela. Jokabide lehenetsi gisa utz ezazu hutsik. Aldaketok soilik LDAP-n mapeatuko (gehituko) diren erabiltzaile eta taldeei eragingo die.", @@ -190,13 +224,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Erabiltzaile izenak metadatuak gordetzeko eta esleitzeko erabiltzen dira. Erabiltzaileak zehazki identifikatu eta ezagutzeko, LDAP erabiltzaile bakoitzak barne erabiltzaile izena izango du. Horretarako, erabiltzaile izenetik LDAP erabiltzailearen mapaketa egin behar da. Sortutako erabiltzaile izena LDAP erabiltzailearen UUIDarekin mapatuta dago. Gainera, DNa cache-an gordetzen da LDAP elkarreragina murrizteko, baina ez da identifikaziorako erabiltzen. DNa aldatzen bada, aldaketak topatuko dira. Barne erabiltzaile izena toki guztietan erabiltzen da. Kartografiak garbitzeak hondarrak izango ditu nonahi. Kartografiak garbitzea ez da konfigurazioarekiko sentikorra, LDAP konfigurazio guztiei eragiten die! Ez garbitu inoiz mapak ekoizpen-ingurune batean, soilik proba edo fase esperimental batean.", "Clear Username-LDAP User Mapping" : "Garbitu LDAP-erabiltzaile-izenaren erabiltzaile mapaketa", "Clear Groupname-LDAP Group Mapping" : "Garbitu LDAP-talde-izenaren talde mapaketa", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD konexio errore bat gertatu da, mesedez egiaztatu ostalaria, ataka eta kredentzialak.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u id\" leku-marka falta da. LDAP / AD kontsultatzerakoan saioa hasteko izenarekin ordezkatuko da.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Taldeen sarrera desgaitu da, LDAP / AD zerbitzariak ez duelako memberOf onartzen.", - "LDAP / AD integration" : "LDAP / AD integrazioa", - "LDAP / AD Username:" : "LDAP / AD Erabiltzaile izena:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD erabiltzaile izenarekin saioa hastea baimentzen du, hau da, \"uid\" edo \"sAMAccountName\" da eta detektatu egingo da.", - "LDAP / AD Email Address:" : "LDAP / AD E-posta Helbidea:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez *DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Utzi hutsik lehenetsitako portaerarako. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua." + "Invalid configuration. Please have a look at the logs for further details." : "Baliogabeko konfigurazioa. Eman begirada bat egunkari-fitxategiei zehaztasun gehiagorako." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/eu.json b/apps/user_ldap/l10n/eu.json index 28570234a48..b8a002b2f71 100644 --- a/apps/user_ldap/l10n/eu.json +++ b/apps/user_ldap/l10n/eu.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Baliogabeko konfigurazioa. Lotura anonimoak ez dira onartzen.", "Valid configuration, connection established!" : "Baleko konfigurazioa, konexioa ezarri da!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Baleko konfigurazioa, baina lotura ez da ezarri. Egiaztatu zerbitzariaren ezarpenak eta kredentzialak.", - "Invalid configuration. Please have a look at the logs for further details." : "Baliogabeko konfigurazioa. Eman begirada bat egunkari-fitxategiei zehaztasun gehiagorako.", "No action specified" : "Ez da ekintzarik zehaztu", "No configuration specified" : "Ez da konfiguraziorik zehaztu", "No data specified" : "Ez da daturik zehaztu", - " Could not set configuration %s" : "Ezin izan da %s konfigurazioa ezarri", + "Invalid data specified" : "Zehaztutako datu baliogabeak", "Action does not exist" : "Ekintza ez da existitzen", "Renewing …" : "Berritzen ...", "Very weak password" : "Pasahitz oso ahula", @@ -51,15 +50,24 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u id\" leku-marka falta da. LDAP/AD kontsultatzerakoan saioa hasteko izenarekin ordezkatuko da.", "Please provide a login name to test against" : "Mesedez saioa hasteko izen bat eman probatu ahal izateko", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Taldeen sarrera desgaitu da, LDAP/AD zerbitzariak ez duelako memberOf onartzen.", - "Password change rejected. Hint: " : "Pasahitz aldaketa ukatu da. Aholkua:", "Please login with the new password" : "Mesedez hasi saioa pasahitz berriarekin", "LDAP User backend" : "LDAP erabiltzaileen atzealdea", "Your password will expire tomorrow." : "Zure pasahitza bihar iraungiko da.", "Your password will expire today." : "Zure pasahitza gaur iraungiko da.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Zure pasahitza egun %nean iraungiko da.","Zure pasahitza %n egunetan iraungiko da."], "LDAP/AD integration" : "LDAP/AD integrazioa", - "_%s group found_::_%s groups found_" : ["Talde %s aurkitu da","%s talde aurkitu dira"], - "_%s user found_::_%s users found_" : ["Erabiltzaile %s aurkitu da","%s erabiltzaile aurkitu dira"], + "LDAP Connection" : "LDAP konexioa", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Lotura egiteak huts egin du LDAP konfigurazio honentzat: %s","Lotura egiteak huts egin du %n LDAP konfigurazioentzat: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Bilaketak huts egin du LDAP konfigurazio honentzat: %s","Bilaketak huts egin du %n LDAP konfigurazioentzat: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Honako LDAP konfigurazioa inaktibo dago: %s","Honako %n LDAP konfigurazioak inaktibo daude: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Loturak eta bilaketak konfiguratutako LDAP konexioan funtzionatzen du (%s)","Loturak eta bilaketak konfiguratutako %n LDAP konexioetan funtzionatzen du (%s)"], + "Invalid LDAP UUIDs" : "Baliogabeko LDAP UUIDak", + "None found" : "Ez da batere aurkitu", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP kontu edo taldeen UUID baliogabeak aurkitu dira. Mesedez, errebisatu zure \"Gainidatzi UUID antzematea\" ezarpena, adituentzako LDAP konfigurazioan, eta erabili \"occ ldap:update-uuid\" eguneratu daitezen.", + "_%n group found_::_%n groups found_" : ["Talde %n aurkitu da","%n talde aurkitu dira"], + "> 1000 groups found" : "> 1000 talde aurkitu dira", + "> 1000 users found" : "> 1000 erabiltzaile aurkitu dira", + "_%n user found_::_%n users found_" : ["Erabiltzaile %n aurkitu da","%n erabiltzaile aurkitu dira"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Ezin izan da antzeman erabiltzailearen bistaratze izenaren atributua. Mesedez, zehaztu zeure burua LDAP ezarpen aurreratuetan.", "Could not find the desired feature" : "Ezin izan da nahi zen ezaugarria aurkitu", "Invalid Host" : "Baliogabeko ostalaria", @@ -72,7 +80,7 @@ "Only these object classes:" : "Bakarrik objektu klase hauetakoak:", "Only from these groups:" : "Bakarrik talde hauetakoak:", "Search groups" : "Bilatu taldeak", - "Available groups" : "Eskuragarri dauden taldeak", + "Available groups" : "Talde erabilgarriak", "Selected groups" : "Hautatuko taldeak", "Edit LDAP Query" : "Editatu LDAP kontsulta", "LDAP Filter:" : "LDAP Iragazkia:", @@ -86,6 +94,7 @@ "Other Attributes:" : "Bestelako atributuak:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Saioa hasten denean aplikatu beharreko iragazkia definitzen du. \"%% uid\" -ek erabiltzaile izena ordezkatzen du saio hasierako ekintzan. Adibidez: \"uid = %% uid\"", "Test Loginname" : "Egiaztatu Saioa hasteko izena", + "Attempts to receive a DN for the given loginname and the current login filter" : "Emandako saio-izenaren eta uneko saio-hasiera-iragazkiaren DN bat jasotzeko saiakera", "Verify settings" : "Egiaztatu ezarpenak", "%s. Server:" : "%s. Zerbitzaria:", "Add a new configuration" : "Gehitu konfigurazio berri bat", @@ -149,6 +158,8 @@ "One User Base DN per line" : "Erabiltzaile DN oinarri bat lerroko", "User Search Attributes" : "Erabili Bilaketa Atributuak ", "Optional; one attribute per line" : "Aukerakoa; atributu bat lerro bakoitzeko", + "Disable users missing from LDAP" : "Desgaitu LDAPean ez dauden erabiltzaileak", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Gaitzean, ez dauden LDAPetik inportatutako erabiltzaileak desgaituko dira", "Group Display Name Field" : "Taldeen bistaratzeko izena duen eremua", "The LDAP attribute to use to generate the groups's display name." : "Taldearen bistaratze izena sortzeko erabiliko den LDAP atributua.", "Base Group Tree" : "Oinarrizko talde-zuhaitza", @@ -177,8 +188,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Utzi hutsik erabiltzaile izenarako (lehentsia). Bestela zehaztu LDAP/AD atributua.", "\"$home\" Placeholder Field" : "\"$home\" Leku-markaren eremua", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home kanpoko biltegiratze konfigurazio batean zehaztutako atributuaren balioarekin ordezkatuko da", + "User Profile Attributes" : "Erabiltzaile-profilaren ezaugarriak", + "Phone Field" : "Telefono eremua", + "User profile Phone will be set from the specified attribute" : "Erabiltzailearen profilaren Telefonoa zehaztutako ezaugarritik ezarriko da", + "Website Field" : "Webgune eremua", + "User profile Website will be set from the specified attribute" : "Erabiltzailearen profilaren Webgunea zehaztutako ezaugarritik ezarriko da", + "Address Field" : "Helbide eremua", + "User profile Address will be set from the specified attribute" : "Erabiltzailearen profilaren Helbidea zehaztutako ezaugarritik ezarriko da", + "Twitter Field" : "Twitter eremua", + "User profile Twitter will be set from the specified attribute" : "Erabiltzailearen profilaren Twitter-a zehaztutako ezaugarritik ezarriko da", + "Fediverse Field" : "Fedibertso eremua", + "User profile Fediverse will be set from the specified attribute" : "Erabiltzailearen profilaren Fedibertsoa zehaztutako ezaugarritik ezarriko da", + "Organisation Field" : "Erakunde eremua", + "User profile Organisation will be set from the specified attribute" : "Erabiltzailearen profilaren Erakundea zehaztutako ezaugarritik ezarriko da", + "Role Field" : "Rol eremua", + "User profile Role will be set from the specified attribute" : "Erabiltzailearen profilaren Rola zehaztutako ezaugarritik ezarriko da", + "Headline Field" : "Titulu-eremua", + "User profile Headline will be set from the specified attribute" : "Erabiltzailearen profilaren Titulua zehaztutako ezaugarritik ezarriko da", + "Biography Field" : "Biografia-eremua", + "User profile Biography will be set from the specified attribute" : "Erabiltzailearen profilaren Biografia zehaztutako ezaugarritik ezarriko da", + "Birthdate Field" : "Jaiotze data eremua", + "User profile Date of birth will be set from the specified attribute" : "Erabiltzailearen profila Jaiotze data zehaztutako atribututik ezarriko da", + "Pronouns Field" : "Izenordainen eremua", + "User profile Pronouns will be set from the specified attribute" : "Erabiltzailearen profilaren Izenordaina zehaztutako ezaugarritik ezarriko da", "Internal Username" : "Barneko erabiltzaile izena", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez *DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua. Utzi hutsik lehenetsitako portaerarako. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua. Utzi hutsik lehenetsitako portaerarako.", "Internal Username Attribute:" : "Baliogabeko Erabiltzaile Izen atributua", "Override UUID detection" : "Gainidatzi UUID antzematea", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Era lehenetsian, UUID atributua automatikoki atzematen da. UUID atributua LDAP erabiltzaleak eta taldeak dudik gabe identifikatzeko erabiltzen da. Gainera, barneko erabiltzaile-izena UUID atributuan oinarritua sortuko da bestelakorik zehazten ez bada. Ezarpenak alda daitezke eta bestelako atributua jar daiteke. Ziur egon behar duzu hautatzen duzun atributua erabiltzaile eta taldeek eskura dezaketela eta bakarra dela. Jokabide lehenetsi gisa utz ezazu hutsik. Aldaketok soilik LDAP-n mapeatuko (gehituko) diren erabiltzaile eta taldeei eragingo die.", @@ -188,13 +222,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Erabiltzaile izenak metadatuak gordetzeko eta esleitzeko erabiltzen dira. Erabiltzaileak zehazki identifikatu eta ezagutzeko, LDAP erabiltzaile bakoitzak barne erabiltzaile izena izango du. Horretarako, erabiltzaile izenetik LDAP erabiltzailearen mapaketa egin behar da. Sortutako erabiltzaile izena LDAP erabiltzailearen UUIDarekin mapatuta dago. Gainera, DNa cache-an gordetzen da LDAP elkarreragina murrizteko, baina ez da identifikaziorako erabiltzen. DNa aldatzen bada, aldaketak topatuko dira. Barne erabiltzaile izena toki guztietan erabiltzen da. Kartografiak garbitzeak hondarrak izango ditu nonahi. Kartografiak garbitzea ez da konfigurazioarekiko sentikorra, LDAP konfigurazio guztiei eragiten die! Ez garbitu inoiz mapak ekoizpen-ingurune batean, soilik proba edo fase esperimental batean.", "Clear Username-LDAP User Mapping" : "Garbitu LDAP-erabiltzaile-izenaren erabiltzaile mapaketa", "Clear Groupname-LDAP Group Mapping" : "Garbitu LDAP-talde-izenaren talde mapaketa", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD konexio errore bat gertatu da, mesedez egiaztatu ostalaria, ataka eta kredentzialak.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u id\" leku-marka falta da. LDAP / AD kontsultatzerakoan saioa hasteko izenarekin ordezkatuko da.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Taldeen sarrera desgaitu da, LDAP / AD zerbitzariak ez duelako memberOf onartzen.", - "LDAP / AD integration" : "LDAP / AD integrazioa", - "LDAP / AD Username:" : "LDAP / AD Erabiltzaile izena:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD erabiltzaile izenarekin saioa hastea baimentzen du, hau da, \"uid\" edo \"sAMAccountName\" da eta detektatu egingo da.", - "LDAP / AD Email Address:" : "LDAP / AD E-posta Helbidea:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Modu lehenetsian barneko erabiltzaile-izena UUID atribututik sortuko da. Honek erabiltzaile-izena bakarra dela eta karaktereak bihurtu behar ez direla ziurtatzen du. Barneko erabiltzaile-izenak karaktere hauek soilik izan ditzake: [ a-zA-Z0-9_.@- ]. Beste karaktereak haien ASCII karaktereekin bihurtu edo guztiz kentzen dira. Kolisioa gertatzen den kasuetan zenbaki bat gehitu edo handituko da. Barneko erabiltzaile-izena erabiltzaile bat barnean identifikatzeko erabiltzen da. Erabiltzailearen etxeko karpetaren izen lehenetsia ere da. Kanpoko URLen parte ere da, adibidez *DAV zerbitzu guztientzako. Ezarpen honekin, lehenetsitako portaera aldatu daiteke. Utzi hutsik lehenetsitako portaerarako. Aldaketek mapatutako (gehitutako) LDAP erabiltzaile berriengan soilik izango du efektua." + "Invalid configuration. Please have a look at the logs for further details." : "Baliogabeko konfigurazioa. Eman begirada bat egunkari-fitxategiei zehaztasun gehiagorako." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/fa.js b/apps/user_ldap/l10n/fa.js index 082f297f98f..6d0867258b1 100644 --- a/apps/user_ldap/l10n/fa.js +++ b/apps/user_ldap/l10n/fa.js @@ -3,88 +3,206 @@ OC.L10N.register( { "Failed to clear the mappings." : "عدم موفقیت در پاک کردن نگاشت.", "Failed to delete the server configuration" : "عملیات حذف پیکربندی سرور ناموفق ماند", - "The configuration is valid and the connection could be established!" : "پیکربندی معتبر است و ارتباط می تواند برقرار شود", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "پیکربندی معتبراست، اما اتصال شکست خورد. لطفا تنظیمات و اعتبارهای سرور را بررسی کنید.", + "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", + "Valid configuration, connection established!" : "Valid configuration, connection established!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", "No action specified" : "فعالیتی مشخص نشده است", "No configuration specified" : "هیچ پیکربندی مشخص نشده است", "No data specified" : "داده ای مشخص نشده است", + "Invalid data specified" : "Invalid data specified", + "Action does not exist" : "Action does not exist", + "Renewing …" : "Renewing …", + "Very weak password" : "رمز عبور بسیار ضعیف", + "Weak password" : "رمز عبور ضعیف", + "So-so password" : "رمز عبور متوسط", + "Good password" : "رمز عبور خوب", + "Strong password" : "رمز عبور قوی", + "The Base DN appears to be wrong" : "The Base DN appears to be wrong", + "Testing configuration…" : "Testing configuration…", "Configuration incorrect" : "پیکربندی نادرست است", "Configuration incomplete" : "پیکربندی کامل نیست", "Configuration OK" : "پیکربندی صحیح است", "Select groups" : "انتخاب گروه ها", "Select object classes" : "انتخاب کلاس های اشیا", + "Please check the credentials, they seem to be wrong." : "Please check the credentials, they seem to be wrong.", "Please specify the port, it could not be auto-detected." : "لطفا پورت را مشخص کنید، امکان تعیین خودکار وجود ندارد.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN could not be auto-detected, please revise credentials, host and port.", "Could not detect Base DN, please enter it manually." : "امکان شناسایی Base DN, وجود ندارد، لطفا بصورت دستی آنرا وارد کنید.", "{nthServer}. Server" : "سرور {nthServer}.", + "No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.", + "More than 1,000 directory entries available." : "More than 1,000 directory entries available.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entry available within the provided Base DN","{objectsFound} entries available within the provided Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.", "Do you really want to delete the current Server Configuration?" : "آیا واقعا می خواهید پیکربندی کنونی سرور را حذف کنید؟", "Confirm Deletion" : "تایید حذف", + "Mappings cleared successfully!" : "Mappings cleared successfully!", + "Error while clearing the mappings." : "Error while clearing the mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous bind is not allowed. Please provide a User DN and Password.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operations error. Anonymous bind might not be allowed.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Saving failed. Please make sure the database is in Operation. Reload before continuing.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?", + "Mode switch" : "Mode switch", "Select attributes" : "انتخاب مشخصه ها", - "_%s group found_::_%s groups found_" : ["%s گروه بافت شد"], - "_%s user found_::_%s users found_" : ["%s کاربر بافت شد"], + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>", + "User found and settings verified." : "User found and settings verified.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", + "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", + "Please provide a login name to test against" : "Please provide a login name to test against", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", + "Your password will expire tomorrow." : "Your password will expire tomorrow.", + "Your password will expire today." : "Your password will expire today.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], + "LDAP/AD integration" : "LDAP/AD integration", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", + "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "هاست نامعتبر است", - "Server" : "سرور", - "Users" : "کاربران", - "Groups" : "گروه ها", + "LDAP user and group backend" : "LDAP user and group backend", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.", "Test Configuration" : "امتحان پیکربندی", - "Help" : "راهنما", + "Help" : "کمک", + "Groups meeting these criteria are available in %s:" : "Groups meeting these criteria are available in %s:", + "Only these object classes:" : "Only these object classes:", "Only from these groups:" : "تنها از این گروهها:", "Search groups" : "جستجوی گروهها", "Available groups" : "گروههای موجود", "Selected groups" : "گروههای انتخاب شده", + "Edit LDAP Query" : "Edit LDAP Query", "LDAP Filter:" : "فیلتر LDAP:", - "LDAP / AD Username:" : "نامکاربری LDAP / AD :", - "LDAP / AD Email Address:" : " آدرس ایمیل LDAP / AD :", + "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", + "Verify settings and count the groups" : "Verify settings and count the groups", + "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", "Other Attributes:" : "مشخصه های دیگر:", - "1. Server" : "1. سرور", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", + "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", + "Verify settings" : "تایید تنظیمات", "%s. Server:" : "%s. سرور:", + "Add a new configuration" : "Add a new configuration", + "Copy current configuration into new directory binding" : "Copy current configuration into new directory binding", + "Delete the current configuration" : "Delete the current configuration", "Host" : "میزبانی", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "You can omit the protocol, unless you require SSL. If so, start with ldaps://", "Port" : "درگاه", "Detect Port" : "شناسایی پورت", "User DN" : "کاربر DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.", "Password" : "گذرواژه", "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", + "Save Credentials" : "Save Credentials", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Detect Base DN" : "Detect Base DN", "Test Base DN" : "تست DN پایه", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.", + "Manually enter LDAP filters (recommended for large directories)" : "Manually enter LDAP filters (recommended for large directories)", + "Listing and searching for users is constrained by these criteria:" : "Listing and searching for users is constrained by these criteria:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "The filter specifies which LDAP users shall have access to the %s instance.", + "Verify settings and count users" : "تایید تنظیمات و تعداد کاربران", "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", - "LDAP" : "LDAP", + "Please renew your password." : "Please renew your password.", + "An internal error occurred." : "یک اشتباه داخلی رخ داد.", + "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", + "Current password" : "گذرواژه کنونی", + "New password" : "گذرواژه جدید", + "Renew password" : "Renew password", + "Wrong password." : "گذرواژه اشتباه.", + "Cancel" : "لغو", + "Server" : "سرور", + "Users" : "کاربران", + "Login Attributes" : "Login Attributes", + "Groups" : "گروه ها", "Expert" : "حرفه ای", "Advanced" : "پیشرفته", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.", "Connection Settings" : "تنظیمات اتصال", "Configuration Active" : "پیکربندی فعال", "When unchecked, this configuration will be skipped." : "زمانیکه انتخاب نشود، این پیکربندی نادیده گرفته خواهد شد.", "Backup (Replica) Host" : "پشتیبان گیری (بدل) میزبان", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Give an optional backup host. It must be a replica of the main LDAP/AD server.", "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", + "Only connect to the replica server." : "Only connect to the replica server.", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "توصیه نمی شود، از آن فقط برای آزمایش استفاده کنید! اگر اتصال فقط با این گزینه کار می کند، گواهی SSL سرور LDAP را در %sسرور خود وارد کنید.", "Cache Time-To-Live" : "مدت زمان کش", + "in seconds. A change empties the cache." : "در چند ثانیه یک تغییر حافظه پنهان را خالی می کند.", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", + "The LDAP attribute to use to generate the user's display name." : "The LDAP attribute to use to generate the user's display name.", + "2nd User Display Name Field" : "2nd User Display Name Field", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.", "Base User Tree" : "کاربر درخت پایه", "One User Base DN per line" : "یک کاربر پایه DN در هر خط", "User Search Attributes" : "ویژگی های جستجوی کاربر", "Optional; one attribute per line" : "اختیاری؛ یک ویژگی در هر خط", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", "Group Display Name Field" : "فیلد نام گروه", + "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the groups's display name.", "Base Group Tree" : "گروه درخت پایه ", "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Dynamic Group Member URL" : "Dynamic Group Member URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)", "Nested Groups" : "گروههای زیرمجموعه", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)", + "Enable LDAP password changes per user" : "Enable LDAP password changes per user", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.", + "(New password is sent as plain text to LDAP)" : "(New password is sent as plain text to LDAP)", + "Default password policy DN" : "Default password policy DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute.", "Quota Default" : "سهمیه بندی پیش فرض", - "in bytes" : "در بایت", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Override default quota for LDAP users who do not have a quota set in the Quota Field.", "Email Field" : "ایمیل ارسال نشد.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", "User Home Folder Naming Rule" : "قانون نامگذاری پوشه خانه کاربر", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "خالی گذاشتن برای نام کاربری (پیش فرض). در غیر این صورت، تعیین یک ویژگی LDAP/AD.", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "خصوصیات نمایهٔ کاربر", + "Phone Field" : "Phone Field", + "Website Field" : "Website Field", + "Address Field" : "Address Field", + "Twitter Field" : "Twitter Field", + "Fediverse Field" : "Fediverse Field", + "Organisation Field" : "Organisation Field", + "Role Field" : "Role Field", + "Headline Field" : "Headline Field", + "Biography Field" : "Biography Field", "Internal Username" : "نام کاربری داخلی", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups.", "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", + "UUID Attribute for Groups:" : "UUID Attribute for Groups:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", - "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" + "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری", + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." }, -"nplurals=1; plural=0;"); +"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/fa.json b/apps/user_ldap/l10n/fa.json index 7a8b3e8212e..a49ee8313c3 100644 --- a/apps/user_ldap/l10n/fa.json +++ b/apps/user_ldap/l10n/fa.json @@ -1,88 +1,206 @@ { "translations": { "Failed to clear the mappings." : "عدم موفقیت در پاک کردن نگاشت.", "Failed to delete the server configuration" : "عملیات حذف پیکربندی سرور ناموفق ماند", - "The configuration is valid and the connection could be established!" : "پیکربندی معتبر است و ارتباط می تواند برقرار شود", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "پیکربندی معتبراست، اما اتصال شکست خورد. لطفا تنظیمات و اعتبارهای سرور را بررسی کنید.", + "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", + "Valid configuration, connection established!" : "Valid configuration, connection established!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", "No action specified" : "فعالیتی مشخص نشده است", "No configuration specified" : "هیچ پیکربندی مشخص نشده است", "No data specified" : "داده ای مشخص نشده است", + "Invalid data specified" : "Invalid data specified", + "Action does not exist" : "Action does not exist", + "Renewing …" : "Renewing …", + "Very weak password" : "رمز عبور بسیار ضعیف", + "Weak password" : "رمز عبور ضعیف", + "So-so password" : "رمز عبور متوسط", + "Good password" : "رمز عبور خوب", + "Strong password" : "رمز عبور قوی", + "The Base DN appears to be wrong" : "The Base DN appears to be wrong", + "Testing configuration…" : "Testing configuration…", "Configuration incorrect" : "پیکربندی نادرست است", "Configuration incomplete" : "پیکربندی کامل نیست", "Configuration OK" : "پیکربندی صحیح است", "Select groups" : "انتخاب گروه ها", "Select object classes" : "انتخاب کلاس های اشیا", + "Please check the credentials, they seem to be wrong." : "Please check the credentials, they seem to be wrong.", "Please specify the port, it could not be auto-detected." : "لطفا پورت را مشخص کنید، امکان تعیین خودکار وجود ندارد.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN could not be auto-detected, please revise credentials, host and port.", "Could not detect Base DN, please enter it manually." : "امکان شناسایی Base DN, وجود ندارد، لطفا بصورت دستی آنرا وارد کنید.", "{nthServer}. Server" : "سرور {nthServer}.", + "No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.", + "More than 1,000 directory entries available." : "More than 1,000 directory entries available.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entry available within the provided Base DN","{objectsFound} entries available within the provided Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.", "Do you really want to delete the current Server Configuration?" : "آیا واقعا می خواهید پیکربندی کنونی سرور را حذف کنید؟", "Confirm Deletion" : "تایید حذف", + "Mappings cleared successfully!" : "Mappings cleared successfully!", + "Error while clearing the mappings." : "Error while clearing the mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous bind is not allowed. Please provide a User DN and Password.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operations error. Anonymous bind might not be allowed.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Saving failed. Please make sure the database is in Operation. Reload before continuing.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?", + "Mode switch" : "Mode switch", "Select attributes" : "انتخاب مشخصه ها", - "_%s group found_::_%s groups found_" : ["%s گروه بافت شد"], - "_%s user found_::_%s users found_" : ["%s کاربر بافت شد"], + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>", + "User found and settings verified." : "User found and settings verified.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", + "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", + "Please provide a login name to test against" : "Please provide a login name to test against", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", + "Your password will expire tomorrow." : "Your password will expire tomorrow.", + "Your password will expire today." : "Your password will expire today.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], + "LDAP/AD integration" : "LDAP/AD integration", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", + "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "هاست نامعتبر است", - "Server" : "سرور", - "Users" : "کاربران", - "Groups" : "گروه ها", + "LDAP user and group backend" : "LDAP user and group backend", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.", "Test Configuration" : "امتحان پیکربندی", - "Help" : "راهنما", + "Help" : "کمک", + "Groups meeting these criteria are available in %s:" : "Groups meeting these criteria are available in %s:", + "Only these object classes:" : "Only these object classes:", "Only from these groups:" : "تنها از این گروهها:", "Search groups" : "جستجوی گروهها", "Available groups" : "گروههای موجود", "Selected groups" : "گروههای انتخاب شده", + "Edit LDAP Query" : "Edit LDAP Query", "LDAP Filter:" : "فیلتر LDAP:", - "LDAP / AD Username:" : "نامکاربری LDAP / AD :", - "LDAP / AD Email Address:" : " آدرس ایمیل LDAP / AD :", + "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", + "Verify settings and count the groups" : "Verify settings and count the groups", + "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", "Other Attributes:" : "مشخصه های دیگر:", - "1. Server" : "1. سرور", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", + "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", + "Verify settings" : "تایید تنظیمات", "%s. Server:" : "%s. سرور:", + "Add a new configuration" : "Add a new configuration", + "Copy current configuration into new directory binding" : "Copy current configuration into new directory binding", + "Delete the current configuration" : "Delete the current configuration", "Host" : "میزبانی", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "You can omit the protocol, unless you require SSL. If so, start with ldaps://", "Port" : "درگاه", "Detect Port" : "شناسایی پورت", "User DN" : "کاربر DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.", "Password" : "گذرواژه", "For anonymous access, leave DN and Password empty." : "برای دسترسی ناشناس، DN را رها نموده و رمزعبور را خالی بگذارید.", + "Save Credentials" : "Save Credentials", "One Base DN per line" : "یک پایه DN در هر خط", "You can specify Base DN for users and groups in the Advanced tab" : "شما می توانید پایه DN را برای کاربران و گروه ها در زبانه Advanced مشخص کنید.", + "Detect Base DN" : "Detect Base DN", "Test Base DN" : "تست DN پایه", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.", + "Manually enter LDAP filters (recommended for large directories)" : "Manually enter LDAP filters (recommended for large directories)", + "Listing and searching for users is constrained by these criteria:" : "Listing and searching for users is constrained by these criteria:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "The filter specifies which LDAP users shall have access to the %s instance.", + "Verify settings and count users" : "تایید تنظیمات و تعداد کاربران", "Saving" : "درحال ذخیره", "Back" : "بازگشت", "Continue" : "ادامه", - "LDAP" : "LDAP", + "Please renew your password." : "Please renew your password.", + "An internal error occurred." : "یک اشتباه داخلی رخ داد.", + "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", + "Current password" : "گذرواژه کنونی", + "New password" : "گذرواژه جدید", + "Renew password" : "Renew password", + "Wrong password." : "گذرواژه اشتباه.", + "Cancel" : "لغو", + "Server" : "سرور", + "Users" : "کاربران", + "Login Attributes" : "Login Attributes", + "Groups" : "گروه ها", "Expert" : "حرفه ای", "Advanced" : "پیشرفته", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.", "Connection Settings" : "تنظیمات اتصال", "Configuration Active" : "پیکربندی فعال", "When unchecked, this configuration will be skipped." : "زمانیکه انتخاب نشود، این پیکربندی نادیده گرفته خواهد شد.", "Backup (Replica) Host" : "پشتیبان گیری (بدل) میزبان", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Give an optional backup host. It must be a replica of the main LDAP/AD server.", "Backup (Replica) Port" : "پشتیبان گیری (بدل) پورت", "Disable Main Server" : "غیر فعال کردن سرور اصلی", + "Only connect to the replica server." : "Only connect to the replica server.", "Turn off SSL certificate validation." : "غیرفعال کردن اعتبار گواهی نامه SSL .", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "توصیه نمی شود، از آن فقط برای آزمایش استفاده کنید! اگر اتصال فقط با این گزینه کار می کند، گواهی SSL سرور LDAP را در %sسرور خود وارد کنید.", "Cache Time-To-Live" : "مدت زمان کش", + "in seconds. A change empties the cache." : "در چند ثانیه یک تغییر حافظه پنهان را خالی می کند.", "Directory Settings" : "تنظیمات پوشه", "User Display Name Field" : "فیلد نام کاربر", + "The LDAP attribute to use to generate the user's display name." : "The LDAP attribute to use to generate the user's display name.", + "2nd User Display Name Field" : "2nd User Display Name Field", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.", "Base User Tree" : "کاربر درخت پایه", "One User Base DN per line" : "یک کاربر پایه DN در هر خط", "User Search Attributes" : "ویژگی های جستجوی کاربر", "Optional; one attribute per line" : "اختیاری؛ یک ویژگی در هر خط", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", "Group Display Name Field" : "فیلد نام گروه", + "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the groups's display name.", "Base Group Tree" : "گروه درخت پایه ", "One Group Base DN per line" : "یک گروه پایه DN در هر خط", "Group Search Attributes" : "گروه صفات جستجو", "Group-Member association" : "انجمن گروه کاربران", + "Dynamic Group Member URL" : "Dynamic Group Member URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)", "Nested Groups" : "گروههای زیرمجموعه", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)", + "Enable LDAP password changes per user" : "Enable LDAP password changes per user", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.", + "(New password is sent as plain text to LDAP)" : "(New password is sent as plain text to LDAP)", + "Default password policy DN" : "Default password policy DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.", "Special Attributes" : "ویژگی های مخصوص", "Quota Field" : "سهمیه بندی انجام نشد.", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute.", "Quota Default" : "سهمیه بندی پیش فرض", - "in bytes" : "در بایت", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Override default quota for LDAP users who do not have a quota set in the Quota Field.", "Email Field" : "ایمیل ارسال نشد.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", "User Home Folder Naming Rule" : "قانون نامگذاری پوشه خانه کاربر", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "خالی گذاشتن برای نام کاربری (پیش فرض). در غیر این صورت، تعیین یک ویژگی LDAP/AD.", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "خصوصیات نمایهٔ کاربر", + "Phone Field" : "Phone Field", + "Website Field" : "Website Field", + "Address Field" : "Address Field", + "Twitter Field" : "Twitter Field", + "Fediverse Field" : "Fediverse Field", + "Organisation Field" : "Organisation Field", + "Role Field" : "Role Field", + "Headline Field" : "Headline Field", + "Biography Field" : "Biography Field", "Internal Username" : "نام کاربری داخلی", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", "Internal Username Attribute:" : "ویژگی نام کاربری داخلی:", "Override UUID detection" : "نادیده گرفتن تشخیص UUID ", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups.", "UUID Attribute for Users:" : "UUID ویژگی برای کاربران:", + "UUID Attribute for Groups:" : "UUID Attribute for Groups:", "Username-LDAP User Mapping" : "نام کاربری - نگاشت کاربر LDAP ", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", "Clear Username-LDAP User Mapping" : "پاک کردن نام کاربری- LDAP نگاشت کاربر ", - "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری" -},"pluralForm" :"nplurals=1; plural=0;" + "Clear Groupname-LDAP Group Mapping" : "پاک کردن نام گروه -LDAP گروه نقشه برداری", + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." +},"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js index 8d1fa7d2ae2..8f5aaf91239 100644 --- a/apps/user_ldap/l10n/fr.js +++ b/apps/user_ldap/l10n/fr.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuration non valable : Le lien anonyme n'est pas autorisé.", "Valid configuration, connection established!" : "Configuration valide, connexion établie !", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuration valide, mais le lien a échoué. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuration non valide. Veuillez consulter les logs pour plus de détails.", + "Invalid configuration: %s" : "Configuration non valide : %s", "No action specified" : "Aucune action spécifiée", "No configuration specified" : "Aucune configuration spécifiée", "No data specified" : "Aucune donnée spécifiée", - " Could not set configuration %s" : "Impossible d'appliquer la configuration %s", + "Invalid data specified" : "Données spécifiées invalides", + "Could not set configuration %1$s to %2$s" : "Impossible de changer la configuration %1$s pour %2$s", "Action does not exist" : "L'action n'existe pas", "Renewing …" : "Renouvellement en cours...", "Very weak password" : "Mot de passe très faible", @@ -18,7 +19,7 @@ OC.L10N.register( "So-so password" : "Mot de passe tout juste acceptable", "Good password" : "Mot de passe de sécurité suffisante", "Strong password" : "Mot de passe fort", - "The Base DN appears to be wrong" : "Le DN de base est erroné", + "The Base DN appears to be wrong" : "Le DN de base semble être erroné", "Testing configuration…" : "Test de configuration", "Configuration incorrect" : "Configuration incorrecte", "Configuration incomplete" : "Configuration incomplète", @@ -32,8 +33,8 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Serveur", "No object found in the given Base DN. Please revise." : "Aucun objet trouvé dans le DN de base spécifié. Veuillez le vérifier.", "More than 1,000 directory entries available." : "Il y a plus de 1 000 entrées de répertoire disponibles.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrée disponible dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrée disponible dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification.", "Do you really want to delete the current Server Configuration?" : "Êtes-vous sûr de vouloir effacer la configuration serveur actuelle ?", "Confirm Deletion" : "Confirmer la suppression", "Mappings cleared successfully!" : "Associations supprimées avec succès !", @@ -53,26 +54,43 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "La chaîne \"%uid\" est manquante. Cette chaîne est remplacée par l'identifiant de connexion lors des requêtes LDAP/AD.", "Please provide a login name to test against" : "Veuillez indiquer un identifiant de connexion avec lequel tester.", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP/AD ne prend pas en charge memberOf.", - "Password change rejected. Hint: " : "La modification du mot de passe a été rejetée. Indice :", + "Password change rejected. Hint: %s" : "Changement du mot de passe rejetée. Astuce : %s", + "Mandatory field \"%s\" left empty" : "Le champ obligatoire \"%s\" n'est pas renseigné", + "A password is given, but not an LDAP agent" : "Un mot de passe est indiqué, mais pas un agent LDAP", + "No password is given for the user agent" : "Aucun mot de passe n'est indiqué pour l'agent utilisateur", + "No LDAP base DN was given" : "Aucun DN de base LDAP n'a été indiqué", + "User base DN is not a subnode of global base DN" : "Le DN de base utilisateur n'est pas un sous-noeud du DN de base global", + "Group base DN is not a subnode of global base DN" : "Le DN de base du groupe n'est pas un sous-noeud du DN de base global", + "Login filter does not contain %s placeholder." : "Le filtre de connexion ne doit pas contenir l'élément de substitution %s", "Please login with the new password" : "Veuillez vous connecter avec le nouveau mot de passe", "LDAP User backend" : "Infrastructure utilisateur LDAP", "Your password will expire tomorrow." : "Votre mot de passe expirera demain", "Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours."], - "LDAP/AD integration" : "Integration LDAP/AD ", - "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], - "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."], + "LDAP/AD integration" : "Intégration LDAP/AD", + "LDAP Connection" : "Connexion LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["La liaison a échoué pour cette configuration LDAP: %s","Échec de la liaison pour %n les configurations LDAP: %s","Échec de la liaison pour %n les configurations LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["La recherche a échoué pour cette configuration LDAP: %s","La recherche a échoué pour %n des configurations LDAP: %s","La recherche a échoué pour %n des configurations LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Il existe une configuration LDAP inactive: %s","Il y a %n configurations LDAP inactives: %s","Il y a %n configurations LDAP inactives: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["La liaison et la recherche fonctionnent sur la connexion LDAP configurée (%s)","La liaison et la recherche fonctionnent sur toutes les %n connexions LDAP configurées (%s)","La liaison et la recherche fonctionnent sur toutes les %n connexions LDAP configurées (%s)"], + "Invalid LDAP UUIDs" : "UUID LDAP invalides", + "None found" : "Aucun trouvé", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Des UUID invalides pour les comptes LDAP ont été trouvés. Merci de vérifier votre paramètre « Passer outre la détection des UUID » dans la partie Expert de la configuration LDAP puis utiliser « occ ldap:update-uuid » pour les mettre à jour.", + "_%n group found_::_%n groups found_" : ["%n groupe trouvé","%n groupes trouvés","%n groupes trouvés"], + "> 1000 groups found" : "> 1000 groupes trouvés", + "> 1000 users found" : "> 1000 utilisateurs trouvés", + "_%n user found_::_%n users found_" : ["%n utilisateur trouvé","%n utilisateurs trouvés","%n utilisateurs trouvés"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres LDAP avancés.", "Could not find the desired feature" : "Impossible de trouver la fonction souhaitée", "Invalid Host" : "Hôte non valide", "LDAP user and group backend" : "Utilisateur LDAP et infrastructure de groupe", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Cette application autorise les administrateurs à connecter Nextcloud à un annuaire LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cette application permet aux administrateurs de connecter Nextcloud à un répertoire d'utilisateurs LDAP pour l'authentification et le provisionnement des utilisateurs, groupes et des attributs d'utilisateurs. Les administrateurs peuvent configurer cette application pour se connecter à un ou plusieurs répertoires LDAP ou Active Directories via une interface LDAP. Les attributs tels que le quota utilisateur, l'email, les images d'avatar, les adhésions de groupe et plus peuvent être envoyés sur Nextcloud à partir d'un répertoire avec les requêtes et les filtres appropriés.\n\nUn utilisateur se connecte à Nextcloud avec ses identifiants LDAP ou AD et obtient l'accès sur la base d'une demande d'authentification gérée par le serveur LDAP ou AD. Nextcloud ne stocke pas les mots de passe LDAP ou AD, mais ces informations d'identification sont utilisées pour authentifier un utilisateur et Nextcloud utilise ensuite une session pour l'ID utilisateur. De plus amples informations sont disponibles dans la documentation LDAP User and Group Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cette application permet aux administrateurs de connecter Nextcloud à un répertoire d'utilisateurs LDAP pour l'authentification et le provisionnement des utilisateurs, groupes et des attributs d'utilisateurs. Les administrateurs peuvent configurer cette application pour se connecter à un ou plusieurs répertoires LDAP ou Active Directories via une interface LDAP. Les attributs tels que le quota utilisateur, l'e-mail, les images d'avatar, les adhésions de groupe et plus peuvent être envoyés sur Nextcloud à partir d'un répertoire avec les requêtes et les filtres appropriés.\n\nUn utilisateur se connecte à Nextcloud avec ses identifiants LDAP ou AD et obtient l'accès sur la base d'une demande d'authentification gérée par le serveur LDAP ou AD. Nextcloud ne stocke pas les mots de passe LDAP ou AD, mais ces informations d'identification sont utilisées pour authentifier un utilisateur et Nextcloud utilise ensuite une session pour l'ID utilisateur. De plus amples informations sont disponibles dans la documentation LDAP User and Group Backend.", "Test Configuration" : "Tester la configuration", "Help" : "Aide", "Groups meeting these criteria are available in %s:" : "Les groupes respectant ces critères sont disponibles dans %s :", "Only these object classes:" : "Seulement ces classes d'objets :", - "Only from these groups:" : "Seulement dans ces groupes :", + "Only from these groups:" : "Seulement dans ces groupes :", "Search groups" : "Chercher dans les groupes", "Available groups" : "Groupes disponibles", "Selected groups" : "Groupes sélectionnés", @@ -81,13 +99,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Le filtre spécifie quels groupes LDAP ont accès à l'instance %s.", "Verify settings and count the groups" : "Vérifier les paramètres et compter les groupes", "When logging in, %s will find the user based on the following attributes:" : "À la connexion, %s cherchera l'utilisateur sur la base des attributs suivant :", - "LDAP/AD Username:" : "Nom d'utilisateur LDAP/AD :", + "LDAP/AD Username:" : "Nom d’utilisateur LDAP/AD :", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Autorise l'authentification à partir du nom d'utilisateur LDAP/AD.Celui-ci sera détecté et pourra être soit \"uid\", soit \"sAMAccountName\".", - "LDAP/AD Email Address:" : "Adresse électronique LDAP/AD :", + "LDAP/AD Email Address:" : "Adresse e-mail LDAP/AD :", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Autorise l'authentification par adresse e-mail. \"mail\" et \"mailPrimaryAddress\" sont autorisés.", "Other Attributes:" : "Autres attributs :", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors de la tentative de connexion. \"%%uid\" remplace le nom d'utilisateur lors de l'authentification. Exemple: \"uid=%%uid\"", "Test Loginname" : "Loginname de test", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tente de recevoir un DN pour l'identifiant de connexion donné et le filtre de connexion courant.", "Verify settings" : "Tester les paramètres", "%s. Server:" : "%s. Serveur :", "Add a new configuration" : "Ajouter une nouvelle configuration", @@ -97,10 +116,10 @@ OC.L10N.register( "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Vous pouvez omettre le protocole, sauf si vous avez besoin de SSL. Dans ce cas, préfixez avec ldaps://", "Port" : "Port", "Detect Port" : "Détecter le port", - "User DN" : "DN Utilisateur", + "User DN" : "Utilisateur DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilisateur client pour lequel la liaison doit se faire, par exemple uid=agent,dc=example,dc=com. Pour un accès anonyme, laisser le DN et le mot de passe vides.", "Password" : "Mot de passe", - "For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.", + "For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser l'utilisateur DN et le mot de passe vides.", "Save Credentials" : "Sauvegarder les informations d'identification", "One Base DN per line" : "Un DN de base par ligne", "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez indiquer le DN de base de vos utilisateurs et groupes via l'onglet Avancé", @@ -125,32 +144,34 @@ OC.L10N.register( "Cancel" : "Annuler", "Server" : "Serveur", "Users" : "Utilisateurs", - "Login Attributes" : "Attributs de login", + "Login Attributes" : "Attributs de connexion", "Groups" : "Groupes", "Expert" : "Expert", "Advanced" : "Avancé", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Attention :</b> Le module php LDAP n'est pas installé, par conséquent cette extension ne pourra fonctionner. Veuillez contacter votre administrateur système afin qu'il l'installe.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Attention :</b> Le module PHP LDAP n'est pas installé, par conséquent cette extension ne pourra pas fonctionner. Veuillez contacter votre administrateur système afin qu'il l'installe.", "Connection Settings" : "Paramètres de connexion", "Configuration Active" : "Configuration active", "When unchecked, this configuration will be skipped." : "Lorsque non cochée, la configuration sera ignorée.", "Backup (Replica) Host" : "Serveur de backup (réplique)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un serveur de backup optionnel. Il doit s'agir d'une réplique du serveur LDAP/AD principal.", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un serveur de secours optionnel. Il doit s'agir d'une réplique du serveur LDAP/AD principal.", "Backup (Replica) Port" : "Port du serveur de backup (réplique)", "Disable Main Server" : "Désactiver le serveur principal", - "Only connect to the replica server." : "Se connecter uniquement à la réplique", - "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL", + "Only connect to the replica server." : "Se connecter uniquement à la réplique.", + "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.", "Cache Time-To-Live" : "Durée de vie du cache (TTL)", "in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.", "Directory Settings" : "Paramètres du dossier", - "User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur", + "User Display Name Field" : "Champ « nom d'affichage » de l'utilisateur", "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.", "2nd User Display Name Field" : "Second attribut pour le nom d'affichage", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom d'affichage, entre parenthèses. Cela donnera par exemple : \"John Doe (john.doe@example.com)\".", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom affiché, entre parenthèses. Cela donnera par exemple: »John Doe (john.doe@example.org)«.", "Base User Tree" : "DN racine de l'arbre utilisateurs", "One User Base DN per line" : "Un DN de base utilisateur par ligne", "User Search Attributes" : "Attributs de recherche utilisateurs", - "Optional; one attribute per line" : "Optionnel, un attribut par ligne", + "Optional; one attribute per line" : "Facultatif ; un attribut par ligne", + "Disable users missing from LDAP" : "Désactiver les utilisateurs absents du LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Si activé, les utilisateurs importés du LDAP absents seront désactivés", "Group Display Name Field" : "Champ \"nom d'affichage\" du groupe", "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.", "Base Group Tree" : "DN racine de l'arbre groupes", @@ -160,7 +181,7 @@ OC.L10N.register( "Dynamic Group Member URL" : "Dynamic Group Member URL", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attribut LDAP des objets groupes qui contient l'URL de recherche LDAP déterminant quels objets appartiennent au groupe. (Un attribut vide désactive la fonctionnalité de groupes dynamiques)", "Nested Groups" : "Groupes imbriqués", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DN).", "Paging chunksize" : "Paging chunksize", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilisée pour les recherches LDAP paginées qui peuvent retourner des résultats par lots comme une énumération d'utilisateurs ou de groupes. (Configurer à 0 pour désactiver les recherches LDAP paginées)", "Enable LDAP password changes per user" : "Activer la modification du mot de passe LDAP par l'utilisateur", @@ -173,30 +194,46 @@ OC.L10N.register( "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laissez vide pour appliquer le quota par défaut de l'utilisateur. Sinon, spécifiez un attribut LDAP / AD.", "Quota Default" : "Quota par défaut", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Remplacez le quota par défaut des utilisateurs LDAP qui ne disposent pas d'un quota dans le champ Quota.", - "Email Field" : "Champ Email", + "Email Field" : "Champ E-mail", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Définissez le courrier électronique de l'utilisateur à partir de leur attribut LDAP. Laissez le champ vide pour appliquer le comportement par défaut.", "User Home Folder Naming Rule" : "Règle de nommage du répertoire utilisateur", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide pour le nom d’utilisateur (par défaut). Sinon, spécifiez un attribut LDAP/AD.", "\"$home\" Placeholder Field" : "\"$home\" Champ Placeholder", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home dans la configuration du stockage externe sera remplacé avec la valeur de l'attribut spécifié", + "User Profile Attributes" : "Attributs du profil utilisateur", + "Phone Field" : "Champ Téléphone", + "User profile Phone will be set from the specified attribute" : "Le téléphone du profil utilisateur va être défini depuis l'attribut spécifié", + "Website Field" : "Champ Site Web", + "User profile Website will be set from the specified attribute" : "Le Site Web du profil utilisateur va être défini depuis l'attribut spécifié", + "Address Field" : "Champ Adresse", + "User profile Address will be set from the specified attribute" : "L'adresse du profil utilisateur va être défini depuis l'attribut spécifié", + "Twitter Field" : "Champ Twitter", + "User profile Twitter will be set from the specified attribute" : "Le twitter du profil utilisateur va être défini depuis l'attribut spécifié", + "Fediverse Field" : "Champ Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Le Fediverse du profil utilisateur va être défini depuis l'attribut spécifié", + "Organisation Field" : "Champ Organisation", + "User profile Organisation will be set from the specified attribute" : "L'organisation du profil utilisateur va être défini depuis l'attribut spécifié", + "Role Field" : "Champ Rôle", + "User profile Role will be set from the specified attribute" : "Le rôle du profil utilisateur va être défini depuis l'attribut spécifié", + "Headline Field" : "Champ Titre", + "User profile Headline will be set from the specified attribute" : "Le titre du profil utilisateur va être défini depuis l'attribut spécifié", + "Biography Field" : "Champ Biographie", + "User profile Biography will be set from the specified attribute" : "La biographie du profil utilisateur va être défini depuis l'attribut spécifié", + "Birthdate Field" : "Champ de date de naissance", + "User profile Date of birth will be set from the specified attribute" : "La date de naissance du profil d'utilisateur sera définie à partir de l'attribut spécifié", + "Pronouns Field" : "Champ des pronoms", + "User profile Pronouns will be set from the specified attribute" : "Les pronoms du profil d'utilisateur seront définis à partir de l'attribut spécifié", "Internal Username" : "Nom d'utilisateur interne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [a-zA-Z0-9_.@-]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi parti des URLs distantes pour tous les services *DAV. Avec ce paramètre, le comportement par défaut peut être écrasé. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés). Laissez-le vide pour utiliser le comportement par défaut", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [a-zA-Z0-9_.@-]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi partie des URLs distantes, pour tous les services DAV par exemple. Avec ce paramètre, le comportement par défaut peut être écrasé. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés). Laissez-le vide pour utiliser le comportement par défaut", "Internal Username Attribute:" : "Nom d'utilisateur interne :", "Override UUID detection" : "Passer outre la détection des UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l’attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d’utilisateur interne basé sur l’UUID sera automatiquement créé, sauf s’il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l’attribut de votre choix. Vous devez alors vous assurer que l’attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu’il soit unique. Laisser vide pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", "UUID Attribute for Users:" : "Attribut UUID pour les Utilisateurs :", "UUID Attribute for Groups:" : "Attribut UUID pour les Groupes :", "Username-LDAP User Mapping" : "Association Nom d'utilisateur-Utilisateur LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilisateurs sont utilisés pour le stockage et l'assignation de (meta) données. Pour identifier et reconnaître précisément les utilisateurs, chaque utilisateur LDAP aura un nom interne spécifique. Cela requiert l'association d'un nom d'utilisateur NextCloud à un nom d'utilisateur LDAP. Le nom d'utilisateur créé est associé à l'attribut UUID de l'utilisateur LDAP. Par ailleurs, le DN est mémorisé en cache pour limiter les interactions LDAP mais il n'est pas utilisé pour l'identification. Si le DN est modifié, ces modifications seront retrouvées. Seul le nom interne à NextCloud est utilisé au sein du produit. Supprimer les associations créera des orphelins et l'action affectera toutes les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mais uniquement sur des environnements de tests et d'expérimentations.", "Clear Username-LDAP User Mapping" : "Supprimer l'association utilisateur interne-utilisateur LDAP", "Clear Groupname-LDAP Group Mapping" : "Supprimer l'association nom de groupe-groupe LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Une erreur s'est produite lors de la connexion au LDAP / AD. Veuillez vérifier l'hôte, le port et les informations d'identification.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La chaîne \"%uid\" est manquante. Cette chaîne est remplacée par l'identifiant de connexion lors des requêtes LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP / AD ne prend pas en charge memberOf.", - "LDAP / AD integration" : "Intégration LDAP/AD", - "LDAP / AD Username:" : "Nom d'utilisateur LDAP / AD :", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Autorise l'authentification à partir du nom d'utilisateur LDAP / AD.Celui-ci sera détecté et pourra être soit \"uid\", soit \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Adresse mail LDAP / AD :", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé depuis l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi parti des URLs distantes, par exemple pour tous les services *DAV. Avec ce paramètre, le comportement par défaut peut être écrasé. Laissez le vide pour utiliser le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés)." + "Invalid configuration. Please have a look at the logs for further details." : "Configuration non valide. Veuillez consulter les logs pour plus de détails." }, -"nplurals=2; plural=(n > 1);"); +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json index a6990467d5d..666b4fac5b4 100644 --- a/apps/user_ldap/l10n/fr.json +++ b/apps/user_ldap/l10n/fr.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuration non valable : Le lien anonyme n'est pas autorisé.", "Valid configuration, connection established!" : "Configuration valide, connexion établie !", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuration valide, mais le lien a échoué. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuration non valide. Veuillez consulter les logs pour plus de détails.", + "Invalid configuration: %s" : "Configuration non valide : %s", "No action specified" : "Aucune action spécifiée", "No configuration specified" : "Aucune configuration spécifiée", "No data specified" : "Aucune donnée spécifiée", - " Could not set configuration %s" : "Impossible d'appliquer la configuration %s", + "Invalid data specified" : "Données spécifiées invalides", + "Could not set configuration %1$s to %2$s" : "Impossible de changer la configuration %1$s pour %2$s", "Action does not exist" : "L'action n'existe pas", "Renewing …" : "Renouvellement en cours...", "Very weak password" : "Mot de passe très faible", @@ -16,7 +17,7 @@ "So-so password" : "Mot de passe tout juste acceptable", "Good password" : "Mot de passe de sécurité suffisante", "Strong password" : "Mot de passe fort", - "The Base DN appears to be wrong" : "Le DN de base est erroné", + "The Base DN appears to be wrong" : "Le DN de base semble être erroné", "Testing configuration…" : "Test de configuration", "Configuration incorrect" : "Configuration incorrecte", "Configuration incomplete" : "Configuration incomplète", @@ -30,8 +31,8 @@ "{nthServer}. Server" : "{nthServer}. Serveur", "No object found in the given Base DN. Please revise." : "Aucun objet trouvé dans le DN de base spécifié. Veuillez le vérifier.", "More than 1,000 directory entries available." : "Il y a plus de 1 000 entrées de répertoire disponibles.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrée disponible dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrée disponible dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié","{objectsFound} entrées disponibles dans le DN de base spécifié"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Une erreur est survenue. Veuillez vérifier le DN de base, ainsi que les paramètres de connexion et les informations d'identification.", "Do you really want to delete the current Server Configuration?" : "Êtes-vous sûr de vouloir effacer la configuration serveur actuelle ?", "Confirm Deletion" : "Confirmer la suppression", "Mappings cleared successfully!" : "Associations supprimées avec succès !", @@ -51,26 +52,43 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "La chaîne \"%uid\" est manquante. Cette chaîne est remplacée par l'identifiant de connexion lors des requêtes LDAP/AD.", "Please provide a login name to test against" : "Veuillez indiquer un identifiant de connexion avec lequel tester.", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP/AD ne prend pas en charge memberOf.", - "Password change rejected. Hint: " : "La modification du mot de passe a été rejetée. Indice :", + "Password change rejected. Hint: %s" : "Changement du mot de passe rejetée. Astuce : %s", + "Mandatory field \"%s\" left empty" : "Le champ obligatoire \"%s\" n'est pas renseigné", + "A password is given, but not an LDAP agent" : "Un mot de passe est indiqué, mais pas un agent LDAP", + "No password is given for the user agent" : "Aucun mot de passe n'est indiqué pour l'agent utilisateur", + "No LDAP base DN was given" : "Aucun DN de base LDAP n'a été indiqué", + "User base DN is not a subnode of global base DN" : "Le DN de base utilisateur n'est pas un sous-noeud du DN de base global", + "Group base DN is not a subnode of global base DN" : "Le DN de base du groupe n'est pas un sous-noeud du DN de base global", + "Login filter does not contain %s placeholder." : "Le filtre de connexion ne doit pas contenir l'élément de substitution %s", "Please login with the new password" : "Veuillez vous connecter avec le nouveau mot de passe", "LDAP User backend" : "Infrastructure utilisateur LDAP", "Your password will expire tomorrow." : "Votre mot de passe expirera demain", "Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours."], - "LDAP/AD integration" : "Integration LDAP/AD ", - "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], - "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."], + "LDAP/AD integration" : "Intégration LDAP/AD", + "LDAP Connection" : "Connexion LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["La liaison a échoué pour cette configuration LDAP: %s","Échec de la liaison pour %n les configurations LDAP: %s","Échec de la liaison pour %n les configurations LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["La recherche a échoué pour cette configuration LDAP: %s","La recherche a échoué pour %n des configurations LDAP: %s","La recherche a échoué pour %n des configurations LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Il existe une configuration LDAP inactive: %s","Il y a %n configurations LDAP inactives: %s","Il y a %n configurations LDAP inactives: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["La liaison et la recherche fonctionnent sur la connexion LDAP configurée (%s)","La liaison et la recherche fonctionnent sur toutes les %n connexions LDAP configurées (%s)","La liaison et la recherche fonctionnent sur toutes les %n connexions LDAP configurées (%s)"], + "Invalid LDAP UUIDs" : "UUID LDAP invalides", + "None found" : "Aucun trouvé", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Des UUID invalides pour les comptes LDAP ont été trouvés. Merci de vérifier votre paramètre « Passer outre la détection des UUID » dans la partie Expert de la configuration LDAP puis utiliser « occ ldap:update-uuid » pour les mettre à jour.", + "_%n group found_::_%n groups found_" : ["%n groupe trouvé","%n groupes trouvés","%n groupes trouvés"], + "> 1000 groups found" : "> 1000 groupes trouvés", + "> 1000 users found" : "> 1000 utilisateurs trouvés", + "_%n user found_::_%n users found_" : ["%n utilisateur trouvé","%n utilisateurs trouvés","%n utilisateurs trouvés"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres LDAP avancés.", "Could not find the desired feature" : "Impossible de trouver la fonction souhaitée", "Invalid Host" : "Hôte non valide", "LDAP user and group backend" : "Utilisateur LDAP et infrastructure de groupe", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Cette application autorise les administrateurs à connecter Nextcloud à un annuaire LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cette application permet aux administrateurs de connecter Nextcloud à un répertoire d'utilisateurs LDAP pour l'authentification et le provisionnement des utilisateurs, groupes et des attributs d'utilisateurs. Les administrateurs peuvent configurer cette application pour se connecter à un ou plusieurs répertoires LDAP ou Active Directories via une interface LDAP. Les attributs tels que le quota utilisateur, l'email, les images d'avatar, les adhésions de groupe et plus peuvent être envoyés sur Nextcloud à partir d'un répertoire avec les requêtes et les filtres appropriés.\n\nUn utilisateur se connecte à Nextcloud avec ses identifiants LDAP ou AD et obtient l'accès sur la base d'une demande d'authentification gérée par le serveur LDAP ou AD. Nextcloud ne stocke pas les mots de passe LDAP ou AD, mais ces informations d'identification sont utilisées pour authentifier un utilisateur et Nextcloud utilise ensuite une session pour l'ID utilisateur. De plus amples informations sont disponibles dans la documentation LDAP User and Group Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cette application permet aux administrateurs de connecter Nextcloud à un répertoire d'utilisateurs LDAP pour l'authentification et le provisionnement des utilisateurs, groupes et des attributs d'utilisateurs. Les administrateurs peuvent configurer cette application pour se connecter à un ou plusieurs répertoires LDAP ou Active Directories via une interface LDAP. Les attributs tels que le quota utilisateur, l'e-mail, les images d'avatar, les adhésions de groupe et plus peuvent être envoyés sur Nextcloud à partir d'un répertoire avec les requêtes et les filtres appropriés.\n\nUn utilisateur se connecte à Nextcloud avec ses identifiants LDAP ou AD et obtient l'accès sur la base d'une demande d'authentification gérée par le serveur LDAP ou AD. Nextcloud ne stocke pas les mots de passe LDAP ou AD, mais ces informations d'identification sont utilisées pour authentifier un utilisateur et Nextcloud utilise ensuite une session pour l'ID utilisateur. De plus amples informations sont disponibles dans la documentation LDAP User and Group Backend.", "Test Configuration" : "Tester la configuration", "Help" : "Aide", "Groups meeting these criteria are available in %s:" : "Les groupes respectant ces critères sont disponibles dans %s :", "Only these object classes:" : "Seulement ces classes d'objets :", - "Only from these groups:" : "Seulement dans ces groupes :", + "Only from these groups:" : "Seulement dans ces groupes :", "Search groups" : "Chercher dans les groupes", "Available groups" : "Groupes disponibles", "Selected groups" : "Groupes sélectionnés", @@ -79,13 +97,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Le filtre spécifie quels groupes LDAP ont accès à l'instance %s.", "Verify settings and count the groups" : "Vérifier les paramètres et compter les groupes", "When logging in, %s will find the user based on the following attributes:" : "À la connexion, %s cherchera l'utilisateur sur la base des attributs suivant :", - "LDAP/AD Username:" : "Nom d'utilisateur LDAP/AD :", + "LDAP/AD Username:" : "Nom d’utilisateur LDAP/AD :", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Autorise l'authentification à partir du nom d'utilisateur LDAP/AD.Celui-ci sera détecté et pourra être soit \"uid\", soit \"sAMAccountName\".", - "LDAP/AD Email Address:" : "Adresse électronique LDAP/AD :", + "LDAP/AD Email Address:" : "Adresse e-mail LDAP/AD :", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Autorise l'authentification par adresse e-mail. \"mail\" et \"mailPrimaryAddress\" sont autorisés.", "Other Attributes:" : "Autres attributs :", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors de la tentative de connexion. \"%%uid\" remplace le nom d'utilisateur lors de l'authentification. Exemple: \"uid=%%uid\"", "Test Loginname" : "Loginname de test", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tente de recevoir un DN pour l'identifiant de connexion donné et le filtre de connexion courant.", "Verify settings" : "Tester les paramètres", "%s. Server:" : "%s. Serveur :", "Add a new configuration" : "Ajouter une nouvelle configuration", @@ -95,10 +114,10 @@ "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Vous pouvez omettre le protocole, sauf si vous avez besoin de SSL. Dans ce cas, préfixez avec ldaps://", "Port" : "Port", "Detect Port" : "Détecter le port", - "User DN" : "DN Utilisateur", + "User DN" : "Utilisateur DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilisateur client pour lequel la liaison doit se faire, par exemple uid=agent,dc=example,dc=com. Pour un accès anonyme, laisser le DN et le mot de passe vides.", "Password" : "Mot de passe", - "For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser le DN utilisateur et le mot de passe vides.", + "For anonymous access, leave DN and Password empty." : "Pour un accès anonyme, laisser l'utilisateur DN et le mot de passe vides.", "Save Credentials" : "Sauvegarder les informations d'identification", "One Base DN per line" : "Un DN de base par ligne", "You can specify Base DN for users and groups in the Advanced tab" : "Vous pouvez indiquer le DN de base de vos utilisateurs et groupes via l'onglet Avancé", @@ -123,32 +142,34 @@ "Cancel" : "Annuler", "Server" : "Serveur", "Users" : "Utilisateurs", - "Login Attributes" : "Attributs de login", + "Login Attributes" : "Attributs de connexion", "Groups" : "Groupes", "Expert" : "Expert", "Advanced" : "Avancé", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Attention :</b> Le module php LDAP n'est pas installé, par conséquent cette extension ne pourra fonctionner. Veuillez contacter votre administrateur système afin qu'il l'installe.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Attention :</b> Le module PHP LDAP n'est pas installé, par conséquent cette extension ne pourra pas fonctionner. Veuillez contacter votre administrateur système afin qu'il l'installe.", "Connection Settings" : "Paramètres de connexion", "Configuration Active" : "Configuration active", "When unchecked, this configuration will be skipped." : "Lorsque non cochée, la configuration sera ignorée.", "Backup (Replica) Host" : "Serveur de backup (réplique)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un serveur de backup optionnel. Il doit s'agir d'une réplique du serveur LDAP/AD principal.", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Fournir un serveur de secours optionnel. Il doit s'agir d'une réplique du serveur LDAP/AD principal.", "Backup (Replica) Port" : "Port du serveur de backup (réplique)", "Disable Main Server" : "Désactiver le serveur principal", - "Only connect to the replica server." : "Se connecter uniquement à la réplique", - "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL", + "Only connect to the replica server." : "Se connecter uniquement à la réplique.", + "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.", "Cache Time-To-Live" : "Durée de vie du cache (TTL)", "in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.", "Directory Settings" : "Paramètres du dossier", - "User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur", + "User Display Name Field" : "Champ « nom d'affichage » de l'utilisateur", "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.", "2nd User Display Name Field" : "Second attribut pour le nom d'affichage", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom d'affichage, entre parenthèses. Cela donnera par exemple : \"John Doe (john.doe@example.com)\".", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optionnel. Attribut LDAP à ajouter au nom affiché, entre parenthèses. Cela donnera par exemple: »John Doe (john.doe@example.org)«.", "Base User Tree" : "DN racine de l'arbre utilisateurs", "One User Base DN per line" : "Un DN de base utilisateur par ligne", "User Search Attributes" : "Attributs de recherche utilisateurs", - "Optional; one attribute per line" : "Optionnel, un attribut par ligne", + "Optional; one attribute per line" : "Facultatif ; un attribut par ligne", + "Disable users missing from LDAP" : "Désactiver les utilisateurs absents du LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Si activé, les utilisateurs importés du LDAP absents seront désactivés", "Group Display Name Field" : "Champ \"nom d'affichage\" du groupe", "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.", "Base Group Tree" : "DN racine de l'arbre groupes", @@ -158,7 +179,7 @@ "Dynamic Group Member URL" : "Dynamic Group Member URL", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'attribut LDAP des objets groupes qui contient l'URL de recherche LDAP déterminant quels objets appartiennent au groupe. (Un attribut vide désactive la fonctionnalité de groupes dynamiques)", "Nested Groups" : "Groupes imbriqués", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DN).", "Paging chunksize" : "Paging chunksize", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilisée pour les recherches LDAP paginées qui peuvent retourner des résultats par lots comme une énumération d'utilisateurs ou de groupes. (Configurer à 0 pour désactiver les recherches LDAP paginées)", "Enable LDAP password changes per user" : "Activer la modification du mot de passe LDAP par l'utilisateur", @@ -171,30 +192,46 @@ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laissez vide pour appliquer le quota par défaut de l'utilisateur. Sinon, spécifiez un attribut LDAP / AD.", "Quota Default" : "Quota par défaut", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Remplacez le quota par défaut des utilisateurs LDAP qui ne disposent pas d'un quota dans le champ Quota.", - "Email Field" : "Champ Email", + "Email Field" : "Champ E-mail", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Définissez le courrier électronique de l'utilisateur à partir de leur attribut LDAP. Laissez le champ vide pour appliquer le comportement par défaut.", "User Home Folder Naming Rule" : "Règle de nommage du répertoire utilisateur", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide pour le nom d’utilisateur (par défaut). Sinon, spécifiez un attribut LDAP/AD.", "\"$home\" Placeholder Field" : "\"$home\" Champ Placeholder", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home dans la configuration du stockage externe sera remplacé avec la valeur de l'attribut spécifié", + "User Profile Attributes" : "Attributs du profil utilisateur", + "Phone Field" : "Champ Téléphone", + "User profile Phone will be set from the specified attribute" : "Le téléphone du profil utilisateur va être défini depuis l'attribut spécifié", + "Website Field" : "Champ Site Web", + "User profile Website will be set from the specified attribute" : "Le Site Web du profil utilisateur va être défini depuis l'attribut spécifié", + "Address Field" : "Champ Adresse", + "User profile Address will be set from the specified attribute" : "L'adresse du profil utilisateur va être défini depuis l'attribut spécifié", + "Twitter Field" : "Champ Twitter", + "User profile Twitter will be set from the specified attribute" : "Le twitter du profil utilisateur va être défini depuis l'attribut spécifié", + "Fediverse Field" : "Champ Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Le Fediverse du profil utilisateur va être défini depuis l'attribut spécifié", + "Organisation Field" : "Champ Organisation", + "User profile Organisation will be set from the specified attribute" : "L'organisation du profil utilisateur va être défini depuis l'attribut spécifié", + "Role Field" : "Champ Rôle", + "User profile Role will be set from the specified attribute" : "Le rôle du profil utilisateur va être défini depuis l'attribut spécifié", + "Headline Field" : "Champ Titre", + "User profile Headline will be set from the specified attribute" : "Le titre du profil utilisateur va être défini depuis l'attribut spécifié", + "Biography Field" : "Champ Biographie", + "User profile Biography will be set from the specified attribute" : "La biographie du profil utilisateur va être défini depuis l'attribut spécifié", + "Birthdate Field" : "Champ de date de naissance", + "User profile Date of birth will be set from the specified attribute" : "La date de naissance du profil d'utilisateur sera définie à partir de l'attribut spécifié", + "Pronouns Field" : "Champ des pronoms", + "User profile Pronouns will be set from the specified attribute" : "Les pronoms du profil d'utilisateur seront définis à partir de l'attribut spécifié", "Internal Username" : "Nom d'utilisateur interne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [a-zA-Z0-9_.@-]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi parti des URLs distantes pour tous les services *DAV. Avec ce paramètre, le comportement par défaut peut être écrasé. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés). Laissez-le vide pour utiliser le comportement par défaut", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [a-zA-Z0-9_.@-]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi partie des URLs distantes, pour tous les services DAV par exemple. Avec ce paramètre, le comportement par défaut peut être écrasé. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés). Laissez-le vide pour utiliser le comportement par défaut", "Internal Username Attribute:" : "Nom d'utilisateur interne :", "Override UUID detection" : "Passer outre la détection des UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l’attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d’utilisateur interne basé sur l’UUID sera automatiquement créé, sauf s’il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l’attribut de votre choix. Vous devez alors vous assurer que l’attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu’il soit unique. Laisser vide pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", "UUID Attribute for Users:" : "Attribut UUID pour les Utilisateurs :", "UUID Attribute for Groups:" : "Attribut UUID pour les Groupes :", "Username-LDAP User Mapping" : "Association Nom d'utilisateur-Utilisateur LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Les noms d'utilisateurs sont utilisés pour le stockage et l'assignation de (meta) données. Pour identifier et reconnaître précisément les utilisateurs, chaque utilisateur LDAP aura un nom interne spécifique. Cela requiert l'association d'un nom d'utilisateur NextCloud à un nom d'utilisateur LDAP. Le nom d'utilisateur créé est associé à l'attribut UUID de l'utilisateur LDAP. Par ailleurs, le DN est mémorisé en cache pour limiter les interactions LDAP mais il n'est pas utilisé pour l'identification. Si le DN est modifié, ces modifications seront retrouvées. Seul le nom interne à NextCloud est utilisé au sein du produit. Supprimer les associations créera des orphelins et l'action affectera toutes les configurations LDAP. NE JAMAIS SUPPRIMER LES ASSOCIATIONS EN ENVIRONNEMENT DE PRODUCTION, mais uniquement sur des environnements de tests et d'expérimentations.", "Clear Username-LDAP User Mapping" : "Supprimer l'association utilisateur interne-utilisateur LDAP", "Clear Groupname-LDAP Group Mapping" : "Supprimer l'association nom de groupe-groupe LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Une erreur s'est produite lors de la connexion au LDAP / AD. Veuillez vérifier l'hôte, le port et les informations d'identification.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La chaîne \"%uid\" est manquante. Cette chaîne est remplacée par l'identifiant de connexion lors des requêtes LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP / AD ne prend pas en charge memberOf.", - "LDAP / AD integration" : "Intégration LDAP/AD", - "LDAP / AD Username:" : "Nom d'utilisateur LDAP / AD :", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Autorise l'authentification à partir du nom d'utilisateur LDAP / AD.Celui-ci sera détecté et pourra être soit \"uid\", soit \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Adresse mail LDAP / AD :", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé depuis l'attribut UUID. Cela permet de s'assurer que le nom d'utilisateur est unique et que les caractères n'ont pas besoin d'être convertis. Le nom d'utilisateur interne a pour restriction de ne contenir que les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leurs correspondants ASCII ou simplement omis. En cas de collisions, un nombre sera ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier un utilisateur en interne. C'est aussi le nom par défaut du dossier personnel de l'utilisateur. Il fait aussi parti des URLs distantes, par exemple pour tous les services *DAV. Avec ce paramètre, le comportement par défaut peut être écrasé. Laissez le vide pour utiliser le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux utilisateurs LDAP mappés (ajoutés)." -},"pluralForm" :"nplurals=2; plural=(n > 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuration non valide. Veuillez consulter les logs pour plus de détails." +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/fy_NL.js b/apps/user_ldap/l10n/fy_NL.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/fy_NL.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/fy_NL.json b/apps/user_ldap/l10n/fy_NL.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/fy_NL.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ga.js b/apps/user_ldap/l10n/ga.js new file mode 100644 index 00000000000..68b5c19e735 --- /dev/null +++ b/apps/user_ldap/l10n/ga.js @@ -0,0 +1,239 @@ +OC.L10N.register( + "user_ldap", + { + "Failed to clear the mappings." : "Theip ar na mapálacha a ghlanadh.", + "Failed to delete the server configuration" : "Theip ar chumraíocht an fhreastalaí a scriosadh", + "Invalid configuration: Anonymous binding is not allowed." : "Cumraíocht neamhbhailí: Ní cheadaítear ceangal gan ainm.", + "Valid configuration, connection established!" : "Cumraíocht bhailí, nasc bunaithe!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cumraíocht bhailí, ach theip ar an gceangal. Seiceáil le do thoil socruithe agus dintiúir an fhreastalaí.", + "Invalid configuration: %s" : "Cumraíocht neamhbhailí: %s", + "No action specified" : "Níor sonraíodh aon ghníomh", + "No configuration specified" : "Níor sonraíodh cumraíocht ar bith", + "No data specified" : "Níor sonraíodh aon sonraí", + "Invalid data specified" : "Sonraí neamhbhailí", + "Could not set configuration %1$s to %2$s" : "Níorbh fhéidir cumraíocht %1$s a shocrú go %2$s", + "Action does not exist" : "Ní gníomh ann", + "Renewing …" : "Ag athnuachan…", + "Very weak password" : "Focal faire an-lag", + "Weak password" : "Pasfhocal lag", + "So-so password" : "mar sin-sin pasfhocal", + "Good password" : "pasfhocal maith", + "Strong password" : "Pasfhocal láidir", + "The Base DN appears to be wrong" : "Is cosúil go bhfuil an Base DN mícheart", + "Testing configuration…" : "Cumraíocht á thástáil…", + "Configuration incorrect" : "Cumraíocht mícheart", + "Configuration incomplete" : "Cumraíocht neamhiomlán", + "Configuration OK" : "Cumraíocht OK", + "Select groups" : "Roghnaigh grúpaí", + "Select object classes" : "Roghnaigh ranganna oibiachta", + "Please check the credentials, they seem to be wrong." : "Seiceáil na dintiúir, is cosúil go bhfuil siad mícheart le do thoil.", + "Please specify the port, it could not be auto-detected." : "Sonraigh an port le do thoil, níorbh fhéidir é a bhrath go huathoibríoch.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Níorbh fhéidir an bonn DN a bhrath go huathoibríoch, athbhreithnigh dintiúir, óstach agus port le do thoil.", + "Could not detect Base DN, please enter it manually." : "Níorbh fhéidir Bonn DN a bhrath, cuir isteach é de láimh le do thoil.", + "{nthServer}. Server" : "{nthServer}. Freastalaí", + "No object found in the given Base DN. Please revise." : "Níor aimsíodh aon réad sa Bhonn DN a thugtar. Athbhreithnigh le do thoil.", + "More than 1,000 directory entries available." : "Níos mó ná 1,000 iontráil eolaire ar fáil.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Tá iontráil {objectsFound} ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Tharla earráid. Seiceáil an Base DN, chomh maith le socruithe ceangail agus dintiúir le do thoil.", + "Do you really want to delete the current Server Configuration?" : "An bhfuil tú cinnte gur mhaith leat Cumraíocht an Fhreastalaí reatha a scriosadh?", + "Confirm Deletion" : "Deimhnigh Scriosadh", + "Mappings cleared successfully!" : "Mappings glanta go rathúil!", + "Error while clearing the mappings." : "Earráid agus na mapálacha á ghlanadh.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Ní cheadaítear ceangal gan ainm. Tabhair DN Úsáideora agus Pasfhocal le do thoil.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Earráid Oibríochtaí LDAP. Seans nach gceadófar ceangal gan ainm.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Theip ar shábháil. Cinntigh le do thoil go bhfuil an bunachar sonraí in Oibriú le do thoil. Athlódáil roimh leanúint ar aghaidh.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cumasóidh sé fiosruithe uathoibríocha LDAP má aistrítear an modh. Ag brath ar do mhéid LDAP féadfaidh siad tamall a ghlacadh. An bhfuil tú fós ag iarraidh an mód a athrú?", + "Mode switch" : "Athrú mód", + "Select attributes" : "Roghnaigh tréithe", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Úsáideoir gan aimsiú. Seiceáil do chuid tréithe logáil isteach agus ainm úsáideora le do thoil. Scagaire éifeachtach (le cóipeáil agus greamaigh le haghaidh bailíochtú na n-orduithe):<br/>", + "User found and settings verified." : "Fuarthas an t-úsáideoir agus fíoraíodh na socruithe.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Smaoinigh ar do chuardach a chaolú, mar gur chuimsigh sé go leor úsáideoirí, agus ní bheidh ach an chéad duine acu in ann logáil isteach.", + "An unspecified error occurred. Please check log and settings." : "Tharla earráid neamhshonraithe. Seiceáil le do thoil logáil agus socruithe le do thoil.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Tá an scagaire cuardaigh neamhbhailí, is dócha mar gheall ar cheisteanna comhréire amhail líon míchothrom na lúibíní oscailte agus dúnta. Athbhreithnigh le do thoil.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Tharla earráid cheangail le LDAP/AD. Seiceáil an t-óstach, an port agus na dintiúir le do thoil.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Tá coinneálaí an ionaid \"%uid\" ar iarraidh. Cuirfear an t-ainm logála isteach ina áit agus LDAP/AD á cheistiú.", + "Please provide a login name to test against" : "Tabhair ainm logáil isteach le tástáil ina choinne le do thoil", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Díchumasaíodh an bosca grúpa toisc nach dtacaíonn an freastalaí LDAP/AD le memberOf.", + "Password change rejected. Hint: %s" : "Diúltaíodh don athrú pasfhocal. Leid: %s", + "Mandatory field \"%s\" left empty" : "Réimse éigeantach \"%s\"fágtha folamh", + "A password is given, but not an LDAP agent" : "Tugtar pasfhocal, ach ní thugtar do ghníomhaire LDAP", + "No password is given for the user agent" : "Ní thugtar aon phasfhocal don ghníomhaire úsáideora", + "No LDAP base DN was given" : "Níor tugadh bonn LDAP DN", + "User base DN is not a subnode of global base DN" : "Ní fonód de bhonn domhanda DN é an bonn úsáideora DN", + "Group base DN is not a subnode of global base DN" : "Ní fonód de bhonn domhanda DN é bonnghrúpa DN", + "Login filter does not contain %s placeholder." : "Níl %s coinneálaí logála isteach sa scagaire logála isteach.", + "Please login with the new password" : "Logáil isteach leis an bpasfhocal nua le do thoil", + "LDAP User backend" : "Inneall Úsáideora LDAP", + "Your password will expire tomorrow." : "Rachaidh do phasfhocal in éag amárach.", + "Your password will expire today." : "Rachaidh do phasfhocal in éag inniu.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá."], + "LDAP/AD integration" : "Comhtháthú LDAP/AD", + "LDAP Connection" : "Ceangal LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Theip ar cheangal don chumraíocht LDAP seo: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Theip ar chuardach don chumraíocht LDAP seo: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Tá cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Oibríonn ceangal agus cuardach ar an gceangal LDAP cumraithe (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)"], + "Invalid LDAP UUIDs" : "UUIDanna LDAP neamhbhailí", + "None found" : "Níor aimsíodh aon cheann", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Fuarthas UUIDanna neamhbhailí de chuntais nó de ghrúpaí LDAP. Athbhreithnigh do shocruithe \"Sáraigh braite UUID\" sa chuid Saineolaithe de chumraíocht LDAP agus úsáid \"occ ldap:update-uuid\" chun iad a nuashonrú le do thoil.", + "_%n group found_::_%n groups found_" : ["%n grúpa aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe"], + "> 1000 groups found" : "> Fuarthas 1000 grúpaí", + "> 1000 users found" : "> Fuarthas 1000 úsáideoirí", + "_%n user found_::_%n users found_" : ["%núsáideoir aimsithe","%núsáideoirí aimsithe","%n úsáideoirí aimsithe","%n úsáideoirí aimsithe","%n úsáideoirí aimsithe"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Níorbh fhéidir aitreabúid ainm taispeána úsáideora a bhrath. Sonraigh tú féin é i ardsocruithe LDAP le do thoil.", + "Could not find the desired feature" : "Níorbh fhéidir an ghné inmhianaithe a aimsiú", + "Invalid Host" : "Óstach Neamhbhailí", + "LDAP user and group backend" : "Úsáideoir LDAP agus inneall grúpa", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Cuireann an feidhmchlár seo ar chumas riarthóirí Nextcloud a nascadh le heolaire úsáideoirí atá bunaithe ar LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cuireann an feidhmchlár seo ar chumas riarthóirí Nextcloud a nascadh le heolaire úsáideoirí atá bunaithe ar LDAP chun úsáideoirí, grúpaí agus tréithe úsáideoirí a fhíordheimhniú agus a sholáthar. Is féidir le riarthóirí an feidhmchlár seo a chumrú chun nascadh le heolaire LDAP amháin nó níos mó nó le hEolairí Gníomhacha trí chomhéadan LDAP. Is féidir tréithe ar nós cuóta úsáideora, ríomhphost, pictiúir avatar, ballraíocht ghrúpa agus níos mó a tharraingt isteach in Nextcloud ó eolaire leis na ceisteanna agus na scagairí cuí.\n\nLogálann úsáideoir isteach ar Nextcloud lena dintiúir LDAP nó AD, agus tugtar rochtain dó bunaithe ar iarratas fíordheimhnithe a láimhseálann an freastalaí LDAP nó AD. Ní stórálann Nextcloud pasfhocail LDAP nó AD, ach úsáidtear na dintiúir seo chun úsáideoir a fhíordheimhniú agus ansin úsáideann Nextcloud seisiún don ID úsáideora. Tá tuilleadh faisnéise ar fáil i gcáipéisíocht an LDAP Úsáideoir agus Inneall Grúpa.", + "Test Configuration" : "Cumraíocht Tástála", + "Help" : "Cabhrú", + "Groups meeting these criteria are available in %s:" : "Tá grúpaí a chomhlíonann na critéir seo ar fáil i %s:", + "Only these object classes:" : "Na haicmí oibiachta seo amháin:", + "Only from these groups:" : "Ó na grúpaí seo amháin:", + "Search groups" : "Cuardaigh grúpaí", + "Available groups" : "Grúpaí atá ar fáil", + "Selected groups" : "Grúpaí roghnaithe", + "Edit LDAP Query" : "Cuir Iarratas LDAP in eagar", + "LDAP Filter:" : "Scagaire LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Sonraíonn an scagaire na grúpaí LDAP a mbeidh rochtain acu ar an gcás %s.", + "Verify settings and count the groups" : "Fíoraigh socruithe agus comhaireamh na grúpaí", + "When logging in, %s will find the user based on the following attributes:" : "Nuair a bheidh tú ag logáil isteach, gheobhaidh %s an t-úsáideoir bunaithe ar na tréithe seo a leanas:", + "LDAP/AD Username:" : "Ainm Úsáideora LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Ligeann sé logáil isteach in aghaidh an ainm úsáideora LDAP/AD, arb é \"uid\" nó \"sAMAccountName\" é agus a bhraitear.", + "LDAP/AD Email Address:" : "Seoladh Ríomhphoist LDAP/AD:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Ligeann sé logáil isteach i gcoinne tréith ríomhphoist. \"mail\" agus \"mailPrimaryAddress\" ceadaithe.", + "Other Attributes:" : "Tréithe Eile:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Sainmhíníonn sé an scagaire le cur i bhfeidhm, nuair a dhéantar iarracht logáil isteach. Cuirtear \"%%uid\" in ionad an ainm úsáideora sa ghníomh logála isteach. Sampla: \"uid=%%uid\"", + "Test Loginname" : "Tástáil Ainm Logála", + "Attempts to receive a DN for the given loginname and the current login filter" : "Iarrachtaí ar DN a fháil don logainm tugtha agus don scagaire logála isteach reatha", + "Verify settings" : "Fíoraigh socruithe", + "%s. Server:" : "%s. Freastalaí:", + "Add a new configuration" : "Cuir cumraíocht nua leis", + "Copy current configuration into new directory binding" : "Cóipeáil an chumraíocht reatha i gceangal eolaire nua", + "Delete the current configuration" : "Scrios an chumraíocht reatha", + "Host" : "Óstach", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Is féidir leat an prótacal a fhágáil ar lár, mura dteastaíonn SSL uait. Más ea, cuir tús le ldaps://", + "Port" : "Port", + "Detect Port" : "Braith Port", + "User DN" : "Úsáideoir DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN an chliaint-úsáideoir lena ndéanfar an ceangal, e.g. uid=agent,dc=example,dc=com. Le rochtain gan ainm, fág DN agus Pasfhocal folamh.", + "Password" : "Pasfhocal", + "For anonymous access, leave DN and Password empty." : "Le rochtain gan ainm, fág DN agus Pasfhocal folamh.", + "Save Credentials" : "Sábháil Dintiúir", + "One Base DN per line" : "Bonn DN amháin in aghaidh an líne", + "You can specify Base DN for users and groups in the Advanced tab" : "Is féidir leat Bonn DN a shonrú d’úsáideoirí agus do ghrúpaí sa chluaisín Casta", + "Detect Base DN" : "Braith Bonn DN", + "Test Base DN" : "Bonn Tástála DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Seachnaíonn iarratais uathoibríocha LDAP. Níos fearr le haghaidh socruithe níos mó, ach teastaíonn roinnt eolais LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Iontráil scagairí LDAP de láimh (molta le haghaidh eolairí móra)", + "Listing and searching for users is constrained by these criteria:" : "Tá liostú agus cuardach úsáideoirí srianta ag na critéir seo:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Is iad na haicmí oibiachta is coitianta d’úsáideoirí ná Duine eagraíochtúil, duine, úsáideoir, agus inetOrgPerson. Mura bhfuil tú cinnte cén aicme oibiachta le roghnú, téigh i gcomhairle le riarthóir do eolaire le do thoil.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Sonraíonn an scagaire cé na húsáideoirí LDAP a mbeidh rochtain acu ar an gcás %s.", + "Verify settings and count users" : "Fíoraigh socruithe agus comhaireamh úsáideoirí", + "Saving" : "Shábháil", + "Back" : "Ar ais", + "Continue" : "Leanúint ar aghaidh", + "Please renew your password." : "Athnuaigh do phasfhocal le do thoil.", + "An internal error occurred." : "Tharla earráid inmheánach.", + "Please try again or contact your administrator." : "Bain triail eile as nó déan teagmháil le do riarthóir.", + "Current password" : "Pasfhocal reatha", + "New password" : "Focal Faire Nua", + "Renew password" : "Athnuaigh pasfhocal", + "Wrong password." : "Pasfhocal mícheart.", + "Cancel" : "Cealaigh", + "Server" : "Freastalaí", + "Users" : "Úsáideoirí", + "Login Attributes" : "Tréithe Logála Isteach", + "Groups" : "Grúpaí", + "Expert" : "Saineolaí", + "Advanced" : "Casta", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Rabhadh:</b> Níl an modúl PHP LDAP suiteáilte, ní oibreoidh an t-inneall. Iarr ar do riarthóir córais é a shuiteáil le do thoil.", + "Connection Settings" : "Socruithe Ceangail", + "Configuration Active" : "Cumraíocht Ghníomhach", + "When unchecked, this configuration will be skipped." : "Nuair nach ndéantar í a sheiceáil, déanfar an chumraíocht seo a scipeáil.", + "Backup (Replica) Host" : "Cúltaca (Macasamhail) Óstach", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Tabhair óstach cúltaca roghnach. Caithfidh gur macasamhail é den phríomhfhreastalaí LDAP/AD.", + "Backup (Replica) Port" : "Cúltaca (Macasamhail) Port", + "Disable Main Server" : "Díchumasaigh Príomhfhreastalaí", + "Only connect to the replica server." : "Ná déan ach ceangal leis an bhfreastalaí macasamhail.", + "Turn off SSL certificate validation." : "Múch bailíochtú teastais SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Ní mholtar é, bain úsáid as le haghaidh tástála amháin! Mura n-oibríonn an ceangal ach leis an rogha seo, iompórtáil teastas SSL an fhreastalaí LDAP i do fhreastalaí %s.", + "Cache Time-To-Live" : "Taisce Am-Chun-Beo", + "in seconds. A change empties the cache." : "i soicindí. Folaíonn athrú an taisce.", + "Directory Settings" : "Socruithe Eolaire", + "User Display Name Field" : "Réimse Ainm Taispeána Úsáideora", + "The LDAP attribute to use to generate the user's display name." : "An tréith LDAP le húsáid chun ainm taispeána an úsáideora a ghiniúint.", + "2nd User Display Name Field" : "2 Réimse Ainm Taispeána Úsáideora", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Roghnach. Aitreabúid LDAP le cur leis an ainm taispeána idir lúibíní. Torthaí i e.g. »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Crann Úsáideora Bonn", + "One User Base DN per line" : "Bonn Úsáideora amháin DN in aghaidh na líne", + "User Search Attributes" : "Tréithe Cuardaigh Úsáideora", + "Optional; one attribute per line" : "Roghnach; tréith amháin in aghaidh an líne", + "Disable users missing from LDAP" : "Díchumasaigh úsáideoirí in easnamh ó LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Nuair a chuirtear ar siúl é, díchumasófar úsáideoirí a allmhairítear ó LDAP atá in easnamh ansin", + "Group Display Name Field" : "Réimse Ainm Taispeána Grúpa", + "The LDAP attribute to use to generate the groups's display name." : "An tréith LDAP le húsáid chun ainm taispeána an ghrúpaí a ghiniúint.", + "Base Group Tree" : "Crann Bun-ghrúpa", + "One Group Base DN per line" : "Bonn Grúpa amháin DN in aghaidh na líne", + "Group Search Attributes" : "Tréithe Cuardach Grúpa", + "Group-Member association" : "Comhlachas Grúpa-Ball", + "Dynamic Group Member URL" : "URL Ball Grúpa Dinimiciúla", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "An aitreabúid LDAP go bhfuil URL cuardaigh LDAP ar oibiachtaí grúpa a shocraíonn cad iad na réada a bhaineann leis an ngrúpa. (Díchumasaíonn socrú folamh feidhmiúlacht bhallraíocht ghrúpa dinimiciúil.)", + "Nested Groups" : "Grúpaí Neadaithe", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Nuair a chuirtear ar siúl é, tacaítear le grúpaí ina bhfuil grúpaí. (Ní oibríonn sé ach amháin má tá DNanna san aitreabúid bhall grúpa.)", + "Paging chunksize" : "Paging smután", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize a úsáidtear le haghaidh cuardaigh leathanaigh LDAP a d'fhéadfadh torthaí toirtiúla a fháil ar nós áirimh úsáideora nó grúpa. (Má shocraítear é 0, díchumasaítear cuardaigh leathanacháilte LDAP sna cásanna sin.)", + "Enable LDAP password changes per user" : "Cumasaigh athruithe pasfhocail LDAP in aghaidh an úsáideora", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Ceadaigh d’úsáideoirí LDAP a bpasfhocal a athrú agus cead a thabhairt d’Oll-Riarthóirí agus do Riarthóirí Grúpa pasfhocal a n-úsáideoirí LDAP a athrú. Ní oibríonn sé ach nuair a bhíonn polasaithe rialaithe rochtana cumraithe dá réir ar an bhfreastalaí LDAP. Toisc go seoltar pasfhocail i ngnáth-théacs chuig an bhfreastalaí LDAP, ní mór criptiú iompair a úsáid agus ba cheart hash pasfhocail a chumrú ar an bhfreastalaí LDAP.", + "(New password is sent as plain text to LDAP)" : "(Seoltar pasfhocal nua mar ghnáth-théacs chuig LDAP)", + "Default password policy DN" : "Beartas réamhshocraithe pasfhocail DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "An DN de pholasaí réamhshocraithe pasfhocail a úsáidfear chun pasfhocal a láimhseáil as feidhm. Ní oibríonn sé ach amháin nuair a chumasaítear athruithe pasfhocail LDAP in aghaidh an úsáideora agus nuair nach dtacaítear leis ach ó OpenLDAP. Fág folamh chun láimhseáil pasfhocal éaga a dhíchumasú.", + "Special Attributes" : "Tréithe Speisialta", + "Quota Field" : "Réimse Cuóta", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Fág folamh le haghaidh cuóta réamhshocraithe an úsáideora. Seachas sin, sonraigh tréith LDAP/AD.", + "Quota Default" : "Réamhshocrú Cuóta", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sáraigh cuóta réamhshocraithe d’úsáideoirí LDAP nach bhfuil cuóta socraithe acu sa Réimse Cuóta.", + "Email Field" : "Réimse Ríomhphost", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Socraigh ríomhphost an úsáideora óna tréith LDAP. Fág folamh é le haghaidh iompair réamhshocraithe.", + "User Home Folder Naming Rule" : "Riail Ainmnithe Fillteán Baile an Úsáideora", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Fág folamh le haghaidh ainm úsáideora (réamhshocraithe). Seachas sin, sonraigh tréith LDAP/AD.", + "\"$home\" Placeholder Field" : "Réimse Sealbhóir Áite \"$home\".", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Cuirfear luach na haitreabúide sonraithe in ionad $home i gcumraíocht stórála seachtrach", + "User Profile Attributes" : "Tréithe Próifíl Úsáideora", + "Phone Field" : "Réimse Fón", + "User profile Phone will be set from the specified attribute" : "Socrófar fón próifíl úsáideora ón tréith shonraithe", + "Website Field" : "Réimse Gréasáin", + "User profile Website will be set from the specified attribute" : "Próifíl úsáideora Socrófar suíomh Gréasáin ón tréith shonraithe", + "Address Field" : "Réimse Seoladh", + "User profile Address will be set from the specified attribute" : "Socrófar Seoladh phróifíl úsáideora ón tréith shonraithe", + "Twitter Field" : "Réimse Twitter", + "User profile Twitter will be set from the specified attribute" : "Socrófar próifíl úsáideora Twitter ón tréith shonraithe", + "Fediverse Field" : "Réimse Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Socrófar próifíl úsáideora Fediverse ón tréith shonraithe", + "Organisation Field" : "Réimse Eagrúcháin", + "User profile Organisation will be set from the specified attribute" : "Próifíl úsáideora Socrófar Eagraíocht ón tréith shonraithe", + "Role Field" : "Réimse Ról", + "User profile Role will be set from the specified attribute" : "Próifíl úsáideora Socrófar Ról ón tréith shonraithe", + "Headline Field" : "Réimse Ceannlíne", + "User profile Headline will be set from the specified attribute" : "Socrófar Ceannlíne próifíle úsáideora ón tréith shonraithe", + "Biography Field" : "Réimse Beathaisnéis", + "User profile Biography will be set from the specified attribute" : "Socrófar Beathaisnéis phróifíl úsáideora ón tréith shonraithe", + "Birthdate Field" : "Réimse Breithlá", + "User profile Date of birth will be set from the specified attribute" : "Próifíl úsáideora Socrófar dáta breithe ón tréith shonraithe", + "Pronouns Field" : "Réimse Forainmneacha", + "User profile Pronouns will be set from the specified attribute" : "Socrófar Forainmneacha próifíle úsáideora ón aitreabúid sonraithe", + "Internal Username" : "Ainm Úsáideora Inmheánach", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De réir réamhshocraithe cruthófar an t-ainm úsáideora inmheánach ón aitreabúid UUID. Cinntíonn sé go bhfuil an t-ainm úsáideora uathúil agus ní gá carachtair a thiontú. Tá an srian ar an ainm úsáideora inmheánach nach gceadaítear ach na carachtair seo: [a-zA-Z0-9_.@-]. Cuirtear a gcomhfhreagras ASCII in ionad carachtair eile nó fágtar ar lár iad. Nuair a bhíonn imbhuailtí cuirfear uimhir leis/méadófar é. Úsáidtear an t-ainm úsáideora inmheánach chun úsáideoir a aithint go hinmheánach. Is é an t-ainm réamhshocraithe é freisin don fhillteán baile úsáideora. Is cuid de URLanna cianda é freisin, mar shampla do gach seirbhís DAV. Leis an socrú seo, is féidir an t-iompar réamhshocraithe a shárú. Ní bheidh éifeacht ag athruithe ach ar úsáideoirí LDAP nua-mhapáilte (curtha leis). Fág é folamh le haghaidh iompar réamhshocraithe.", + "Internal Username Attribute:" : "Tréith Ainm Úsáideora Inmheánach:", + "Override UUID detection" : "Sáraigh brath UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "De réir réamhshocraithe, braitear an aitreabúid UUID go huathoibríoch. Úsáidtear an tréith UUID chun úsáideoirí agus grúpaí LDAP a shainaithint gan amhras. Chomh maith leis sin, cruthófar an t-ainm úsáideora inmheánach bunaithe ar an UUID, mura sonraítear a mhalairt thuas. Is féidir leat an socrú a shárú agus tréith de do rogha a chur ar aghaidh. Ní mór duit a chinntiú gur féidir an tréith is rogha leat a fháil d’úsáideoirí agus do ghrúpaí araon agus go bhfuil sé uathúil. Fág é folamh le haghaidh iompar réamhshocraithe. Ní bheidh éifeacht ag athruithe ach ar úsáideoirí agus grúpaí LDAP nua-mhapáilte (curtha leis).", + "UUID Attribute for Users:" : "Tréith UUID d'Úsáideoirí:", + "UUID Attribute for Groups:" : "Tréith UUID do Ghrúpaí:", + "Username-LDAP User Mapping" : "Mapáil Úsáideora Ainm Úsáideora-LDAP", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Úsáidtear ainmneacha úsáideoirí chun meiteashonraí a stóráil agus a shannadh. Chun úsáideoirí a shainaithint agus a aithint go beacht, beidh ainm úsáideora inmheánach ag gach úsáideoir LDAP. Teastaíonn mapáil ón ainm úsáideora go dtí an t-úsáideoir LDAP chuige seo. Tá an t-ainm úsáideora cruthaithe mapáilte chuig UUID an úsáideora LDAP. Ina theannta sin tá an DN i dtaisce freisin chun idirghníomhaíocht LDAP a laghdú, ach ní úsáidtear é le haghaidh aitheantais. Má athraíonn an DN, beidh na hathruithe le fáil. Úsáidtear an t-ainm úsáideora inmheánach ar fad. Beidh rudaí fágtha i ngach áit chun na mapálacha a ghlanadh. Ní íogair don chumraíocht é na mapálacha a ghlanadh, bíonn tionchar aige ar gach cumraíocht LDAP! Ná glan na mapálacha riamh i dtimpeallacht táirgthe, ach amháin ag céim tástála nó turgnamhach.", + "Clear Username-LDAP User Mapping" : "Glan Léarscáiliú Úsáideora Ainm Úsáideora-LDAP", + "Clear Groupname-LDAP Group Mapping" : "Glan Léarscáiliú Grúpa Ainm an Ghrúpa-LDAP", + "Invalid configuration. Please have a look at the logs for further details." : "Cumraíocht neamhbhailí. Féach ar na logaí le haghaidh tuilleadh sonraí le do thoil." +}, +"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); diff --git a/apps/user_ldap/l10n/ga.json b/apps/user_ldap/l10n/ga.json new file mode 100644 index 00000000000..4bd89e1f0e6 --- /dev/null +++ b/apps/user_ldap/l10n/ga.json @@ -0,0 +1,237 @@ +{ "translations": { + "Failed to clear the mappings." : "Theip ar na mapálacha a ghlanadh.", + "Failed to delete the server configuration" : "Theip ar chumraíocht an fhreastalaí a scriosadh", + "Invalid configuration: Anonymous binding is not allowed." : "Cumraíocht neamhbhailí: Ní cheadaítear ceangal gan ainm.", + "Valid configuration, connection established!" : "Cumraíocht bhailí, nasc bunaithe!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cumraíocht bhailí, ach theip ar an gceangal. Seiceáil le do thoil socruithe agus dintiúir an fhreastalaí.", + "Invalid configuration: %s" : "Cumraíocht neamhbhailí: %s", + "No action specified" : "Níor sonraíodh aon ghníomh", + "No configuration specified" : "Níor sonraíodh cumraíocht ar bith", + "No data specified" : "Níor sonraíodh aon sonraí", + "Invalid data specified" : "Sonraí neamhbhailí", + "Could not set configuration %1$s to %2$s" : "Níorbh fhéidir cumraíocht %1$s a shocrú go %2$s", + "Action does not exist" : "Ní gníomh ann", + "Renewing …" : "Ag athnuachan…", + "Very weak password" : "Focal faire an-lag", + "Weak password" : "Pasfhocal lag", + "So-so password" : "mar sin-sin pasfhocal", + "Good password" : "pasfhocal maith", + "Strong password" : "Pasfhocal láidir", + "The Base DN appears to be wrong" : "Is cosúil go bhfuil an Base DN mícheart", + "Testing configuration…" : "Cumraíocht á thástáil…", + "Configuration incorrect" : "Cumraíocht mícheart", + "Configuration incomplete" : "Cumraíocht neamhiomlán", + "Configuration OK" : "Cumraíocht OK", + "Select groups" : "Roghnaigh grúpaí", + "Select object classes" : "Roghnaigh ranganna oibiachta", + "Please check the credentials, they seem to be wrong." : "Seiceáil na dintiúir, is cosúil go bhfuil siad mícheart le do thoil.", + "Please specify the port, it could not be auto-detected." : "Sonraigh an port le do thoil, níorbh fhéidir é a bhrath go huathoibríoch.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Níorbh fhéidir an bonn DN a bhrath go huathoibríoch, athbhreithnigh dintiúir, óstach agus port le do thoil.", + "Could not detect Base DN, please enter it manually." : "Níorbh fhéidir Bonn DN a bhrath, cuir isteach é de láimh le do thoil.", + "{nthServer}. Server" : "{nthServer}. Freastalaí", + "No object found in the given Base DN. Please revise." : "Níor aimsíodh aon réad sa Bhonn DN a thugtar. Athbhreithnigh le do thoil.", + "More than 1,000 directory entries available." : "Níos mó ná 1,000 iontráil eolaire ar fáil.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Tá iontráil {objectsFound} ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh","{objectsFound} iontrálacha ar fáil laistigh den Bhunáit DN a soláthraíodh"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Tharla earráid. Seiceáil an Base DN, chomh maith le socruithe ceangail agus dintiúir le do thoil.", + "Do you really want to delete the current Server Configuration?" : "An bhfuil tú cinnte gur mhaith leat Cumraíocht an Fhreastalaí reatha a scriosadh?", + "Confirm Deletion" : "Deimhnigh Scriosadh", + "Mappings cleared successfully!" : "Mappings glanta go rathúil!", + "Error while clearing the mappings." : "Earráid agus na mapálacha á ghlanadh.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Ní cheadaítear ceangal gan ainm. Tabhair DN Úsáideora agus Pasfhocal le do thoil.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Earráid Oibríochtaí LDAP. Seans nach gceadófar ceangal gan ainm.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Theip ar shábháil. Cinntigh le do thoil go bhfuil an bunachar sonraí in Oibriú le do thoil. Athlódáil roimh leanúint ar aghaidh.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cumasóidh sé fiosruithe uathoibríocha LDAP má aistrítear an modh. Ag brath ar do mhéid LDAP féadfaidh siad tamall a ghlacadh. An bhfuil tú fós ag iarraidh an mód a athrú?", + "Mode switch" : "Athrú mód", + "Select attributes" : "Roghnaigh tréithe", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Úsáideoir gan aimsiú. Seiceáil do chuid tréithe logáil isteach agus ainm úsáideora le do thoil. Scagaire éifeachtach (le cóipeáil agus greamaigh le haghaidh bailíochtú na n-orduithe):<br/>", + "User found and settings verified." : "Fuarthas an t-úsáideoir agus fíoraíodh na socruithe.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Smaoinigh ar do chuardach a chaolú, mar gur chuimsigh sé go leor úsáideoirí, agus ní bheidh ach an chéad duine acu in ann logáil isteach.", + "An unspecified error occurred. Please check log and settings." : "Tharla earráid neamhshonraithe. Seiceáil le do thoil logáil agus socruithe le do thoil.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Tá an scagaire cuardaigh neamhbhailí, is dócha mar gheall ar cheisteanna comhréire amhail líon míchothrom na lúibíní oscailte agus dúnta. Athbhreithnigh le do thoil.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Tharla earráid cheangail le LDAP/AD. Seiceáil an t-óstach, an port agus na dintiúir le do thoil.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Tá coinneálaí an ionaid \"%uid\" ar iarraidh. Cuirfear an t-ainm logála isteach ina áit agus LDAP/AD á cheistiú.", + "Please provide a login name to test against" : "Tabhair ainm logáil isteach le tástáil ina choinne le do thoil", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Díchumasaíodh an bosca grúpa toisc nach dtacaíonn an freastalaí LDAP/AD le memberOf.", + "Password change rejected. Hint: %s" : "Diúltaíodh don athrú pasfhocal. Leid: %s", + "Mandatory field \"%s\" left empty" : "Réimse éigeantach \"%s\"fágtha folamh", + "A password is given, but not an LDAP agent" : "Tugtar pasfhocal, ach ní thugtar do ghníomhaire LDAP", + "No password is given for the user agent" : "Ní thugtar aon phasfhocal don ghníomhaire úsáideora", + "No LDAP base DN was given" : "Níor tugadh bonn LDAP DN", + "User base DN is not a subnode of global base DN" : "Ní fonód de bhonn domhanda DN é an bonn úsáideora DN", + "Group base DN is not a subnode of global base DN" : "Ní fonód de bhonn domhanda DN é bonnghrúpa DN", + "Login filter does not contain %s placeholder." : "Níl %s coinneálaí logála isteach sa scagaire logála isteach.", + "Please login with the new password" : "Logáil isteach leis an bpasfhocal nua le do thoil", + "LDAP User backend" : "Inneall Úsáideora LDAP", + "Your password will expire tomorrow." : "Rachaidh do phasfhocal in éag amárach.", + "Your password will expire today." : "Rachaidh do phasfhocal in éag inniu.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá.","Rachaidh do phasfhocal in éag laistigh de %n lá."], + "LDAP/AD integration" : "Comhtháthú LDAP/AD", + "LDAP Connection" : "Ceangal LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Theip ar cheangal don chumraíocht LDAP seo: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s","Theip ar cheangal le haghaidh %n cumraíochtaí LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Theip ar chuardach don chumraíocht LDAP seo: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s","Theip ar chuardach le haghaidh %n cumraíochtaí LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Tá cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s","Tá %n cumraíocht LDAP neamhghníomhach: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Oibríonn ceangal agus cuardach ar an gceangal LDAP cumraithe (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)","Oibríonn ceangal agus cuardach ar na naisc LDAP go léir atá cumraithe %n (%s)"], + "Invalid LDAP UUIDs" : "UUIDanna LDAP neamhbhailí", + "None found" : "Níor aimsíodh aon cheann", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Fuarthas UUIDanna neamhbhailí de chuntais nó de ghrúpaí LDAP. Athbhreithnigh do shocruithe \"Sáraigh braite UUID\" sa chuid Saineolaithe de chumraíocht LDAP agus úsáid \"occ ldap:update-uuid\" chun iad a nuashonrú le do thoil.", + "_%n group found_::_%n groups found_" : ["%n grúpa aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe","%n grúpaí aimsithe"], + "> 1000 groups found" : "> Fuarthas 1000 grúpaí", + "> 1000 users found" : "> Fuarthas 1000 úsáideoirí", + "_%n user found_::_%n users found_" : ["%núsáideoir aimsithe","%núsáideoirí aimsithe","%n úsáideoirí aimsithe","%n úsáideoirí aimsithe","%n úsáideoirí aimsithe"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Níorbh fhéidir aitreabúid ainm taispeána úsáideora a bhrath. Sonraigh tú féin é i ardsocruithe LDAP le do thoil.", + "Could not find the desired feature" : "Níorbh fhéidir an ghné inmhianaithe a aimsiú", + "Invalid Host" : "Óstach Neamhbhailí", + "LDAP user and group backend" : "Úsáideoir LDAP agus inneall grúpa", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Cuireann an feidhmchlár seo ar chumas riarthóirí Nextcloud a nascadh le heolaire úsáideoirí atá bunaithe ar LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Cuireann an feidhmchlár seo ar chumas riarthóirí Nextcloud a nascadh le heolaire úsáideoirí atá bunaithe ar LDAP chun úsáideoirí, grúpaí agus tréithe úsáideoirí a fhíordheimhniú agus a sholáthar. Is féidir le riarthóirí an feidhmchlár seo a chumrú chun nascadh le heolaire LDAP amháin nó níos mó nó le hEolairí Gníomhacha trí chomhéadan LDAP. Is féidir tréithe ar nós cuóta úsáideora, ríomhphost, pictiúir avatar, ballraíocht ghrúpa agus níos mó a tharraingt isteach in Nextcloud ó eolaire leis na ceisteanna agus na scagairí cuí.\n\nLogálann úsáideoir isteach ar Nextcloud lena dintiúir LDAP nó AD, agus tugtar rochtain dó bunaithe ar iarratas fíordheimhnithe a láimhseálann an freastalaí LDAP nó AD. Ní stórálann Nextcloud pasfhocail LDAP nó AD, ach úsáidtear na dintiúir seo chun úsáideoir a fhíordheimhniú agus ansin úsáideann Nextcloud seisiún don ID úsáideora. Tá tuilleadh faisnéise ar fáil i gcáipéisíocht an LDAP Úsáideoir agus Inneall Grúpa.", + "Test Configuration" : "Cumraíocht Tástála", + "Help" : "Cabhrú", + "Groups meeting these criteria are available in %s:" : "Tá grúpaí a chomhlíonann na critéir seo ar fáil i %s:", + "Only these object classes:" : "Na haicmí oibiachta seo amháin:", + "Only from these groups:" : "Ó na grúpaí seo amháin:", + "Search groups" : "Cuardaigh grúpaí", + "Available groups" : "Grúpaí atá ar fáil", + "Selected groups" : "Grúpaí roghnaithe", + "Edit LDAP Query" : "Cuir Iarratas LDAP in eagar", + "LDAP Filter:" : "Scagaire LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Sonraíonn an scagaire na grúpaí LDAP a mbeidh rochtain acu ar an gcás %s.", + "Verify settings and count the groups" : "Fíoraigh socruithe agus comhaireamh na grúpaí", + "When logging in, %s will find the user based on the following attributes:" : "Nuair a bheidh tú ag logáil isteach, gheobhaidh %s an t-úsáideoir bunaithe ar na tréithe seo a leanas:", + "LDAP/AD Username:" : "Ainm Úsáideora LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Ligeann sé logáil isteach in aghaidh an ainm úsáideora LDAP/AD, arb é \"uid\" nó \"sAMAccountName\" é agus a bhraitear.", + "LDAP/AD Email Address:" : "Seoladh Ríomhphoist LDAP/AD:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Ligeann sé logáil isteach i gcoinne tréith ríomhphoist. \"mail\" agus \"mailPrimaryAddress\" ceadaithe.", + "Other Attributes:" : "Tréithe Eile:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Sainmhíníonn sé an scagaire le cur i bhfeidhm, nuair a dhéantar iarracht logáil isteach. Cuirtear \"%%uid\" in ionad an ainm úsáideora sa ghníomh logála isteach. Sampla: \"uid=%%uid\"", + "Test Loginname" : "Tástáil Ainm Logála", + "Attempts to receive a DN for the given loginname and the current login filter" : "Iarrachtaí ar DN a fháil don logainm tugtha agus don scagaire logála isteach reatha", + "Verify settings" : "Fíoraigh socruithe", + "%s. Server:" : "%s. Freastalaí:", + "Add a new configuration" : "Cuir cumraíocht nua leis", + "Copy current configuration into new directory binding" : "Cóipeáil an chumraíocht reatha i gceangal eolaire nua", + "Delete the current configuration" : "Scrios an chumraíocht reatha", + "Host" : "Óstach", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Is féidir leat an prótacal a fhágáil ar lár, mura dteastaíonn SSL uait. Más ea, cuir tús le ldaps://", + "Port" : "Port", + "Detect Port" : "Braith Port", + "User DN" : "Úsáideoir DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN an chliaint-úsáideoir lena ndéanfar an ceangal, e.g. uid=agent,dc=example,dc=com. Le rochtain gan ainm, fág DN agus Pasfhocal folamh.", + "Password" : "Pasfhocal", + "For anonymous access, leave DN and Password empty." : "Le rochtain gan ainm, fág DN agus Pasfhocal folamh.", + "Save Credentials" : "Sábháil Dintiúir", + "One Base DN per line" : "Bonn DN amháin in aghaidh an líne", + "You can specify Base DN for users and groups in the Advanced tab" : "Is féidir leat Bonn DN a shonrú d’úsáideoirí agus do ghrúpaí sa chluaisín Casta", + "Detect Base DN" : "Braith Bonn DN", + "Test Base DN" : "Bonn Tástála DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Seachnaíonn iarratais uathoibríocha LDAP. Níos fearr le haghaidh socruithe níos mó, ach teastaíonn roinnt eolais LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Iontráil scagairí LDAP de láimh (molta le haghaidh eolairí móra)", + "Listing and searching for users is constrained by these criteria:" : "Tá liostú agus cuardach úsáideoirí srianta ag na critéir seo:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Is iad na haicmí oibiachta is coitianta d’úsáideoirí ná Duine eagraíochtúil, duine, úsáideoir, agus inetOrgPerson. Mura bhfuil tú cinnte cén aicme oibiachta le roghnú, téigh i gcomhairle le riarthóir do eolaire le do thoil.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Sonraíonn an scagaire cé na húsáideoirí LDAP a mbeidh rochtain acu ar an gcás %s.", + "Verify settings and count users" : "Fíoraigh socruithe agus comhaireamh úsáideoirí", + "Saving" : "Shábháil", + "Back" : "Ar ais", + "Continue" : "Leanúint ar aghaidh", + "Please renew your password." : "Athnuaigh do phasfhocal le do thoil.", + "An internal error occurred." : "Tharla earráid inmheánach.", + "Please try again or contact your administrator." : "Bain triail eile as nó déan teagmháil le do riarthóir.", + "Current password" : "Pasfhocal reatha", + "New password" : "Focal Faire Nua", + "Renew password" : "Athnuaigh pasfhocal", + "Wrong password." : "Pasfhocal mícheart.", + "Cancel" : "Cealaigh", + "Server" : "Freastalaí", + "Users" : "Úsáideoirí", + "Login Attributes" : "Tréithe Logála Isteach", + "Groups" : "Grúpaí", + "Expert" : "Saineolaí", + "Advanced" : "Casta", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Rabhadh:</b> Níl an modúl PHP LDAP suiteáilte, ní oibreoidh an t-inneall. Iarr ar do riarthóir córais é a shuiteáil le do thoil.", + "Connection Settings" : "Socruithe Ceangail", + "Configuration Active" : "Cumraíocht Ghníomhach", + "When unchecked, this configuration will be skipped." : "Nuair nach ndéantar í a sheiceáil, déanfar an chumraíocht seo a scipeáil.", + "Backup (Replica) Host" : "Cúltaca (Macasamhail) Óstach", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Tabhair óstach cúltaca roghnach. Caithfidh gur macasamhail é den phríomhfhreastalaí LDAP/AD.", + "Backup (Replica) Port" : "Cúltaca (Macasamhail) Port", + "Disable Main Server" : "Díchumasaigh Príomhfhreastalaí", + "Only connect to the replica server." : "Ná déan ach ceangal leis an bhfreastalaí macasamhail.", + "Turn off SSL certificate validation." : "Múch bailíochtú teastais SSL.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Ní mholtar é, bain úsáid as le haghaidh tástála amháin! Mura n-oibríonn an ceangal ach leis an rogha seo, iompórtáil teastas SSL an fhreastalaí LDAP i do fhreastalaí %s.", + "Cache Time-To-Live" : "Taisce Am-Chun-Beo", + "in seconds. A change empties the cache." : "i soicindí. Folaíonn athrú an taisce.", + "Directory Settings" : "Socruithe Eolaire", + "User Display Name Field" : "Réimse Ainm Taispeána Úsáideora", + "The LDAP attribute to use to generate the user's display name." : "An tréith LDAP le húsáid chun ainm taispeána an úsáideora a ghiniúint.", + "2nd User Display Name Field" : "2 Réimse Ainm Taispeána Úsáideora", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Roghnach. Aitreabúid LDAP le cur leis an ainm taispeána idir lúibíní. Torthaí i e.g. »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Crann Úsáideora Bonn", + "One User Base DN per line" : "Bonn Úsáideora amháin DN in aghaidh na líne", + "User Search Attributes" : "Tréithe Cuardaigh Úsáideora", + "Optional; one attribute per line" : "Roghnach; tréith amháin in aghaidh an líne", + "Disable users missing from LDAP" : "Díchumasaigh úsáideoirí in easnamh ó LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Nuair a chuirtear ar siúl é, díchumasófar úsáideoirí a allmhairítear ó LDAP atá in easnamh ansin", + "Group Display Name Field" : "Réimse Ainm Taispeána Grúpa", + "The LDAP attribute to use to generate the groups's display name." : "An tréith LDAP le húsáid chun ainm taispeána an ghrúpaí a ghiniúint.", + "Base Group Tree" : "Crann Bun-ghrúpa", + "One Group Base DN per line" : "Bonn Grúpa amháin DN in aghaidh na líne", + "Group Search Attributes" : "Tréithe Cuardach Grúpa", + "Group-Member association" : "Comhlachas Grúpa-Ball", + "Dynamic Group Member URL" : "URL Ball Grúpa Dinimiciúla", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "An aitreabúid LDAP go bhfuil URL cuardaigh LDAP ar oibiachtaí grúpa a shocraíonn cad iad na réada a bhaineann leis an ngrúpa. (Díchumasaíonn socrú folamh feidhmiúlacht bhallraíocht ghrúpa dinimiciúil.)", + "Nested Groups" : "Grúpaí Neadaithe", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Nuair a chuirtear ar siúl é, tacaítear le grúpaí ina bhfuil grúpaí. (Ní oibríonn sé ach amháin má tá DNanna san aitreabúid bhall grúpa.)", + "Paging chunksize" : "Paging smután", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize a úsáidtear le haghaidh cuardaigh leathanaigh LDAP a d'fhéadfadh torthaí toirtiúla a fháil ar nós áirimh úsáideora nó grúpa. (Má shocraítear é 0, díchumasaítear cuardaigh leathanacháilte LDAP sna cásanna sin.)", + "Enable LDAP password changes per user" : "Cumasaigh athruithe pasfhocail LDAP in aghaidh an úsáideora", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Ceadaigh d’úsáideoirí LDAP a bpasfhocal a athrú agus cead a thabhairt d’Oll-Riarthóirí agus do Riarthóirí Grúpa pasfhocal a n-úsáideoirí LDAP a athrú. Ní oibríonn sé ach nuair a bhíonn polasaithe rialaithe rochtana cumraithe dá réir ar an bhfreastalaí LDAP. Toisc go seoltar pasfhocail i ngnáth-théacs chuig an bhfreastalaí LDAP, ní mór criptiú iompair a úsáid agus ba cheart hash pasfhocail a chumrú ar an bhfreastalaí LDAP.", + "(New password is sent as plain text to LDAP)" : "(Seoltar pasfhocal nua mar ghnáth-théacs chuig LDAP)", + "Default password policy DN" : "Beartas réamhshocraithe pasfhocail DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "An DN de pholasaí réamhshocraithe pasfhocail a úsáidfear chun pasfhocal a láimhseáil as feidhm. Ní oibríonn sé ach amháin nuair a chumasaítear athruithe pasfhocail LDAP in aghaidh an úsáideora agus nuair nach dtacaítear leis ach ó OpenLDAP. Fág folamh chun láimhseáil pasfhocal éaga a dhíchumasú.", + "Special Attributes" : "Tréithe Speisialta", + "Quota Field" : "Réimse Cuóta", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Fág folamh le haghaidh cuóta réamhshocraithe an úsáideora. Seachas sin, sonraigh tréith LDAP/AD.", + "Quota Default" : "Réamhshocrú Cuóta", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sáraigh cuóta réamhshocraithe d’úsáideoirí LDAP nach bhfuil cuóta socraithe acu sa Réimse Cuóta.", + "Email Field" : "Réimse Ríomhphost", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Socraigh ríomhphost an úsáideora óna tréith LDAP. Fág folamh é le haghaidh iompair réamhshocraithe.", + "User Home Folder Naming Rule" : "Riail Ainmnithe Fillteán Baile an Úsáideora", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Fág folamh le haghaidh ainm úsáideora (réamhshocraithe). Seachas sin, sonraigh tréith LDAP/AD.", + "\"$home\" Placeholder Field" : "Réimse Sealbhóir Áite \"$home\".", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Cuirfear luach na haitreabúide sonraithe in ionad $home i gcumraíocht stórála seachtrach", + "User Profile Attributes" : "Tréithe Próifíl Úsáideora", + "Phone Field" : "Réimse Fón", + "User profile Phone will be set from the specified attribute" : "Socrófar fón próifíl úsáideora ón tréith shonraithe", + "Website Field" : "Réimse Gréasáin", + "User profile Website will be set from the specified attribute" : "Próifíl úsáideora Socrófar suíomh Gréasáin ón tréith shonraithe", + "Address Field" : "Réimse Seoladh", + "User profile Address will be set from the specified attribute" : "Socrófar Seoladh phróifíl úsáideora ón tréith shonraithe", + "Twitter Field" : "Réimse Twitter", + "User profile Twitter will be set from the specified attribute" : "Socrófar próifíl úsáideora Twitter ón tréith shonraithe", + "Fediverse Field" : "Réimse Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Socrófar próifíl úsáideora Fediverse ón tréith shonraithe", + "Organisation Field" : "Réimse Eagrúcháin", + "User profile Organisation will be set from the specified attribute" : "Próifíl úsáideora Socrófar Eagraíocht ón tréith shonraithe", + "Role Field" : "Réimse Ról", + "User profile Role will be set from the specified attribute" : "Próifíl úsáideora Socrófar Ról ón tréith shonraithe", + "Headline Field" : "Réimse Ceannlíne", + "User profile Headline will be set from the specified attribute" : "Socrófar Ceannlíne próifíle úsáideora ón tréith shonraithe", + "Biography Field" : "Réimse Beathaisnéis", + "User profile Biography will be set from the specified attribute" : "Socrófar Beathaisnéis phróifíl úsáideora ón tréith shonraithe", + "Birthdate Field" : "Réimse Breithlá", + "User profile Date of birth will be set from the specified attribute" : "Próifíl úsáideora Socrófar dáta breithe ón tréith shonraithe", + "Pronouns Field" : "Réimse Forainmneacha", + "User profile Pronouns will be set from the specified attribute" : "Socrófar Forainmneacha próifíle úsáideora ón aitreabúid sonraithe", + "Internal Username" : "Ainm Úsáideora Inmheánach", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De réir réamhshocraithe cruthófar an t-ainm úsáideora inmheánach ón aitreabúid UUID. Cinntíonn sé go bhfuil an t-ainm úsáideora uathúil agus ní gá carachtair a thiontú. Tá an srian ar an ainm úsáideora inmheánach nach gceadaítear ach na carachtair seo: [a-zA-Z0-9_.@-]. Cuirtear a gcomhfhreagras ASCII in ionad carachtair eile nó fágtar ar lár iad. Nuair a bhíonn imbhuailtí cuirfear uimhir leis/méadófar é. Úsáidtear an t-ainm úsáideora inmheánach chun úsáideoir a aithint go hinmheánach. Is é an t-ainm réamhshocraithe é freisin don fhillteán baile úsáideora. Is cuid de URLanna cianda é freisin, mar shampla do gach seirbhís DAV. Leis an socrú seo, is féidir an t-iompar réamhshocraithe a shárú. Ní bheidh éifeacht ag athruithe ach ar úsáideoirí LDAP nua-mhapáilte (curtha leis). Fág é folamh le haghaidh iompar réamhshocraithe.", + "Internal Username Attribute:" : "Tréith Ainm Úsáideora Inmheánach:", + "Override UUID detection" : "Sáraigh brath UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "De réir réamhshocraithe, braitear an aitreabúid UUID go huathoibríoch. Úsáidtear an tréith UUID chun úsáideoirí agus grúpaí LDAP a shainaithint gan amhras. Chomh maith leis sin, cruthófar an t-ainm úsáideora inmheánach bunaithe ar an UUID, mura sonraítear a mhalairt thuas. Is féidir leat an socrú a shárú agus tréith de do rogha a chur ar aghaidh. Ní mór duit a chinntiú gur féidir an tréith is rogha leat a fháil d’úsáideoirí agus do ghrúpaí araon agus go bhfuil sé uathúil. Fág é folamh le haghaidh iompar réamhshocraithe. Ní bheidh éifeacht ag athruithe ach ar úsáideoirí agus grúpaí LDAP nua-mhapáilte (curtha leis).", + "UUID Attribute for Users:" : "Tréith UUID d'Úsáideoirí:", + "UUID Attribute for Groups:" : "Tréith UUID do Ghrúpaí:", + "Username-LDAP User Mapping" : "Mapáil Úsáideora Ainm Úsáideora-LDAP", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Úsáidtear ainmneacha úsáideoirí chun meiteashonraí a stóráil agus a shannadh. Chun úsáideoirí a shainaithint agus a aithint go beacht, beidh ainm úsáideora inmheánach ag gach úsáideoir LDAP. Teastaíonn mapáil ón ainm úsáideora go dtí an t-úsáideoir LDAP chuige seo. Tá an t-ainm úsáideora cruthaithe mapáilte chuig UUID an úsáideora LDAP. Ina theannta sin tá an DN i dtaisce freisin chun idirghníomhaíocht LDAP a laghdú, ach ní úsáidtear é le haghaidh aitheantais. Má athraíonn an DN, beidh na hathruithe le fáil. Úsáidtear an t-ainm úsáideora inmheánach ar fad. Beidh rudaí fágtha i ngach áit chun na mapálacha a ghlanadh. Ní íogair don chumraíocht é na mapálacha a ghlanadh, bíonn tionchar aige ar gach cumraíocht LDAP! Ná glan na mapálacha riamh i dtimpeallacht táirgthe, ach amháin ag céim tástála nó turgnamhach.", + "Clear Username-LDAP User Mapping" : "Glan Léarscáiliú Úsáideora Ainm Úsáideora-LDAP", + "Clear Groupname-LDAP Group Mapping" : "Glan Léarscáiliú Grúpa Ainm an Ghrúpa-LDAP", + "Invalid configuration. Please have a look at the logs for further details." : "Cumraíocht neamhbhailí. Féach ar na logaí le haghaidh tuilleadh sonraí le do thoil." +},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" +}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js index 85278b1010c..a39e92ab1f8 100644 --- a/apps/user_ldap/l10n/gl.js +++ b/apps/user_ldap/l10n/gl.js @@ -3,14 +3,15 @@ OC.L10N.register( { "Failed to clear the mappings." : "Non foi posíbel limpar as asignacións.", "Failed to delete the server configuration" : "Non foi posíbel eliminar a configuración do servidor", - "Invalid configuration: Anonymous binding is not allowed." : "A configuración non é correcta: o vínculo anónimo non está permitido.", + "Invalid configuration: Anonymous binding is not allowed." : "A configuración non é correcta: a vinculación non está permitida.", "Valid configuration, connection established!" : "A configuración é correcta, estabeleceuse a conexión!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "A configuración é correcta, mais o vínculo falla. Comprobe os axustes do servidor e as credenciais.", - "Invalid configuration. Please have a look at the logs for further details." : "A configuración non é correcta. Bótelle unha ollada aos rexistros para obter máis detalles.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "A configuración é correcta, mais fallou a vinculación. Comprobe os axustes do servidor e as credenciais.", + "Invalid configuration: %s" : "Configuración incorrecta: %s", "No action specified" : "Non se especificou unha acción", "No configuration specified" : "Non se especificou unha configuración", "No data specified" : "Non se especificaron datos", - " Could not set configuration %s" : "Non foi posíbel estabelecer a configuración %s", + "Invalid data specified" : "Datos especificados non válidos", + "Could not set configuration %1$s to %2$s" : "Non foi posíbel definir a configuración %1$s a %2$s", "Action does not exist" : "Non existe esta acción", "Renewing …" : "Renovando…", "Very weak password" : "Contrasinal moi feble", @@ -19,13 +20,13 @@ OC.L10N.register( "Good password" : "Bo contrasinal", "Strong password" : "Contrasinal forte", "The Base DN appears to be wrong" : "O DN base semella ser erróneo", - "Testing configuration…" : "Probando a configuración...", + "Testing configuration…" : "Probando a configuración…", "Configuration incorrect" : "Configuración incorrecta", "Configuration incomplete" : "Configuración incompleta", "Configuration OK" : "Configuración correcta", "Select groups" : "Seleccionar grupos", "Select object classes" : "Seleccione as clases de obxectos", - "Please check the credentials, they seem to be wrong." : "Comprobe as credenciais, semella que son incorrectas.", + "Please check the credentials, they seem to be wrong." : "Comprobe as credenciais, semella que son erróneas.", "Please specify the port, it could not be auto-detected." : "Especifique o porto, non foi posíbel detectalo automaticamente.", "Base DN could not be auto-detected, please revise credentials, host and port." : "Non foi posíbel detectar automaticamente o DN base, revise as credenciais, a máquina e o porto.", "Could not detect Base DN, please enter it manually." : "Non foi posíbel detectar o DN base, introdúzao manualmente.", @@ -46,24 +47,45 @@ OC.L10N.register( "Select attributes" : "Seleccione os atributos", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Non se atopou o usuario. Recomendase consultar os atributos de acceso e o nome de usuario. Filtro eficaz (copiar e pegar para a validación en liña de ordes): <br/>", "User found and settings verified." : "Atopouse o usuario e verificáronse os axustes.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considere restrinxir a súa busca, pois abrange moitos usuarios, apenas o primeiro deles poderá acceder.\n", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considere restrinxir a súa busca, pois abrangue moitos usuarios, apenas o primeiro deles poderá acceder.", "An unspecified error occurred. Please check log and settings." : "Produciuse un erro non especificado. Comprobe o rexistro e os axustes.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de busca é incorrecto, probabelmente por mor de erros de sintaxe como un número impar de chaves de apertura/peche. Revíseo.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Produciuse un erro de conexión a LDAP/AD. Verifique a máquina, o porto e as credenciais.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta o marcador de substitución «%uid». Substitúese polo nome de acceso ao consultar LDAP/AD.", "Please provide a login name to test against" : "Forneza o nome de acceso para facer a proba", - "Password change rejected. Hint: " : "Contrasinal rexeitado. Consello:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Desactivouse a caixa de grupo porque o servidor LDAP/AD non admite memberOf.", + "Password change rejected. Hint: %s" : "Contrasinal rexeitado. Consello: %s", + "Mandatory field \"%s\" left empty" : "Deixou baleiro o campo obrigatorio «%s»", + "A password is given, but not an LDAP agent" : "Indicou un contrasinal, mais non un axente LDAP", + "No password is given for the user agent" : "Non indicou un contrasinal para este axente de usuario", + "No LDAP base DN was given" : "Non se indicou un DN base de LDAP", + "User base DN is not a subnode of global base DN" : "O DN base do usuario non é un subnodo do DN base global", + "Group base DN is not a subnode of global base DN" : "O DN base de grupo non é un subnodo do DN base global", + "Login filter does not contain %s placeholder." : "O filtro de inicio de sesión non contén o marcador de substitución %s.", "Please login with the new password" : "Acceda co novo contrasinal", "LDAP User backend" : "Infraestrutura do usuario LDAP", "Your password will expire tomorrow." : "O seu contrasinal caduca mañá.", "Your password will expire today." : "O seu contrasinal caducará hoxe.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["O seu contrasinal caducará en %n día.","O seu contrasinal caducará en %n días."], - "_%s group found_::_%s groups found_" : ["Atopouse %s grupo","Atopáronse %s grupos"], - "_%s user found_::_%s users found_" : ["Atopouse %s usuario","Atopáronse %s usuarios"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Non foi posíbel detectar o atributo nome de usuario que amosar. Especifíqueo vostede mesmo nos axustes avanzados de LDAP. ", + "LDAP/AD integration" : "Integración de LDAP/AD", + "LDAP Connection" : "Conexión LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Produciuse un fallo na vinculación desta configuración LDAP: %s","Produciuse un fallo na vinculación de %n configuracións LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Produciuse un fallo ao buscar esta configuración LDAP: %s","Produciuse un fallo ao buscar %n configuracións LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Hai unha configuración LDAP inactiva: %s","Hai %n configuracións LDAP inactivas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["A vinculación e a busca funcionan na conexión LDAP configurada (%s)","A vinculación e a busca funciona en todas as %n conexións LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUID de LDAP incorrectos", + "None found" : "Non se atopou ningún", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Atopáronse UUID incorrectos de contas ou grupos LDAP. Revise a súa configuración de «Anular a detección de UUID» na parte Experto da configuración LDAP e utilice «occ ldap:update-uuid» para actualizalos.", + "_%n group found_::_%n groups found_" : ["Atopouse %n grupo","Atopáronse %n grupos"], + "> 1000 groups found" : "> 1000 grupos atopados", + "> 1000 users found" : "> 1000 usuarios atopados", + "_%n user found_::_%n users found_" : ["%n usuario atopado","%n usuarios atopados"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Non foi posíbel detectar o atributo nome de usuario que amosar. Especifíqueo Vde. mesmo nos axustes avanzados de LDAP. ", "Could not find the desired feature" : "Non foi posíbel atopar a función desexada", "Invalid Host" : "Máquina incorrecta", "LDAP user and group backend" : "Infraestrutura de usuarios e grupos LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Esta aplicación permitelle aos administradores conectar Nextcloud a un directorio de usuarios baseado en LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permítelle aos administradores conectar Nextcloud cun directorio de usuarios baseado en LDAP para a autenticación e aprovisionamento de usuarios, grupos e atributos de usuario. Os administradores poden configurar esta aplicación para conectarse a un ou máis directorios LDAP ou Active Directory mediante unha interface LDAP. Os atributos como cota de usuario, correo, imaxes de avatar, pertenza a grupos e máis poden incorporarse ao Nextcloud dende un directorio coas peticións e filtros axeitados.\n\nUn usuario rexistrase no Nextcloud coas súa credenciais LDAP ou AD e se lle concede acceso baseandose nunha petición de autenticación manexada polo servidor LDAP ou AD.Nexttcloud non almacen os contrasinais LDAP ou AD, senon que estas credenciais usanse para autenticar un usuario e após o Nextcloud emprega unha sesión para O ID do usuario. Ten dispoñíbel máis información na documentación da infraestrutura de usuarios e grupos LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permítelle aos administradores conectar Nextcloud cun directorio de usuarios baseado en LDAP para a autenticación e aprovisionamento de usuarios, grupos e atributos de usuario. Os administradores poden configurar esta aplicación para conectarse a un ou máis directorios LDAP ou Active Directory mediante unha interface LDAP. Os atributos como cota de usuario, correo, imaxes de avatar, pertenza a grupos e máis poden incorporarse a Nextcloud desde un directorio coas peticións e filtros axeitados.\n\nUn usuario rexistrase en Nextcloud coas súa credenciais LDAP ou AD e se lle concede acceso baseandose nunha petición de autenticación manexada polo servidor LDAP ou AD.Nexttcloud non almacen os contrasinais LDAP ou AD, senon que estas credenciais usanse para autenticar un usuario e após Nextcloud emprega unha sesión para O ID do usuario. Ten dispoñíbel máis información na documentación da infraestrutura de usuarios e grupos LDAP.", "Test Configuration" : "Probar a configuración", "Help" : "Axuda", "Groups meeting these criteria are available in %s:" : "Os grupos que cumpren estes criterios están dispoñíbeis en %s:", @@ -77,10 +99,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica que grupos LDAP teñen acceso á instancia %s.", "Verify settings and count the groups" : "Verificar os axustes e contar os grupos", "When logging in, %s will find the user based on the following attributes:" : "Ao acceder, %s atopa o usuario en función dos seguintes atributos:", + "LDAP/AD Username:" : "Nome de usuario LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite acceder co nome de usuario LDAP/AD, que é «uid» ou «sAMAccountName» e será detectado.", + "LDAP/AD Email Address:" : "Enderezo de correo LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite o acceso contra un atributo de correo-e. Permitirase «mail» e «mailPrimaryAddress».", "Other Attributes:" : "Outros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro que se aplica cando se intenta o acceso. «%%uid» substitúe o nome de usuario e a acción de acceso. Exemplo: «uid=%%uid» ", "Test Loginname" : "Probar o nome de acceso", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta recibir un DN para o nome de acceso indicado e o filtro de acceso actual", "Verify settings" : "Verificar os axustes", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Engadir unha configuración nova", @@ -91,7 +117,7 @@ OC.L10N.register( "Port" : "Porto", "Detect Port" : "Detectar o porto", "User DN" : "DN do usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Password" : "Contrasinal", "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Save Credentials" : "Gardar as credenciais", @@ -99,7 +125,7 @@ OC.L10N.register( "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar o DN base para usuarios e grupos na lapela de «Avanzado»", "Detect Base DN" : "Detectar o DN base", "Test Base DN" : "Probar o DN base", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as solicitudes LDAP automáticas. E o mellor para as configuracións máis grandes, mais require algúns coñecementos de LDAP.", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as solicitudes LDAP automáticas. E o mellor para as configuracións máis grandes, mais precisa algúns coñecementos de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introduza manualmente os filtros LDAP (recomendado para directorios grandes)", "Listing and searching for users is constrained by these criteria:" : "A listaxe e a busca de usuarios están restrinxidos por estes criterios:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "As clases de obxecto máis comúns para os usuarios son «organizationalPerson», «person», «user» e «inetOrgPerson». Se non está seguro de que clase de obxecto ten que seleccionar, consulte co administrador de directorios.", @@ -110,11 +136,11 @@ OC.L10N.register( "Continue" : "Continuar", "Please renew your password." : "Renove o seu contrasinal.", "An internal error occurred." : "Produciuse un erro interno.", - "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", + "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto coa administración desta instancia.", "Current password" : "Contrasinal actual", "New password" : "Contrasinal novo", "Renew password" : "Renovar o contrasinal", - "Wrong password." : "Contrasinal incorrecto.", + "Wrong password." : "Contrasinal erróneo", "Cancel" : "Cancelar", "Server" : "Servidor", "Users" : "Usuarios", @@ -122,29 +148,31 @@ OC.L10N.register( "Groups" : "Grupos", "Expert" : "Experto", "Advanced" : "Avanzado", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP non está instalado, o servidor non funcionará. Consulte co administrador do sistema para instalalo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> O módulo PHP LDAP non está instalado, o servidor non funcionará. Consulte coa administración do sistema para instalalo.", "Connection Settings" : "Axustes da conexión", "Configuration Active" : "Configuración activa", "When unchecked, this configuration will be skipped." : "Se está sen marcar, omítese esta configuración.", - "Backup (Replica) Host" : "Servidor da copia de seguridade (réplica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indicar un servidor de copia de seguridade opcional. Debe ser unha réplica do servidor principal LDAP/AD.", - "Backup (Replica) Port" : "Porto da copia de seguridade (réplica)", + "Backup (Replica) Host" : "Servidor da copia de seguranza (réplica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indicar un servidor de copia de seguranza opcional. Debe ser unha réplica do servidor principal LDAP/AD.", + "Backup (Replica) Port" : "Porto da copia de seguranza (réplica)", "Disable Main Server" : "Desactivar o servidor principal", "Only connect to the replica server." : "Conectar só co servidor de réplica.", "Turn off SSL certificate validation." : "Desactiva a validación do certificado SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recomendado, utilizar só para probas! Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no seu servidor %s.", - "Cache Time-To-Live" : "Tempo de persistencia da caché", - "in seconds. A change empties the cache." : "en segundos. Calquera cambio baleira a caché.", + "Cache Time-To-Live" : "Tempo de persistencia da memoria tobo", + "in seconds. A change empties the cache." : "en segundos. Calquera cambio baleira a memoria tobo.", "Directory Settings" : "Axustes do directorio", "User Display Name Field" : "Campo de nome de usuario para amosar", "The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.", - "2nd User Display Name Field" : "2º campo de nome de usuario para amosar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemple.org)».", + "2nd User Display Name Field" : "2.º campo de nome de usuario para amosar", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@example.org)».", "Base User Tree" : "Base da árbore de usuarios", "One User Base DN per line" : "Un DN base de usuario por liña", "User Search Attributes" : "Atributos de busca do usuario", "Optional; one attribute per line" : "Opcional; un atributo por liña", - "Group Display Name Field" : "Campo de mostra do nome de grupo", + "Disable users missing from LDAP" : "Desactivar usuarios que faltan en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Cando estea activado, desactivaranse os usuarios importados de LDAP e que logo faltan", + "Group Display Name Field" : "Campo de nome de grupo para amosar", "The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP úsase para xerar os nomes dos grupos que amosar.", "Base Group Tree" : "Base da árbore de grupo", "One Group Base DN per line" : "Un DN base de grupo por liña", @@ -153,11 +181,11 @@ OC.L10N.register( "Dynamic Group Member URL" : "URL dinámico do membro do grupo", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que nos obxectos de grupo contén un URL de busca LDAP que determina que obxectos pertencen ao grupo. (Un escenario baleiro desactiva a funcionalidade dinámica de pertenza ao grupo.)", "Nested Groups" : "Grupos aniñados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se está activado, admítense grupos que conteñen grupos. (Só funciona se o atributo de membro no grupo contén os DN.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se está activado, admítense grupos que conteñen grupos. (Só funciona se o atributo de membros do grupo contén os DN.)", "Paging chunksize" : "Tamaño dos fragmentos paxinados", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño dos fragmentos utilizados para as buscas LDAP paxinadas, que poden devolver resultados voluminosos como usuario ou enumeración de grupo. (Se se estabelece a 0, desactívanse as buscas LDAP paxinadas nesas situacións.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño dos fragmentos utilizados para as buscas LDAP paxinadas, que poden devolver resultados voluminosos como usuario ou enumeración de grupo. (Se se axusta a 0, desactívanse as buscas LDAP paxinadas nesas situacións.)", "Enable LDAP password changes per user" : "Activar os cambios no contrasinal LDAP polo usuario", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permítelle aos usuarios LDAP cambiar o seu contrasinal e permite que os administradores e administradores de grupos, cambiar o contrasinal dos seus usuarios LDAP. Só funciona cando as directivas de control de acceso están configuradas conforme coas do servidor LDAP. Xa que os contrasinais son enviados en texto simple ao servidor, LDAP, debe empregarse o cifrado no transporte e o «hash» dos contrasinais debe ser configurado no servidor LDAP.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permítelle aos usuarios LDAP cambiar o seu contrasinal e permite que os administradores e administradores de grupos, cambiar o contrasinal dos seus usuarios LDAP. Só funciona cando as directivas de control de acceso están configuradas conforme coas do servidor LDAP. Xa que os contrasinais son enviados en texto simple ao servidor, LDAP, debe empregarse o cifrado no transporte e o «resumo criptográfico dos contrasinais debe ser configurado no servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(O novo contrasinal envíase como un texto simple para LDAP)", "Default password policy DN" : "DN da directiva de contrasinal predeterminado", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "O DN dunha directiva de contrasinais predeterminados que será usado para o control da caducidade dos contrasinais. Só funciona cando está activado o cambio do contrasinal LDAP polos usuarios e só está aceptado por OpenLDAP. Déixea baleira para desactivar o control da caducidade dos contrasinais.", @@ -165,30 +193,47 @@ OC.L10N.register( "Quota Field" : "Campo de cota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para a cota predeterminada do usuario. Noutro caso, especifique un atributo LDAP/AD.", "Quota Default" : "Cota predeterminada", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir a cota predeterminada para usuarios LDAP que non teñen unha cota configurada no campo Cota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Anular a cota predeterminada para usuarios LDAP que non teñen unha cota definida no campo Cota.", "Email Field" : "Campo do correo", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Axustar o correo do usuario dende un atributo LDAP. Déixeo baleiro para un comportamento predeterminado.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Definir o correo do usuario desde un atributo LDAP. Déixeo baleiro para un comportamento predeterminado.", "User Home Folder Naming Rule" : "Regra de nomeado do cartafol do usuario", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD.", - "\"$home\" Placeholder Field" : "Campo de marcador de posición «$home»", + "\"$home\" Placeholder Field" : "Campo de marcador de substitución «$home»", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado", + "User Profile Attributes" : "Atributos do perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "O teléfono do perfil de usuario definirase a partir do atributo especificado", + "Website Field" : "Campo do sitio web", + "User profile Website will be set from the specified attribute" : "O sitio web do perfil de usuario definirase a partir do atributo especificado", + "Address Field" : "Campo de enderezo", + "User profile Address will be set from the specified attribute" : "O enderezo do perfil de usuario definirase a partir do atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "O perfil de usuario en Twitter definirase a partir do atributo especificado", + "Fediverse Field" : "Campo do Fediverso", + "User profile Fediverse will be set from the specified attribute" : "O perfil de usuario no Fediverso definirase a partir do atributo especificado", + "Organisation Field" : "Campo da organización", + "User profile Organisation will be set from the specified attribute" : "A organización do perfil de usuario definirase a partir do atributo especificado", + "Role Field" : "Campo de rol", + "User profile Role will be set from the specified attribute" : "O rol do perfil de usuario definirase a partir do atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "O título do perfil de usuario definirase a partir do atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "A biografía no perfil de usuario definirase a partir do atributo especificado", + "Birthdate Field" : "Campo de data de nacemento", + "User profile Date of birth will be set from the specified attribute" : "A data de nacemento no perfil do usuario definirase a partir do atributo especificado", + "Pronouns Field" : "Campo de pronomes", + "User profile Pronouns will be set from the specified attribute" : "Os pronomes no perfil de usuario definiranse a partir do atributo especificado", "Internal Username" : "Nome interno de usuario", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De xeito predeterminado, o nome de usuario interno crearase a partir do atributo UUID. Isto asegura que o nome de usuario é único e que non é necesario converter os caracteres. O nome de usuario interno ten a restrición de que só se permiten estes caracteres: [a-zA-Z0-9_.@-]. Outros caracteres substitúense pola súa correspondencia ASCII ou simplemente omítense. Nos casos de colisións engadirase/aumentarase un número. O nome de usuario interno úsase para identificar un usuario internamente. Tamén é o nome predeterminado para o cartafol de inicio do usuario. Tamén forma parte dos URL remotos, por exemplo para todos os servizos DAV. Con esta configuración, pódese anular o comportamento predeterminado. Os cambios só terán efecto nos usuarios LDAP recén asignados (engadidos). Déixeo baleiro para o comportamento predeterminado.", "Internal Username Attribute:" : "Atributo do nome interno de usuario:", - "Override UUID detection" : "Ignorar a detección do UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por omisión, o atributo UUID é detectado automaticamente. O atributo UUID utilizase para identificar, sen dúbida, aos usuarios e grupos LDAP. Ademais, crearase o nome interno de usuario baseado no UUID, se non se especifica anteriormente o contrario. Pode anular a configuración e pasar un atributo da súa escolla. Vostede debe asegurarse de que o atributo da súa escolla pode ser recuperado polos usuarios e grupos e de que é único. Déixeo baleiro para o comportamento predeterminado. Os cambios terán efecto só nas novas asignacións (engadidos) de usuarios de LDAP.", + "Override UUID detection" : "Anular a detección do UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por omisión, o atributo UUID é detectado automaticamente. O atributo UUID utilizase para identificar, sen dúbida, aos usuarios e grupos LDAP. Ademais, crearase o nome interno de usuario baseado no UUID, se non se especifica anteriormente o contrario. Pode anular o axuste e pasar un atributo da súa escolla. Asegúrese de que o atributo da súa escolla pode ser recuperado polos usuarios e grupos e de que é único. Déixeo baleiro para o comportamento predeterminado. Os cambios terán efecto só nas novas asignacións (engadidos) de usuarios de LDAP.", "UUID Attribute for Users:" : "Atributo do UUID para usuarios:", "UUID Attribute for Groups:" : "Atributo do UUID para grupos:", "Username-LDAP User Mapping" : "Asignación do usuario ao «nome de usuario LDAP»", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuario empréganse para almacenar e asignar metadatos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome interno de usuario. Isto require unha asignación do nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados. O nome interno do usuario utilizase para todo. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun contorno de produción. Limpar as asignacións só en fases de proba ou experimentais.", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuario empréganse para almacenar e asignar metadatos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome interno de usuario. Isto precisa dunha asignación do nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na memoria tobo, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados. O nome interno do usuario utilizase para todo. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun contorno de produción. Limpar as asignacións só en fases de proba ou experimentais.", "Clear Username-LDAP User Mapping" : "Limpar a asignación do usuario ao «nome de usuario LDAP»", "Clear Groupname-LDAP Group Mapping" : "Limpar a asignación do grupo ao «nome de grupo LDAP»", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Produciuse un erro de conexión no LDAP / AD, comprobe a máquina o porto e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Non se atopou o «%u ID» do marcador de posición. Vai ser substituído co nome de acceso cando se consulta LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa de grupo está desactivada, o servidor LDAP / AD non admite «memberOf».", - "LDAP / AD integration" : "Integración LDAP / AD", - "LDAP / AD Username:" : "Nome de usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite o acceso co nome de usuario LDAP / AD, sexa «uid» ou «sAMAccountName« e será detectado.", - "LDAP / AD Email Address:" : "Enderezo de correo LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por omisión, o nome interno de usuario crearase a partir do atributo UUID. Isto asegura que o nome de usuario é único e non é necesario converter os caracteres. O nome interno de usuario ten a restrición de que só se admiten estes caracteres: [ a-zA-Z0-9_.@- ]. Outros caracteres son substituídos pola súa correspondencia ASCII ou simplemente omitidos. En caso de colisións engadirase/incrementarase un número. O nome interno de usuario usase para identificar internamente a un usuario. É tamén o nome predeterminado do cartafol de inicio do usuario. Tamén é parte dos URL remotos, por exemplo para todos os servizos *DAV. Con esta configuración, pódese anular o comportamento predeterminado. Déixeo baleiro para usar o comportamento predeterminado. Os cambios terán efecto só nos usuarios LDAP signados (engadidos) após os cambios." + "Invalid configuration. Please have a look at the logs for further details." : "A configuración non é correcta. Bótelle unha ollada aos rexistros para obter máis detalles." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json index 7f03bc73cfb..58b0658ebf0 100644 --- a/apps/user_ldap/l10n/gl.json +++ b/apps/user_ldap/l10n/gl.json @@ -1,14 +1,15 @@ { "translations": { "Failed to clear the mappings." : "Non foi posíbel limpar as asignacións.", "Failed to delete the server configuration" : "Non foi posíbel eliminar a configuración do servidor", - "Invalid configuration: Anonymous binding is not allowed." : "A configuración non é correcta: o vínculo anónimo non está permitido.", + "Invalid configuration: Anonymous binding is not allowed." : "A configuración non é correcta: a vinculación non está permitida.", "Valid configuration, connection established!" : "A configuración é correcta, estabeleceuse a conexión!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "A configuración é correcta, mais o vínculo falla. Comprobe os axustes do servidor e as credenciais.", - "Invalid configuration. Please have a look at the logs for further details." : "A configuración non é correcta. Bótelle unha ollada aos rexistros para obter máis detalles.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "A configuración é correcta, mais fallou a vinculación. Comprobe os axustes do servidor e as credenciais.", + "Invalid configuration: %s" : "Configuración incorrecta: %s", "No action specified" : "Non se especificou unha acción", "No configuration specified" : "Non se especificou unha configuración", "No data specified" : "Non se especificaron datos", - " Could not set configuration %s" : "Non foi posíbel estabelecer a configuración %s", + "Invalid data specified" : "Datos especificados non válidos", + "Could not set configuration %1$s to %2$s" : "Non foi posíbel definir a configuración %1$s a %2$s", "Action does not exist" : "Non existe esta acción", "Renewing …" : "Renovando…", "Very weak password" : "Contrasinal moi feble", @@ -17,13 +18,13 @@ "Good password" : "Bo contrasinal", "Strong password" : "Contrasinal forte", "The Base DN appears to be wrong" : "O DN base semella ser erróneo", - "Testing configuration…" : "Probando a configuración...", + "Testing configuration…" : "Probando a configuración…", "Configuration incorrect" : "Configuración incorrecta", "Configuration incomplete" : "Configuración incompleta", "Configuration OK" : "Configuración correcta", "Select groups" : "Seleccionar grupos", "Select object classes" : "Seleccione as clases de obxectos", - "Please check the credentials, they seem to be wrong." : "Comprobe as credenciais, semella que son incorrectas.", + "Please check the credentials, they seem to be wrong." : "Comprobe as credenciais, semella que son erróneas.", "Please specify the port, it could not be auto-detected." : "Especifique o porto, non foi posíbel detectalo automaticamente.", "Base DN could not be auto-detected, please revise credentials, host and port." : "Non foi posíbel detectar automaticamente o DN base, revise as credenciais, a máquina e o porto.", "Could not detect Base DN, please enter it manually." : "Non foi posíbel detectar o DN base, introdúzao manualmente.", @@ -44,24 +45,45 @@ "Select attributes" : "Seleccione os atributos", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Non se atopou o usuario. Recomendase consultar os atributos de acceso e o nome de usuario. Filtro eficaz (copiar e pegar para a validación en liña de ordes): <br/>", "User found and settings verified." : "Atopouse o usuario e verificáronse os axustes.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considere restrinxir a súa busca, pois abrange moitos usuarios, apenas o primeiro deles poderá acceder.\n", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Considere restrinxir a súa busca, pois abrangue moitos usuarios, apenas o primeiro deles poderá acceder.", "An unspecified error occurred. Please check log and settings." : "Produciuse un erro non especificado. Comprobe o rexistro e os axustes.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de busca é incorrecto, probabelmente por mor de erros de sintaxe como un número impar de chaves de apertura/peche. Revíseo.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Produciuse un erro de conexión a LDAP/AD. Verifique a máquina, o porto e as credenciais.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Falta o marcador de substitución «%uid». Substitúese polo nome de acceso ao consultar LDAP/AD.", "Please provide a login name to test against" : "Forneza o nome de acceso para facer a proba", - "Password change rejected. Hint: " : "Contrasinal rexeitado. Consello:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Desactivouse a caixa de grupo porque o servidor LDAP/AD non admite memberOf.", + "Password change rejected. Hint: %s" : "Contrasinal rexeitado. Consello: %s", + "Mandatory field \"%s\" left empty" : "Deixou baleiro o campo obrigatorio «%s»", + "A password is given, but not an LDAP agent" : "Indicou un contrasinal, mais non un axente LDAP", + "No password is given for the user agent" : "Non indicou un contrasinal para este axente de usuario", + "No LDAP base DN was given" : "Non se indicou un DN base de LDAP", + "User base DN is not a subnode of global base DN" : "O DN base do usuario non é un subnodo do DN base global", + "Group base DN is not a subnode of global base DN" : "O DN base de grupo non é un subnodo do DN base global", + "Login filter does not contain %s placeholder." : "O filtro de inicio de sesión non contén o marcador de substitución %s.", "Please login with the new password" : "Acceda co novo contrasinal", "LDAP User backend" : "Infraestrutura do usuario LDAP", "Your password will expire tomorrow." : "O seu contrasinal caduca mañá.", "Your password will expire today." : "O seu contrasinal caducará hoxe.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["O seu contrasinal caducará en %n día.","O seu contrasinal caducará en %n días."], - "_%s group found_::_%s groups found_" : ["Atopouse %s grupo","Atopáronse %s grupos"], - "_%s user found_::_%s users found_" : ["Atopouse %s usuario","Atopáronse %s usuarios"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Non foi posíbel detectar o atributo nome de usuario que amosar. Especifíqueo vostede mesmo nos axustes avanzados de LDAP. ", + "LDAP/AD integration" : "Integración de LDAP/AD", + "LDAP Connection" : "Conexión LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Produciuse un fallo na vinculación desta configuración LDAP: %s","Produciuse un fallo na vinculación de %n configuracións LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Produciuse un fallo ao buscar esta configuración LDAP: %s","Produciuse un fallo ao buscar %n configuracións LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Hai unha configuración LDAP inactiva: %s","Hai %n configuracións LDAP inactivas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["A vinculación e a busca funcionan na conexión LDAP configurada (%s)","A vinculación e a busca funciona en todas as %n conexións LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUID de LDAP incorrectos", + "None found" : "Non se atopou ningún", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Atopáronse UUID incorrectos de contas ou grupos LDAP. Revise a súa configuración de «Anular a detección de UUID» na parte Experto da configuración LDAP e utilice «occ ldap:update-uuid» para actualizalos.", + "_%n group found_::_%n groups found_" : ["Atopouse %n grupo","Atopáronse %n grupos"], + "> 1000 groups found" : "> 1000 grupos atopados", + "> 1000 users found" : "> 1000 usuarios atopados", + "_%n user found_::_%n users found_" : ["%n usuario atopado","%n usuarios atopados"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Non foi posíbel detectar o atributo nome de usuario que amosar. Especifíqueo Vde. mesmo nos axustes avanzados de LDAP. ", "Could not find the desired feature" : "Non foi posíbel atopar a función desexada", "Invalid Host" : "Máquina incorrecta", "LDAP user and group backend" : "Infraestrutura de usuarios e grupos LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Esta aplicación permitelle aos administradores conectar Nextcloud a un directorio de usuarios baseado en LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permítelle aos administradores conectar Nextcloud cun directorio de usuarios baseado en LDAP para a autenticación e aprovisionamento de usuarios, grupos e atributos de usuario. Os administradores poden configurar esta aplicación para conectarse a un ou máis directorios LDAP ou Active Directory mediante unha interface LDAP. Os atributos como cota de usuario, correo, imaxes de avatar, pertenza a grupos e máis poden incorporarse ao Nextcloud dende un directorio coas peticións e filtros axeitados.\n\nUn usuario rexistrase no Nextcloud coas súa credenciais LDAP ou AD e se lle concede acceso baseandose nunha petición de autenticación manexada polo servidor LDAP ou AD.Nexttcloud non almacen os contrasinais LDAP ou AD, senon que estas credenciais usanse para autenticar un usuario e após o Nextcloud emprega unha sesión para O ID do usuario. Ten dispoñíbel máis información na documentación da infraestrutura de usuarios e grupos LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Esta aplicación permítelle aos administradores conectar Nextcloud cun directorio de usuarios baseado en LDAP para a autenticación e aprovisionamento de usuarios, grupos e atributos de usuario. Os administradores poden configurar esta aplicación para conectarse a un ou máis directorios LDAP ou Active Directory mediante unha interface LDAP. Os atributos como cota de usuario, correo, imaxes de avatar, pertenza a grupos e máis poden incorporarse a Nextcloud desde un directorio coas peticións e filtros axeitados.\n\nUn usuario rexistrase en Nextcloud coas súa credenciais LDAP ou AD e se lle concede acceso baseandose nunha petición de autenticación manexada polo servidor LDAP ou AD.Nexttcloud non almacen os contrasinais LDAP ou AD, senon que estas credenciais usanse para autenticar un usuario e após Nextcloud emprega unha sesión para O ID do usuario. Ten dispoñíbel máis información na documentación da infraestrutura de usuarios e grupos LDAP.", "Test Configuration" : "Probar a configuración", "Help" : "Axuda", "Groups meeting these criteria are available in %s:" : "Os grupos que cumpren estes criterios están dispoñíbeis en %s:", @@ -75,10 +97,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica que grupos LDAP teñen acceso á instancia %s.", "Verify settings and count the groups" : "Verificar os axustes e contar os grupos", "When logging in, %s will find the user based on the following attributes:" : "Ao acceder, %s atopa o usuario en función dos seguintes atributos:", + "LDAP/AD Username:" : "Nome de usuario LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite acceder co nome de usuario LDAP/AD, que é «uid» ou «sAMAccountName» e será detectado.", + "LDAP/AD Email Address:" : "Enderezo de correo LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite o acceso contra un atributo de correo-e. Permitirase «mail» e «mailPrimaryAddress».", "Other Attributes:" : "Outros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro que se aplica cando se intenta o acceso. «%%uid» substitúe o nome de usuario e a acción de acceso. Exemplo: «uid=%%uid» ", "Test Loginname" : "Probar o nome de acceso", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta recibir un DN para o nome de acceso indicado e o filtro de acceso actual", "Verify settings" : "Verificar os axustes", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Engadir unha configuración nova", @@ -89,7 +115,7 @@ "Port" : "Porto", "Detect Port" : "Detectar o porto", "User DN" : "DN do usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Password" : "Contrasinal", "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Save Credentials" : "Gardar as credenciais", @@ -97,7 +123,7 @@ "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar o DN base para usuarios e grupos na lapela de «Avanzado»", "Detect Base DN" : "Detectar o DN base", "Test Base DN" : "Probar o DN base", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as solicitudes LDAP automáticas. E o mellor para as configuracións máis grandes, mais require algúns coñecementos de LDAP.", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as solicitudes LDAP automáticas. E o mellor para as configuracións máis grandes, mais precisa algúns coñecementos de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Introduza manualmente os filtros LDAP (recomendado para directorios grandes)", "Listing and searching for users is constrained by these criteria:" : "A listaxe e a busca de usuarios están restrinxidos por estes criterios:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "As clases de obxecto máis comúns para os usuarios son «organizationalPerson», «person», «user» e «inetOrgPerson». Se non está seguro de que clase de obxecto ten que seleccionar, consulte co administrador de directorios.", @@ -108,11 +134,11 @@ "Continue" : "Continuar", "Please renew your password." : "Renove o seu contrasinal.", "An internal error occurred." : "Produciuse un erro interno.", - "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", + "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto coa administración desta instancia.", "Current password" : "Contrasinal actual", "New password" : "Contrasinal novo", "Renew password" : "Renovar o contrasinal", - "Wrong password." : "Contrasinal incorrecto.", + "Wrong password." : "Contrasinal erróneo", "Cancel" : "Cancelar", "Server" : "Servidor", "Users" : "Usuarios", @@ -120,29 +146,31 @@ "Groups" : "Grupos", "Expert" : "Experto", "Advanced" : "Avanzado", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP non está instalado, o servidor non funcionará. Consulte co administrador do sistema para instalalo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> O módulo PHP LDAP non está instalado, o servidor non funcionará. Consulte coa administración do sistema para instalalo.", "Connection Settings" : "Axustes da conexión", "Configuration Active" : "Configuración activa", "When unchecked, this configuration will be skipped." : "Se está sen marcar, omítese esta configuración.", - "Backup (Replica) Host" : "Servidor da copia de seguridade (réplica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indicar un servidor de copia de seguridade opcional. Debe ser unha réplica do servidor principal LDAP/AD.", - "Backup (Replica) Port" : "Porto da copia de seguridade (réplica)", + "Backup (Replica) Host" : "Servidor da copia de seguranza (réplica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indicar un servidor de copia de seguranza opcional. Debe ser unha réplica do servidor principal LDAP/AD.", + "Backup (Replica) Port" : "Porto da copia de seguranza (réplica)", "Disable Main Server" : "Desactivar o servidor principal", "Only connect to the replica server." : "Conectar só co servidor de réplica.", "Turn off SSL certificate validation." : "Desactiva a validación do certificado SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recomendado, utilizar só para probas! Se a conexión só funciona con esta opción importa o certificado SSL do servidor LDAP no seu servidor %s.", - "Cache Time-To-Live" : "Tempo de persistencia da caché", - "in seconds. A change empties the cache." : "en segundos. Calquera cambio baleira a caché.", + "Cache Time-To-Live" : "Tempo de persistencia da memoria tobo", + "in seconds. A change empties the cache." : "en segundos. Calquera cambio baleira a memoria tobo.", "Directory Settings" : "Axustes do directorio", "User Display Name Field" : "Campo de nome de usuario para amosar", "The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.", - "2nd User Display Name Field" : "2º campo de nome de usuario para amosar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemple.org)».", + "2nd User Display Name Field" : "2.º campo de nome de usuario para amosar", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@example.org)».", "Base User Tree" : "Base da árbore de usuarios", "One User Base DN per line" : "Un DN base de usuario por liña", "User Search Attributes" : "Atributos de busca do usuario", "Optional; one attribute per line" : "Opcional; un atributo por liña", - "Group Display Name Field" : "Campo de mostra do nome de grupo", + "Disable users missing from LDAP" : "Desactivar usuarios que faltan en LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Cando estea activado, desactivaranse os usuarios importados de LDAP e que logo faltan", + "Group Display Name Field" : "Campo de nome de grupo para amosar", "The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP úsase para xerar os nomes dos grupos que amosar.", "Base Group Tree" : "Base da árbore de grupo", "One Group Base DN per line" : "Un DN base de grupo por liña", @@ -151,11 +179,11 @@ "Dynamic Group Member URL" : "URL dinámico do membro do grupo", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que nos obxectos de grupo contén un URL de busca LDAP que determina que obxectos pertencen ao grupo. (Un escenario baleiro desactiva a funcionalidade dinámica de pertenza ao grupo.)", "Nested Groups" : "Grupos aniñados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se está activado, admítense grupos que conteñen grupos. (Só funciona se o atributo de membro no grupo contén os DN.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se está activado, admítense grupos que conteñen grupos. (Só funciona se o atributo de membros do grupo contén os DN.)", "Paging chunksize" : "Tamaño dos fragmentos paxinados", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño dos fragmentos utilizados para as buscas LDAP paxinadas, que poden devolver resultados voluminosos como usuario ou enumeración de grupo. (Se se estabelece a 0, desactívanse as buscas LDAP paxinadas nesas situacións.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño dos fragmentos utilizados para as buscas LDAP paxinadas, que poden devolver resultados voluminosos como usuario ou enumeración de grupo. (Se se axusta a 0, desactívanse as buscas LDAP paxinadas nesas situacións.)", "Enable LDAP password changes per user" : "Activar os cambios no contrasinal LDAP polo usuario", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permítelle aos usuarios LDAP cambiar o seu contrasinal e permite que os administradores e administradores de grupos, cambiar o contrasinal dos seus usuarios LDAP. Só funciona cando as directivas de control de acceso están configuradas conforme coas do servidor LDAP. Xa que os contrasinais son enviados en texto simple ao servidor, LDAP, debe empregarse o cifrado no transporte e o «hash» dos contrasinais debe ser configurado no servidor LDAP.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permítelle aos usuarios LDAP cambiar o seu contrasinal e permite que os administradores e administradores de grupos, cambiar o contrasinal dos seus usuarios LDAP. Só funciona cando as directivas de control de acceso están configuradas conforme coas do servidor LDAP. Xa que os contrasinais son enviados en texto simple ao servidor, LDAP, debe empregarse o cifrado no transporte e o «resumo criptográfico dos contrasinais debe ser configurado no servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(O novo contrasinal envíase como un texto simple para LDAP)", "Default password policy DN" : "DN da directiva de contrasinal predeterminado", "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "O DN dunha directiva de contrasinais predeterminados que será usado para o control da caducidade dos contrasinais. Só funciona cando está activado o cambio do contrasinal LDAP polos usuarios e só está aceptado por OpenLDAP. Déixea baleira para desactivar o control da caducidade dos contrasinais.", @@ -163,30 +191,47 @@ "Quota Field" : "Campo de cota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para a cota predeterminada do usuario. Noutro caso, especifique un atributo LDAP/AD.", "Quota Default" : "Cota predeterminada", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobrescribir a cota predeterminada para usuarios LDAP que non teñen unha cota configurada no campo Cota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Anular a cota predeterminada para usuarios LDAP que non teñen unha cota definida no campo Cota.", "Email Field" : "Campo do correo", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Axustar o correo do usuario dende un atributo LDAP. Déixeo baleiro para un comportamento predeterminado.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Definir o correo do usuario desde un atributo LDAP. Déixeo baleiro para un comportamento predeterminado.", "User Home Folder Naming Rule" : "Regra de nomeado do cartafol do usuario", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixar baleiro para o nome de usuario (predeterminado). Noutro caso, especifique un atributo LDAP/AD.", - "\"$home\" Placeholder Field" : "Campo de marcador de posición «$home»", + "\"$home\" Placeholder Field" : "Campo de marcador de substitución «$home»", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Nunha configuración de almacenamento externo substituirase $home polo valor do atributo especificado", + "User Profile Attributes" : "Atributos do perfil de usuario", + "Phone Field" : "Campo de teléfono", + "User profile Phone will be set from the specified attribute" : "O teléfono do perfil de usuario definirase a partir do atributo especificado", + "Website Field" : "Campo do sitio web", + "User profile Website will be set from the specified attribute" : "O sitio web do perfil de usuario definirase a partir do atributo especificado", + "Address Field" : "Campo de enderezo", + "User profile Address will be set from the specified attribute" : "O enderezo do perfil de usuario definirase a partir do atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "O perfil de usuario en Twitter definirase a partir do atributo especificado", + "Fediverse Field" : "Campo do Fediverso", + "User profile Fediverse will be set from the specified attribute" : "O perfil de usuario no Fediverso definirase a partir do atributo especificado", + "Organisation Field" : "Campo da organización", + "User profile Organisation will be set from the specified attribute" : "A organización do perfil de usuario definirase a partir do atributo especificado", + "Role Field" : "Campo de rol", + "User profile Role will be set from the specified attribute" : "O rol do perfil de usuario definirase a partir do atributo especificado", + "Headline Field" : "Campo de titular", + "User profile Headline will be set from the specified attribute" : "O título do perfil de usuario definirase a partir do atributo especificado", + "Biography Field" : "Campo de biografía", + "User profile Biography will be set from the specified attribute" : "A biografía no perfil de usuario definirase a partir do atributo especificado", + "Birthdate Field" : "Campo de data de nacemento", + "User profile Date of birth will be set from the specified attribute" : "A data de nacemento no perfil do usuario definirase a partir do atributo especificado", + "Pronouns Field" : "Campo de pronomes", + "User profile Pronouns will be set from the specified attribute" : "Os pronomes no perfil de usuario definiranse a partir do atributo especificado", "Internal Username" : "Nome interno de usuario", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "De xeito predeterminado, o nome de usuario interno crearase a partir do atributo UUID. Isto asegura que o nome de usuario é único e que non é necesario converter os caracteres. O nome de usuario interno ten a restrición de que só se permiten estes caracteres: [a-zA-Z0-9_.@-]. Outros caracteres substitúense pola súa correspondencia ASCII ou simplemente omítense. Nos casos de colisións engadirase/aumentarase un número. O nome de usuario interno úsase para identificar un usuario internamente. Tamén é o nome predeterminado para o cartafol de inicio do usuario. Tamén forma parte dos URL remotos, por exemplo para todos os servizos DAV. Con esta configuración, pódese anular o comportamento predeterminado. Os cambios só terán efecto nos usuarios LDAP recén asignados (engadidos). Déixeo baleiro para o comportamento predeterminado.", "Internal Username Attribute:" : "Atributo do nome interno de usuario:", - "Override UUID detection" : "Ignorar a detección do UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por omisión, o atributo UUID é detectado automaticamente. O atributo UUID utilizase para identificar, sen dúbida, aos usuarios e grupos LDAP. Ademais, crearase o nome interno de usuario baseado no UUID, se non se especifica anteriormente o contrario. Pode anular a configuración e pasar un atributo da súa escolla. Vostede debe asegurarse de que o atributo da súa escolla pode ser recuperado polos usuarios e grupos e de que é único. Déixeo baleiro para o comportamento predeterminado. Os cambios terán efecto só nas novas asignacións (engadidos) de usuarios de LDAP.", + "Override UUID detection" : "Anular a detección do UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por omisión, o atributo UUID é detectado automaticamente. O atributo UUID utilizase para identificar, sen dúbida, aos usuarios e grupos LDAP. Ademais, crearase o nome interno de usuario baseado no UUID, se non se especifica anteriormente o contrario. Pode anular o axuste e pasar un atributo da súa escolla. Asegúrese de que o atributo da súa escolla pode ser recuperado polos usuarios e grupos e de que é único. Déixeo baleiro para o comportamento predeterminado. Os cambios terán efecto só nas novas asignacións (engadidos) de usuarios de LDAP.", "UUID Attribute for Users:" : "Atributo do UUID para usuarios:", "UUID Attribute for Groups:" : "Atributo do UUID para grupos:", "Username-LDAP User Mapping" : "Asignación do usuario ao «nome de usuario LDAP»", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuario empréganse para almacenar e asignar metadatos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome interno de usuario. Isto require unha asignación do nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados. O nome interno do usuario utilizase para todo. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun contorno de produción. Limpar as asignacións só en fases de proba ou experimentais.", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuario empréganse para almacenar e asignar metadatos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome interno de usuario. Isto precisa dunha asignación do nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na memoria tobo, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados. O nome interno do usuario utilizase para todo. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun contorno de produción. Limpar as asignacións só en fases de proba ou experimentais.", "Clear Username-LDAP User Mapping" : "Limpar a asignación do usuario ao «nome de usuario LDAP»", "Clear Groupname-LDAP Group Mapping" : "Limpar a asignación do grupo ao «nome de grupo LDAP»", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Produciuse un erro de conexión no LDAP / AD, comprobe a máquina o porto e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Non se atopou o «%u ID» do marcador de posición. Vai ser substituído co nome de acceso cando se consulta LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa de grupo está desactivada, o servidor LDAP / AD non admite «memberOf».", - "LDAP / AD integration" : "Integración LDAP / AD", - "LDAP / AD Username:" : "Nome de usuario LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite o acceso co nome de usuario LDAP / AD, sexa «uid» ou «sAMAccountName« e será detectado.", - "LDAP / AD Email Address:" : "Enderezo de correo LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por omisión, o nome interno de usuario crearase a partir do atributo UUID. Isto asegura que o nome de usuario é único e non é necesario converter os caracteres. O nome interno de usuario ten a restrición de que só se admiten estes caracteres: [ a-zA-Z0-9_.@- ]. Outros caracteres son substituídos pola súa correspondencia ASCII ou simplemente omitidos. En caso de colisións engadirase/incrementarase un número. O nome interno de usuario usase para identificar internamente a un usuario. É tamén o nome predeterminado do cartafol de inicio do usuario. Tamén é parte dos URL remotos, por exemplo para todos os servizos *DAV. Con esta configuración, pódese anular o comportamento predeterminado. Déixeo baleiro para usar o comportamento predeterminado. Os cambios terán efecto só nos usuarios LDAP signados (engadidos) após os cambios." + "Invalid configuration. Please have a look at the logs for further details." : "A configuración non é correcta. Bótelle unha ollada aos rexistros para obter máis detalles." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/gu.js b/apps/user_ldap/l10n/gu.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/gu.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/gu.json b/apps/user_ldap/l10n/gu.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/gu.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/he.js b/apps/user_ldap/l10n/he.js index 66a84f710b6..d695a6ca133 100644 --- a/apps/user_ldap/l10n/he.js +++ b/apps/user_ldap/l10n/he.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "תצורה שגויה: איגוד אלמוני אסור.", "Valid configuration, connection established!" : "התצורה תקפה, התבצע חיבור!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "התצורה תקפה, אך האיגוד נכשל. נא לבדוק את הגדרות השרת ואת פרטי הגישה.", - "Invalid configuration. Please have a look at the logs for further details." : "תצורה שגויה. נא לעיין ברישום לקבלת פרטים נוספים.", "No action specified" : "לא צויינה פעולה", "No configuration specified" : "לא הוגדרה תצורה", "No data specified" : "לא הוגדר מידע", - " Could not set configuration %s" : " לא ניתן היה לקבוע הגדרות %s", "Action does not exist" : "פעולה לא קיימת", "Renewing …" : "מתבצע חידוש…", "Very weak password" : "ססמה חלשה מאוד", @@ -48,13 +46,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "אירעה שגיאה בלתי מוגדרת. נא לבדוק את יומן הרישום וההגדרות.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "סינון החיפוש אינו חוקי. ככל הנראה בשל שיאה תחבירית כגון מספר לא שווה של פתח-סוגריים וסגור-סוגריים. יש לתקן.", "Please provide a login name to test against" : "יש לספק שם משתמש לבדיקה מולו", - "Password change rejected. Hint: " : "שינוי הססמה נדחה. רמז:", "Please login with the new password" : "נא להיכנס עם הססמה החדשה", "Your password will expire tomorrow." : "הססמה שלך תפוג מחר.", "Your password will expire today." : "הססמה שלך תפוג היום.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["הססמה שלך תפוג בעוד יום.","הססמה שלך תפוג בעוד יומיים.","הססמה שלך תפוג בעוד %n ימים.","הססמה שלך תפוג בעוד %n ימים."], - "_%s group found_::_%s groups found_" : ["אותרה %s קבוצה","אותרו %s קבוצות","אותרו %s קבוצות","אותרו %s קבוצות"], - "_%s user found_::_%s users found_" : ["אותר %s משתמש","אותרו %s משתמשים","אותרו %s משתמשים","אותרו %s משתמשים"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["הססמה שלך תפוג בעוד יום.","הססמה שלך תפוג בעוד יומיים.","הססמה שלך תפוג בעוד %n ימים."], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "לא ניתן לאתר את מאפיין שם תצוגת המשתמש. נא לציין אותו בעצמך בהגדרות ה־LDAP המתקדמות.", "Could not find the desired feature" : "לא אותרה התכונה הרצויה", "Invalid Host" : "מארח לא חוקי", @@ -161,10 +156,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "מיפוי שם משתמש LDAP:", "Clear Username-LDAP User Mapping" : "ניקוי מיפוי שם משתמש LDAP:", "Clear Groupname-LDAP Group Mapping" : "ניקוי מיפוי שם משתמש קבוצה LDAP:", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "אירעה שגיאת חיבור ל- LDAP / AD, יש לבדוק את השרת, שער החיבור - פורט ופרטי הכניסה. ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "שדה הקבוצה נוטרל, כיוון ששרת ה- LDAP / AD לא תומך ב- memberOf.", - "LDAP / AD integration" : "שילוב של LDAP / AD", - "LDAP / AD Username:" : "שם משתמש LDAP / AD:", - "LDAP / AD Email Address:" : "כתובת דואר אלקטרוני LDAP / AD:" + "Invalid configuration. Please have a look at the logs for further details." : "תצורה שגויה. נא לעיין ברישום לקבלת פרטים נוספים." }, -"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); +"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;"); diff --git a/apps/user_ldap/l10n/he.json b/apps/user_ldap/l10n/he.json index e64d345c7f4..c892a8f17a1 100644 --- a/apps/user_ldap/l10n/he.json +++ b/apps/user_ldap/l10n/he.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "תצורה שגויה: איגוד אלמוני אסור.", "Valid configuration, connection established!" : "התצורה תקפה, התבצע חיבור!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "התצורה תקפה, אך האיגוד נכשל. נא לבדוק את הגדרות השרת ואת פרטי הגישה.", - "Invalid configuration. Please have a look at the logs for further details." : "תצורה שגויה. נא לעיין ברישום לקבלת פרטים נוספים.", "No action specified" : "לא צויינה פעולה", "No configuration specified" : "לא הוגדרה תצורה", "No data specified" : "לא הוגדר מידע", - " Could not set configuration %s" : " לא ניתן היה לקבוע הגדרות %s", "Action does not exist" : "פעולה לא קיימת", "Renewing …" : "מתבצע חידוש…", "Very weak password" : "ססמה חלשה מאוד", @@ -46,13 +44,10 @@ "An unspecified error occurred. Please check log and settings." : "אירעה שגיאה בלתי מוגדרת. נא לבדוק את יומן הרישום וההגדרות.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "סינון החיפוש אינו חוקי. ככל הנראה בשל שיאה תחבירית כגון מספר לא שווה של פתח-סוגריים וסגור-סוגריים. יש לתקן.", "Please provide a login name to test against" : "יש לספק שם משתמש לבדיקה מולו", - "Password change rejected. Hint: " : "שינוי הססמה נדחה. רמז:", "Please login with the new password" : "נא להיכנס עם הססמה החדשה", "Your password will expire tomorrow." : "הססמה שלך תפוג מחר.", "Your password will expire today." : "הססמה שלך תפוג היום.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["הססמה שלך תפוג בעוד יום.","הססמה שלך תפוג בעוד יומיים.","הססמה שלך תפוג בעוד %n ימים.","הססמה שלך תפוג בעוד %n ימים."], - "_%s group found_::_%s groups found_" : ["אותרה %s קבוצה","אותרו %s קבוצות","אותרו %s קבוצות","אותרו %s קבוצות"], - "_%s user found_::_%s users found_" : ["אותר %s משתמש","אותרו %s משתמשים","אותרו %s משתמשים","אותרו %s משתמשים"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["הססמה שלך תפוג בעוד יום.","הססמה שלך תפוג בעוד יומיים.","הססמה שלך תפוג בעוד %n ימים."], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "לא ניתן לאתר את מאפיין שם תצוגת המשתמש. נא לציין אותו בעצמך בהגדרות ה־LDAP המתקדמות.", "Could not find the desired feature" : "לא אותרה התכונה הרצויה", "Invalid Host" : "מארח לא חוקי", @@ -159,10 +154,6 @@ "Username-LDAP User Mapping" : "מיפוי שם משתמש LDAP:", "Clear Username-LDAP User Mapping" : "ניקוי מיפוי שם משתמש LDAP:", "Clear Groupname-LDAP Group Mapping" : "ניקוי מיפוי שם משתמש קבוצה LDAP:", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "אירעה שגיאת חיבור ל- LDAP / AD, יש לבדוק את השרת, שער החיבור - פורט ופרטי הכניסה. ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "שדה הקבוצה נוטרל, כיוון ששרת ה- LDAP / AD לא תומך ב- memberOf.", - "LDAP / AD integration" : "שילוב של LDAP / AD", - "LDAP / AD Username:" : "שם משתמש LDAP / AD:", - "LDAP / AD Email Address:" : "כתובת דואר אלקטרוני LDAP / AD:" -},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;" + "Invalid configuration. Please have a look at the logs for further details." : "תצורה שגויה. נא לעיין ברישום לקבלת פרטים נוספים." +},"pluralForm" :"nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/hr.js b/apps/user_ldap/l10n/hr.js index c7b0f5b9d5b..e7379157dab 100644 --- a/apps/user_ldap/l10n/hr.js +++ b/apps/user_ldap/l10n/hr.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Nevažeća konfiguracija: nije dopušteno anonimno povezivanje.", "Valid configuration, connection established!" : "Važeća konfiguracija, veza je uspostavljena!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Važeća konfiguracija, ali povezivanje nije uspjelo. Provjerite postavke i vjerodajnice poslužitelja.", - "Invalid configuration. Please have a look at the logs for further details." : "Nevažeća konfiguracija. Pogledajte zapise za više informacija.", "No action specified" : "Nije navedena nijedna radnja", "No configuration specified" : "Nije navedena konfiguracija", "No data specified" : "Nema podataka", - " Could not set configuration %s" : " Konfiguraciju %s nije moguće postaviti", "Action does not exist" : "Radnja ne postoji", "Renewing …" : "Obnavljanje...", "Very weak password" : "Zaporka vrlo slaba", @@ -53,15 +51,12 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Nedostaje „%uid”. Zamijenit će se imenom za prijavu kada se šalje upit LDAP-u/AD-u.", "Please provide a login name to test against" : "Navedite ispitno ime za prijavu", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Okvir grupe je onemogućen jer LDAP/AD poslužitelj ne podržava memberOf.", - "Password change rejected. Hint: " : "Odbijena promjena zaporke. Savjet: ", "Please login with the new password" : "Prijavite se novom zaporkom", "LDAP User backend" : "LDAP korisnički pozadinski sustav", "Your password will expire tomorrow." : "Vaša zaporka istječe sutra.", "Your password will expire today." : "Vaša zaporka istječe danas.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaša zaporka istječe za %n dan.","Vaša zaporka istječe za %n dana.","Vaša zaporka istječe za %n dana."], "LDAP/AD integration" : "Integracija LDAP-a/AD-a", - "_%s group found_::_%s groups found_" : ["Pronađena je %s grupa","Pronađeno je %s grupa","Pronađeno je %s grupa"], - "_%s user found_::_%s users found_" : ["Pronađen je %s korisnik","Pronađeno je %s korisnika","Pronađeno je %s korisnika"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Otkrivanje atributa imena za prikaz nije uspjelo. Navedite ga u naprednim postavkama LDAP-a.", "Could not find the desired feature" : "Željena značajka nije pronađena", "Invalid Host" : "Nevažeće računalo", @@ -180,7 +175,6 @@ OC.L10N.register( "\"$home\" Placeholder Field" : "Polje rezerviranja „$home”", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home će se u konfiguraciji vanjske pohrane zamijeniti s vrijednosti navedenog atributa", "Internal Username" : "Unutarnje korisničko ime", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Sukladno zadanim postavkama, unutarnje korisničko stvara se iz atributa UUID. Time se osigurava da je korisničko ime jedinstveno i da ne treba pretvarati znakove. Unutarnje korisničko ime ograničeno je na sljedeće znakove: [a-zA-Z0-9_.@ -]. Ostali znakovi zamjenjuju se istovjetnim ASCII znakovima ili se jednostavno izostavljaju. Nepodudarni se brojevi dodaju/povećavaju. Unutarnje korisničko ime upotrebljava se za unutarnju identifikaciju korisnika. Također se upotrebljava kao zadano ime za početnu mapu korisnika. Dio je udaljenih URL-ova, primjerice, za sve *DAV servise. Ovom postavkom možete promijeniti zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike. Ostavite je praznom ako želite zadržati zadano ponašanje.", "Internal Username Attribute:" : "Atribut unutarnjeg korisničkog imena:", "Override UUID detection" : "Premosti UUID otkrivanje", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Atribut UUID se prema zadanim postavkama automatski otkriva. Atribut UUID se upotrebljava za nedvosmislenu identifikaciju LDAP korisnika i grupa. Također će se stvoriti unutarnje korisničko ime na temelju UUID-a ako nije ručno navedeno. Možete aktivirati postavku i prenijeti atribut po vlastitom izboru. Morate biti sigurni da taj atribut može biti dostupan i za korisnike i za grupu i da je jedinstven. Ostavite prazno ako želite zadržati zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike.", @@ -190,13 +184,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Korisnička imena upotrebljavaju se za pohranu i dodjeljivanje metapodataka. Kako bi se precizno identificirali i prepoznali korisnici, svaki LDAP korisnik ima unutarnje korisničko ime. Za to je potrebno mapiranje podataka s korisničkog imena na LDAP korisnika. Stvoreno korisničko ime mapira se na UUID LDAP korisnika. Također se DN pohranjuje u predmemoriju radi smanjenja interakcije s LDAP-om, ali se ne koristi za identifikaciju. Ako se DN promijeni, te će promijene biti otkrivene. Unutarnje korisničko ime upotrebljava se u raznim situacijama. Brisanjem mapiranja ostaju razni tragovi u sustavu. Brisanje mapiranja ne ovisi o konfiguraciji, utječe na sve konfiguracije LDAP-a! Nikada nemojte brisati mapiranja u produkcijskom okruženju, već samo u fazi ispitivanja ili eksperimentiranja.", "Clear Username-LDAP User Mapping" : "Izbriši mapiranje korisnika LDAP-korisničko ime", "Clear Groupname-LDAP Group Mapping" : "Izbriši mapiranje grupe naziv grupe-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo je do pogreške s LDAP-om/AD-om, provjerite računalo, port i vjerodajnice.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Nedostaje „%uid”. Zamijenit će se imenom za prijavu kada se šalje upit LDAP-u/AD-u.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Okvir grupe je onemogućen jer LDAP/AD poslužitelj ne podržava memberOf.", - "LDAP / AD integration" : "Integracija LDAP-a/AD-a", - "LDAP / AD Username:" : "LDAP/AD korisničko ime:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Omogućuje prijavu provjerom LDAP/AD korisničkog imena sukladno postavkama „uid” ili „sAMAccountName”.", - "LDAP / AD Email Address:" : "LDAP/AD adresa e-pošte:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Sukladno zadanim postavkama, unutarnje korisničko stvara se iz atributa UUID. Time se osigurava da je korisničko ime jedinstveno i da ne treba pretvarati znakove. Unutarnje korisničko ime ograničeno je na sljedeće znakove: [a-zA-Z0-9_.@ -]. Ostali znakovi zamjenjuju se istovjetnim ASCII znakovima ili se jednostavno izostavljaju. Nepodudarni se brojevi dodaju/povećavaju. Unutarnje korisničko ime upotrebljava se za unutarnju identifikaciju korisnika. Također se upotrebljava kao zadano ime za početnu mapu korisnika. Dio je udaljenih URL-ova, primjerice, za sve *DAV servise. Ovom postavkom možete promijeniti zadano ponašanje. Ostavite je praznom ako želite zadržati zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike." + "Invalid configuration. Please have a look at the logs for further details." : "Nevažeća konfiguracija. Pogledajte zapise za više informacija." }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/hr.json b/apps/user_ldap/l10n/hr.json index a67a360e5bf..b55b4c15df4 100644 --- a/apps/user_ldap/l10n/hr.json +++ b/apps/user_ldap/l10n/hr.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Nevažeća konfiguracija: nije dopušteno anonimno povezivanje.", "Valid configuration, connection established!" : "Važeća konfiguracija, veza je uspostavljena!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Važeća konfiguracija, ali povezivanje nije uspjelo. Provjerite postavke i vjerodajnice poslužitelja.", - "Invalid configuration. Please have a look at the logs for further details." : "Nevažeća konfiguracija. Pogledajte zapise za više informacija.", "No action specified" : "Nije navedena nijedna radnja", "No configuration specified" : "Nije navedena konfiguracija", "No data specified" : "Nema podataka", - " Could not set configuration %s" : " Konfiguraciju %s nije moguće postaviti", "Action does not exist" : "Radnja ne postoji", "Renewing …" : "Obnavljanje...", "Very weak password" : "Zaporka vrlo slaba", @@ -51,15 +49,12 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Nedostaje „%uid”. Zamijenit će se imenom za prijavu kada se šalje upit LDAP-u/AD-u.", "Please provide a login name to test against" : "Navedite ispitno ime za prijavu", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Okvir grupe je onemogućen jer LDAP/AD poslužitelj ne podržava memberOf.", - "Password change rejected. Hint: " : "Odbijena promjena zaporke. Savjet: ", "Please login with the new password" : "Prijavite se novom zaporkom", "LDAP User backend" : "LDAP korisnički pozadinski sustav", "Your password will expire tomorrow." : "Vaša zaporka istječe sutra.", "Your password will expire today." : "Vaša zaporka istječe danas.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaša zaporka istječe za %n dan.","Vaša zaporka istječe za %n dana.","Vaša zaporka istječe za %n dana."], "LDAP/AD integration" : "Integracija LDAP-a/AD-a", - "_%s group found_::_%s groups found_" : ["Pronađena je %s grupa","Pronađeno je %s grupa","Pronađeno je %s grupa"], - "_%s user found_::_%s users found_" : ["Pronađen je %s korisnik","Pronađeno je %s korisnika","Pronađeno je %s korisnika"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Otkrivanje atributa imena za prikaz nije uspjelo. Navedite ga u naprednim postavkama LDAP-a.", "Could not find the desired feature" : "Željena značajka nije pronađena", "Invalid Host" : "Nevažeće računalo", @@ -178,7 +173,6 @@ "\"$home\" Placeholder Field" : "Polje rezerviranja „$home”", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home će se u konfiguraciji vanjske pohrane zamijeniti s vrijednosti navedenog atributa", "Internal Username" : "Unutarnje korisničko ime", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Sukladno zadanim postavkama, unutarnje korisničko stvara se iz atributa UUID. Time se osigurava da je korisničko ime jedinstveno i da ne treba pretvarati znakove. Unutarnje korisničko ime ograničeno je na sljedeće znakove: [a-zA-Z0-9_.@ -]. Ostali znakovi zamjenjuju se istovjetnim ASCII znakovima ili se jednostavno izostavljaju. Nepodudarni se brojevi dodaju/povećavaju. Unutarnje korisničko ime upotrebljava se za unutarnju identifikaciju korisnika. Također se upotrebljava kao zadano ime za početnu mapu korisnika. Dio je udaljenih URL-ova, primjerice, za sve *DAV servise. Ovom postavkom možete promijeniti zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike. Ostavite je praznom ako želite zadržati zadano ponašanje.", "Internal Username Attribute:" : "Atribut unutarnjeg korisničkog imena:", "Override UUID detection" : "Premosti UUID otkrivanje", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Atribut UUID se prema zadanim postavkama automatski otkriva. Atribut UUID se upotrebljava za nedvosmislenu identifikaciju LDAP korisnika i grupa. Također će se stvoriti unutarnje korisničko ime na temelju UUID-a ako nije ručno navedeno. Možete aktivirati postavku i prenijeti atribut po vlastitom izboru. Morate biti sigurni da taj atribut može biti dostupan i za korisnike i za grupu i da je jedinstven. Ostavite prazno ako želite zadržati zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike.", @@ -188,13 +182,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Korisnička imena upotrebljavaju se za pohranu i dodjeljivanje metapodataka. Kako bi se precizno identificirali i prepoznali korisnici, svaki LDAP korisnik ima unutarnje korisničko ime. Za to je potrebno mapiranje podataka s korisničkog imena na LDAP korisnika. Stvoreno korisničko ime mapira se na UUID LDAP korisnika. Također se DN pohranjuje u predmemoriju radi smanjenja interakcije s LDAP-om, ali se ne koristi za identifikaciju. Ako se DN promijeni, te će promijene biti otkrivene. Unutarnje korisničko ime upotrebljava se u raznim situacijama. Brisanjem mapiranja ostaju razni tragovi u sustavu. Brisanje mapiranja ne ovisi o konfiguraciji, utječe na sve konfiguracije LDAP-a! Nikada nemojte brisati mapiranja u produkcijskom okruženju, već samo u fazi ispitivanja ili eksperimentiranja.", "Clear Username-LDAP User Mapping" : "Izbriši mapiranje korisnika LDAP-korisničko ime", "Clear Groupname-LDAP Group Mapping" : "Izbriši mapiranje grupe naziv grupe-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo je do pogreške s LDAP-om/AD-om, provjerite računalo, port i vjerodajnice.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Nedostaje „%uid”. Zamijenit će se imenom za prijavu kada se šalje upit LDAP-u/AD-u.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Okvir grupe je onemogućen jer LDAP/AD poslužitelj ne podržava memberOf.", - "LDAP / AD integration" : "Integracija LDAP-a/AD-a", - "LDAP / AD Username:" : "LDAP/AD korisničko ime:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Omogućuje prijavu provjerom LDAP/AD korisničkog imena sukladno postavkama „uid” ili „sAMAccountName”.", - "LDAP / AD Email Address:" : "LDAP/AD adresa e-pošte:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Sukladno zadanim postavkama, unutarnje korisničko stvara se iz atributa UUID. Time se osigurava da je korisničko ime jedinstveno i da ne treba pretvarati znakove. Unutarnje korisničko ime ograničeno je na sljedeće znakove: [a-zA-Z0-9_.@ -]. Ostali znakovi zamjenjuju se istovjetnim ASCII znakovima ili se jednostavno izostavljaju. Nepodudarni se brojevi dodaju/povećavaju. Unutarnje korisničko ime upotrebljava se za unutarnju identifikaciju korisnika. Također se upotrebljava kao zadano ime za početnu mapu korisnika. Dio je udaljenih URL-ova, primjerice, za sve *DAV servise. Ovom postavkom možete promijeniti zadano ponašanje. Ostavite je praznom ako želite zadržati zadano ponašanje. Promjene će se primijeniti samo na nove mapirane (dodane) LDAP korisnike." + "Invalid configuration. Please have a look at the logs for further details." : "Nevažeća konfiguracija. Pogledajte zapise za više informacija." },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/hu.js b/apps/user_ldap/l10n/hu.js index 9fc665a0898..a9201cbab20 100644 --- a/apps/user_ldap/l10n/hu.js +++ b/apps/user_ldap/l10n/hu.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Érvénytelen beállítások: Az anonim kötés nem engedélyezett.", "Valid configuration, connection established!" : "Érvényes beállítások, a kapcsolat létrejött.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Érvényes beállítások, de a kötés sikertelen. Ellenőrizze a kiszolgálóbeállításokat és a hitelesítő adatokat.", - "Invalid configuration. Please have a look at the logs for further details." : "Érvénytelen beállítások. További információkért nézze meg a naplófájlokat.", "No action specified" : "Nincs megadva művelet", "No configuration specified" : "Nincsenek megadva beállítások", "No data specified" : "Nincsenek megadva adatok", - " Could not set configuration %s" : " A(z) %s beállítás nem adható meg", + "Invalid data specified" : "A megadott adatok érvénytelenek", "Action does not exist" : "A művelet nem létezik", "Renewing …" : "Megújítás…", "Very weak password" : "Nagyon gyenge jelszó", @@ -53,15 +52,18 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "A(z) „%uid” helykitöltő hiányzik. Ez lesz lecserélve a felhasználónévre az LDAP/AD lekérdezésekor.", "Please provide a login name to test against" : "Adjon meg egy bejelentkezési nevet a teszteléshez", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A csoport beviteli mező ki van kapcsolva, mert az LDAP/AD-kiszolgáló nem támogatja a memberOf attribútumtípust.", - "Password change rejected. Hint: " : "Jelszómódosítás elutasítva. Tipp:", "Please login with the new password" : "Jelentkezzen be az új jelszóval", "LDAP User backend" : "LDAP felhasználói háttérszolgáltatás", "Your password will expire tomorrow." : "A jelszava holnap lejár.", "Your password will expire today." : "A jelszava ma lejár.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["A jelszava %n nap múlva lejár.","A jelszava %n nap múlva lejár."], "LDAP/AD integration" : "LDAP/AD integráció", - "_%s group found_::_%s groups found_" : ["%s csoport található","%s csoport található"], - "_%s user found_::_%s users found_" : ["%s felhasználó található","%s felhasználó található"], + "Invalid LDAP UUIDs" : "Érvénytelen LADS UUID-k", + "None found" : "Nincs találat", + "_%n group found_::_%n groups found_" : ["%n csoport található","%n csoport található"], + "> 1000 groups found" : "> 1000 csoport található", + "> 1000 users found" : "> 1000 felhasználó találhatófound", + "_%n user found_::_%n users found_" : ["%n felhasználó található","%n felhasználó található"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nem lehet észlelni a felhasználó megjelenítendő név attribútumát. Adja meg kézzel a speciális LDAP beállításokban.", "Could not find the desired feature" : "A kívánt funkció nem található", "Invalid Host" : "Érvénytelen gépnév", @@ -88,6 +90,7 @@ OC.L10N.register( "Other Attributes:" : "Más attribútumok:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Meghatározza a belépéskor alkalmazandó szűrőt. A „%%uid” lecseréli a felhasználónevet a bejelentkezési műveletnél. Például: „uid=%%uid”", "Test Loginname" : "Teszt bejelentkezési név", + "Attempts to receive a DN for the given loginname and the current login filter" : "Megpróbál fogadni egy DN-t a megadott „loginname” és a jelenlegi bejelentkezési szűrő alapján", "Verify settings" : "Beállítások ellenőrzése", "%s. Server:" : "%s. szerver:", "Add a new configuration" : "Új beállítások hozzáadása", @@ -151,6 +154,8 @@ OC.L10N.register( "One User Base DN per line" : "Soronként egy felhasználói alap DN", "User Search Attributes" : "Felhasználókeresési attribútumok", "Optional; one attribute per line" : "Nem kötelező; soronként egy attribútum", + "Disable users missing from LDAP" : "Az LDAP-ból hiányzó felhasználók letiltása", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Ha engedélyezve van, az LDAP importálásból hiányzó felhasználók letiltásra kerülnek", "Group Display Name Field" : "A csoport megjelenítendő nevének mezője", "The LDAP attribute to use to generate the groups's display name." : "A csoport megjelenítendő nevének előállításához használandó LDAP attribútum.", "Base Group Tree" : "A csoportfa gyökere", @@ -179,8 +184,27 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Hagyja üresen a felhasználónévhez (alapértelmezett). Egyéb esetben adjon meg egy LDAP/AD attribútumot.", "\"$home\" Placeholder Field" : "„$home” helykitöltő mező", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Külső tárhely beállítása esetén a $home a megadott tulajdonság értékére lesz cserélve", + "User Profile Attributes" : "Felhasználói profil attribútumai", + "Phone Field" : "Telefonszám mező", + "User profile Phone will be set from the specified attribute" : "A felhasználói profil Telefonszám mezője a megadott attribútumból lesz beállítva", + "Website Field" : "Webhely mező", + "User profile Website will be set from the specified attribute" : "A felhasználói profil Webhely mezője a megadott attribútumból lesz beállítva", + "Address Field" : "Cím mező", + "User profile Address will be set from the specified attribute" : "A felhasználói profil Cím mezője a megadott attribútumból lesz beállítva", + "Twitter Field" : "Twitter mező", + "User profile Twitter will be set from the specified attribute" : "A felhasználói profil Twitter mezője a megadott attribútumból lesz beállítva", + "Fediverse Field" : "Födiverzum mező", + "User profile Fediverse will be set from the specified attribute" : "A felhasználói profil Födiverzum mezője a megadott attribútumból lesz beállítva", + "Organisation Field" : "Szervezet mező", + "User profile Organisation will be set from the specified attribute" : "A felhasználói profil Szervezet mezője a megadott attribútumból lesz beállítva", + "Role Field" : "Szerepkör mező", + "User profile Role will be set from the specified attribute" : "A felhasználói profil Szerepkör mezője a megadott attribútumból lesz beállítva", + "Headline Field" : "Szalagcím mező", + "User profile Headline will be set from the specified attribute" : "A felhasználói profil Szalagcím mezője a megadott attribútumból lesz beállítva", + "Biography Field" : "Életrajz mező", + "User profile Biography will be set from the specified attribute" : "A felhasználói profil Életrajz mezője a megadott attribútumból lesz beállítva", "Internal Username" : "Belső felhasználónév", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [a-zA-Z0-9_.@-]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra. Hagyja üresen az alapértelmezett viselkedéshez.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [a-zA-Z0-9_.@-]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes *DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra. Hagyja üresen az alapértelmezett viselkedéshez.", "Internal Username Attribute:" : "Belső felhasználónév attribútuma:", "Override UUID detection" : "UUID-felismerés felülbírálása", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Az UUID attribútum alapértelmezetten felismerésre kerül. Az UUID attribútum segítségével az LDAP felhasználók és csoportok egyértelműen azonosíthatók. A belső felhasználónév is azonos lesz az UUID-vel, ha fentebb nincs másként definiálva. Ezt a beállítást felülbírálhatja és bármely attribútummal helyettesítheti. Ekkor azonban gondoskodnia kell arról, hogy a kiválasztott attribútum minden felhasználó és csoport esetén lekérdezhető legyen, és egyedi értékkel bírjon. Ha a mezőt üresen hagyja, akkor az alapértelmezett attribútum lesz érvényes. Egy esetleges módosítás csak az újonnan hozzárendelt (hozzáadott) felhasználókra és csoportokra lesz érvényes.", @@ -190,13 +214,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "A felhasználónevek a metaadatok kezeléséhez és tárolásához vannak felhasználva. Annak érdekében, hogy teljes mértékben azonosítható legyen egy felhasználó, minden LDAP felhasználó kapni fog egy belső felhasználónevet. Ez egy hozzárendelést igényel az eredeti felhasználónév és az LDAP fiók között. A létrejött felhasználónév hozzárendelődik az LDAP fiók UUID értékéhez. Emellett a DN gyorsítótárazott, hogy csökkentse az LDAP interakciók számát, de nincs használva azonosítás céljából. Ha a DN megváltozik, a rendszer észleli ezeket a változásokat. A belső felhasználónév van mindenhol használva a rendszeren belül. A hozzárendelések törlése adattöredékeket hagy maga után. A hozzárendelések ürítése nem beállításfüggő, minden LDAP beállításra hatással van. Soha ne ürítse éles rendszeren a hozzárendeléseket, csak tesztelési vagy kísérleti szakaszban.", "Clear Username-LDAP User Mapping" : "Felhasználónév–LDAP felhasználó hozzárendelés törlése", "Clear Groupname-LDAP Group Mapping" : "Csoport–LDAP csoport hozzárendelés törlése", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD kapcsolati hiba lépett fel, ellenőrizze a gépet, a portot és a hitelesítési adatokat.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "A(z) %„uid” helykitöltő hiányzik. Le lesz cserélve a bejelentkezési névre az LDAP/AD lekérdezéskor.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A csoport beviteli mező ki van kapcsolva, mert az LDAP/AD-kiszolgáló nem támogatja a memberOf attribútumtípust.", - "LDAP / AD integration" : "LDAP/AD integráció", - "LDAP / AD Username:" : "LDAP/AD felhasználónév:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Lehetővé teszi az LDAP/AD felhasználónévvel történő bejelentkezést, amelynél vagy az „uid” vagy az „sAMAccountName” lesz észlelve.", - "LDAP / AD Email Address:" : "LDAP/AD e-mail-cím:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [ a-zA-Z0-9_.@- ]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. Hagyja üresen az alapértelmezett viselkedéshez. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra." + "Invalid configuration. Please have a look at the logs for further details." : "Érvénytelen beállítások. További információkért nézze meg a naplófájlokat." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/hu.json b/apps/user_ldap/l10n/hu.json index f694833a71f..c5673ac0c1f 100644 --- a/apps/user_ldap/l10n/hu.json +++ b/apps/user_ldap/l10n/hu.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Érvénytelen beállítások: Az anonim kötés nem engedélyezett.", "Valid configuration, connection established!" : "Érvényes beállítások, a kapcsolat létrejött.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Érvényes beállítások, de a kötés sikertelen. Ellenőrizze a kiszolgálóbeállításokat és a hitelesítő adatokat.", - "Invalid configuration. Please have a look at the logs for further details." : "Érvénytelen beállítások. További információkért nézze meg a naplófájlokat.", "No action specified" : "Nincs megadva művelet", "No configuration specified" : "Nincsenek megadva beállítások", "No data specified" : "Nincsenek megadva adatok", - " Could not set configuration %s" : " A(z) %s beállítás nem adható meg", + "Invalid data specified" : "A megadott adatok érvénytelenek", "Action does not exist" : "A művelet nem létezik", "Renewing …" : "Megújítás…", "Very weak password" : "Nagyon gyenge jelszó", @@ -51,15 +50,18 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "A(z) „%uid” helykitöltő hiányzik. Ez lesz lecserélve a felhasználónévre az LDAP/AD lekérdezésekor.", "Please provide a login name to test against" : "Adjon meg egy bejelentkezési nevet a teszteléshez", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A csoport beviteli mező ki van kapcsolva, mert az LDAP/AD-kiszolgáló nem támogatja a memberOf attribútumtípust.", - "Password change rejected. Hint: " : "Jelszómódosítás elutasítva. Tipp:", "Please login with the new password" : "Jelentkezzen be az új jelszóval", "LDAP User backend" : "LDAP felhasználói háttérszolgáltatás", "Your password will expire tomorrow." : "A jelszava holnap lejár.", "Your password will expire today." : "A jelszava ma lejár.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["A jelszava %n nap múlva lejár.","A jelszava %n nap múlva lejár."], "LDAP/AD integration" : "LDAP/AD integráció", - "_%s group found_::_%s groups found_" : ["%s csoport található","%s csoport található"], - "_%s user found_::_%s users found_" : ["%s felhasználó található","%s felhasználó található"], + "Invalid LDAP UUIDs" : "Érvénytelen LADS UUID-k", + "None found" : "Nincs találat", + "_%n group found_::_%n groups found_" : ["%n csoport található","%n csoport található"], + "> 1000 groups found" : "> 1000 csoport található", + "> 1000 users found" : "> 1000 felhasználó találhatófound", + "_%n user found_::_%n users found_" : ["%n felhasználó található","%n felhasználó található"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nem lehet észlelni a felhasználó megjelenítendő név attribútumát. Adja meg kézzel a speciális LDAP beállításokban.", "Could not find the desired feature" : "A kívánt funkció nem található", "Invalid Host" : "Érvénytelen gépnév", @@ -86,6 +88,7 @@ "Other Attributes:" : "Más attribútumok:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Meghatározza a belépéskor alkalmazandó szűrőt. A „%%uid” lecseréli a felhasználónevet a bejelentkezési műveletnél. Például: „uid=%%uid”", "Test Loginname" : "Teszt bejelentkezési név", + "Attempts to receive a DN for the given loginname and the current login filter" : "Megpróbál fogadni egy DN-t a megadott „loginname” és a jelenlegi bejelentkezési szűrő alapján", "Verify settings" : "Beállítások ellenőrzése", "%s. Server:" : "%s. szerver:", "Add a new configuration" : "Új beállítások hozzáadása", @@ -149,6 +152,8 @@ "One User Base DN per line" : "Soronként egy felhasználói alap DN", "User Search Attributes" : "Felhasználókeresési attribútumok", "Optional; one attribute per line" : "Nem kötelező; soronként egy attribútum", + "Disable users missing from LDAP" : "Az LDAP-ból hiányzó felhasználók letiltása", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Ha engedélyezve van, az LDAP importálásból hiányzó felhasználók letiltásra kerülnek", "Group Display Name Field" : "A csoport megjelenítendő nevének mezője", "The LDAP attribute to use to generate the groups's display name." : "A csoport megjelenítendő nevének előállításához használandó LDAP attribútum.", "Base Group Tree" : "A csoportfa gyökere", @@ -177,8 +182,27 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Hagyja üresen a felhasználónévhez (alapértelmezett). Egyéb esetben adjon meg egy LDAP/AD attribútumot.", "\"$home\" Placeholder Field" : "„$home” helykitöltő mező", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Külső tárhely beállítása esetén a $home a megadott tulajdonság értékére lesz cserélve", + "User Profile Attributes" : "Felhasználói profil attribútumai", + "Phone Field" : "Telefonszám mező", + "User profile Phone will be set from the specified attribute" : "A felhasználói profil Telefonszám mezője a megadott attribútumból lesz beállítva", + "Website Field" : "Webhely mező", + "User profile Website will be set from the specified attribute" : "A felhasználói profil Webhely mezője a megadott attribútumból lesz beállítva", + "Address Field" : "Cím mező", + "User profile Address will be set from the specified attribute" : "A felhasználói profil Cím mezője a megadott attribútumból lesz beállítva", + "Twitter Field" : "Twitter mező", + "User profile Twitter will be set from the specified attribute" : "A felhasználói profil Twitter mezője a megadott attribútumból lesz beállítva", + "Fediverse Field" : "Födiverzum mező", + "User profile Fediverse will be set from the specified attribute" : "A felhasználói profil Födiverzum mezője a megadott attribútumból lesz beállítva", + "Organisation Field" : "Szervezet mező", + "User profile Organisation will be set from the specified attribute" : "A felhasználói profil Szervezet mezője a megadott attribútumból lesz beállítva", + "Role Field" : "Szerepkör mező", + "User profile Role will be set from the specified attribute" : "A felhasználói profil Szerepkör mezője a megadott attribútumból lesz beállítva", + "Headline Field" : "Szalagcím mező", + "User profile Headline will be set from the specified attribute" : "A felhasználói profil Szalagcím mezője a megadott attribútumból lesz beállítva", + "Biography Field" : "Életrajz mező", + "User profile Biography will be set from the specified attribute" : "A felhasználói profil Életrajz mezője a megadott attribútumból lesz beállítva", "Internal Username" : "Belső felhasználónév", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [a-zA-Z0-9_.@-]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra. Hagyja üresen az alapértelmezett viselkedéshez.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [a-zA-Z0-9_.@-]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes *DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra. Hagyja üresen az alapértelmezett viselkedéshez.", "Internal Username Attribute:" : "Belső felhasználónév attribútuma:", "Override UUID detection" : "UUID-felismerés felülbírálása", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Az UUID attribútum alapértelmezetten felismerésre kerül. Az UUID attribútum segítségével az LDAP felhasználók és csoportok egyértelműen azonosíthatók. A belső felhasználónév is azonos lesz az UUID-vel, ha fentebb nincs másként definiálva. Ezt a beállítást felülbírálhatja és bármely attribútummal helyettesítheti. Ekkor azonban gondoskodnia kell arról, hogy a kiválasztott attribútum minden felhasználó és csoport esetén lekérdezhető legyen, és egyedi értékkel bírjon. Ha a mezőt üresen hagyja, akkor az alapértelmezett attribútum lesz érvényes. Egy esetleges módosítás csak az újonnan hozzárendelt (hozzáadott) felhasználókra és csoportokra lesz érvényes.", @@ -188,13 +212,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "A felhasználónevek a metaadatok kezeléséhez és tárolásához vannak felhasználva. Annak érdekében, hogy teljes mértékben azonosítható legyen egy felhasználó, minden LDAP felhasználó kapni fog egy belső felhasználónevet. Ez egy hozzárendelést igényel az eredeti felhasználónév és az LDAP fiók között. A létrejött felhasználónév hozzárendelődik az LDAP fiók UUID értékéhez. Emellett a DN gyorsítótárazott, hogy csökkentse az LDAP interakciók számát, de nincs használva azonosítás céljából. Ha a DN megváltozik, a rendszer észleli ezeket a változásokat. A belső felhasználónév van mindenhol használva a rendszeren belül. A hozzárendelések törlése adattöredékeket hagy maga után. A hozzárendelések ürítése nem beállításfüggő, minden LDAP beállításra hatással van. Soha ne ürítse éles rendszeren a hozzárendeléseket, csak tesztelési vagy kísérleti szakaszban.", "Clear Username-LDAP User Mapping" : "Felhasználónév–LDAP felhasználó hozzárendelés törlése", "Clear Groupname-LDAP Group Mapping" : "Csoport–LDAP csoport hozzárendelés törlése", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD kapcsolati hiba lépett fel, ellenőrizze a gépet, a portot és a hitelesítési adatokat.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "A(z) %„uid” helykitöltő hiányzik. Le lesz cserélve a bejelentkezési névre az LDAP/AD lekérdezéskor.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A csoport beviteli mező ki van kapcsolva, mert az LDAP/AD-kiszolgáló nem támogatja a memberOf attribútumtípust.", - "LDAP / AD integration" : "LDAP/AD integráció", - "LDAP / AD Username:" : "LDAP/AD felhasználónév:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Lehetővé teszi az LDAP/AD felhasználónévvel történő bejelentkezést, amelynél vagy az „uid” vagy az „sAMAccountName” lesz észlelve.", - "LDAP / AD Email Address:" : "LDAP/AD e-mail-cím:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Alapértelmezetten egy belső felhasználónév jön létre a UUID attribútumból. Gondoskodik róla, hogy a felhasználónév egyedi legyen és ne kelljen a karaktereket konvertálni. A belső felhasználónév csak a következő karakterekből állhat: [ a-zA-Z0-9_.@- ]. Más karakterek az ASCII megfelelőikre lesznek cserélve, vagy csak simán ki lesznek hagyva. Ütközés esetén egy szám lesz hozzáadva, vagy növelve. A belső felhasználónév a felhasználó belső azonosítására szolgál. Egyben a felhasználó saját mappájának neveként is szolgál. Ez része a távoli URL-eknek, például az összes DAV szolgáltatásnál. Ezzel a beállítással az alapértelmezett működés felülírható. Hagyja üresen az alapértelmezett viselkedéshez. A változások csak újonnan hozzárendelt (hozzáadott) LDAP felhasználóknál kerül alkalmazásra." + "Invalid configuration. Please have a look at the logs for further details." : "Érvénytelen beállítások. További információkért nézze meg a naplófájlokat." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/hy.js b/apps/user_ldap/l10n/hy.js deleted file mode 100644 index 6e3fc1a22c8..00000000000 --- a/apps/user_ldap/l10n/hy.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Groups" : "Խմբեր", - "Help" : "Օգնություն", - "Password" : "Գաղտնաբառ", - "Continue" : "Շարունակել" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/hy.json b/apps/user_ldap/l10n/hy.json deleted file mode 100644 index cff0593a7be..00000000000 --- a/apps/user_ldap/l10n/hy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Groups" : "Խմբեր", - "Help" : "Օգնություն", - "Password" : "Գաղտնաբառ", - "Continue" : "Շարունակել" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ia.js b/apps/user_ldap/l10n/ia.js deleted file mode 100644 index c129620ee87..00000000000 --- a/apps/user_ldap/l10n/ia.js +++ /dev/null @@ -1,12 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "Usatores", - "Groups" : "Gruppos", - "Help" : "Adjuta", - "Password" : "Contrasigno", - "Back" : "Retro", - "Continue" : "Continuar", - "Advanced" : "Avantiate" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ia.json b/apps/user_ldap/l10n/ia.json deleted file mode 100644 index 86b535fd079..00000000000 --- a/apps/user_ldap/l10n/ia.json +++ /dev/null @@ -1,10 +0,0 @@ -{ "translations": { - "Users" : "Usatores", - "Groups" : "Gruppos", - "Help" : "Adjuta", - "Password" : "Contrasigno", - "Back" : "Retro", - "Continue" : "Continuar", - "Advanced" : "Avantiate" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/id.js b/apps/user_ldap/l10n/id.js index 492f5f72428..e9b5054cd1f 100644 --- a/apps/user_ldap/l10n/id.js +++ b/apps/user_ldap/l10n/id.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Konfigurasi tidak valid: Pengikatan anonim tidak diizinkan.", "Valid configuration, connection established!" : "Konfigurasi valid, terhubung!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigurasi valid, tetapi pengikatan gagal. Silakan periksa pengaturan peladen dan kredensial.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurasi tidak valid. Silakan log untuk detil lebih lanjut.", "No action specified" : "Tidak ada tindakan yang ditetapkan", "No configuration specified" : "Tidak ada konfigurasi yang ditetapkan", "No data specified" : "Tidak ada data yang ditetapkan", - " Could not set configuration %s" : "Tidak dapat menyetel konfigurasi %s", "Action does not exist" : "Tidak ada tindakan", "Renewing …" : "Memperbarui ...", "Very weak password" : "Kata sandi sangat lemah", @@ -44,26 +42,23 @@ OC.L10N.register( "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP secara otomatis. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?", "Mode switch" : "Beralih modus", "Select attributes" : "Pilih atribut", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Pengguna tidak ditemukan. Silahkan periksa atribut log masuk dan nama pengguna. Filter yang diterapkan (untuk validasi pada antarmuka CLI):<br/>", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Pengguna tidak ditemukan. Silakan periksa atribut log masuk dan nama pengguna. Filter yang diterapkan (untuk validasi pada antarmuka CLI):<br/>", "User found and settings verified." : "Pengguna ditemukan dan pengaturan terverifikasi.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Pertimbangkan untuk mempersempit pencarian Anda, karena meliputi banyak pengguna, hanya yang pertama yang dapat log masuk.", "An unspecified error occurred. Please check log and settings." : "Suatu galat yang belum diketahui muncul. Silakan periksa log dan pengaturan.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Penyaring pencarian tidak sah, kemungkinan karena masalah sintaks seperti jumlah kurung buka dan tutup tidak sama. Mohon diperiksa.", "Please provide a login name to test against" : "Mohon berikan nama login untuk mengujinya kembali", - "Password change rejected. Hint: " : "Perubahan kata sandi ditolak. Petunjuk:", - "Please login with the new password" : "Silahkan log masuk dengan kata sandi baru", + "Please login with the new password" : "Silakan log masuk dengan kata sandi baru", "LDAP User backend" : "Backend pengguna", "Your password will expire tomorrow." : "Kata sandi Anda akan kedaluwarsa besok.", "Your password will expire today." : "Kata sandi Anda akan kedaluwarsa hari ini.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Kata sandi Anda akan kedaluwarsa dalam %n hari."], - "_%s group found_::_%s groups found_" : ["%s grup ditemukan"], - "_%s user found_::_%s users found_" : ["%s pengguna ditemukan"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Atribut nama yang akan ditampilkan tidak terdeteksi. Silahkan tentukan Anda sendiri pada pengaturan lanjutan LDAP.", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Atribut nama yang akan ditampilkan tidak terdeteksi. Silakan tentukan Anda sendiri pada pengaturan lanjutan LDAP.", "Could not find the desired feature" : "Tidak dapat menemukan fitur yang diinginkan", "Invalid Host" : "Host tidak sah", "LDAP user and group backend" : "Backend pengguna dan grup LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Aplikasi ini memungkinkan administrator menghubungkan Nextcloud dengan direktori pengguna berbasis LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aplikasi ini mengizinkan administrator untuk menghubungkan Nexcloud dengan direktori pengguna berbasis LDAP, untuk otentikasi dan penyediaan atribut pengguna dan grup. Admin dapat melakukan konfigurasi untuk menghubungkan satu atau lebih LDAP atau Active Directory melalui antarmuka LDAP. Atribut seperti diantaranya, kuota, surel, gambar profil, keanggotaan grup, dan lainnya dapat ditarik ke Nextcloud dari suatu layanan direktori dengan kueri dan filter yang sesuai.\n\nPengguna akan terhubung ke Nextcloud menggunakan kredensial LDAP atau AD, dan mendapatkan akses berdasarkan permintaan autentikasi yang ditangani oleh peladen LDAP atau AD. Nextcloud tidak menyimpan kata sandi LDAP atau AD, alih-alih kredensial digunakan untuk mengautentikasi pengguna, dan berikutnya Nextcloud akan menggunakan suatu sesi bagi ID pengguna. Informasi lebih lanjut dapat dilihat pada dokumentasi LDAP User and Group Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aplikasi ini mengizinkan administrator untuk menghubungkan Nexcloud dengan direktori pengguna berbasis LDAP, untuk otentikasi dan penyediaan atribut pengguna dan grup. Admin dapat melakukan konfigurasi untuk menghubungkan satu atau lebih LDAP atau Active Directory melalui antarmuka LDAP. Atribut seperti diantaranya, kuota, email, gambar profil, keanggotaan grup, dan lainnya dapat ditarik ke Nextcloud dari suatu layanan direktori dengan kueri dan filter yang sesuai.\n\nPengguna akan terhubung ke Nextcloud menggunakan kredensial LDAP atau AD, dan mendapatkan akses berdasarkan permintaan autentikasi yang ditangani oleh peladen LDAP atau AD. Nextcloud tidak menyimpan kata sandi LDAP atau AD, alih-alih kredensial digunakan untuk mengautentikasi pengguna, dan berikutnya Nextcloud akan menggunakan suatu sesi bagi ID pengguna. Informasi lebih lanjut dapat dilihat pada dokumentasi LDAP User and Group Backend.", "Test Configuration" : "Uji Konfigurasi", "Help" : "Bantuan", "Groups meeting these criteria are available in %s:" : "Grup yang memenuhi kriteria ini tersedia di %s:", @@ -77,7 +72,7 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Penyaring menentukan grup LDAP mana yang memiliki akses ke %s.", "Verify settings and count the groups" : "Verifikasi pengaturan, dan hitung jumlah grup", "When logging in, %s will find the user based on the following attributes:" : "Pada saat login, %s akan menemukan pengguna berdasarkan atribut berikut:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Mengizinkan juga log masuk menggunakan atribut surel \"mail\" dan \"mailPrimaryAddress\".", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Mengizinkan juga log masuk menggunakan atribut email \"mail\" dan \"mailPrimaryAddress\".", "Other Attributes:" : "Atribut Lain:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definisikan penerapan filter saat percobaan log masuk. \"%%uid\" akan menggantikan nama pengguna saat aksi dilakukan. Contoh: \"uid=%%uid\"", "Test Loginname" : "Test Loginname", @@ -108,7 +103,7 @@ OC.L10N.register( "Saving" : "Menyimpan", "Back" : "Kembali", "Continue" : "Lanjutkan", - "Please renew your password." : "Silahkan perbarui kata sandi Anda.", + "Please renew your password." : "Silakan perbarui kata sandi Anda.", "An internal error occurred." : "Terjadi kesalahan internal.", "Please try again or contact your administrator." : "Mohon coba lagi atau hubungi administrator Anda.", "Current password" : "Kata sandi saat ini", @@ -167,7 +162,7 @@ OC.L10N.register( "Quota Default" : "Kuota Baku", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Tetapkan kuota bawaan bagi pengguna LDAP, yang nilai kuotanya tidak ditentukan pada isian kuota.", "Email Field" : "Kolom Email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Tetapkan surel pengguna menggunakan atribut LDAP. Biarkan kosong untuk menggunakan perilaku bawaan.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Tetapkan email pengguna menggunakan atribut LDAP. Biarkan kosong untuk menggunakan perilaku bawaan.", "User Home Folder Naming Rule" : "Aturan Penamaan Folder Home Pengguna", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (bawaan). Atau, tentukan atribut LDAP/AD.", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home pada konfigurasi penyimpanan eksternal akan diubah dengan nilai pada atribut yang ditentukan", @@ -181,13 +176,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nama pengguna digunakan untuk menyimpan dan menetapkan (meta) data. Digunakan untuk mengidentifikasi dan mengenali pengguna secara tepat, setiap pengguna LDAP akan memiliki nama pengguna internal. Hal ini memerlukan sebuah pemetaan dari nama pengguna ke pengguna LDAP. Nama pengguna yang dibuat akan dipetakan pada UUID pengguna LDAP. Selain itu, DN akan di cache untuk mengurangi interaksi LDAP, tetapi tidak digunakan untuk identifikasi. Jika DN berubah, perubahan akan ditemukan. Nama pengguna internal digunakan secara menyeluruh. Membersihkan pemetaan akan mempengaruhi semua konfigurasi LDAP! JANGAN PERNAH MENGHAPUS PEMETAAN PADA LINGKUNGAN PRODUKSI, hanya gunakan selama tahap pengujian dan percobaan.", "Clear Username-LDAP User Mapping" : "Bersihkan Pemetaan Pengguna LDAP-Nama pengguna", "Clear Groupname-LDAP Group Mapping" : "Bersihkan Pemetaan Grup LDAP-Nama grup", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Terjadi kesalahan sambungan ke LDAP / AD, mohon periksa host, port dan kredensial.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Placeholder %uid tidak ditemukan. Ini akan digantikan dengan nama pengguna saat melakukan kueri LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah dinonaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.", - "LDAP / AD integration" : "Integrasi LDAP / AD", - "LDAP / AD Username:" : "Nama pengguna LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Mengizinkan log masuk menggunakan nama pengguna LDAP / AD, hal ini akan mendeteksi \"uid\" atau \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Alamat Email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Secara bawaan nama pengguna internal akan dibuat dari atribut UUID. Hal ini memastikan bahwa nama yang unik dan karakter tidak perlu dikonversi. Nama pengguna internal yang memiliki batasan bahwa hanya karakter ini diperbolehkan: [ a-zA-Z0-9_.@- ]. Karakter lain yang diganti dengan korespondensi ASCII mereka atau hanya dihilangkan. Pada tabrakan nomor akan ditambahkan / meningkat. Nama pengguna internal digunakan untuk mengidentifikasi pengguna internal. Itu juga merupakan nama bawaan untuk folder pengguna rumah. Ini juga merupakan bagian dari URL remote, misalnya instansi untuk semua layanan *DAV. Dengan pengaturan ini, perilaku bawaan dapat diganti. Biarkan kosong untuk perilaku bawaan. Perubahan hanya akan berpengaruh pada baru dipetakan (ditambahkan) pengguna LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurasi tidak valid. Silakan log untuk detil lebih lanjut." }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/id.json b/apps/user_ldap/l10n/id.json index 9fa347e3902..fc608eb8182 100644 --- a/apps/user_ldap/l10n/id.json +++ b/apps/user_ldap/l10n/id.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Konfigurasi tidak valid: Pengikatan anonim tidak diizinkan.", "Valid configuration, connection established!" : "Konfigurasi valid, terhubung!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigurasi valid, tetapi pengikatan gagal. Silakan periksa pengaturan peladen dan kredensial.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurasi tidak valid. Silakan log untuk detil lebih lanjut.", "No action specified" : "Tidak ada tindakan yang ditetapkan", "No configuration specified" : "Tidak ada konfigurasi yang ditetapkan", "No data specified" : "Tidak ada data yang ditetapkan", - " Could not set configuration %s" : "Tidak dapat menyetel konfigurasi %s", "Action does not exist" : "Tidak ada tindakan", "Renewing …" : "Memperbarui ...", "Very weak password" : "Kata sandi sangat lemah", @@ -42,26 +40,23 @@ "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP secara otomatis. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?", "Mode switch" : "Beralih modus", "Select attributes" : "Pilih atribut", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Pengguna tidak ditemukan. Silahkan periksa atribut log masuk dan nama pengguna. Filter yang diterapkan (untuk validasi pada antarmuka CLI):<br/>", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Pengguna tidak ditemukan. Silakan periksa atribut log masuk dan nama pengguna. Filter yang diterapkan (untuk validasi pada antarmuka CLI):<br/>", "User found and settings verified." : "Pengguna ditemukan dan pengaturan terverifikasi.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Pertimbangkan untuk mempersempit pencarian Anda, karena meliputi banyak pengguna, hanya yang pertama yang dapat log masuk.", "An unspecified error occurred. Please check log and settings." : "Suatu galat yang belum diketahui muncul. Silakan periksa log dan pengaturan.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Penyaring pencarian tidak sah, kemungkinan karena masalah sintaks seperti jumlah kurung buka dan tutup tidak sama. Mohon diperiksa.", "Please provide a login name to test against" : "Mohon berikan nama login untuk mengujinya kembali", - "Password change rejected. Hint: " : "Perubahan kata sandi ditolak. Petunjuk:", - "Please login with the new password" : "Silahkan log masuk dengan kata sandi baru", + "Please login with the new password" : "Silakan log masuk dengan kata sandi baru", "LDAP User backend" : "Backend pengguna", "Your password will expire tomorrow." : "Kata sandi Anda akan kedaluwarsa besok.", "Your password will expire today." : "Kata sandi Anda akan kedaluwarsa hari ini.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Kata sandi Anda akan kedaluwarsa dalam %n hari."], - "_%s group found_::_%s groups found_" : ["%s grup ditemukan"], - "_%s user found_::_%s users found_" : ["%s pengguna ditemukan"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Atribut nama yang akan ditampilkan tidak terdeteksi. Silahkan tentukan Anda sendiri pada pengaturan lanjutan LDAP.", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Atribut nama yang akan ditampilkan tidak terdeteksi. Silakan tentukan Anda sendiri pada pengaturan lanjutan LDAP.", "Could not find the desired feature" : "Tidak dapat menemukan fitur yang diinginkan", "Invalid Host" : "Host tidak sah", "LDAP user and group backend" : "Backend pengguna dan grup LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Aplikasi ini memungkinkan administrator menghubungkan Nextcloud dengan direktori pengguna berbasis LDAP.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aplikasi ini mengizinkan administrator untuk menghubungkan Nexcloud dengan direktori pengguna berbasis LDAP, untuk otentikasi dan penyediaan atribut pengguna dan grup. Admin dapat melakukan konfigurasi untuk menghubungkan satu atau lebih LDAP atau Active Directory melalui antarmuka LDAP. Atribut seperti diantaranya, kuota, surel, gambar profil, keanggotaan grup, dan lainnya dapat ditarik ke Nextcloud dari suatu layanan direktori dengan kueri dan filter yang sesuai.\n\nPengguna akan terhubung ke Nextcloud menggunakan kredensial LDAP atau AD, dan mendapatkan akses berdasarkan permintaan autentikasi yang ditangani oleh peladen LDAP atau AD. Nextcloud tidak menyimpan kata sandi LDAP atau AD, alih-alih kredensial digunakan untuk mengautentikasi pengguna, dan berikutnya Nextcloud akan menggunakan suatu sesi bagi ID pengguna. Informasi lebih lanjut dapat dilihat pada dokumentasi LDAP User and Group Backend.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Aplikasi ini mengizinkan administrator untuk menghubungkan Nexcloud dengan direktori pengguna berbasis LDAP, untuk otentikasi dan penyediaan atribut pengguna dan grup. Admin dapat melakukan konfigurasi untuk menghubungkan satu atau lebih LDAP atau Active Directory melalui antarmuka LDAP. Atribut seperti diantaranya, kuota, email, gambar profil, keanggotaan grup, dan lainnya dapat ditarik ke Nextcloud dari suatu layanan direktori dengan kueri dan filter yang sesuai.\n\nPengguna akan terhubung ke Nextcloud menggunakan kredensial LDAP atau AD, dan mendapatkan akses berdasarkan permintaan autentikasi yang ditangani oleh peladen LDAP atau AD. Nextcloud tidak menyimpan kata sandi LDAP atau AD, alih-alih kredensial digunakan untuk mengautentikasi pengguna, dan berikutnya Nextcloud akan menggunakan suatu sesi bagi ID pengguna. Informasi lebih lanjut dapat dilihat pada dokumentasi LDAP User and Group Backend.", "Test Configuration" : "Uji Konfigurasi", "Help" : "Bantuan", "Groups meeting these criteria are available in %s:" : "Grup yang memenuhi kriteria ini tersedia di %s:", @@ -75,7 +70,7 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Penyaring menentukan grup LDAP mana yang memiliki akses ke %s.", "Verify settings and count the groups" : "Verifikasi pengaturan, dan hitung jumlah grup", "When logging in, %s will find the user based on the following attributes:" : "Pada saat login, %s akan menemukan pengguna berdasarkan atribut berikut:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Mengizinkan juga log masuk menggunakan atribut surel \"mail\" dan \"mailPrimaryAddress\".", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Mengizinkan juga log masuk menggunakan atribut email \"mail\" dan \"mailPrimaryAddress\".", "Other Attributes:" : "Atribut Lain:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definisikan penerapan filter saat percobaan log masuk. \"%%uid\" akan menggantikan nama pengguna saat aksi dilakukan. Contoh: \"uid=%%uid\"", "Test Loginname" : "Test Loginname", @@ -106,7 +101,7 @@ "Saving" : "Menyimpan", "Back" : "Kembali", "Continue" : "Lanjutkan", - "Please renew your password." : "Silahkan perbarui kata sandi Anda.", + "Please renew your password." : "Silakan perbarui kata sandi Anda.", "An internal error occurred." : "Terjadi kesalahan internal.", "Please try again or contact your administrator." : "Mohon coba lagi atau hubungi administrator Anda.", "Current password" : "Kata sandi saat ini", @@ -165,7 +160,7 @@ "Quota Default" : "Kuota Baku", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Tetapkan kuota bawaan bagi pengguna LDAP, yang nilai kuotanya tidak ditentukan pada isian kuota.", "Email Field" : "Kolom Email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Tetapkan surel pengguna menggunakan atribut LDAP. Biarkan kosong untuk menggunakan perilaku bawaan.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Tetapkan email pengguna menggunakan atribut LDAP. Biarkan kosong untuk menggunakan perilaku bawaan.", "User Home Folder Naming Rule" : "Aturan Penamaan Folder Home Pengguna", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (bawaan). Atau, tentukan atribut LDAP/AD.", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home pada konfigurasi penyimpanan eksternal akan diubah dengan nilai pada atribut yang ditentukan", @@ -179,13 +174,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nama pengguna digunakan untuk menyimpan dan menetapkan (meta) data. Digunakan untuk mengidentifikasi dan mengenali pengguna secara tepat, setiap pengguna LDAP akan memiliki nama pengguna internal. Hal ini memerlukan sebuah pemetaan dari nama pengguna ke pengguna LDAP. Nama pengguna yang dibuat akan dipetakan pada UUID pengguna LDAP. Selain itu, DN akan di cache untuk mengurangi interaksi LDAP, tetapi tidak digunakan untuk identifikasi. Jika DN berubah, perubahan akan ditemukan. Nama pengguna internal digunakan secara menyeluruh. Membersihkan pemetaan akan mempengaruhi semua konfigurasi LDAP! JANGAN PERNAH MENGHAPUS PEMETAAN PADA LINGKUNGAN PRODUKSI, hanya gunakan selama tahap pengujian dan percobaan.", "Clear Username-LDAP User Mapping" : "Bersihkan Pemetaan Pengguna LDAP-Nama pengguna", "Clear Groupname-LDAP Group Mapping" : "Bersihkan Pemetaan Grup LDAP-Nama grup", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Terjadi kesalahan sambungan ke LDAP / AD, mohon periksa host, port dan kredensial.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Placeholder %uid tidak ditemukan. Ini akan digantikan dengan nama pengguna saat melakukan kueri LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah dinonaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.", - "LDAP / AD integration" : "Integrasi LDAP / AD", - "LDAP / AD Username:" : "Nama pengguna LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Mengizinkan log masuk menggunakan nama pengguna LDAP / AD, hal ini akan mendeteksi \"uid\" atau \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Alamat Email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Secara bawaan nama pengguna internal akan dibuat dari atribut UUID. Hal ini memastikan bahwa nama yang unik dan karakter tidak perlu dikonversi. Nama pengguna internal yang memiliki batasan bahwa hanya karakter ini diperbolehkan: [ a-zA-Z0-9_.@- ]. Karakter lain yang diganti dengan korespondensi ASCII mereka atau hanya dihilangkan. Pada tabrakan nomor akan ditambahkan / meningkat. Nama pengguna internal digunakan untuk mengidentifikasi pengguna internal. Itu juga merupakan nama bawaan untuk folder pengguna rumah. Ini juga merupakan bagian dari URL remote, misalnya instansi untuk semua layanan *DAV. Dengan pengaturan ini, perilaku bawaan dapat diganti. Biarkan kosong untuk perilaku bawaan. Perubahan hanya akan berpengaruh pada baru dipetakan (ditambahkan) pengguna LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurasi tidak valid. Silakan log untuk detil lebih lanjut." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/io.js b/apps/user_ldap/l10n/io.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/io.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/io.json b/apps/user_ldap/l10n/io.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/io.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/is.js b/apps/user_ldap/l10n/is.js deleted file mode 100644 index 3cf4e3ad4f7..00000000000 --- a/apps/user_ldap/l10n/is.js +++ /dev/null @@ -1,103 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Mistókst að hreinsa varpanir.", - "Failed to delete the server configuration" : "Mistókst að eyða uppsetningu þjónsins", - "Valid configuration, connection established!" : "Gild uppsetning, tengingu komið á!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Uppsetningin er gild, en binding mistókst. Skoðaðu stillingar þjónsins og auðkenni.", - "Invalid configuration. Please have a look at the logs for further details." : "Uppsetningin er ógild. Skoðaðu atvikaskrárnar til að sjá nánari upplýsingar.", - "No action specified" : "Engin aðgerð tiltekin", - "No configuration specified" : "Engin uppsetning tiltekin", - "No data specified" : "Engin gögn tiltekin", - " Could not set configuration %s" : "Gat ekki sett uppsetningu %s", - "Action does not exist" : "Aðgerð er ekki til", - "Renewing …" : "Endurnýja …", - "Very weak password" : "Mjög veikt lykilorð", - "Weak password" : "Veikt lykilorð", - "So-so password" : "Miðlungs lykilorð", - "Good password" : "Gott lykilorð", - "Strong password" : "Sterkt lykilorð", - "Testing configuration…" : "Prófa stillingar…", - "Configuration incorrect" : "Röng uppsetning", - "Configuration incomplete" : "Ófullgerð uppsetning", - "Configuration OK" : "Stillingar eru í lagi", - "Select groups" : "Veldu hópa", - "Please check the credentials, they seem to be wrong." : "Athugaðu auðkennin, þau líta út fyrir að vera röng.", - "{nthServer}. Server" : "{nthServer}. Þjónn", - "More than 1,000 directory entries available." : "Meira en 1,000 möppufærslur tiltækar.", - "Do you really want to delete the current Server Configuration?" : "Ertu viss um að þú viljir eyða núgildandi uppsetningu á þjóninum?", - "Confirm Deletion" : "Staðfesta eyðingu", - "Mappings cleared successfully!" : "Það tókst að hreinsa varpanir!", - "Error while clearing the mappings." : "Villa við að hreinsa út varpanir.", - "Mode switch" : "Skipta um ham", - "Select attributes" : "Veldu eigindi", - "User found and settings verified." : "Notandi fannst og stillingar yfirfarnar.", - "Password change rejected. Hint: " : "Breytingu á lykilorði hafnað. Ábending: ", - "Please login with the new password" : "Skráðu þig inn með nýja lykilorðinu", - "Your password will expire tomorrow." : "Lykilorðið þitt rennur út á morgun.", - "Your password will expire today." : "Lykilorðið þitt rennur út í dag.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Lykilorðið þitt rennur út innan %n dags.","Lykilorðið þitt rennur út innan %n daga."], - "LDAP / AD integration" : "LDAP / AD samþætting", - "_%s group found_::_%s groups found_" : ["%s hópur fannst","%s hópar fundust"], - "_%s user found_::_%s users found_" : ["%s notandi fannst","%s notendur fundust"], - "Could not find the desired feature" : "Gat ekki fundið eiginleika sem óskað var eftir", - "Invalid Host" : "Ógild vél", - "LDAP user and group backend" : "LDAP notandi og bakendi hóps", - "Test Configuration" : "Prófa uppsetningu", - "Help" : "Hjálp", - "Only from these groups:" : "Aðeins úr þessum hópum:", - "Search groups" : "Leita í hópum", - "Available groups" : "Tiltækir hópar", - "Selected groups" : "Valdir hópar", - "Edit LDAP Query" : "Breyta LDAP-fyrirspurn", - "LDAP Filter:" : "LDAP sía:", - "Verify settings and count the groups" : "Sannprófa stillingar og telja hópa", - "LDAP / AD Username:" : "LDAP / AD notandanafn:", - "LDAP / AD Email Address:" : "LDAP / AD tölvupóstfang:", - "Other Attributes:" : "Önnur eigindi:", - "Test Loginname" : "Prófa innskráningarnafn", - "Verify settings" : "Sannprófa stillingar", - "%s. Server:" : "%s. Þjónn:", - "Add a new configuration" : "Bæta við nýrri uppsetningu", - "Delete the current configuration" : "Eyða núgildandi uppsetningu", - "Host" : "Hýsill", - "Port" : "Gátt", - "Detect Port" : "Finna gátt", - "User DN" : "DN notanda", - "Password" : "Lykilorð", - "Save Credentials" : "Vista auðkenni", - "Verify settings and count users" : "Sannprófa stillingar og telja notendur", - "Saving" : "Vistun", - "Back" : "Til baka", - "Continue" : "Halda áfram", - "Please renew your password." : "Endurnýjaðu lykilorðið þitt", - "An internal error occurred." : "Innri villa kom upp.", - "Please try again or contact your administrator." : "Reyndu aftur eða hafðu samband við kerfisstjóra.", - "Current password" : "Núverandi lykilorð", - "New password" : "Nýtt lykilorð", - "Renew password" : "Endurnýja lykilorð", - "Wrong password." : "Rangt lykilorð.", - "Cancel" : "Hætta við", - "Server" : "Þjónn", - "Users" : "Notendur", - "Login Attributes" : "Eigindi innskráningar", - "Groups" : "Hópar", - "Expert" : "Snillingur", - "Advanced" : "Ítarlegt", - "Connection Settings" : "Valkostir tengingar ", - "Configuration Active" : "Uppsetning er virk", - "Disable Main Server" : "Gera aðalþjón óvirkan", - "Turn off SSL certificate validation." : "Slökkva á sannvottun SSL-skilríkja.", - "in seconds. A change empties the cache." : "í sekúndum. Breyting tæmir skyndiminnið.", - "Directory Settings" : "Stillingar möppu", - "Nested Groups" : "Faldaðir hópar", - "(New password is sent as plain text to LDAP)" : "(Nýtt lykilorð er sent sem hreinn texti til LDAP)", - "Default password policy DN" : "Sjálfgefin lykilorðastefna DN", - "Special Attributes" : "Sérstök eigindi", - "Quota Field" : "Gagnasvið fyrir kvóta", - "Quota Default" : "Sjálfgefinn kvóti", - "Email Field" : "Gagnasvið fyrir netfang", - "Internal Username" : "Innra notandanafn", - "UUID Attribute for Groups:" : "UUID-eigindi fyrir hópa:" -}, -"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/user_ldap/l10n/is.json b/apps/user_ldap/l10n/is.json deleted file mode 100644 index 5cfa2563c83..00000000000 --- a/apps/user_ldap/l10n/is.json +++ /dev/null @@ -1,101 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Mistókst að hreinsa varpanir.", - "Failed to delete the server configuration" : "Mistókst að eyða uppsetningu þjónsins", - "Valid configuration, connection established!" : "Gild uppsetning, tengingu komið á!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Uppsetningin er gild, en binding mistókst. Skoðaðu stillingar þjónsins og auðkenni.", - "Invalid configuration. Please have a look at the logs for further details." : "Uppsetningin er ógild. Skoðaðu atvikaskrárnar til að sjá nánari upplýsingar.", - "No action specified" : "Engin aðgerð tiltekin", - "No configuration specified" : "Engin uppsetning tiltekin", - "No data specified" : "Engin gögn tiltekin", - " Could not set configuration %s" : "Gat ekki sett uppsetningu %s", - "Action does not exist" : "Aðgerð er ekki til", - "Renewing …" : "Endurnýja …", - "Very weak password" : "Mjög veikt lykilorð", - "Weak password" : "Veikt lykilorð", - "So-so password" : "Miðlungs lykilorð", - "Good password" : "Gott lykilorð", - "Strong password" : "Sterkt lykilorð", - "Testing configuration…" : "Prófa stillingar…", - "Configuration incorrect" : "Röng uppsetning", - "Configuration incomplete" : "Ófullgerð uppsetning", - "Configuration OK" : "Stillingar eru í lagi", - "Select groups" : "Veldu hópa", - "Please check the credentials, they seem to be wrong." : "Athugaðu auðkennin, þau líta út fyrir að vera röng.", - "{nthServer}. Server" : "{nthServer}. Þjónn", - "More than 1,000 directory entries available." : "Meira en 1,000 möppufærslur tiltækar.", - "Do you really want to delete the current Server Configuration?" : "Ertu viss um að þú viljir eyða núgildandi uppsetningu á þjóninum?", - "Confirm Deletion" : "Staðfesta eyðingu", - "Mappings cleared successfully!" : "Það tókst að hreinsa varpanir!", - "Error while clearing the mappings." : "Villa við að hreinsa út varpanir.", - "Mode switch" : "Skipta um ham", - "Select attributes" : "Veldu eigindi", - "User found and settings verified." : "Notandi fannst og stillingar yfirfarnar.", - "Password change rejected. Hint: " : "Breytingu á lykilorði hafnað. Ábending: ", - "Please login with the new password" : "Skráðu þig inn með nýja lykilorðinu", - "Your password will expire tomorrow." : "Lykilorðið þitt rennur út á morgun.", - "Your password will expire today." : "Lykilorðið þitt rennur út í dag.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Lykilorðið þitt rennur út innan %n dags.","Lykilorðið þitt rennur út innan %n daga."], - "LDAP / AD integration" : "LDAP / AD samþætting", - "_%s group found_::_%s groups found_" : ["%s hópur fannst","%s hópar fundust"], - "_%s user found_::_%s users found_" : ["%s notandi fannst","%s notendur fundust"], - "Could not find the desired feature" : "Gat ekki fundið eiginleika sem óskað var eftir", - "Invalid Host" : "Ógild vél", - "LDAP user and group backend" : "LDAP notandi og bakendi hóps", - "Test Configuration" : "Prófa uppsetningu", - "Help" : "Hjálp", - "Only from these groups:" : "Aðeins úr þessum hópum:", - "Search groups" : "Leita í hópum", - "Available groups" : "Tiltækir hópar", - "Selected groups" : "Valdir hópar", - "Edit LDAP Query" : "Breyta LDAP-fyrirspurn", - "LDAP Filter:" : "LDAP sía:", - "Verify settings and count the groups" : "Sannprófa stillingar og telja hópa", - "LDAP / AD Username:" : "LDAP / AD notandanafn:", - "LDAP / AD Email Address:" : "LDAP / AD tölvupóstfang:", - "Other Attributes:" : "Önnur eigindi:", - "Test Loginname" : "Prófa innskráningarnafn", - "Verify settings" : "Sannprófa stillingar", - "%s. Server:" : "%s. Þjónn:", - "Add a new configuration" : "Bæta við nýrri uppsetningu", - "Delete the current configuration" : "Eyða núgildandi uppsetningu", - "Host" : "Hýsill", - "Port" : "Gátt", - "Detect Port" : "Finna gátt", - "User DN" : "DN notanda", - "Password" : "Lykilorð", - "Save Credentials" : "Vista auðkenni", - "Verify settings and count users" : "Sannprófa stillingar og telja notendur", - "Saving" : "Vistun", - "Back" : "Til baka", - "Continue" : "Halda áfram", - "Please renew your password." : "Endurnýjaðu lykilorðið þitt", - "An internal error occurred." : "Innri villa kom upp.", - "Please try again or contact your administrator." : "Reyndu aftur eða hafðu samband við kerfisstjóra.", - "Current password" : "Núverandi lykilorð", - "New password" : "Nýtt lykilorð", - "Renew password" : "Endurnýja lykilorð", - "Wrong password." : "Rangt lykilorð.", - "Cancel" : "Hætta við", - "Server" : "Þjónn", - "Users" : "Notendur", - "Login Attributes" : "Eigindi innskráningar", - "Groups" : "Hópar", - "Expert" : "Snillingur", - "Advanced" : "Ítarlegt", - "Connection Settings" : "Valkostir tengingar ", - "Configuration Active" : "Uppsetning er virk", - "Disable Main Server" : "Gera aðalþjón óvirkan", - "Turn off SSL certificate validation." : "Slökkva á sannvottun SSL-skilríkja.", - "in seconds. A change empties the cache." : "í sekúndum. Breyting tæmir skyndiminnið.", - "Directory Settings" : "Stillingar möppu", - "Nested Groups" : "Faldaðir hópar", - "(New password is sent as plain text to LDAP)" : "(Nýtt lykilorð er sent sem hreinn texti til LDAP)", - "Default password policy DN" : "Sjálfgefin lykilorðastefna DN", - "Special Attributes" : "Sérstök eigindi", - "Quota Field" : "Gagnasvið fyrir kvóta", - "Quota Default" : "Sjálfgefinn kvóti", - "Email Field" : "Gagnasvið fyrir netfang", - "Internal Username" : "Innra notandanafn", - "UUID Attribute for Groups:" : "UUID-eigindi fyrir hópa:" -},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js index cc121f450e7..5fc1cfa7cf3 100644 --- a/apps/user_ldap/l10n/it.js +++ b/apps/user_ldap/l10n/it.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "La configurazione non è valida: l'associazione anonima non è consentita.", "Valid configuration, connection established!" : "Configurazione valida, connessione stabilita!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configurazione valida, ma associazione non riuscita. Controlla le impostazioni del server e le credenziali.", - "Invalid configuration. Please have a look at the logs for further details." : "Configurazione non valida. Controlla i log per ulteriori dettagli.", "No action specified" : "Nessuna azione specificata", "No configuration specified" : "Nessuna configurazione specificata", "No data specified" : "Nessun dato specificato", - " Could not set configuration %s" : "Impossibile impostare la configurazione %s", + "Invalid data specified" : "Dati specificati non validi", "Action does not exist" : "L'azione non esiste", "Renewing …" : "Rinnovo...", "Very weak password" : "Password molto debole", @@ -32,7 +31,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. server", "No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.", "More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} voce disponibile all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} voce disponibile all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Si è verificato un errore. Controlla il DN base, così come le impostazioni di connessione e le credenziali.", "Do you really want to delete the current Server Configuration?" : "Vuoi davvero eliminare la configurazione attuale del server?", "Confirm Deletion" : "Conferma l'eliminazione", @@ -53,15 +52,24 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP/AD.", "Please provide a login name to test against" : "Fornisci un nome di accesso da provare", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "La casella dei gruppi è stata disattivata, poiché il server LDAP/AD non supporta memberOf.", - "Password change rejected. Hint: " : "Cambio password rifiutato. Suggerimento:", "Please login with the new password" : "Accedi con la nuova password", "LDAP User backend" : "Motore Utenti LDAP", "Your password will expire tomorrow." : "La tua password scadrà domani.", "Your password will expire today." : "La tua password scadrà oggi.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La tua password scadrà tra %n giorno.","La tua password scadrà oggi tra %n giorni."], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La tua password scadrà tra %n giorno.","La tua password scadrà oggi tra %n giorni.","La tua password scadrà oggi tra %n giorni."], "LDAP/AD integration" : "Integrazione LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s gruppo trovato","%s gruppi trovati"], - "_%s user found_::_%s users found_" : ["%s utente trovato","%s utenti trovati"], + "LDAP Connection" : "Connessione LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Associazione non riuscita per questa configurazione LDAP: %s","Associazione non riuscita per %n configurazioni LDAP: %s","Associazione non riuscita per %n configurazioni LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Ricerca fallita per questa configurazione LDAP: %s","Ricerca fallita per %n configurazioni LDAP: %s","Ricerca fallita per %n configurazioni LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["C'è una configurazione LDAP inattiva: %s","Ci sono %n configurazioni LDAP inattive: %s","Ci sono %n configurazioni LDAP inattive: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["L'associazione e la ricerca funzionano sulla connessione LDAP configurata (%s)","L'associazione e la ricerca funzionano sulle %n connessioni LDAP configurate (%s)","L'associazione e la ricerca funzionano sulle %n connessioni LDAP configurate (%s)"], + "Invalid LDAP UUIDs" : "UUID LDAP non validi", + "None found" : "Nessuno trovato", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Sono stati trovati UUID non validi di account o gruppi LDAP. Controlla le impostazioni \"Ignora rilevamento UUID\" nella parte Esperto della configurazione LDAP e utilizza \"occ ldap:update-uuid\" per aggiornarle.", + "_%n group found_::_%n groups found_" : ["%n gruppo trovato","%n gruppi trovati","%n gruppi trovati"], + "> 1000 groups found" : "> 1000 gruppi trovati", + "> 1000 users found" : "> 1000 utenti trovati", + "_%n user found_::_%n users found_" : ["%n utente trovato","%n utenti trovati","%n utenti trovati"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossibile rilevare l'attributo nome visualizzato dell'utente. Specificalo nelle impostazioni avanzate di LDAP.", "Could not find the desired feature" : "Impossibile trovare la funzionalità desiderata", "Invalid Host" : "Host non valido", @@ -88,6 +96,7 @@ OC.L10N.register( "Other Attributes:" : "Altri attributi:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definisce i filtri da applicare quando viene eseguito il tentativo di accesso. \"%%uid\" rimpiazza il nome utente nell'azione di accesso. Esempio: \"uid=%%uid\"", "Test Loginname" : "Prova nome di accesso", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta di ricevere un nome di dominio per il nome di login dato e l'attuale filtro di login", "Verify settings" : "Verifica impostazioni", "%s. Server:" : "%s. server:", "Add a new configuration" : "Aggiungi una nuova configurazione", @@ -151,6 +160,8 @@ OC.L10N.register( "One User Base DN per line" : "Un DN base utente per riga", "User Search Attributes" : "Attributi di ricerca utente", "Optional; one attribute per line" : "Opzionale; un attributo per riga", + "Disable users missing from LDAP" : "Disattiva utenti mancanti da LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quando attivo, gli utenti importati da LDAP che poi mancano, saranno disattivati", "Group Display Name Field" : "Campo per la visualizzazione del nome del gruppo", "The LDAP attribute to use to generate the groups's display name." : "L'attributo LDAP da usare per generare il nome visualizzato del gruppo.", "Base Group Tree" : "Struttura base del gruppo", @@ -179,8 +190,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lascia vuoto il nome utente (predefinito). Altrimenti, specifica un attributo LDAP/AD.", "\"$home\" Placeholder Field" : "Segnaposto \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home nella configurazione di un'archiviazione esterna sarà sostituita con il valore dell'attributo specificato", + "User Profile Attributes" : "Attributi profilo utente", + "Phone Field" : "Campo telefono", + "User profile Phone will be set from the specified attribute" : "Il telefono del profilo utente verrà impostato dall'attributo specificato", + "Website Field" : "Campo sito web", + "User profile Website will be set from the specified attribute" : "Il sito web del profilo utente verrà impostato dall'attributo specificato", + "Address Field" : "Campo indirizzo", + "User profile Address will be set from the specified attribute" : "L'indirizzo del profilo utente verrà impostato dall'attributo specificato", + "Twitter Field" : "Campo Twitter", + "User profile Twitter will be set from the specified attribute" : "Il Twitter del profilo utente verrà impostato dall'attributo specificato", + "Fediverse Field" : "Campo fediverso", + "User profile Fediverse will be set from the specified attribute" : "Il fediverso del profilo utente verrà impostato dall'attributo specificato", + "Organisation Field" : "Campo organizzazione", + "User profile Organisation will be set from the specified attribute" : "L'organizzazione del profilo utente verrà impostata dall'attributo specificato", + "Role Field" : "Campo ruolo", + "User profile Role will be set from the specified attribute" : "Il ruolo del profilo utente verrà impostato dall'attributo specificato", + "Headline Field" : "Campo titolo", + "User profile Headline will be set from the specified attribute" : "Il titolo del profilo utente verrà impostato dall'attributo specificato", + "Biography Field" : "Campo biografia", + "User profile Biography will be set from the specified attribute" : "La biografia del profilo utente verrà impostata dall'attributo specificato", + "Birthdate Field" : "Campo Data di Nascita", + "User profile Date of birth will be set from the specified attribute" : "La data di nascita del Profilo Utente verrà impostata dall'attributo specificato", + "Pronouns Field" : "Campo Pronomi", + "User profile Pronouns will be set from the specified attribute" : "I pronomi del Profilo Utente verranno impostati dall'attributo specificato", "Internal Username" : "Nome utente interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti). Lascialo vuoto per ottenere il comportamento predefinito.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso solo di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è usato per identificare un utente internamente. È anche il nome predefinito per la cartella home dell'utente. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti). Lascialo vuoto per ottenere il comportamento predefinito.", "Internal Username Attribute:" : "Attributo nome utente interno:", "Override UUID detection" : "Ignora rilevamento UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "In modo predefinito, l'attributo UUID viene rilevato automaticamente. L'attributo UUID è utilizzato per identificare senza alcun dubbio gli utenti e i gruppi LDAP. Inoltre, il nome utente interno sarà creato sulla base dell'UUID, se non è specificato in precedenza. Puoi ignorare l'impostazione e fornire un attributo di tua scelta. Assicurati che l'attributo scelto possa essere ottenuto sia per gli utenti che per i gruppi e che sia univoco. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovi utenti e gruppi LDAP associati (aggiunti).", @@ -190,13 +224,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "I nomi utente sono utilizzati per archiviare e assegnare i metadati. Per identificare con precisione e riconoscere gli utenti, ogni utente LDAP avrà un nome utente interno. Il nome utente creato. Ciò richiede un'associazione tra il nome utente e l'utente LDAP. Il nome utente creato è associato allo UUID dell'utente LDAP. In aggiunta, il DN viene memorizzato in cache per ridurre l'interazione con LDAP, ma non è utilizzato per l'identificazione. Se il DN cambia, le modifiche saranno rilevate. Il nome utente interno è utilizzato dappertutto. La cancellazione delle associazioni lascerà tracce residue ovunque e interesserà tutta la configurazione LDAP. Non cancellare mai le associazioni in un ambiente di produzione, ma solo in una fase sperimentale o di test.", "Clear Username-LDAP User Mapping" : "Cancella associazione Nome utente-Utente LDAP", "Clear Groupname-LDAP Group Mapping" : "Cancella associazione Nome gruppo-Gruppo LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Si è verificato un errore di connessione a LDAP / AD, controlla l'host, la porta e le credenziali.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "La casella dei gruppi è stata disabilitata, poiché il server LDAP / AD non supporta memberOf.", - "LDAP / AD integration" : "Integrazione LDAP / AD", - "LDAP / AD Username:" : "Nome utente LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Consente l'accesso tramite il nome utente LDAP / AD, può essere sia \"uid\" o \"sAMAccountName\" e sarà rilevato.", - "LDAP / AD Email Address:" : "Indirizzo email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti)." + "Invalid configuration. Please have a look at the logs for further details." : "Configurazione non valida. Controlla i log per ulteriori dettagli." }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json index 5b006c8db8c..2faa08fb7f1 100644 --- a/apps/user_ldap/l10n/it.json +++ b/apps/user_ldap/l10n/it.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "La configurazione non è valida: l'associazione anonima non è consentita.", "Valid configuration, connection established!" : "Configurazione valida, connessione stabilita!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configurazione valida, ma associazione non riuscita. Controlla le impostazioni del server e le credenziali.", - "Invalid configuration. Please have a look at the logs for further details." : "Configurazione non valida. Controlla i log per ulteriori dettagli.", "No action specified" : "Nessuna azione specificata", "No configuration specified" : "Nessuna configurazione specificata", "No data specified" : "Nessun dato specificato", - " Could not set configuration %s" : "Impossibile impostare la configurazione %s", + "Invalid data specified" : "Dati specificati non validi", "Action does not exist" : "L'azione non esiste", "Renewing …" : "Rinnovo...", "Very weak password" : "Password molto debole", @@ -30,7 +29,7 @@ "{nthServer}. Server" : "{nthServer}. server", "No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.", "More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} voce disponibile all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} voce disponibile all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito","{objectsFound} voci disponibili all'interno del DN base fornito"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Si è verificato un errore. Controlla il DN base, così come le impostazioni di connessione e le credenziali.", "Do you really want to delete the current Server Configuration?" : "Vuoi davvero eliminare la configurazione attuale del server?", "Confirm Deletion" : "Conferma l'eliminazione", @@ -51,15 +50,24 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP/AD.", "Please provide a login name to test against" : "Fornisci un nome di accesso da provare", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "La casella dei gruppi è stata disattivata, poiché il server LDAP/AD non supporta memberOf.", - "Password change rejected. Hint: " : "Cambio password rifiutato. Suggerimento:", "Please login with the new password" : "Accedi con la nuova password", "LDAP User backend" : "Motore Utenti LDAP", "Your password will expire tomorrow." : "La tua password scadrà domani.", "Your password will expire today." : "La tua password scadrà oggi.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La tua password scadrà tra %n giorno.","La tua password scadrà oggi tra %n giorni."], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La tua password scadrà tra %n giorno.","La tua password scadrà oggi tra %n giorni.","La tua password scadrà oggi tra %n giorni."], "LDAP/AD integration" : "Integrazione LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s gruppo trovato","%s gruppi trovati"], - "_%s user found_::_%s users found_" : ["%s utente trovato","%s utenti trovati"], + "LDAP Connection" : "Connessione LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Associazione non riuscita per questa configurazione LDAP: %s","Associazione non riuscita per %n configurazioni LDAP: %s","Associazione non riuscita per %n configurazioni LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Ricerca fallita per questa configurazione LDAP: %s","Ricerca fallita per %n configurazioni LDAP: %s","Ricerca fallita per %n configurazioni LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["C'è una configurazione LDAP inattiva: %s","Ci sono %n configurazioni LDAP inattive: %s","Ci sono %n configurazioni LDAP inattive: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["L'associazione e la ricerca funzionano sulla connessione LDAP configurata (%s)","L'associazione e la ricerca funzionano sulle %n connessioni LDAP configurate (%s)","L'associazione e la ricerca funzionano sulle %n connessioni LDAP configurate (%s)"], + "Invalid LDAP UUIDs" : "UUID LDAP non validi", + "None found" : "Nessuno trovato", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Sono stati trovati UUID non validi di account o gruppi LDAP. Controlla le impostazioni \"Ignora rilevamento UUID\" nella parte Esperto della configurazione LDAP e utilizza \"occ ldap:update-uuid\" per aggiornarle.", + "_%n group found_::_%n groups found_" : ["%n gruppo trovato","%n gruppi trovati","%n gruppi trovati"], + "> 1000 groups found" : "> 1000 gruppi trovati", + "> 1000 users found" : "> 1000 utenti trovati", + "_%n user found_::_%n users found_" : ["%n utente trovato","%n utenti trovati","%n utenti trovati"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossibile rilevare l'attributo nome visualizzato dell'utente. Specificalo nelle impostazioni avanzate di LDAP.", "Could not find the desired feature" : "Impossibile trovare la funzionalità desiderata", "Invalid Host" : "Host non valido", @@ -86,6 +94,7 @@ "Other Attributes:" : "Altri attributi:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definisce i filtri da applicare quando viene eseguito il tentativo di accesso. \"%%uid\" rimpiazza il nome utente nell'azione di accesso. Esempio: \"uid=%%uid\"", "Test Loginname" : "Prova nome di accesso", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta di ricevere un nome di dominio per il nome di login dato e l'attuale filtro di login", "Verify settings" : "Verifica impostazioni", "%s. Server:" : "%s. server:", "Add a new configuration" : "Aggiungi una nuova configurazione", @@ -149,6 +158,8 @@ "One User Base DN per line" : "Un DN base utente per riga", "User Search Attributes" : "Attributi di ricerca utente", "Optional; one attribute per line" : "Opzionale; un attributo per riga", + "Disable users missing from LDAP" : "Disattiva utenti mancanti da LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quando attivo, gli utenti importati da LDAP che poi mancano, saranno disattivati", "Group Display Name Field" : "Campo per la visualizzazione del nome del gruppo", "The LDAP attribute to use to generate the groups's display name." : "L'attributo LDAP da usare per generare il nome visualizzato del gruppo.", "Base Group Tree" : "Struttura base del gruppo", @@ -177,8 +188,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lascia vuoto il nome utente (predefinito). Altrimenti, specifica un attributo LDAP/AD.", "\"$home\" Placeholder Field" : "Segnaposto \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home nella configurazione di un'archiviazione esterna sarà sostituita con il valore dell'attributo specificato", + "User Profile Attributes" : "Attributi profilo utente", + "Phone Field" : "Campo telefono", + "User profile Phone will be set from the specified attribute" : "Il telefono del profilo utente verrà impostato dall'attributo specificato", + "Website Field" : "Campo sito web", + "User profile Website will be set from the specified attribute" : "Il sito web del profilo utente verrà impostato dall'attributo specificato", + "Address Field" : "Campo indirizzo", + "User profile Address will be set from the specified attribute" : "L'indirizzo del profilo utente verrà impostato dall'attributo specificato", + "Twitter Field" : "Campo Twitter", + "User profile Twitter will be set from the specified attribute" : "Il Twitter del profilo utente verrà impostato dall'attributo specificato", + "Fediverse Field" : "Campo fediverso", + "User profile Fediverse will be set from the specified attribute" : "Il fediverso del profilo utente verrà impostato dall'attributo specificato", + "Organisation Field" : "Campo organizzazione", + "User profile Organisation will be set from the specified attribute" : "L'organizzazione del profilo utente verrà impostata dall'attributo specificato", + "Role Field" : "Campo ruolo", + "User profile Role will be set from the specified attribute" : "Il ruolo del profilo utente verrà impostato dall'attributo specificato", + "Headline Field" : "Campo titolo", + "User profile Headline will be set from the specified attribute" : "Il titolo del profilo utente verrà impostato dall'attributo specificato", + "Biography Field" : "Campo biografia", + "User profile Biography will be set from the specified attribute" : "La biografia del profilo utente verrà impostata dall'attributo specificato", + "Birthdate Field" : "Campo Data di Nascita", + "User profile Date of birth will be set from the specified attribute" : "La data di nascita del Profilo Utente verrà impostata dall'attributo specificato", + "Pronouns Field" : "Campo Pronomi", + "User profile Pronouns will be set from the specified attribute" : "I pronomi del Profilo Utente verranno impostati dall'attributo specificato", "Internal Username" : "Nome utente interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti). Lascialo vuoto per ottenere il comportamento predefinito.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso solo di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è usato per identificare un utente internamente. È anche il nome predefinito per la cartella home dell'utente. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti). Lascialo vuoto per ottenere il comportamento predefinito.", "Internal Username Attribute:" : "Attributo nome utente interno:", "Override UUID detection" : "Ignora rilevamento UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "In modo predefinito, l'attributo UUID viene rilevato automaticamente. L'attributo UUID è utilizzato per identificare senza alcun dubbio gli utenti e i gruppi LDAP. Inoltre, il nome utente interno sarà creato sulla base dell'UUID, se non è specificato in precedenza. Puoi ignorare l'impostazione e fornire un attributo di tua scelta. Assicurati che l'attributo scelto possa essere ottenuto sia per gli utenti che per i gruppi e che sia univoco. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovi utenti e gruppi LDAP associati (aggiunti).", @@ -188,13 +222,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "I nomi utente sono utilizzati per archiviare e assegnare i metadati. Per identificare con precisione e riconoscere gli utenti, ogni utente LDAP avrà un nome utente interno. Il nome utente creato. Ciò richiede un'associazione tra il nome utente e l'utente LDAP. Il nome utente creato è associato allo UUID dell'utente LDAP. In aggiunta, il DN viene memorizzato in cache per ridurre l'interazione con LDAP, ma non è utilizzato per l'identificazione. Se il DN cambia, le modifiche saranno rilevate. Il nome utente interno è utilizzato dappertutto. La cancellazione delle associazioni lascerà tracce residue ovunque e interesserà tutta la configurazione LDAP. Non cancellare mai le associazioni in un ambiente di produzione, ma solo in una fase sperimentale o di test.", "Clear Username-LDAP User Mapping" : "Cancella associazione Nome utente-Utente LDAP", "Clear Groupname-LDAP Group Mapping" : "Cancella associazione Nome gruppo-Gruppo LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Si è verificato un errore di connessione a LDAP / AD, controlla l'host, la porta e le credenziali.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "La casella dei gruppi è stata disabilitata, poiché il server LDAP / AD non supporta memberOf.", - "LDAP / AD integration" : "Integrazione LDAP / AD", - "LDAP / AD Username:" : "Nome utente LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Consente l'accesso tramite il nome utente LDAP / AD, può essere sia \"uid\" o \"sAMAccountName\" e sarà rilevato.", - "LDAP / AD Email Address:" : "Indirizzo email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "In modo predefinito, il nome utente interno sarà creato dall'attributo UUID. Ciò assicura che il nome utente sia univoco e che non sia necessario convertire i caratteri. Il nome utente interno consente l'uso di determinati caratteri: [ a-zA-Z0-9_.@- ]. Altri caratteri sono sostituiti con il corrispondente ASCII o sono semplicemente omessi. In caso di conflitto, sarà aggiunto/incrementato un numero. Il nome utente interno è utilizzato per identificare un utente internamente. Rappresenta, inoltre, il nome predefinito per la cartella home dell'utente in ownCloud. Costituisce anche una parte di URL remoti, ad esempio per tutti i servizi *DAV. Con questa impostazione, il comportamento predefinito può essere scavalcato. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovo utenti LDAP associati (aggiunti)." -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configurazione non valida. Controlla i log per ulteriori dettagli." +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js index 6ff251c8b26..b957227dfd1 100644 --- a/apps/user_ldap/l10n/ja.js +++ b/apps/user_ldap/l10n/ja.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "設定が間違っています: 匿名接続は、許可されていません。", "Valid configuration, connection established!" : "正しい設定です。接続されました。", "Valid configuration, but binding failed. Please check the server settings and credentials." : "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。", - "Invalid configuration. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。", + "Invalid configuration: %s" : "無効な設定: %s", "No action specified" : "アクションが指定されていません", "No configuration specified" : "構成が指定されていません", "No data specified" : "データが指定されていません", - " Could not set configuration %s" : "構成 %s を設定できませんでした", + "Invalid data specified" : "無効なデータが指定されました", + "Could not set configuration %1$s to %2$s" : "構成%1$sを%2$sに設定できませんでした", "Action does not exist" : "アクションが存在しません", "Renewing …" : "更新中 ...", "Very weak password" : "非常に弱いパスワードです", @@ -53,15 +54,32 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u\" id のプレースホルダがありません。プレースホルダは、LDAP /ADで問合せするときにログイン名で置き換えられます。", "Please provide a login name to test against" : "テストの為にログイン名を入力してください。", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/ADサーバーがMemberOfオプションをサポートしていないため、グループボックスは無効になりました。", - "Password change rejected. Hint: " : "パスワード変更が拒否されました。ヒント:", + "Password change rejected. Hint: %s" : "パスワード変更が拒否されました。ヒント: %s", + "Mandatory field \"%s\" left empty" : "必須フィールド\"%s\"が空欄のままです", + "A password is given, but not an LDAP agent" : "パスワードは与えられています、LDAPエージェントは与えられていません", + "No password is given for the user agent" : "ユーザーエージェントにパスワードが与えられていません", + "No LDAP base DN was given" : "LDAPベースDNが指定されていません", + "User base DN is not a subnode of global base DN" : "ユーザーベースDNはグローバルベースDNのサブノードではありません", + "Group base DN is not a subnode of global base DN" : "グループベースDNがグローバルベースDNのサブノードではありません", + "Login filter does not contain %s placeholder." : "ログインフィルタに%sプレースホルダが含まれていません。", "Please login with the new password" : "新しいパスワードでログインしてください", "LDAP User backend" : "LDAPユーザーバックエンド", "Your password will expire tomorrow." : "パスワードが明日期限切れになります。", "Your password will expire today." : "パスワードが今日期限切れになります。", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["パスワードがあと %n日で期限切れになります。"], "LDAP/AD integration" : "LDAP/AD統合", - "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], - "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], + "LDAP Connection" : "LDAP接続", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n 個のLDAP設定のバインディングに失敗しました: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n 個のLDAP設定の検索に失敗しました: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["非アクティブなLDAPコンフィギュレーションが%n個あります: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["バインディングと検索は、設定された%nのLDAP接続すべてで機能します(%s)"], + "Invalid LDAP UUIDs" : "無効な LDAP UUID", + "None found" : "該当なし", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAPアカウントまたはグループの無効なUUIDが見つかりました。LDAP設定のエキスパート部分にある \"Override UUID detection\" の設定を見直して、\"occ ldap:update-uuid\"を使ってアップデートしてください。", + "_%n group found_::_%n groups found_" : ["グループ%nが見つかりました "], + "> 1000 groups found" : "1000 以上のグループが見つかりました", + "> 1000 users found" : "1000 以上のユーザーが見つかりました", + "_%n user found_::_%n users found_" : ["ユーザー%n が見つかりました"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", "Could not find the desired feature" : "望ましい機能は見つかりませんでした", "Invalid Host" : "無効なホスト", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "その他の属性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "ログイン実行時に適用するフィルターを定義します。uid \"%%\" にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"", "Test Loginname" : "テスト用ログイン名", + "Attempts to receive a DN for the given loginname and the current login filter" : "指定されたログイン名と現在のログインフィルタのDNを取得します", "Verify settings" : "設定のチェック", "%s. Server:" : "%s. サーバー:", "Add a new configuration" : "新しい設定を追加", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "1行に1つのユーザーベースDN", "User Search Attributes" : "ユーザー検索属性", "Optional; one attribute per line" : "オプション:1行に1属性", + "Disable users missing from LDAP" : "LDAPから消えたユーザーを無効にする", + "When switched on, users imported from LDAP which are then missing will be disabled" : "オンにすると、LDAPからインポートされたユーザーのうち欠落しているユーザーは無効になります。", "Group Display Name Field" : "グループ表示名のフィールド", "The LDAP attribute to use to generate the groups's display name." : "ユーザーのグループ表示名の生成に利用するLDAP属性", "Base Group Tree" : "ベースグループツリー", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "ユーザー名は空のままにしてください(デフォルト)。それ以外の場合は、LDAP/AD属性を指定します。", "\"$home\" Placeholder Field" : "\"$home\" 属性設定", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部ストレージ設定の $home 変数には、指定した属性の値が入ります", + "User Profile Attributes" : "ユーザープロファイル属性", + "Phone Field" : "電話番号 フィールド", + "User profile Phone will be set from the specified attribute" : "ユーザープロファイルの電話番号は、指定された属性から設定されます。", + "Website Field" : "ウェブサイト フィールド", + "User profile Website will be set from the specified attribute" : "ユーザープロファイルのウェブサイトは、指定された属性から設定されます。", + "Address Field" : "住所 フィールド", + "User profile Address will be set from the specified attribute" : "ユーザープロファイルの住所は、指定された属性から設定されます。", + "Twitter Field" : "Twitter フィールド", + "User profile Twitter will be set from the specified attribute" : "ユーザープロファイルの Twitter は、指定された属性から設定されます。", + "Fediverse Field" : "Fediverse フィールド", + "User profile Fediverse will be set from the specified attribute" : "ユーザープロファイルの Fediverse は、指定された属性から設定されます。", + "Organisation Field" : "組織 フィールド", + "User profile Organisation will be set from the specified attribute" : "ユーザープロファイルの組織は、指定された属性から設定されます。", + "Role Field" : "役職 フィールド", + "User profile Role will be set from the specified attribute" : "ユーザープロファイルの役職は、指定された属性から設定されます。", + "Headline Field" : "ヘッドライン フィールド", + "User profile Headline will be set from the specified attribute" : "ユーザープロファイルのヘッドラインは、指定された属性から設定されます。", + "Biography Field" : "経歴 フィールド", + "User profile Biography will be set from the specified attribute" : "ユーザープロファイルの経歴は、指定された属性から設定されます。", + "Birthdate Field" : "誕生日フィールド", + "User profile Date of birth will be set from the specified attribute" : "生年月日のユーザープロフィールは、指定された属性から設定されます", + "Pronouns Field" : "代名詞フィールド", + "User profile Pronouns will be set from the specified attribute" : "ユーザープロファイルの代名詞は、指定された属性から設定されます", "Internal Username" : "内部ユーザー名", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。これは、たとえばすべての* DAVサービスのリモートURLの一部でもあります。この設定を使用すると、デフォルトの動作を上書きできます。変更は、新しくマップされた(追加された)LDAPユーザーにのみ影響します。デフォルトの動作のために空のままにします。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。これは、たとえばすべての* DAVサービスのリモートURLの一部でもあります。この設定を使用すると、デフォルトの動作を上書きできます。変更は、新しくマップされた(追加された)LDAPユーザーにのみ影響します。デフォルトの動作のために空のままにします。", "Internal Username Attribute:" : "内部ユーザー名属性:", "Override UUID detection" : "UUID検出を再定義する", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ユーザー名は、メタデータの保存と割り当てに使用されます。 ユーザーを正確に識別して認識するために、各LDAPユーザーには内部ユーザー名が割り当てられます。 これには、ユーザー名からLDAPユーザーへのマッピングが必要です。 作成されたユーザー名は、LDAPユーザーのUUIDにマップされます。 さらに、DNはLDAPインタラクションを減らすためにキャッシュされますが、識別には使用されません。 DNが変更された場合、変更が検出されます。 内部ユーザー名はいたるところで使用されます。 マッピングをクリアすると、どこに残っているか分かります。 マッピングの消去はコンフィギュレーションセンシティブではなく、すべてのLDAP構成に影響します。 本番環境のマッピングをクリアしないでください。テスト環境または実験段階でのみ実施してください。", "Clear Username-LDAP User Mapping" : "ユーザー名とLDAPユーザーのマッピングをクリアする", "Clear Groupname-LDAP Group Mapping" : "グループ名とLDAPグループのマッピングをクリアする", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD の接続エラーが発生しました。ホスト名、ポート、権限をチェックしてください。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u\" id のプレースホルダがありません。プレースホルダは、LDAP /ADで問合せするときにログイン名で置き換えられます。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/ADサーバーがMemberOfオプションをサポートしていないため、グループボックスは無効になりました。", - "LDAP / AD integration" : "LDAP/AD統合", - "LDAP / AD Username:" : "LDAP/ADユーザー名:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/ADユーザー名に対してログインが許可されています。\"uid\" か、\"sAMAccountName\" のどちらかが検出されました。", - "LDAP / AD Email Address:" : "LDAP/ADメールアドレス:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。ownCloud 5 以前と同じような振る舞いにするためには、以下のフィールドにユーザー表示名の属性を入力します。空にするとデフォルトの振る舞いとなります。変更は新しくマッピング(追加)されたLDAPユーザーにおいてのみ有効となります。" + "Invalid configuration. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json index 70d75378702..6cadf55ae4e 100644 --- a/apps/user_ldap/l10n/ja.json +++ b/apps/user_ldap/l10n/ja.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "設定が間違っています: 匿名接続は、許可されていません。", "Valid configuration, connection established!" : "正しい設定です。接続されました。", "Valid configuration, but binding failed. Please check the server settings and credentials." : "設定は有効ですが、接続に失敗しました。サーバー設定と資格情報を確認してください。", - "Invalid configuration. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。", + "Invalid configuration: %s" : "無効な設定: %s", "No action specified" : "アクションが指定されていません", "No configuration specified" : "構成が指定されていません", "No data specified" : "データが指定されていません", - " Could not set configuration %s" : "構成 %s を設定できませんでした", + "Invalid data specified" : "無効なデータが指定されました", + "Could not set configuration %1$s to %2$s" : "構成%1$sを%2$sに設定できませんでした", "Action does not exist" : "アクションが存在しません", "Renewing …" : "更新中 ...", "Very weak password" : "非常に弱いパスワードです", @@ -51,15 +52,32 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u\" id のプレースホルダがありません。プレースホルダは、LDAP /ADで問合せするときにログイン名で置き換えられます。", "Please provide a login name to test against" : "テストの為にログイン名を入力してください。", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/ADサーバーがMemberOfオプションをサポートしていないため、グループボックスは無効になりました。", - "Password change rejected. Hint: " : "パスワード変更が拒否されました。ヒント:", + "Password change rejected. Hint: %s" : "パスワード変更が拒否されました。ヒント: %s", + "Mandatory field \"%s\" left empty" : "必須フィールド\"%s\"が空欄のままです", + "A password is given, but not an LDAP agent" : "パスワードは与えられています、LDAPエージェントは与えられていません", + "No password is given for the user agent" : "ユーザーエージェントにパスワードが与えられていません", + "No LDAP base DN was given" : "LDAPベースDNが指定されていません", + "User base DN is not a subnode of global base DN" : "ユーザーベースDNはグローバルベースDNのサブノードではありません", + "Group base DN is not a subnode of global base DN" : "グループベースDNがグローバルベースDNのサブノードではありません", + "Login filter does not contain %s placeholder." : "ログインフィルタに%sプレースホルダが含まれていません。", "Please login with the new password" : "新しいパスワードでログインしてください", "LDAP User backend" : "LDAPユーザーバックエンド", "Your password will expire tomorrow." : "パスワードが明日期限切れになります。", "Your password will expire today." : "パスワードが今日期限切れになります。", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["パスワードがあと %n日で期限切れになります。"], "LDAP/AD integration" : "LDAP/AD統合", - "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], - "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], + "LDAP Connection" : "LDAP接続", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n 個のLDAP設定のバインディングに失敗しました: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n 個のLDAP設定の検索に失敗しました: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["非アクティブなLDAPコンフィギュレーションが%n個あります: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["バインディングと検索は、設定された%nのLDAP接続すべてで機能します(%s)"], + "Invalid LDAP UUIDs" : "無効な LDAP UUID", + "None found" : "該当なし", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAPアカウントまたはグループの無効なUUIDが見つかりました。LDAP設定のエキスパート部分にある \"Override UUID detection\" の設定を見直して、\"occ ldap:update-uuid\"を使ってアップデートしてください。", + "_%n group found_::_%n groups found_" : ["グループ%nが見つかりました "], + "> 1000 groups found" : "1000 以上のグループが見つかりました", + "> 1000 users found" : "1000 以上のユーザーが見つかりました", + "_%n user found_::_%n users found_" : ["ユーザー%n が見つかりました"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", "Could not find the desired feature" : "望ましい機能は見つかりませんでした", "Invalid Host" : "無効なホスト", @@ -86,6 +104,7 @@ "Other Attributes:" : "その他の属性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "ログイン実行時に適用するフィルターを定義します。uid \"%%\" にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"", "Test Loginname" : "テスト用ログイン名", + "Attempts to receive a DN for the given loginname and the current login filter" : "指定されたログイン名と現在のログインフィルタのDNを取得します", "Verify settings" : "設定のチェック", "%s. Server:" : "%s. サーバー:", "Add a new configuration" : "新しい設定を追加", @@ -149,6 +168,8 @@ "One User Base DN per line" : "1行に1つのユーザーベースDN", "User Search Attributes" : "ユーザー検索属性", "Optional; one attribute per line" : "オプション:1行に1属性", + "Disable users missing from LDAP" : "LDAPから消えたユーザーを無効にする", + "When switched on, users imported from LDAP which are then missing will be disabled" : "オンにすると、LDAPからインポートされたユーザーのうち欠落しているユーザーは無効になります。", "Group Display Name Field" : "グループ表示名のフィールド", "The LDAP attribute to use to generate the groups's display name." : "ユーザーのグループ表示名の生成に利用するLDAP属性", "Base Group Tree" : "ベースグループツリー", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "ユーザー名は空のままにしてください(デフォルト)。それ以外の場合は、LDAP/AD属性を指定します。", "\"$home\" Placeholder Field" : "\"$home\" 属性設定", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部ストレージ設定の $home 変数には、指定した属性の値が入ります", + "User Profile Attributes" : "ユーザープロファイル属性", + "Phone Field" : "電話番号 フィールド", + "User profile Phone will be set from the specified attribute" : "ユーザープロファイルの電話番号は、指定された属性から設定されます。", + "Website Field" : "ウェブサイト フィールド", + "User profile Website will be set from the specified attribute" : "ユーザープロファイルのウェブサイトは、指定された属性から設定されます。", + "Address Field" : "住所 フィールド", + "User profile Address will be set from the specified attribute" : "ユーザープロファイルの住所は、指定された属性から設定されます。", + "Twitter Field" : "Twitter フィールド", + "User profile Twitter will be set from the specified attribute" : "ユーザープロファイルの Twitter は、指定された属性から設定されます。", + "Fediverse Field" : "Fediverse フィールド", + "User profile Fediverse will be set from the specified attribute" : "ユーザープロファイルの Fediverse は、指定された属性から設定されます。", + "Organisation Field" : "組織 フィールド", + "User profile Organisation will be set from the specified attribute" : "ユーザープロファイルの組織は、指定された属性から設定されます。", + "Role Field" : "役職 フィールド", + "User profile Role will be set from the specified attribute" : "ユーザープロファイルの役職は、指定された属性から設定されます。", + "Headline Field" : "ヘッドライン フィールド", + "User profile Headline will be set from the specified attribute" : "ユーザープロファイルのヘッドラインは、指定された属性から設定されます。", + "Biography Field" : "経歴 フィールド", + "User profile Biography will be set from the specified attribute" : "ユーザープロファイルの経歴は、指定された属性から設定されます。", + "Birthdate Field" : "誕生日フィールド", + "User profile Date of birth will be set from the specified attribute" : "生年月日のユーザープロフィールは、指定された属性から設定されます", + "Pronouns Field" : "代名詞フィールド", + "User profile Pronouns will be set from the specified attribute" : "ユーザープロファイルの代名詞は、指定された属性から設定されます", "Internal Username" : "内部ユーザー名", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。これは、たとえばすべての* DAVサービスのリモートURLの一部でもあります。この設定を使用すると、デフォルトの動作を上書きできます。変更は、新しくマップされた(追加された)LDAPユーザーにのみ影響します。デフォルトの動作のために空のままにします。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。これは、たとえばすべての* DAVサービスのリモートURLの一部でもあります。この設定を使用すると、デフォルトの動作を上書きできます。変更は、新しくマップされた(追加された)LDAPユーザーにのみ影響します。デフォルトの動作のために空のままにします。", "Internal Username Attribute:" : "内部ユーザー名属性:", "Override UUID detection" : "UUID検出を再定義する", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ユーザー名は、メタデータの保存と割り当てに使用されます。 ユーザーを正確に識別して認識するために、各LDAPユーザーには内部ユーザー名が割り当てられます。 これには、ユーザー名からLDAPユーザーへのマッピングが必要です。 作成されたユーザー名は、LDAPユーザーのUUIDにマップされます。 さらに、DNはLDAPインタラクションを減らすためにキャッシュされますが、識別には使用されません。 DNが変更された場合、変更が検出されます。 内部ユーザー名はいたるところで使用されます。 マッピングをクリアすると、どこに残っているか分かります。 マッピングの消去はコンフィギュレーションセンシティブではなく、すべてのLDAP構成に影響します。 本番環境のマッピングをクリアしないでください。テスト環境または実験段階でのみ実施してください。", "Clear Username-LDAP User Mapping" : "ユーザー名とLDAPユーザーのマッピングをクリアする", "Clear Groupname-LDAP Group Mapping" : "グループ名とLDAPグループのマッピングをクリアする", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD の接続エラーが発生しました。ホスト名、ポート、権限をチェックしてください。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u\" id のプレースホルダがありません。プレースホルダは、LDAP /ADで問合せするときにログイン名で置き換えられます。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/ADサーバーがMemberOfオプションをサポートしていないため、グループボックスは無効になりました。", - "LDAP / AD integration" : "LDAP/AD統合", - "LDAP / AD Username:" : "LDAP/ADユーザー名:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/ADユーザー名に対してログインが許可されています。\"uid\" か、\"sAMAccountName\" のどちらかが検出されました。", - "LDAP / AD Email Address:" : "LDAP/ADメールアドレス:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "デフォルトでは、内部的なユーザー名がUUID属性から作成されます。これにより、ユーザー名がユニークであり、かつ文字の変換が不要であることを保証します。内部ユーザー名には、[ a-zA-Z0-9_.@- ] の文字のみが有効であるという制限があり、その他の文字は対応する ASCII コードに変換されるか単に無視されます。そのため、他のユーザー名との衝突の回数が増加するでしょう。内部ユーザー名は、内部的にユーザーを識別するために用いられ、また、Nextcloud におけるデフォルトのホームフォルダー名としても用いられます。例えば*DAVサービスのように、リモートURLの一部でもあります。この設定により、デフォルトの振る舞いを再定義します。ownCloud 5 以前と同じような振る舞いにするためには、以下のフィールドにユーザー表示名の属性を入力します。空にするとデフォルトの振る舞いとなります。変更は新しくマッピング(追加)されたLDAPユーザーにおいてのみ有効となります。" + "Invalid configuration. Please have a look at the logs for further details." : "設定が無効です。詳細はログを確認してください。" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ka.js b/apps/user_ldap/l10n/ka.js new file mode 100644 index 00000000000..768c8ddd732 --- /dev/null +++ b/apps/user_ldap/l10n/ka.js @@ -0,0 +1,219 @@ +OC.L10N.register( + "user_ldap", + { + "Failed to clear the mappings." : "Failed to clear the mappings.", + "Failed to delete the server configuration" : "Failed to delete the server configuration", + "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", + "Valid configuration, connection established!" : "Valid configuration, connection established!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", + "No action specified" : "No action specified", + "No configuration specified" : "No configuration specified", + "No data specified" : "No data specified", + "Invalid data specified" : "Invalid data specified", + "Action does not exist" : "Action does not exist", + "Renewing …" : "Renewing …", + "Very weak password" : "Very weak password", + "Weak password" : "Weak password", + "So-so password" : "So-so password", + "Good password" : "Good password", + "Strong password" : "Strong password", + "The Base DN appears to be wrong" : "The Base DN appears to be wrong", + "Testing configuration…" : "Testing configuration…", + "Configuration incorrect" : "Configuration incorrect", + "Configuration incomplete" : "Configuration incomplete", + "Configuration OK" : "Configuration OK", + "Select groups" : "Select groups", + "Select object classes" : "Select object classes", + "Please check the credentials, they seem to be wrong." : "Please check the credentials, they seem to be wrong.", + "Please specify the port, it could not be auto-detected." : "Please specify the port, it could not be auto-detected.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN could not be auto-detected, please revise credentials, host and port.", + "Could not detect Base DN, please enter it manually." : "Could not detect Base DN, please enter it manually.", + "{nthServer}. Server" : "{nthServer}. Server", + "No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.", + "More than 1,000 directory entries available." : "More than 1,000 directory entries available.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entry available within the provided Base DN","{objectsFound} entries available within the provided Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.", + "Do you really want to delete the current Server Configuration?" : "Do you really want to delete the current Server Configuration?", + "Confirm Deletion" : "Confirm Deletion", + "Mappings cleared successfully!" : "Mappings cleared successfully!", + "Error while clearing the mappings." : "Error while clearing the mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous bind is not allowed. Please provide a User DN and Password.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operations error. Anonymous bind might not be allowed.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Saving failed. Please make sure the database is in Operation. Reload before continuing.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?", + "Mode switch" : "Mode switch", + "Select attributes" : "Select attributes", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>", + "User found and settings verified." : "User found and settings verified.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", + "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", + "Please provide a login name to test against" : "Please provide a login name to test against", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", + "Your password will expire tomorrow." : "Your password will expire tomorrow.", + "Your password will expire today." : "Your password will expire today.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], + "LDAP/AD integration" : "LDAP/AD integration", + "Invalid LDAP UUIDs" : "Invalid LDAP UUIDs", + "None found" : "None found", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", + "Could not find the desired feature" : "Could not find the desired feature", + "Invalid Host" : "Invalid Host", + "LDAP user and group backend" : "LDAP user and group backend", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.", + "Test Configuration" : "Test Configuration", + "Help" : "Help", + "Groups meeting these criteria are available in %s:" : "Groups meeting these criteria are available in %s:", + "Only these object classes:" : "Only these object classes:", + "Only from these groups:" : "Only from these groups:", + "Search groups" : "Search groups", + "Available groups" : "Available groups", + "Selected groups" : "Selected groups", + "Edit LDAP Query" : "Edit LDAP Query", + "LDAP Filter:" : "LDAP Filter:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", + "Verify settings and count the groups" : "Verify settings and count the groups", + "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", + "Other Attributes:" : "Other Attributes:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", + "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", + "Verify settings" : "Verify settings", + "%s. Server:" : "%s. Server:", + "Add a new configuration" : "Add a new configuration", + "Copy current configuration into new directory binding" : "Copy current configuration into new directory binding", + "Delete the current configuration" : "Delete the current configuration", + "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "You can omit the protocol, unless you require SSL. If so, start with ldaps://", + "Port" : "Port", + "Detect Port" : "Detect Port", + "User DN" : "User DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.", + "Password" : "პაროლი", + "For anonymous access, leave DN and Password empty." : "For anonymous access, leave DN and Password empty.", + "Save Credentials" : "Save Credentials", + "One Base DN per line" : "One Base DN per line", + "You can specify Base DN for users and groups in the Advanced tab" : "You can specify Base DN for users and groups in the Advanced tab", + "Detect Base DN" : "Detect Base DN", + "Test Base DN" : "Test Base DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.", + "Manually enter LDAP filters (recommended for large directories)" : "Manually enter LDAP filters (recommended for large directories)", + "Listing and searching for users is constrained by these criteria:" : "Listing and searching for users is constrained by these criteria:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "The filter specifies which LDAP users shall have access to the %s instance.", + "Verify settings and count users" : "Verify settings and count users", + "Saving" : "Saving", + "Back" : "Back", + "Continue" : "Continue", + "Please renew your password." : "Please renew your password.", + "An internal error occurred." : "An internal error occurred.", + "Please try again or contact your administrator." : "Please try again or contact your administrator.", + "Current password" : "Current password", + "New password" : "New password", + "Renew password" : "Renew password", + "Wrong password." : "Wrong password.", + "Cancel" : "Cancel", + "Server" : "Server", + "Users" : "Users", + "Login Attributes" : "Login Attributes", + "Groups" : "Groups", + "Expert" : "Expert", + "Advanced" : "Advanced", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.", + "Connection Settings" : "Connection Settings", + "Configuration Active" : "Configuration Active", + "When unchecked, this configuration will be skipped." : "When unchecked, this configuration will be skipped.", + "Backup (Replica) Host" : "Backup (Replica) Host", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Give an optional backup host. It must be a replica of the main LDAP/AD server.", + "Backup (Replica) Port" : "Backup (Replica) Port", + "Disable Main Server" : "Disable Main Server", + "Only connect to the replica server." : "Only connect to the replica server.", + "Turn off SSL certificate validation." : "Turn off SSL certificate validation.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "in seconds. A change empties the cache.", + "Directory Settings" : "Directory Settings", + "User Display Name Field" : "User Display Name Field", + "The LDAP attribute to use to generate the user's display name." : "The LDAP attribute to use to generate the user's display name.", + "2nd User Display Name Field" : "2nd User Display Name Field", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Base User Tree", + "One User Base DN per line" : "One User Base DN per line", + "User Search Attributes" : "User Search Attributes", + "Optional; one attribute per line" : "Optional; one attribute per line", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", + "Group Display Name Field" : "Group Display Name Field", + "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the groups's display name.", + "Base Group Tree" : "Base Group Tree", + "One Group Base DN per line" : "One Group Base DN per line", + "Group Search Attributes" : "Group Search Attributes", + "Group-Member association" : "Group-Member association", + "Dynamic Group Member URL" : "Dynamic Group Member URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)", + "Nested Groups" : "Nested Groups", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)", + "Enable LDAP password changes per user" : "Enable LDAP password changes per user", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.", + "(New password is sent as plain text to LDAP)" : "(New password is sent as plain text to LDAP)", + "Default password policy DN" : "Default password policy DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.", + "Special Attributes" : "Special Attributes", + "Quota Field" : "Quota Field", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute.", + "Quota Default" : "Quota Default", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Override default quota for LDAP users who do not have a quota set in the Quota Field.", + "Email Field" : "Email Field", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", + "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "User Profile Attributes", + "Phone Field" : "Phone Field", + "User profile Phone will be set from the specified attribute" : "User profile Phone will be set from the specified attribute", + "Website Field" : "Website Field", + "User profile Website will be set from the specified attribute" : "User profile Website will be set from the specified attribute", + "Address Field" : "Address Field", + "User profile Address will be set from the specified attribute" : "User profile Address will be set from the specified attribute", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "User profile Twitter will be set from the specified attribute", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "User profile Fediverse will be set from the specified attribute", + "Organisation Field" : "Organisation Field", + "User profile Organisation will be set from the specified attribute" : "User profile Organisation will be set from the specified attribute", + "Role Field" : "Role Field", + "User profile Role will be set from the specified attribute" : "User profile Role will be set from the specified attribute", + "Headline Field" : "Headline Field", + "User profile Headline will be set from the specified attribute" : "User profile Headline will be set from the specified attribute", + "Biography Field" : "Biography Field", + "User profile Biography will be set from the specified attribute" : "User profile Biography will be set from the specified attribute", + "Internal Username" : "Internal Username", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", + "Internal Username Attribute:" : "Internal Username Attribute:", + "Override UUID detection" : "Override UUID detection", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups.", + "UUID Attribute for Users:" : "UUID Attribute for Users:", + "UUID Attribute for Groups:" : "UUID Attribute for Groups:", + "Username-LDAP User Mapping" : "Username-LDAP User Mapping", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", + "Clear Username-LDAP User Mapping" : "Clear Username-LDAP User Mapping", + "Clear Groupname-LDAP Group Mapping" : "Clear Groupname-LDAP Group Mapping", + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." +}, +"nplurals=2; plural=(n!=1);"); diff --git a/apps/user_ldap/l10n/ka.json b/apps/user_ldap/l10n/ka.json new file mode 100644 index 00000000000..bc1ae2d991c --- /dev/null +++ b/apps/user_ldap/l10n/ka.json @@ -0,0 +1,217 @@ +{ "translations": { + "Failed to clear the mappings." : "Failed to clear the mappings.", + "Failed to delete the server configuration" : "Failed to delete the server configuration", + "Invalid configuration: Anonymous binding is not allowed." : "Invalid configuration: Anonymous binding is not allowed.", + "Valid configuration, connection established!" : "Valid configuration, connection established!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Valid configuration, but binding failed. Please check the server settings and credentials.", + "No action specified" : "No action specified", + "No configuration specified" : "No configuration specified", + "No data specified" : "No data specified", + "Invalid data specified" : "Invalid data specified", + "Action does not exist" : "Action does not exist", + "Renewing …" : "Renewing …", + "Very weak password" : "Very weak password", + "Weak password" : "Weak password", + "So-so password" : "So-so password", + "Good password" : "Good password", + "Strong password" : "Strong password", + "The Base DN appears to be wrong" : "The Base DN appears to be wrong", + "Testing configuration…" : "Testing configuration…", + "Configuration incorrect" : "Configuration incorrect", + "Configuration incomplete" : "Configuration incomplete", + "Configuration OK" : "Configuration OK", + "Select groups" : "Select groups", + "Select object classes" : "Select object classes", + "Please check the credentials, they seem to be wrong." : "Please check the credentials, they seem to be wrong.", + "Please specify the port, it could not be auto-detected." : "Please specify the port, it could not be auto-detected.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN could not be auto-detected, please revise credentials, host and port.", + "Could not detect Base DN, please enter it manually." : "Could not detect Base DN, please enter it manually.", + "{nthServer}. Server" : "{nthServer}. Server", + "No object found in the given Base DN. Please revise." : "No object found in the given Base DN. Please revise.", + "More than 1,000 directory entries available." : "More than 1,000 directory entries available.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entry available within the provided Base DN","{objectsFound} entries available within the provided Base DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "An error occurred. Please check the Base DN, as well as connection settings and credentials.", + "Do you really want to delete the current Server Configuration?" : "Do you really want to delete the current Server Configuration?", + "Confirm Deletion" : "Confirm Deletion", + "Mappings cleared successfully!" : "Mappings cleared successfully!", + "Error while clearing the mappings." : "Error while clearing the mappings.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonymous bind is not allowed. Please provide a User DN and Password.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP Operations error. Anonymous bind might not be allowed.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Saving failed. Please make sure the database is in Operation. Reload before continuing.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?", + "Mode switch" : "Mode switch", + "Select attributes" : "Select attributes", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>", + "User found and settings verified." : "User found and settings verified.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in.", + "An unspecified error occurred. Please check log and settings." : "An unspecified error occurred. Please check log and settings.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "A connection error to LDAP/AD occurred. Please check host, port and credentials.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD.", + "Please provide a login name to test against" : "Please provide a login name to test against", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "The group box was disabled, because the LDAP/AD server does not support memberOf.", + "Please login with the new password" : "Please login with the new password", + "LDAP User backend" : "LDAP User backend", + "Your password will expire tomorrow." : "Your password will expire tomorrow.", + "Your password will expire today." : "Your password will expire today.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Your password will expire within %n day.","Your password will expire within %n days."], + "LDAP/AD integration" : "LDAP/AD integration", + "Invalid LDAP UUIDs" : "Invalid LDAP UUIDs", + "None found" : "None found", + "_%n group found_::_%n groups found_" : ["%n group found","%n groups found"], + "> 1000 groups found" : "> 1000 groups found", + "> 1000 users found" : "> 1000 users found", + "_%n user found_::_%n users found_" : ["%n user found","%n users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings.", + "Could not find the desired feature" : "Could not find the desired feature", + "Invalid Host" : "Invalid Host", + "LDAP user and group backend" : "LDAP user and group backend", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.", + "Test Configuration" : "Test Configuration", + "Help" : "Help", + "Groups meeting these criteria are available in %s:" : "Groups meeting these criteria are available in %s:", + "Only these object classes:" : "Only these object classes:", + "Only from these groups:" : "Only from these groups:", + "Search groups" : "Search groups", + "Available groups" : "Available groups", + "Selected groups" : "Selected groups", + "Edit LDAP Query" : "Edit LDAP Query", + "LDAP Filter:" : "LDAP Filter:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "The filter specifies which LDAP groups shall have access to the %s instance.", + "Verify settings and count the groups" : "Verify settings and count the groups", + "When logging in, %s will find the user based on the following attributes:" : "When logging in, %s will find the user based on the following attributes:", + "LDAP/AD Username:" : "LDAP/AD Username:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected.", + "LDAP/AD Email Address:" : "LDAP/AD Email Address:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed.", + "Other Attributes:" : "Other Attributes:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"", + "Test Loginname" : "Test Loginname", + "Attempts to receive a DN for the given loginname and the current login filter" : "Attempts to receive a DN for the given loginname and the current login filter", + "Verify settings" : "Verify settings", + "%s. Server:" : "%s. Server:", + "Add a new configuration" : "Add a new configuration", + "Copy current configuration into new directory binding" : "Copy current configuration into new directory binding", + "Delete the current configuration" : "Delete the current configuration", + "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "You can omit the protocol, unless you require SSL. If so, start with ldaps://", + "Port" : "Port", + "Detect Port" : "Detect Port", + "User DN" : "User DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.", + "Password" : "პაროლი", + "For anonymous access, leave DN and Password empty." : "For anonymous access, leave DN and Password empty.", + "Save Credentials" : "Save Credentials", + "One Base DN per line" : "One Base DN per line", + "You can specify Base DN for users and groups in the Advanced tab" : "You can specify Base DN for users and groups in the Advanced tab", + "Detect Base DN" : "Detect Base DN", + "Test Base DN" : "Test Base DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.", + "Manually enter LDAP filters (recommended for large directories)" : "Manually enter LDAP filters (recommended for large directories)", + "Listing and searching for users is constrained by these criteria:" : "Listing and searching for users is constrained by these criteria:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "The filter specifies which LDAP users shall have access to the %s instance.", + "Verify settings and count users" : "Verify settings and count users", + "Saving" : "Saving", + "Back" : "Back", + "Continue" : "Continue", + "Please renew your password." : "Please renew your password.", + "An internal error occurred." : "An internal error occurred.", + "Please try again or contact your administrator." : "Please try again or contact your administrator.", + "Current password" : "Current password", + "New password" : "New password", + "Renew password" : "Renew password", + "Wrong password." : "Wrong password.", + "Cancel" : "Cancel", + "Server" : "Server", + "Users" : "Users", + "Login Attributes" : "Login Attributes", + "Groups" : "Groups", + "Expert" : "Expert", + "Advanced" : "Advanced", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.", + "Connection Settings" : "Connection Settings", + "Configuration Active" : "Configuration Active", + "When unchecked, this configuration will be skipped." : "When unchecked, this configuration will be skipped.", + "Backup (Replica) Host" : "Backup (Replica) Host", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Give an optional backup host. It must be a replica of the main LDAP/AD server.", + "Backup (Replica) Port" : "Backup (Replica) Port", + "Disable Main Server" : "Disable Main Server", + "Only connect to the replica server." : "Only connect to the replica server.", + "Turn off SSL certificate validation." : "Turn off SSL certificate validation.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "in seconds. A change empties the cache.", + "Directory Settings" : "Directory Settings", + "User Display Name Field" : "User Display Name Field", + "The LDAP attribute to use to generate the user's display name." : "The LDAP attribute to use to generate the user's display name.", + "2nd User Display Name Field" : "2nd User Display Name Field", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Base User Tree", + "One User Base DN per line" : "One User Base DN per line", + "User Search Attributes" : "User Search Attributes", + "Optional; one attribute per line" : "Optional; one attribute per line", + "Disable users missing from LDAP" : "Disable users missing from LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "When switched on, users imported from LDAP which are then missing will be disabled", + "Group Display Name Field" : "Group Display Name Field", + "The LDAP attribute to use to generate the groups's display name." : "The LDAP attribute to use to generate the groups's display name.", + "Base Group Tree" : "Base Group Tree", + "One Group Base DN per line" : "One Group Base DN per line", + "Group Search Attributes" : "Group Search Attributes", + "Group-Member association" : "Group-Member association", + "Dynamic Group Member URL" : "Dynamic Group Member URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)", + "Nested Groups" : "Nested Groups", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)", + "Enable LDAP password changes per user" : "Enable LDAP password changes per user", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.", + "(New password is sent as plain text to LDAP)" : "(New password is sent as plain text to LDAP)", + "Default password policy DN" : "Default password policy DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.", + "Special Attributes" : "Special Attributes", + "Quota Field" : "Quota Field", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute.", + "Quota Default" : "Quota Default", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Override default quota for LDAP users who do not have a quota set in the Quota Field.", + "Email Field" : "Email Field", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Set the user's email from their LDAP attribute. Leave it empty for default behaviour.", + "User Home Folder Naming Rule" : "User Home Folder Naming Rule", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.", + "\"$home\" Placeholder Field" : "\"$home\" Placeholder Field", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in an external storage configuration will be replaced with the value of the specified attribute", + "User Profile Attributes" : "User Profile Attributes", + "Phone Field" : "Phone Field", + "User profile Phone will be set from the specified attribute" : "User profile Phone will be set from the specified attribute", + "Website Field" : "Website Field", + "User profile Website will be set from the specified attribute" : "User profile Website will be set from the specified attribute", + "Address Field" : "Address Field", + "User profile Address will be set from the specified attribute" : "User profile Address will be set from the specified attribute", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "User profile Twitter will be set from the specified attribute", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "User profile Fediverse will be set from the specified attribute", + "Organisation Field" : "Organisation Field", + "User profile Organisation will be set from the specified attribute" : "User profile Organisation will be set from the specified attribute", + "Role Field" : "Role Field", + "User profile Role will be set from the specified attribute" : "User profile Role will be set from the specified attribute", + "Headline Field" : "Headline Field", + "User profile Headline will be set from the specified attribute" : "User profile Headline will be set from the specified attribute", + "Biography Field" : "Biography Field", + "User profile Biography will be set from the specified attribute" : "User profile Biography will be set from the specified attribute", + "Internal Username" : "Internal Username", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.", + "Internal Username Attribute:" : "Internal Username Attribute:", + "Override UUID detection" : "Override UUID detection", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups.", + "UUID Attribute for Users:" : "UUID Attribute for Users:", + "UUID Attribute for Groups:" : "UUID Attribute for Groups:", + "Username-LDAP User Mapping" : "Username-LDAP User Mapping", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.", + "Clear Username-LDAP User Mapping" : "Clear Username-LDAP User Mapping", + "Clear Groupname-LDAP Group Mapping" : "Clear Groupname-LDAP Group Mapping", + "Invalid configuration. Please have a look at the logs for further details." : "Invalid configuration. Please have a look at the logs for further details." +},"pluralForm" :"nplurals=2; plural=(n!=1);" +}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ka_GE.js b/apps/user_ldap/l10n/ka_GE.js index e6cac02608e..80c4b8c791d 100644 --- a/apps/user_ldap/l10n/ka_GE.js +++ b/apps/user_ldap/l10n/ka_GE.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "არასწორი კონფიგურაცია: ანონიმური კავშირები არაა დაშვებული.", "Valid configuration, connection established!" : "სწორი კონფიგურაცია, კავშირი დამყარებულია!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "სწორი კონფიგურაცია, თუმცა მიბმა ვერ მოხერხდა. გთხოვთ შეამოწმოთ სერვერის კონფიგურაცია და უფლებამოსილებები.", - "Invalid configuration. Please have a look at the logs for further details." : "არასწორი კონფიგურაცია. დეტალებისთვის გთხოვთ გადახედოთ ლოგებს.", "No action specified" : "ქმედება არ იყო სპეციფირებული", "No configuration specified" : "კონფიგურაცია არ იყო სპეციფირებული", "No data specified" : "მონაცემები არ იყო სპეციფირებული", - " Could not set configuration %s" : "კონფიგურაციის %s დაყენება ვერ მოხერხდა", "Action does not exist" : "ქმედება არ არსებობს", "Renewing …" : "განხილვა …", "Very weak password" : "ძალიან სუსტი პაროლი", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "გამოჩნდა არასპეციფირებული შეცდომა. გთხოვთ შეამოწმოთ ლოგი და პარამეტრები.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ძიების ფილტრი არასწორია, ეს შესაძლოა გამოეწვიათ ისეთ სინტაქსის პრობლემებს, როგორებიცაა გახსნილი და დახურული ფრჩხილების არაჯერადი რაოდენობა. გთხოვთ გადახედოთ.", "Please provide a login name to test against" : "ტესტისთვის გთხოვთ მიუთითოთ ლოგინის სახელი", - "Password change rejected. Hint: " : "პაროლის ცვლილება უარყოფილ იქნა. მითითება:", "Please login with the new password" : "გთხოვთ გაიაროთ ავტორიზაცია ახალი პაროლით", "Your password will expire tomorrow." : "თქვენი პაროლი გაუქმდება ხვალ.", "Your password will expire today." : "თქვენი პაროლი გაუქმდება დღეს.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["თქვენი პაროლი გაუქმდება %n დღეში.","თქვენი პაროლი გაუქმდება %n დღეში."], - "_%s group found_::_%s groups found_" : ["ნაპოვნა %s ჯგუფი","ნაპოვნა %s ჯგუფი"], - "_%s user found_::_%s users found_" : ["ნაპოვნია %s მომხმარებელი","ნაპოვნია %s მომხმარებელი"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "მომხმარებლის დისპლეის სახელის ატრიბუტის აღმოჩენა ვერ მოხერხდა. გთხოვთ LDAP-ის პარამეტრებში თქვენით დააყენოთ ის.", "Could not find the desired feature" : "მოთხოვნილი ფუნქციონალის პოვნა ვერ მოხერხდა", "Invalid Host" : "არასწორი ჰოსტი", @@ -174,13 +169,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Username-LDAP მომხმარებლის ბმები", "Clear Username-LDAP User Mapping" : "Username-LDAP მომხმარებლის ბმების გასუფთავება", "Clear Groupname-LDAP Group Mapping" : "Groupname-LDAP ჯგუფის ბმების გასუფთავება", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD-სთან გამოჩნდა კავშირის პრობლემა, გთხოვთ შეამოწმოთ ჰოსტი, პორტი და უფლებამოსილებები.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u\" ადგილი არაა მითითებული. LDAP / AD პასუხის მოთხოვნისას, ის ჩანაცვლებულ იქნება ლოგინის სახელით.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "ჯგუფის ყუთი გაითიშა, LDAP / AD სერვერს არ აქვს memberOf-ის მხარდაჭერა.", - "LDAP / AD integration" : "LDAP / AD ინტეგრაცია", - "LDAP / AD Username:" : "LDAP / AD მომხმარებელი:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD მომხმარებლზე იძლევა ავტორიზაციის უფლებას, მომხმარებელი ან \"uid\"-ია ან \"sAMAaccountName\", ის იქნება აღმოჩენილი.", - "LDAP / AD Email Address:" : "LDAP / AD ელ-ფოსტის მისამართი:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "საწყისი კონფიგურაციით შიდა მომხმარებლის სახელი შეიქმნება UUID ატრიბუტისგან. ეს იძლევა გარანტიას, რომ მომხმარებლის სახელი იქნება უნიკალური და ნიშნების კონვერტაცია არ იქნება საჭირო. შიდა მომხმარებლის სახელს ააქვს შეზღუდვა, მხოლოდ ეს ნიშნებია დაშვებული: [ a-zA-Z0-9_.@- ]. სხვა ნიშნები ჩანაცვლებულია შესაბამისი ASCII ნიშნებით ან იშლებიან. უთანხმოებისას ხდება ციფრის დამატება/მომატება. შიდა მომხმარებლის სახელი გამოყენებულია მომხმარებლის შიდა იდენტიფიკაციისთვის. ის ასევე მომხმარებლის სახლის დირექტორიის საწყისი სახელია. აგრეთვე ის ნაწილია დისტანციური URL-ების, მაგალითად ყველა *DAV სერვისისთვის. ამ პარამეტრით, საწყისი ქცევის ფორმა შეიძლება შეიცვალოს. საწყისი ქცევის ფორმისთვის დატოვეთ ცარიელი. ცვილებებს გავლენა ექნებათ მხოლოდ ახლად მიბმულ (დამატებულ) LDAP მომხმარებლებზე." + "Invalid configuration. Please have a look at the logs for further details." : "არასწორი კონფიგურაცია. დეტალებისთვის გთხოვთ გადახედოთ ლოგებს." }, "nplurals=2; plural=(n!=1);"); diff --git a/apps/user_ldap/l10n/ka_GE.json b/apps/user_ldap/l10n/ka_GE.json index f5dfe24b3af..caef3b06b29 100644 --- a/apps/user_ldap/l10n/ka_GE.json +++ b/apps/user_ldap/l10n/ka_GE.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "არასწორი კონფიგურაცია: ანონიმური კავშირები არაა დაშვებული.", "Valid configuration, connection established!" : "სწორი კონფიგურაცია, კავშირი დამყარებულია!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "სწორი კონფიგურაცია, თუმცა მიბმა ვერ მოხერხდა. გთხოვთ შეამოწმოთ სერვერის კონფიგურაცია და უფლებამოსილებები.", - "Invalid configuration. Please have a look at the logs for further details." : "არასწორი კონფიგურაცია. დეტალებისთვის გთხოვთ გადახედოთ ლოგებს.", "No action specified" : "ქმედება არ იყო სპეციფირებული", "No configuration specified" : "კონფიგურაცია არ იყო სპეციფირებული", "No data specified" : "მონაცემები არ იყო სპეციფირებული", - " Could not set configuration %s" : "კონფიგურაციის %s დაყენება ვერ მოხერხდა", "Action does not exist" : "ქმედება არ არსებობს", "Renewing …" : "განხილვა …", "Very weak password" : "ძალიან სუსტი პაროლი", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "გამოჩნდა არასპეციფირებული შეცდომა. გთხოვთ შეამოწმოთ ლოგი და პარამეტრები.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ძიების ფილტრი არასწორია, ეს შესაძლოა გამოეწვიათ ისეთ სინტაქსის პრობლემებს, როგორებიცაა გახსნილი და დახურული ფრჩხილების არაჯერადი რაოდენობა. გთხოვთ გადახედოთ.", "Please provide a login name to test against" : "ტესტისთვის გთხოვთ მიუთითოთ ლოგინის სახელი", - "Password change rejected. Hint: " : "პაროლის ცვლილება უარყოფილ იქნა. მითითება:", "Please login with the new password" : "გთხოვთ გაიაროთ ავტორიზაცია ახალი პაროლით", "Your password will expire tomorrow." : "თქვენი პაროლი გაუქმდება ხვალ.", "Your password will expire today." : "თქვენი პაროლი გაუქმდება დღეს.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["თქვენი პაროლი გაუქმდება %n დღეში.","თქვენი პაროლი გაუქმდება %n დღეში."], - "_%s group found_::_%s groups found_" : ["ნაპოვნა %s ჯგუფი","ნაპოვნა %s ჯგუფი"], - "_%s user found_::_%s users found_" : ["ნაპოვნია %s მომხმარებელი","ნაპოვნია %s მომხმარებელი"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "მომხმარებლის დისპლეის სახელის ატრიბუტის აღმოჩენა ვერ მოხერხდა. გთხოვთ LDAP-ის პარამეტრებში თქვენით დააყენოთ ის.", "Could not find the desired feature" : "მოთხოვნილი ფუნქციონალის პოვნა ვერ მოხერხდა", "Invalid Host" : "არასწორი ჰოსტი", @@ -172,13 +167,6 @@ "Username-LDAP User Mapping" : "Username-LDAP მომხმარებლის ბმები", "Clear Username-LDAP User Mapping" : "Username-LDAP მომხმარებლის ბმების გასუფთავება", "Clear Groupname-LDAP Group Mapping" : "Groupname-LDAP ჯგუფის ბმების გასუფთავება", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD-სთან გამოჩნდა კავშირის პრობლემა, გთხოვთ შეამოწმოთ ჰოსტი, პორტი და უფლებამოსილებები.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%u\" ადგილი არაა მითითებული. LDAP / AD პასუხის მოთხოვნისას, ის ჩანაცვლებულ იქნება ლოგინის სახელით.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "ჯგუფის ყუთი გაითიშა, LDAP / AD სერვერს არ აქვს memberOf-ის მხარდაჭერა.", - "LDAP / AD integration" : "LDAP / AD ინტეგრაცია", - "LDAP / AD Username:" : "LDAP / AD მომხმარებელი:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD მომხმარებლზე იძლევა ავტორიზაციის უფლებას, მომხმარებელი ან \"uid\"-ია ან \"sAMAaccountName\", ის იქნება აღმოჩენილი.", - "LDAP / AD Email Address:" : "LDAP / AD ელ-ფოსტის მისამართი:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "საწყისი კონფიგურაციით შიდა მომხმარებლის სახელი შეიქმნება UUID ატრიბუტისგან. ეს იძლევა გარანტიას, რომ მომხმარებლის სახელი იქნება უნიკალური და ნიშნების კონვერტაცია არ იქნება საჭირო. შიდა მომხმარებლის სახელს ააქვს შეზღუდვა, მხოლოდ ეს ნიშნებია დაშვებული: [ a-zA-Z0-9_.@- ]. სხვა ნიშნები ჩანაცვლებულია შესაბამისი ASCII ნიშნებით ან იშლებიან. უთანხმოებისას ხდება ციფრის დამატება/მომატება. შიდა მომხმარებლის სახელი გამოყენებულია მომხმარებლის შიდა იდენტიფიკაციისთვის. ის ასევე მომხმარებლის სახლის დირექტორიის საწყისი სახელია. აგრეთვე ის ნაწილია დისტანციური URL-ების, მაგალითად ყველა *DAV სერვისისთვის. ამ პარამეტრით, საწყისი ქცევის ფორმა შეიძლება შეიცვალოს. საწყისი ქცევის ფორმისთვის დატოვეთ ცარიელი. ცვილებებს გავლენა ექნებათ მხოლოდ ახლად მიბმულ (დამატებულ) LDAP მომხმარებლებზე." + "Invalid configuration. Please have a look at the logs for further details." : "არასწორი კონფიგურაცია. დეტალებისთვის გთხოვთ გადახედოთ ლოგებს." },"pluralForm" :"nplurals=2; plural=(n!=1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/km.js b/apps/user_ldap/l10n/km.js deleted file mode 100644 index a42ee7b14f1..00000000000 --- a/apps/user_ldap/l10n/km.js +++ /dev/null @@ -1,17 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to delete the server configuration" : "លុបការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនបម្រើ មិនបានសម្រេច", - "Do you really want to delete the current Server Configuration?" : "តើអ្នកពិតជាចង់លុបការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនបម្រើបច្ចុប្បន្នមែនទេ?", - "Confirm Deletion" : "បញ្ជាក់ការលុប", - "Users" : "អ្នកប្រើ", - "Groups" : "ក្រុ", - "Help" : "ជំនួយ", - "Host" : "ម៉ាស៊ីនផ្ទុក", - "Port" : "ច្រក", - "Password" : "ពាក្យសម្ងាត់", - "Back" : "ត្រឡប់ក្រោយ", - "Continue" : "បន្ត", - "Advanced" : "កម្រិតខ្ពស់" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/km.json b/apps/user_ldap/l10n/km.json deleted file mode 100644 index 5c8ec8897ba..00000000000 --- a/apps/user_ldap/l10n/km.json +++ /dev/null @@ -1,15 +0,0 @@ -{ "translations": { - "Failed to delete the server configuration" : "លុបការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនបម្រើ មិនបានសម្រេច", - "Do you really want to delete the current Server Configuration?" : "តើអ្នកពិតជាចង់លុបការកំណត់រចនាសម្ព័ន្ធម៉ាស៊ីនបម្រើបច្ចុប្បន្នមែនទេ?", - "Confirm Deletion" : "បញ្ជាក់ការលុប", - "Users" : "អ្នកប្រើ", - "Groups" : "ក្រុ", - "Help" : "ជំនួយ", - "Host" : "ម៉ាស៊ីនផ្ទុក", - "Port" : "ច្រក", - "Password" : "ពាក្យសម្ងាត់", - "Back" : "ត្រឡប់ក្រោយ", - "Continue" : "បន្ត", - "Advanced" : "កម្រិតខ្ពស់" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/kn.js b/apps/user_ldap/l10n/kn.js deleted file mode 100644 index f70fc699983..00000000000 --- a/apps/user_ldap/l10n/kn.js +++ /dev/null @@ -1,12 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "ಬಳಕೆದಾರರು", - "Groups" : "ಗುಂಪುಗಳು", - "Help" : "ಸಹಾಯ", - "Host" : "ಅತಿಥೆಯ-ಗಣಕ", - "Port" : "ರೇವು", - "Password" : "ಗುಪ್ತ ಪದ", - "Continue" : "ಮುಂದುವರಿಸಿ" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/kn.json b/apps/user_ldap/l10n/kn.json deleted file mode 100644 index 39705ffba6a..00000000000 --- a/apps/user_ldap/l10n/kn.json +++ /dev/null @@ -1,10 +0,0 @@ -{ "translations": { - "Users" : "ಬಳಕೆದಾರರು", - "Groups" : "ಗುಂಪುಗಳು", - "Help" : "ಸಹಾಯ", - "Host" : "ಅತಿಥೆಯ-ಗಣಕ", - "Port" : "ರೇವು", - "Password" : "ಗುಪ್ತ ಪದ", - "Continue" : "ಮುಂದುವರಿಸಿ" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ko.js b/apps/user_ldap/l10n/ko.js index d2a0f30c630..3081e8b2e5c 100644 --- a/apps/user_ldap/l10n/ko.js +++ b/apps/user_ldap/l10n/ko.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "설정 잘못됨: 익명 바인딩이 허용되지 않습니다.", "Valid configuration, connection established!" : "설정 올바름, 연결되었습니다!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "설정이 올바르지만 바인딩이 실패했습니다. 서버 설정과 인증 정보를 확인하십시오.", - "Invalid configuration. Please have a look at the logs for further details." : "설정이 잘못되었습니다. 더 자세한 정보를 보려면 로그를 참조하십시오.", "No action specified" : "동작이 지정되지 않음", "No configuration specified" : "설정이 지정되지 않음", "No data specified" : "데이터가 지정되지 않음", - " Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음", + "Invalid data specified" : "잘못된 데이터가 특정됨", "Action does not exist" : "동작이 존재하지 않음", "Renewing …" : "갱신 중 …", "Very weak password" : "매우 약한 암호", @@ -53,15 +52,18 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "%uid 자리 비움자가 존재하지 않습니다. LDAP/AD에 조회할 때 로그인 사용자 이름으로 대체됩니다.", "Please provide a login name to test against" : "테스트할 로그인 사용자 이름을 입력하십시오", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", - "Password change rejected. Hint: " : "암호 변경이 거부되었습니다. 힌트:", "Please login with the new password" : "새 암호로 로그인하십시오", "LDAP User backend" : "사용자 백엔드", "Your password will expire tomorrow." : "내 암호가 내일 만료됩니다.", "Your password will expire today." : "내 암호가 오늘 만료됩니다.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["내 암호가 %n일 후 만료됩니다."], "LDAP/AD integration" : "LDAP/AD 통합", - "_%s group found_::_%s groups found_" : ["그룹 %s개 찾음"], - "_%s user found_::_%s users found_" : ["사용자 %s명 찾음"], + "Invalid LDAP UUIDs" : "잘못된 LDAP UUID", + "None found" : "아무것도 찾지 못함", + "_%n group found_::_%n groups found_" : ["그룹 %n개 찾음"], + "> 1000 groups found" : "그룹 1000개 초과 찾음", + "> 1000 users found" : "사용자 1000명 초과 찾음", + "_%n user found_::_%n users found_" : ["%n명의 사용자 찾음"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "사용자 표시 이름 속성을 찾을 수 없습니다. 고급 LDAP 설정에서 직접 지정하십시오.", "Could not find the desired feature" : "필요한 기능을 찾을 수 없음", "Invalid Host" : "잘못된 호스트", @@ -81,7 +83,7 @@ OC.L10N.register( "Verify settings and count the groups" : "설정을 확인하고 그룹 개수 세기", "When logging in, %s will find the user based on the following attributes:" : "로그인할 때 %s에서 다음 속성을 기반으로 사용자를 찾습니다:", "LDAP/AD Username:" : "LDAP/AD 사용자 이름:", - "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 아이디로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", "LDAP/AD Email Address:" : "LDAP/AD 이메일 주소:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "이메일 속성으로 로그인하는 것을 허용합니다. \"mail\" 및 \"mailPrimaryAddress\"를 사용할 수 있습니다.", "Other Attributes:" : "기타 속성:", @@ -150,6 +152,8 @@ OC.L10N.register( "One User Base DN per line" : "사용자 DN을 한 줄에 하나씩 입력하십시오", "User Search Attributes" : "사용자 검색 속성", "Optional; one attribute per line" : "추가적, 한 줄에 하나의 속성을 입력하십시오", + "Disable users missing from LDAP" : "LDAP에서 유실된 사용자 비활성화", + "When switched on, users imported from LDAP which are then missing will be disabled" : "이 옵션을 켜면 LDAP에서 불러온 사용자 중 유실된 계정이 비활성화될 것입니다", "Group Display Name Field" : "그룹의 표시 이름 필드", "The LDAP attribute to use to generate the groups's display name." : "그룹 표시 이름을 생성할 때 사용할 LDAP 속성입니다.", "Base Group Tree" : "기본 그룹 트리", @@ -177,6 +181,26 @@ OC.L10N.register( "User Home Folder Naming Rule" : "사용자 홈 폴더 이름 규칙", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오.", "\"$home\" Placeholder Field" : "\"$home\" 자리 비움자 필드", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "외부 저장소 설정에서 $home이 지정된 속성의 값으로 대체됩니다", + "User Profile Attributes" : "사용자 프로필 속성", + "Phone Field" : "전화번호 필드", + "User profile Phone will be set from the specified attribute" : "사용자 프로필의 전화번호가 지정된 속성으로 설정됩니다", + "Website Field" : "웹사이트 필드", + "User profile Website will be set from the specified attribute" : "사용자 프로필의 웹사이트가 지정된 속성으로 설정됩니다", + "Address Field" : "주소 필드", + "User profile Address will be set from the specified attribute" : "사용자 프로필의 주소가 지정된 속성으로 설정됩니다", + "Twitter Field" : "Twitter 필드", + "User profile Twitter will be set from the specified attribute" : "사용자 프로필의 Twitter가 지정된 속성으로 설정됩니다", + "Fediverse Field" : "Fediverse 필드", + "User profile Fediverse will be set from the specified attribute" : "사용자 프로필의 Fediverse가 지정된 속성으로 설정됩니다", + "Organisation Field" : "조직 필드", + "User profile Organisation will be set from the specified attribute" : "사용자 프로필의 조직 필드가 지정된 속성으로 설정됩니다", + "Role Field" : "직책 필드", + "User profile Role will be set from the specified attribute" : "사용자 프로필의 직책이 지정된 속성으로 설정됩니다", + "Headline Field" : "표제 필드", + "User profile Headline will be set from the specified attribute" : "사용자 프로필의 표제가 지정된 속성으로 설정됩니다", + "Biography Field" : "소개문구 필드", + "User profile Biography will be set from the specified attribute" : "사용자 프로필의 소개문구가 지정된 속성으로 설정됩니다", "Internal Username" : "내부 사용자 이름", "Internal Username Attribute:" : "내부 사용자 이름 속성:", "Override UUID detection" : "UUID 확인 재정의", @@ -184,15 +208,9 @@ OC.L10N.register( "UUID Attribute for Users:" : "사용자 UUID 속성:", "UUID Attribute for Groups:" : "그룹 UUID 속성:", "Username-LDAP User Mapping" : "사용자 이름-LDAP 사용자 매핑", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "사용자 이름은 메타데이터를 저장하고 할당하는 데 사용됩니다. 사용자를 정확히 식별하기 위해서 모든 LDAP 사용자는 내부 사용자 이름을 갖고 있습니다. 이 정보에 접근하려면 사용자 이름과 LDAP 사용자 사이의 연결을 알아야 합니다. 생성된 사용자 이름은 LDAP 사용자의 UUID에 연결됩니다. LDAP에 연결하는 횟수를 줄이기 위하여 DN을 캐시에 저장하지만, 식별에는 사용하지 않습니다. DN이 변경되었을 때 변경 사항이 적용됩니다. 내부 사용자 이름은 항상 사용됩니다. 매핑을 비우면 과거 매핑의 흔적이 남습니다. 매핑을 비우는 것은 설정에 관계 없이 적용되므로 모든 LDAP 설정에 영향을 줍니다! 테스트 및 실험 단계에서만 매핑을 비우고, 상용 환경에서는 매핑을 비우지 마십시오.", "Clear Username-LDAP User Mapping" : "사용자 이름-LDAP 사용자 매핑 비우기", "Clear Groupname-LDAP Group Mapping" : "그룹 이름-LDAP 그룹 매핑 비우기", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 연결 오류가 발생했습니다. 호스트, 포트, 인증 정보를 확인하십시오.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%uid\" 자리 비움자가 없습니다. LDAP/AD에 조회할 때 로그인 이름으로 대체됩니다.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", - "LDAP / AD integration" : "LDAP/AD 통합", - "LDAP / AD Username:" : "LDAP/AD 사용자 이름:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", - "LDAP / AD Email Address:" : "LDAP/AD 이메일 주소:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "기본적으로 내부 사용자 이름은 UUID 속성에서 생성됩니다. 이를 통해서 사용자 이름이 유일하며 문자를 변환할 필요가 없도록 합니다. 내부 사용자 이름에는 다음 글자만 사용할 수 있습니다: [a-zA-Z0-9_.@-] 다른 모든 글자는 ASCII에 해당하는 글자로 대체되거나 생략됩니다. 충돌이 발생할 경우 숫자가 추가로 붙거나 증가합니다. 내부 사용자 이름은 사용자를 내부에서 식별하는 데에도 사용되며, 사용자 홈 폴더의 기본 이름입니다. 모든 *DAV 서비스 등에 사용되는 URL의 일부이기도 합니다. 이 설정을 사용하면 기본 행동을 사용자 정의할 수 있으며, 비워 두면 기본값을 사용합니다. 변경 사항은 새로 매핑 및 추가된 LDAP 사용자에게만 적용됩니다." + "Invalid configuration. Please have a look at the logs for further details." : "설정이 잘못되었습니다. 더 자세한 정보를 보려면 로그를 참조하십시오." }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/ko.json b/apps/user_ldap/l10n/ko.json index 6ba221cbf58..7f19afbeea7 100644 --- a/apps/user_ldap/l10n/ko.json +++ b/apps/user_ldap/l10n/ko.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "설정 잘못됨: 익명 바인딩이 허용되지 않습니다.", "Valid configuration, connection established!" : "설정 올바름, 연결되었습니다!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "설정이 올바르지만 바인딩이 실패했습니다. 서버 설정과 인증 정보를 확인하십시오.", - "Invalid configuration. Please have a look at the logs for further details." : "설정이 잘못되었습니다. 더 자세한 정보를 보려면 로그를 참조하십시오.", "No action specified" : "동작이 지정되지 않음", "No configuration specified" : "설정이 지정되지 않음", "No data specified" : "데이터가 지정되지 않음", - " Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음", + "Invalid data specified" : "잘못된 데이터가 특정됨", "Action does not exist" : "동작이 존재하지 않음", "Renewing …" : "갱신 중 …", "Very weak password" : "매우 약한 암호", @@ -51,15 +50,18 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "%uid 자리 비움자가 존재하지 않습니다. LDAP/AD에 조회할 때 로그인 사용자 이름으로 대체됩니다.", "Please provide a login name to test against" : "테스트할 로그인 사용자 이름을 입력하십시오", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", - "Password change rejected. Hint: " : "암호 변경이 거부되었습니다. 힌트:", "Please login with the new password" : "새 암호로 로그인하십시오", "LDAP User backend" : "사용자 백엔드", "Your password will expire tomorrow." : "내 암호가 내일 만료됩니다.", "Your password will expire today." : "내 암호가 오늘 만료됩니다.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["내 암호가 %n일 후 만료됩니다."], "LDAP/AD integration" : "LDAP/AD 통합", - "_%s group found_::_%s groups found_" : ["그룹 %s개 찾음"], - "_%s user found_::_%s users found_" : ["사용자 %s명 찾음"], + "Invalid LDAP UUIDs" : "잘못된 LDAP UUID", + "None found" : "아무것도 찾지 못함", + "_%n group found_::_%n groups found_" : ["그룹 %n개 찾음"], + "> 1000 groups found" : "그룹 1000개 초과 찾음", + "> 1000 users found" : "사용자 1000명 초과 찾음", + "_%n user found_::_%n users found_" : ["%n명의 사용자 찾음"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "사용자 표시 이름 속성을 찾을 수 없습니다. 고급 LDAP 설정에서 직접 지정하십시오.", "Could not find the desired feature" : "필요한 기능을 찾을 수 없음", "Invalid Host" : "잘못된 호스트", @@ -79,7 +81,7 @@ "Verify settings and count the groups" : "설정을 확인하고 그룹 개수 세기", "When logging in, %s will find the user based on the following attributes:" : "로그인할 때 %s에서 다음 속성을 기반으로 사용자를 찾습니다:", "LDAP/AD Username:" : "LDAP/AD 사용자 이름:", - "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 아이디로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", "LDAP/AD Email Address:" : "LDAP/AD 이메일 주소:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "이메일 속성으로 로그인하는 것을 허용합니다. \"mail\" 및 \"mailPrimaryAddress\"를 사용할 수 있습니다.", "Other Attributes:" : "기타 속성:", @@ -148,6 +150,8 @@ "One User Base DN per line" : "사용자 DN을 한 줄에 하나씩 입력하십시오", "User Search Attributes" : "사용자 검색 속성", "Optional; one attribute per line" : "추가적, 한 줄에 하나의 속성을 입력하십시오", + "Disable users missing from LDAP" : "LDAP에서 유실된 사용자 비활성화", + "When switched on, users imported from LDAP which are then missing will be disabled" : "이 옵션을 켜면 LDAP에서 불러온 사용자 중 유실된 계정이 비활성화될 것입니다", "Group Display Name Field" : "그룹의 표시 이름 필드", "The LDAP attribute to use to generate the groups's display name." : "그룹 표시 이름을 생성할 때 사용할 LDAP 속성입니다.", "Base Group Tree" : "기본 그룹 트리", @@ -175,6 +179,26 @@ "User Home Folder Naming Rule" : "사용자 홈 폴더 이름 규칙", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오.", "\"$home\" Placeholder Field" : "\"$home\" 자리 비움자 필드", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "외부 저장소 설정에서 $home이 지정된 속성의 값으로 대체됩니다", + "User Profile Attributes" : "사용자 프로필 속성", + "Phone Field" : "전화번호 필드", + "User profile Phone will be set from the specified attribute" : "사용자 프로필의 전화번호가 지정된 속성으로 설정됩니다", + "Website Field" : "웹사이트 필드", + "User profile Website will be set from the specified attribute" : "사용자 프로필의 웹사이트가 지정된 속성으로 설정됩니다", + "Address Field" : "주소 필드", + "User profile Address will be set from the specified attribute" : "사용자 프로필의 주소가 지정된 속성으로 설정됩니다", + "Twitter Field" : "Twitter 필드", + "User profile Twitter will be set from the specified attribute" : "사용자 프로필의 Twitter가 지정된 속성으로 설정됩니다", + "Fediverse Field" : "Fediverse 필드", + "User profile Fediverse will be set from the specified attribute" : "사용자 프로필의 Fediverse가 지정된 속성으로 설정됩니다", + "Organisation Field" : "조직 필드", + "User profile Organisation will be set from the specified attribute" : "사용자 프로필의 조직 필드가 지정된 속성으로 설정됩니다", + "Role Field" : "직책 필드", + "User profile Role will be set from the specified attribute" : "사용자 프로필의 직책이 지정된 속성으로 설정됩니다", + "Headline Field" : "표제 필드", + "User profile Headline will be set from the specified attribute" : "사용자 프로필의 표제가 지정된 속성으로 설정됩니다", + "Biography Field" : "소개문구 필드", + "User profile Biography will be set from the specified attribute" : "사용자 프로필의 소개문구가 지정된 속성으로 설정됩니다", "Internal Username" : "내부 사용자 이름", "Internal Username Attribute:" : "내부 사용자 이름 속성:", "Override UUID detection" : "UUID 확인 재정의", @@ -182,15 +206,9 @@ "UUID Attribute for Users:" : "사용자 UUID 속성:", "UUID Attribute for Groups:" : "그룹 UUID 속성:", "Username-LDAP User Mapping" : "사용자 이름-LDAP 사용자 매핑", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "사용자 이름은 메타데이터를 저장하고 할당하는 데 사용됩니다. 사용자를 정확히 식별하기 위해서 모든 LDAP 사용자는 내부 사용자 이름을 갖고 있습니다. 이 정보에 접근하려면 사용자 이름과 LDAP 사용자 사이의 연결을 알아야 합니다. 생성된 사용자 이름은 LDAP 사용자의 UUID에 연결됩니다. LDAP에 연결하는 횟수를 줄이기 위하여 DN을 캐시에 저장하지만, 식별에는 사용하지 않습니다. DN이 변경되었을 때 변경 사항이 적용됩니다. 내부 사용자 이름은 항상 사용됩니다. 매핑을 비우면 과거 매핑의 흔적이 남습니다. 매핑을 비우는 것은 설정에 관계 없이 적용되므로 모든 LDAP 설정에 영향을 줍니다! 테스트 및 실험 단계에서만 매핑을 비우고, 상용 환경에서는 매핑을 비우지 마십시오.", "Clear Username-LDAP User Mapping" : "사용자 이름-LDAP 사용자 매핑 비우기", "Clear Groupname-LDAP Group Mapping" : "그룹 이름-LDAP 그룹 매핑 비우기", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 연결 오류가 발생했습니다. 호스트, 포트, 인증 정보를 확인하십시오.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%uid\" 자리 비움자가 없습니다. LDAP/AD에 조회할 때 로그인 이름으로 대체됩니다.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", - "LDAP / AD integration" : "LDAP/AD 통합", - "LDAP / AD Username:" : "LDAP/AD 사용자 이름:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. \"uid\" 및 \"sAMAccountName\" 중 하나이며 자동으로 감지합니다.", - "LDAP / AD Email Address:" : "LDAP/AD 이메일 주소:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "기본적으로 내부 사용자 이름은 UUID 속성에서 생성됩니다. 이를 통해서 사용자 이름이 유일하며 문자를 변환할 필요가 없도록 합니다. 내부 사용자 이름에는 다음 글자만 사용할 수 있습니다: [a-zA-Z0-9_.@-] 다른 모든 글자는 ASCII에 해당하는 글자로 대체되거나 생략됩니다. 충돌이 발생할 경우 숫자가 추가로 붙거나 증가합니다. 내부 사용자 이름은 사용자를 내부에서 식별하는 데에도 사용되며, 사용자 홈 폴더의 기본 이름입니다. 모든 *DAV 서비스 등에 사용되는 URL의 일부이기도 합니다. 이 설정을 사용하면 기본 행동을 사용자 정의할 수 있으며, 비워 두면 기본값을 사용합니다. 변경 사항은 새로 매핑 및 추가된 LDAP 사용자에게만 적용됩니다." + "Invalid configuration. Please have a look at the logs for further details." : "설정이 잘못되었습니다. 더 자세한 정보를 보려면 로그를 참조하십시오." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/lb.js b/apps/user_ldap/l10n/lb.js deleted file mode 100644 index f62d2924488..00000000000 --- a/apps/user_ldap/l10n/lb.js +++ /dev/null @@ -1,51 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to delete the server configuration" : "D'Server-Konfiguratioun konnt net geläscht ginn", - "The configuration is invalid: anonymous bind is not allowed." : "Dës Konfiguratioun ass ongëlteg: eng anonym Bindung ass net erlaabt.", - "Action does not exist" : "Dës Aktioun gëtt et net", - "Testing configuration…" : "D'Konfiguratioun gëtt getest...", - "Configuration incorrect" : "D'Konfiguratioun ass net korrekt", - "Configuration incomplete" : "D'Konfiguratioun ass net komplett", - "Configuration OK" : "Konfiguratioun OK", - "Select groups" : "Wiel Gruppen äus", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "D'Späicheren huet net geklappt. W.e.g. géi sécher dass Datebank an der Operatioun ass. Lued nach emol éiers de weider fiers.", - "Select attributes" : "Wiel Attributer aus", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "De Benotzer konnt net fonnt ginn. W.e.g. kuck deng Login Attributer a Benotzernumm no. \n ", - "_%s group found_::_%s groups found_" : ["%s Grupp fonnt","%s Gruppe fonnt"], - "_%s user found_::_%s users found_" : ["%s Benotzer fonnt","%s Benotzere fonnt"], - "Could not find the desired feature" : "Déi gewënschte Funktioun konnt net fonnt ginn", - "Server" : "Server", - "Users" : "Benotzer", - "Groups" : "Gruppen", - "Test Configuration" : "Konfiguratiounstest", - "Help" : "Hëllef", - "Groups meeting these criteria are available in %s:" : "D'Gruppen, déi dës Critèren erfëllen sinn am %s:", - "Only these object classes:" : "Nëmmen des Klass vun Objeten:", - "Only from these groups:" : "Nëmme vun dëse Gruppen:", - "Search groups" : "Sich Gruppen", - "Available groups" : "Disponibel Gruppen", - "Selected groups" : "Ausgewielte Gruppen", - "Test Loginname" : "Test Benotzernumm", - "Verify settings" : "Astellungen iwwerpréiwen", - "1. Server" : "1. Server", - "%s. Server:" : "%s. Server", - "Delete the current configuration" : "Läsch déi aktuell Konfiguratioun", - "Host" : "Host", - "Port" : "Port", - "User DN" : "Benotzer DN", - "Password" : "Passwuert", - "Saving" : "Speicheren...", - "Back" : "Zeréck", - "Continue" : "Weider", - "Advanced" : "Erweidert", - "Connection Settings" : "D'Astellunge vun der Verbindung", - "Configuration Active" : "D'Konfiguratioun ass aktiv", - "When unchecked, this configuration will be skipped." : "Ouni Iwwerpréiwung wäert dës Konfiguratioun iwwergaange ginn.", - "Directory Settings" : "Dossier's Astellungen", - "in bytes" : "A Bytes", - "Email Field" : "Email Feld", - "Internal Username" : "Interne Benotzernumm", - "Internal Username Attribute:" : "Interne Benotzernumm Attribut:" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/lb.json b/apps/user_ldap/l10n/lb.json deleted file mode 100644 index e869a5821b1..00000000000 --- a/apps/user_ldap/l10n/lb.json +++ /dev/null @@ -1,49 +0,0 @@ -{ "translations": { - "Failed to delete the server configuration" : "D'Server-Konfiguratioun konnt net geläscht ginn", - "The configuration is invalid: anonymous bind is not allowed." : "Dës Konfiguratioun ass ongëlteg: eng anonym Bindung ass net erlaabt.", - "Action does not exist" : "Dës Aktioun gëtt et net", - "Testing configuration…" : "D'Konfiguratioun gëtt getest...", - "Configuration incorrect" : "D'Konfiguratioun ass net korrekt", - "Configuration incomplete" : "D'Konfiguratioun ass net komplett", - "Configuration OK" : "Konfiguratioun OK", - "Select groups" : "Wiel Gruppen äus", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "D'Späicheren huet net geklappt. W.e.g. géi sécher dass Datebank an der Operatioun ass. Lued nach emol éiers de weider fiers.", - "Select attributes" : "Wiel Attributer aus", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "De Benotzer konnt net fonnt ginn. W.e.g. kuck deng Login Attributer a Benotzernumm no. \n ", - "_%s group found_::_%s groups found_" : ["%s Grupp fonnt","%s Gruppe fonnt"], - "_%s user found_::_%s users found_" : ["%s Benotzer fonnt","%s Benotzere fonnt"], - "Could not find the desired feature" : "Déi gewënschte Funktioun konnt net fonnt ginn", - "Server" : "Server", - "Users" : "Benotzer", - "Groups" : "Gruppen", - "Test Configuration" : "Konfiguratiounstest", - "Help" : "Hëllef", - "Groups meeting these criteria are available in %s:" : "D'Gruppen, déi dës Critèren erfëllen sinn am %s:", - "Only these object classes:" : "Nëmmen des Klass vun Objeten:", - "Only from these groups:" : "Nëmme vun dëse Gruppen:", - "Search groups" : "Sich Gruppen", - "Available groups" : "Disponibel Gruppen", - "Selected groups" : "Ausgewielte Gruppen", - "Test Loginname" : "Test Benotzernumm", - "Verify settings" : "Astellungen iwwerpréiwen", - "1. Server" : "1. Server", - "%s. Server:" : "%s. Server", - "Delete the current configuration" : "Läsch déi aktuell Konfiguratioun", - "Host" : "Host", - "Port" : "Port", - "User DN" : "Benotzer DN", - "Password" : "Passwuert", - "Saving" : "Speicheren...", - "Back" : "Zeréck", - "Continue" : "Weider", - "Advanced" : "Erweidert", - "Connection Settings" : "D'Astellunge vun der Verbindung", - "Configuration Active" : "D'Konfiguratioun ass aktiv", - "When unchecked, this configuration will be skipped." : "Ouni Iwwerpréiwung wäert dës Konfiguratioun iwwergaange ginn.", - "Directory Settings" : "Dossier's Astellungen", - "in bytes" : "A Bytes", - "Email Field" : "Email Feld", - "Internal Username" : "Interne Benotzernumm", - "Internal Username Attribute:" : "Interne Benotzernumm Attribut:" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/lo.js b/apps/user_ldap/l10n/lo.js deleted file mode 100644 index 5494dcae62e..00000000000 --- a/apps/user_ldap/l10n/lo.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/lo.json b/apps/user_ldap/l10n/lo.json deleted file mode 100644 index 75f0f056cc4..00000000000 --- a/apps/user_ldap/l10n/lo.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/lt_LT.js b/apps/user_ldap/l10n/lt_LT.js index b907c3aa3bb..9b5d942ba0e 100644 --- a/apps/user_ldap/l10n/lt_LT.js +++ b/apps/user_ldap/l10n/lt_LT.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Neteisinga konfigūracija: Anoniminis prisijungimas neleidžiamas.", "Valid configuration, connection established!" : "Konfigūracija teisinga, ryšys užmegztas!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigūracija teisinga, bet prisijungimas nepavyko. Patikrinkite serverio nustatymus ir prisijungimo duomenis.", - "Invalid configuration. Please have a look at the logs for further details." : "Neteisinga konfigūracija. Išsamesnei informacijai, žiūrėkite žurnalus.", "No action specified" : "Nenurodytas veiksmas", "No configuration specified" : "Nenurodyta jokia konfigūracija", "No data specified" : "Nepateikta duomenų", - " Could not set configuration %s" : "Nepavyko nustatyti konfigūracijos %s", "Action does not exist" : "Veiksmo nėra", "Renewing …" : "Atnaujinama ...", "Very weak password" : "Labai silpnas slaptažodis", @@ -49,14 +47,11 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Įvyko nenustatyta klaida. Patikrinkite žurnalo įrašus ir nustatymus.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Paieškos filtras netinkamas, greičiausiai dėl sintaksės problemų, tokių kaip nevienodas atidarytų ir uždarų skliaustų skaičius. Prašome patikrinkite.", "Please provide a login name to test against" : "Pateikite prisijungimo vardą, kurį norite patikrinti", - "Password change rejected. Hint: " : "Slaptažodžio keitimas atmestas. Patarimas: ", "Please login with the new password" : "Prisijunkite naudodami naują slaptažodį", "LDAP User backend" : "LDAP naudotojo vidinė pusė", "Your password will expire tomorrow." : "Jūsų slaptažodžio galiojimo laikas pasibaigs rytoj.", "Your password will expire today." : "Jūsų slaptažodžio galiojimo laikas baigiasi šiandien.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Jūsų slaptažodis nustos galioti po %n dienos.","Jūsų slaptažodis nustos galioti po %n dienų.","Jūsų slaptažodis nustos galioti po %n dienų.","Jūsų slaptažodis nustos galioti po %n dienos."], - "_%s group found_::_%s groups found_" : ["Rasta %s grupė","Rastos %s grupės","Rasta %s grupių","Rasta %s grupė"], - "_%s user found_::_%s users found_" : ["Rastas %s naudotojas","Rasti %s naudotojai","Rasta %s naudotojų","Rastas %s naudotojas"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nepavyko aptikti naudotojo rodomo vardo požymio. Nurodykite jį patys išplėstiniuose LDAP nustatymuose.", "Could not find the desired feature" : "Nepavyko rasti pageidaujamos ypatybės", "Invalid Host" : "Neteisingas serveris", @@ -74,6 +69,8 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtras nurodo, kurios LDAP grupės turi turėti prieigą prie %s", "Verify settings and count the groups" : "Patikrinkite nustatymus ir suskaičiuokite grupes", "When logging in, %s will find the user based on the following attributes:" : "Prisijungiant, %s suras naudotoją, remiantis šiais požymiais:", + "LDAP/AD Username:" : "LDAP/AD naudotojo vardas:", + "LDAP/AD Email Address:" : "LDAP/AD el. pašto adresas:", "Other Attributes:" : "Kiti požymiai:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Apibrėžia filtrą, kuris taikomas bandant prisijungti. \"%%uid\" pakeičia naudotojo vardą prisijungimo metu. Pavyzdys: \"uid=%%uid\"", "Test Loginname" : "Ištestuokite prisijungimo vardą", @@ -169,11 +166,6 @@ OC.L10N.register( "UUID Attribute for Groups:" : "UUID požymis grupėms:", "Username-LDAP User Mapping" : "Naudotojo vardo - LDAP naudotojo sąsaja", "Clear Username-LDAP User Mapping" : "Išvalyti naudotojo vardo - LDAP naudotojo sąsają", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Įvyko sujungimo su LDAP/ AD klaida, patikrinkite serverį, prievadus ir prisijungimo duomenis.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Trūksta \"%u\" vietaženklio. Jis bus pakeistas prisijungimo vardu, siunčiant užklausas LDAP / AD. ", - "LDAP / AD integration" : "LDAP / AD integracija", - "LDAP / AD Username:" : "LDAP / AD naudotojo vardas:", - "LDAP / AD Email Address:" : "LDAP / AD el. pašto adresas:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID požymio. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams." + "Invalid configuration. Please have a look at the logs for further details." : "Neteisinga konfigūracija. Išsamesnei informacijai, žiūrėkite žurnalus." }, "nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/user_ldap/l10n/lt_LT.json b/apps/user_ldap/l10n/lt_LT.json index 7fd2d631e00..6eb4a8a3756 100644 --- a/apps/user_ldap/l10n/lt_LT.json +++ b/apps/user_ldap/l10n/lt_LT.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Neteisinga konfigūracija: Anoniminis prisijungimas neleidžiamas.", "Valid configuration, connection established!" : "Konfigūracija teisinga, ryšys užmegztas!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigūracija teisinga, bet prisijungimas nepavyko. Patikrinkite serverio nustatymus ir prisijungimo duomenis.", - "Invalid configuration. Please have a look at the logs for further details." : "Neteisinga konfigūracija. Išsamesnei informacijai, žiūrėkite žurnalus.", "No action specified" : "Nenurodytas veiksmas", "No configuration specified" : "Nenurodyta jokia konfigūracija", "No data specified" : "Nepateikta duomenų", - " Could not set configuration %s" : "Nepavyko nustatyti konfigūracijos %s", "Action does not exist" : "Veiksmo nėra", "Renewing …" : "Atnaujinama ...", "Very weak password" : "Labai silpnas slaptažodis", @@ -47,14 +45,11 @@ "An unspecified error occurred. Please check log and settings." : "Įvyko nenustatyta klaida. Patikrinkite žurnalo įrašus ir nustatymus.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Paieškos filtras netinkamas, greičiausiai dėl sintaksės problemų, tokių kaip nevienodas atidarytų ir uždarų skliaustų skaičius. Prašome patikrinkite.", "Please provide a login name to test against" : "Pateikite prisijungimo vardą, kurį norite patikrinti", - "Password change rejected. Hint: " : "Slaptažodžio keitimas atmestas. Patarimas: ", "Please login with the new password" : "Prisijunkite naudodami naują slaptažodį", "LDAP User backend" : "LDAP naudotojo vidinė pusė", "Your password will expire tomorrow." : "Jūsų slaptažodžio galiojimo laikas pasibaigs rytoj.", "Your password will expire today." : "Jūsų slaptažodžio galiojimo laikas baigiasi šiandien.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Jūsų slaptažodis nustos galioti po %n dienos.","Jūsų slaptažodis nustos galioti po %n dienų.","Jūsų slaptažodis nustos galioti po %n dienų.","Jūsų slaptažodis nustos galioti po %n dienos."], - "_%s group found_::_%s groups found_" : ["Rasta %s grupė","Rastos %s grupės","Rasta %s grupių","Rasta %s grupė"], - "_%s user found_::_%s users found_" : ["Rastas %s naudotojas","Rasti %s naudotojai","Rasta %s naudotojų","Rastas %s naudotojas"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nepavyko aptikti naudotojo rodomo vardo požymio. Nurodykite jį patys išplėstiniuose LDAP nustatymuose.", "Could not find the desired feature" : "Nepavyko rasti pageidaujamos ypatybės", "Invalid Host" : "Neteisingas serveris", @@ -72,6 +67,8 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtras nurodo, kurios LDAP grupės turi turėti prieigą prie %s", "Verify settings and count the groups" : "Patikrinkite nustatymus ir suskaičiuokite grupes", "When logging in, %s will find the user based on the following attributes:" : "Prisijungiant, %s suras naudotoją, remiantis šiais požymiais:", + "LDAP/AD Username:" : "LDAP/AD naudotojo vardas:", + "LDAP/AD Email Address:" : "LDAP/AD el. pašto adresas:", "Other Attributes:" : "Kiti požymiai:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Apibrėžia filtrą, kuris taikomas bandant prisijungti. \"%%uid\" pakeičia naudotojo vardą prisijungimo metu. Pavyzdys: \"uid=%%uid\"", "Test Loginname" : "Ištestuokite prisijungimo vardą", @@ -167,11 +164,6 @@ "UUID Attribute for Groups:" : "UUID požymis grupėms:", "Username-LDAP User Mapping" : "Naudotojo vardo - LDAP naudotojo sąsaja", "Clear Username-LDAP User Mapping" : "Išvalyti naudotojo vardo - LDAP naudotojo sąsają", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Įvyko sujungimo su LDAP/ AD klaida, patikrinkite serverį, prievadus ir prisijungimo duomenis.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Trūksta \"%u\" vietaženklio. Jis bus pakeistas prisijungimo vardu, siunčiant užklausas LDAP / AD. ", - "LDAP / AD integration" : "LDAP / AD integracija", - "LDAP / AD Username:" : "LDAP / AD naudotojo vardas:", - "LDAP / AD Email Address:" : "LDAP / AD el. pašto adresas:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID požymio. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams." + "Invalid configuration. Please have a look at the logs for further details." : "Neteisinga konfigūracija. Išsamesnei informacijai, žiūrėkite žurnalus." },"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/lv.js b/apps/user_ldap/l10n/lv.js deleted file mode 100644 index 095a43b4e47..00000000000 --- a/apps/user_ldap/l10n/lv.js +++ /dev/null @@ -1,117 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Neizdevās nodzēstu samērošanu.", - "Failed to delete the server configuration" : "Neizdevās izdzēst servera konfigurāciju", - "No action specified" : "Nav norādīta darbība", - "No configuration specified" : "Nav norādīta konfigurācija", - "No data specified" : "Nav norādīti dati", - " Could not set configuration %s" : "Nevarēja iestatīt konfigurāciju %s", - "Action does not exist" : "Darbība neeksistē", - "Very weak password" : "Ļoti vāja parole", - "Weak password" : "Vāja parole", - "So-so password" : "Normāla parole", - "Good password" : "Laba parole", - "Strong password" : "Lieliska parole", - "The Base DN appears to be wrong" : "DN bāze šķiet nepareiza", - "Testing configuration…" : "Konfigurācijas pārbaude...", - "Configuration incorrect" : "Nepareiza konfigurācija", - "Configuration incomplete" : "Nepilnīga konfigurācija", - "Configuration OK" : "Konfigurācija OK", - "Select groups" : "Izvēlieties grupas", - "Select object classes" : "Atlasiet objektu klases", - "Please check the credentials, they seem to be wrong." : "Lūdzu, pārbaudiet akreditācijas datus, tie šķiet nepareizi.", - "Please specify the port, it could not be auto-detected." : "Lūdzu, norādiet portu, tas nevarēja būt noteikts automātiski.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "DN bāzi nevarēja noteikt, lūdzu, pārskatiet datus, resursdatoru un portu.", - "Could not detect Base DN, please enter it manually." : "Nevarēja noteikt DN bāzi, lūdzu, ievadiet to manuāli.", - "{nthServer}. Server" : "{nthServer}. Serveris", - "No object found in the given Base DN. Please revise." : "Neviens objekts nav atrasts konkrētā DN bāzē. Lūdzu pārskatīt.", - "More than 1,000 directory entries available." : "Vairāk nekā 1,000 kataloga ieraksti ir pieejami.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Radās kļūda. Lūdzu, pārbaudiet bāzes DN, kā arī savienojuma iestatījumus vai akreditācijas datus.", - "Do you really want to delete the current Server Configuration?" : "Vai tiešām vēlaties dzēst pašreizējo servera konfigurāciju?", - "Confirm Deletion" : "Apstiprināt dzēšanu", - "Mappings cleared successfully!" : "Kartējumi notīrīta veiksmīgi!", - "Error while clearing the mappings." : "Kļūda, dzēšot kartējumus.", - "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP operācijas kļūda. Anonīma sasaiste, iespējams, nav atļauta.", - "Select attributes" : "Atlasīt atribūtus", - "Password change rejected. Hint: " : "Paroles maiņas noraidīja. Padoms:", - "_%s group found_::_%s groups found_" : ["%s grupas atrastas","%s grupas atrastas","%s grupas atrastas"], - "_%s user found_::_%s users found_" : ["%s lietotāji atrasti","%s lietotāji atrasti","%s lietotāji atrasti"], - "Invalid Host" : "Nederīgs resursdators", - "Test Configuration" : "Testa konfigurācija", - "Help" : "Palīdzība", - "Only these object classes:" : "Tikai šo objektu kategorijas:", - "Only from these groups:" : "Tikai no šīm grupām:", - "Search groups" : "Meklēt grupas", - "Available groups" : "Pieejamās grupas", - "Selected groups" : "Izvēlētās grupas", - "Edit LDAP Query" : "Labot LDAP vaicājumu", - "LDAP Filter:" : "LDAP filtrs:", - "Other Attributes:" : "Citi atribūti:", - "Test Loginname" : "Pārbaudiet lietotājvārdu", - "Verify settings" : "Pārbaudīt iestatījumus", - "%s. Server:" : "%s. Serveris:", - "Host" : "Resursdators", - "Port" : "Ports", - "Detect Port" : "Noteikt portu", - "User DN" : "Lietotāja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klienta lietotāja DN, ar ko veiks sasaisti, piemēram, uid=agent,dc=example,dc=com. Lai piekļūtu anonīmi, atstājiet DN un paroli tukšu.", - "Password" : "Parole", - "For anonymous access, leave DN and Password empty." : "Lai piekļūtu anonīmi, atstājiet DN un paroli tukšu.", - "One Base DN per line" : "Viena bāzes DN rindā", - "You can specify Base DN for users and groups in the Advanced tab" : "Lietotājiem un grupām var norādīt bāzes DN cilnē “Paplašināti”", - "Detect Base DN" : "Noteikt bāzes DN", - "Test Base DN" : "Testēt bāzes DN", - "Saving" : "Saglabā", - "Back" : "Atpakaļ", - "Continue" : "Turpināt", - "An internal error occurred." : "Radās iekšēja kļūda.", - "Please try again or contact your administrator." : "Lūdzu, mēģiniet vēlreiz vai sazinieties ar administratoru.", - "Current password" : "Pašreizējā parole", - "New password" : "Jauna parole", - "Wrong password." : "Nepareiza parole.", - "Cancel" : "Atcelt", - "Server" : "Serveris", - "Users" : "Lietotāji", - "Login Attributes" : "Pieteikšanās atribūti", - "Groups" : "Grupas", - "Expert" : "Eksperts", - "Advanced" : "Paplašināti", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Brīdinājums:</b> PHP LDAP modulis nav uzinstalēts, aizmugure nedarbosies. Lūdzu, prasiet savam sistēmas administratoram kādu no tām deaktivēt.", - "Connection Settings" : "Savienojuma iestatījumi", - "Configuration Active" : "Konfigurācija ir aktīva", - "When unchecked, this configuration will be skipped." : "Ja nav atzīmēts, šī konfigurācija tiks izlaista.", - "Backup (Replica) Host" : "Rezerves (kopija) serveris", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Norādi rezerves serveri (nav obligāti). Tam ir jābūt galvenā LDAP/AD servera kopijai.", - "Backup (Replica) Port" : "Rezerves (kopijas) ports", - "Disable Main Server" : "Deaktivēt galveno serveri", - "Turn off SSL certificate validation." : "Izslēgt SSL sertifikātu validēšanu.", - "Cache Time-To-Live" : "Kešatmiņas dzīvlaiks", - "in seconds. A change empties the cache." : "sekundēs. Izmaiņas iztukšos kešatmiņu.", - "Directory Settings" : "Direktorijas iestatījumi", - "User Display Name Field" : "Lietotāja redzamā vārda lauks", - "Base User Tree" : "Bāzes lietotāju koks", - "One User Base DN per line" : "Viens lietotājs bāzes DN rindā", - "User Search Attributes" : "Lietotāju meklēšanas atribūts", - "Optional; one attribute per line" : "Neobligāti; viens atribūts rindā", - "Group Display Name Field" : "Grupas redzamā nosaukuma lauks", - "Base Group Tree" : "Bāzes grupu koks", - "One Group Base DN per line" : "Viena grupu bāzes DN rindā", - "Group Search Attributes" : "Grupu meklēšanas atribūts", - "Group-Member association" : "Grupu piederības asociācija", - "Enable LDAP password changes per user" : "Iespējot LDAP paroles maiņu katram lietotājam", - "(New password is sent as plain text to LDAP)" : "(Jaunā parole tiek nosūtīta kā vienkāršs teksts ar LDAP)", - "Special Attributes" : "Īpašie atribūti", - "Quota Field" : "Kvotu lauks", - "Quota Default" : "Kvotas noklusējums", - "Email Field" : "E-pasta lauks", - "User Home Folder Naming Rule" : "Lietotāja mājas mapes nosaukšanas kārtula", - "Internal Username" : "Iekšējais lietotājvārds", - "Override UUID detection" : "Ignorēt UUID noteikšanu", - "UUID Attribute for Users:" : "UUID atribūti lietotājiem:", - "UUID Attribute for Groups:" : "UUID atribūti grupām:", - "LDAP / AD integration" : "LDAP / AD integrācija", - "LDAP / AD Username:" : "LDAP / AD lietotājvārds:", - "LDAP / AD Email Address:" : "LDAP / AD e-pasta adrese:" -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/user_ldap/l10n/lv.json b/apps/user_ldap/l10n/lv.json deleted file mode 100644 index 4e4dddbc8ac..00000000000 --- a/apps/user_ldap/l10n/lv.json +++ /dev/null @@ -1,115 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Neizdevās nodzēstu samērošanu.", - "Failed to delete the server configuration" : "Neizdevās izdzēst servera konfigurāciju", - "No action specified" : "Nav norādīta darbība", - "No configuration specified" : "Nav norādīta konfigurācija", - "No data specified" : "Nav norādīti dati", - " Could not set configuration %s" : "Nevarēja iestatīt konfigurāciju %s", - "Action does not exist" : "Darbība neeksistē", - "Very weak password" : "Ļoti vāja parole", - "Weak password" : "Vāja parole", - "So-so password" : "Normāla parole", - "Good password" : "Laba parole", - "Strong password" : "Lieliska parole", - "The Base DN appears to be wrong" : "DN bāze šķiet nepareiza", - "Testing configuration…" : "Konfigurācijas pārbaude...", - "Configuration incorrect" : "Nepareiza konfigurācija", - "Configuration incomplete" : "Nepilnīga konfigurācija", - "Configuration OK" : "Konfigurācija OK", - "Select groups" : "Izvēlieties grupas", - "Select object classes" : "Atlasiet objektu klases", - "Please check the credentials, they seem to be wrong." : "Lūdzu, pārbaudiet akreditācijas datus, tie šķiet nepareizi.", - "Please specify the port, it could not be auto-detected." : "Lūdzu, norādiet portu, tas nevarēja būt noteikts automātiski.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "DN bāzi nevarēja noteikt, lūdzu, pārskatiet datus, resursdatoru un portu.", - "Could not detect Base DN, please enter it manually." : "Nevarēja noteikt DN bāzi, lūdzu, ievadiet to manuāli.", - "{nthServer}. Server" : "{nthServer}. Serveris", - "No object found in the given Base DN. Please revise." : "Neviens objekts nav atrasts konkrētā DN bāzē. Lūdzu pārskatīt.", - "More than 1,000 directory entries available." : "Vairāk nekā 1,000 kataloga ieraksti ir pieejami.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Radās kļūda. Lūdzu, pārbaudiet bāzes DN, kā arī savienojuma iestatījumus vai akreditācijas datus.", - "Do you really want to delete the current Server Configuration?" : "Vai tiešām vēlaties dzēst pašreizējo servera konfigurāciju?", - "Confirm Deletion" : "Apstiprināt dzēšanu", - "Mappings cleared successfully!" : "Kartējumi notīrīta veiksmīgi!", - "Error while clearing the mappings." : "Kļūda, dzēšot kartējumus.", - "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP operācijas kļūda. Anonīma sasaiste, iespējams, nav atļauta.", - "Select attributes" : "Atlasīt atribūtus", - "Password change rejected. Hint: " : "Paroles maiņas noraidīja. Padoms:", - "_%s group found_::_%s groups found_" : ["%s grupas atrastas","%s grupas atrastas","%s grupas atrastas"], - "_%s user found_::_%s users found_" : ["%s lietotāji atrasti","%s lietotāji atrasti","%s lietotāji atrasti"], - "Invalid Host" : "Nederīgs resursdators", - "Test Configuration" : "Testa konfigurācija", - "Help" : "Palīdzība", - "Only these object classes:" : "Tikai šo objektu kategorijas:", - "Only from these groups:" : "Tikai no šīm grupām:", - "Search groups" : "Meklēt grupas", - "Available groups" : "Pieejamās grupas", - "Selected groups" : "Izvēlētās grupas", - "Edit LDAP Query" : "Labot LDAP vaicājumu", - "LDAP Filter:" : "LDAP filtrs:", - "Other Attributes:" : "Citi atribūti:", - "Test Loginname" : "Pārbaudiet lietotājvārdu", - "Verify settings" : "Pārbaudīt iestatījumus", - "%s. Server:" : "%s. Serveris:", - "Host" : "Resursdators", - "Port" : "Ports", - "Detect Port" : "Noteikt portu", - "User DN" : "Lietotāja DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klienta lietotāja DN, ar ko veiks sasaisti, piemēram, uid=agent,dc=example,dc=com. Lai piekļūtu anonīmi, atstājiet DN un paroli tukšu.", - "Password" : "Parole", - "For anonymous access, leave DN and Password empty." : "Lai piekļūtu anonīmi, atstājiet DN un paroli tukšu.", - "One Base DN per line" : "Viena bāzes DN rindā", - "You can specify Base DN for users and groups in the Advanced tab" : "Lietotājiem un grupām var norādīt bāzes DN cilnē “Paplašināti”", - "Detect Base DN" : "Noteikt bāzes DN", - "Test Base DN" : "Testēt bāzes DN", - "Saving" : "Saglabā", - "Back" : "Atpakaļ", - "Continue" : "Turpināt", - "An internal error occurred." : "Radās iekšēja kļūda.", - "Please try again or contact your administrator." : "Lūdzu, mēģiniet vēlreiz vai sazinieties ar administratoru.", - "Current password" : "Pašreizējā parole", - "New password" : "Jauna parole", - "Wrong password." : "Nepareiza parole.", - "Cancel" : "Atcelt", - "Server" : "Serveris", - "Users" : "Lietotāji", - "Login Attributes" : "Pieteikšanās atribūti", - "Groups" : "Grupas", - "Expert" : "Eksperts", - "Advanced" : "Paplašināti", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Brīdinājums:</b> PHP LDAP modulis nav uzinstalēts, aizmugure nedarbosies. Lūdzu, prasiet savam sistēmas administratoram kādu no tām deaktivēt.", - "Connection Settings" : "Savienojuma iestatījumi", - "Configuration Active" : "Konfigurācija ir aktīva", - "When unchecked, this configuration will be skipped." : "Ja nav atzīmēts, šī konfigurācija tiks izlaista.", - "Backup (Replica) Host" : "Rezerves (kopija) serveris", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Norādi rezerves serveri (nav obligāti). Tam ir jābūt galvenā LDAP/AD servera kopijai.", - "Backup (Replica) Port" : "Rezerves (kopijas) ports", - "Disable Main Server" : "Deaktivēt galveno serveri", - "Turn off SSL certificate validation." : "Izslēgt SSL sertifikātu validēšanu.", - "Cache Time-To-Live" : "Kešatmiņas dzīvlaiks", - "in seconds. A change empties the cache." : "sekundēs. Izmaiņas iztukšos kešatmiņu.", - "Directory Settings" : "Direktorijas iestatījumi", - "User Display Name Field" : "Lietotāja redzamā vārda lauks", - "Base User Tree" : "Bāzes lietotāju koks", - "One User Base DN per line" : "Viens lietotājs bāzes DN rindā", - "User Search Attributes" : "Lietotāju meklēšanas atribūts", - "Optional; one attribute per line" : "Neobligāti; viens atribūts rindā", - "Group Display Name Field" : "Grupas redzamā nosaukuma lauks", - "Base Group Tree" : "Bāzes grupu koks", - "One Group Base DN per line" : "Viena grupu bāzes DN rindā", - "Group Search Attributes" : "Grupu meklēšanas atribūts", - "Group-Member association" : "Grupu piederības asociācija", - "Enable LDAP password changes per user" : "Iespējot LDAP paroles maiņu katram lietotājam", - "(New password is sent as plain text to LDAP)" : "(Jaunā parole tiek nosūtīta kā vienkāršs teksts ar LDAP)", - "Special Attributes" : "Īpašie atribūti", - "Quota Field" : "Kvotu lauks", - "Quota Default" : "Kvotas noklusējums", - "Email Field" : "E-pasta lauks", - "User Home Folder Naming Rule" : "Lietotāja mājas mapes nosaukšanas kārtula", - "Internal Username" : "Iekšējais lietotājvārds", - "Override UUID detection" : "Ignorēt UUID noteikšanu", - "UUID Attribute for Users:" : "UUID atribūti lietotājiem:", - "UUID Attribute for Groups:" : "UUID atribūti grupām:", - "LDAP / AD integration" : "LDAP / AD integrācija", - "LDAP / AD Username:" : "LDAP / AD lietotājvārds:", - "LDAP / AD Email Address:" : "LDAP / AD e-pasta adrese:" -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mg.js b/apps/user_ldap/l10n/mg.js deleted file mode 100644 index 95c97db2f9c..00000000000 --- a/apps/user_ldap/l10n/mg.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/mg.json b/apps/user_ldap/l10n/mg.json deleted file mode 100644 index 8e0cd6f6783..00000000000 --- a/apps/user_ldap/l10n/mg.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mk.js b/apps/user_ldap/l10n/mk.js deleted file mode 100644 index 39fe8f5da90..00000000000 --- a/apps/user_ldap/l10n/mk.js +++ /dev/null @@ -1,18 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Неуспешно бришење на мапирањстс.", - "Select groups" : "Одбери групи", - "Confirm Deletion" : "Потврдете го бришењето", - "Users" : "Корисници", - "Groups" : "Групи", - "Help" : "Помош", - "Host" : "Домаќин", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Може да го скокнете протколот освен ако не ви треба SSL. Тогаш ставете ldaps://", - "Port" : "Порта", - "Password" : "Лозинка", - "Back" : "Назад", - "Continue" : "Продолжи", - "Advanced" : "Напредно" -}, -"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/user_ldap/l10n/mk.json b/apps/user_ldap/l10n/mk.json deleted file mode 100644 index 238bd2a8ebc..00000000000 --- a/apps/user_ldap/l10n/mk.json +++ /dev/null @@ -1,16 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Неуспешно бришење на мапирањстс.", - "Select groups" : "Одбери групи", - "Confirm Deletion" : "Потврдете го бришењето", - "Users" : "Корисници", - "Groups" : "Групи", - "Help" : "Помош", - "Host" : "Домаќин", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Може да го скокнете протколот освен ако не ви треба SSL. Тогаш ставете ldaps://", - "Port" : "Порта", - "Password" : "Лозинка", - "Back" : "Назад", - "Continue" : "Продолжи", - "Advanced" : "Напредно" -},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ml.js b/apps/user_ldap/l10n/ml.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/ml.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ml.json b/apps/user_ldap/l10n/ml.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/ml.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mn.js b/apps/user_ldap/l10n/mn.js deleted file mode 100644 index 304c0247840..00000000000 --- a/apps/user_ldap/l10n/mn.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Password" : "Нууц үг" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/mn.json b/apps/user_ldap/l10n/mn.json deleted file mode 100644 index 13788221f43..00000000000 --- a/apps/user_ldap/l10n/mn.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Password" : "Нууц үг" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mr.js b/apps/user_ldap/l10n/mr.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/mr.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/mr.json b/apps/user_ldap/l10n/mr.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/mr.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ms_MY.js b/apps/user_ldap/l10n/ms_MY.js deleted file mode 100644 index 74bdc1b820f..00000000000 --- a/apps/user_ldap/l10n/ms_MY.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "Pengguna", - "Groups" : "Kumpulan", - "Help" : "Bantuan", - "Password" : "Kata laluan", - "Back" : "Kembali", - "Advanced" : "Maju" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/ms_MY.json b/apps/user_ldap/l10n/ms_MY.json deleted file mode 100644 index 1d26cfcaf3d..00000000000 --- a/apps/user_ldap/l10n/ms_MY.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "Users" : "Pengguna", - "Groups" : "Kumpulan", - "Help" : "Bantuan", - "Password" : "Kata laluan", - "Back" : "Kembali", - "Advanced" : "Maju" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mt_MT.js b/apps/user_ldap/l10n/mt_MT.js deleted file mode 100644 index 8b3fcfae910..00000000000 --- a/apps/user_ldap/l10n/mt_MT.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["","","",""], - "_%s user found_::_%s users found_" : ["","","",""] -}, -"nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);"); diff --git a/apps/user_ldap/l10n/mt_MT.json b/apps/user_ldap/l10n/mt_MT.json deleted file mode 100644 index cbda8c83cca..00000000000 --- a/apps/user_ldap/l10n/mt_MT.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["","","",""], - "_%s user found_::_%s users found_" : ["","","",""] -},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/nb.js b/apps/user_ldap/l10n/nb.js index 9ef8f8ead3d..50b9e2a40ff 100644 --- a/apps/user_ldap/l10n/nb.js +++ b/apps/user_ldap/l10n/nb.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Oppsettet er ugyldig: Anonym binding er ikke tillatt.", "Valid configuration, connection established!" : "Gyldig oppsett, tilkoblet.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Oppsettet er i orden, men binding mislyktes. Sjekk server-oppsettet og påloggingsinformasjonen.", - "Invalid configuration. Please have a look at the logs for further details." : "Oppsettet er ikke gyldig. Sjekk loggene for flere detaljer.", "No action specified" : "Ingen handling spesifisert", "No configuration specified" : "Ingen oppsett spesifisert", "No data specified" : "Ingen data spesifisert", - " Could not set configuration %s" : "Klarte ikke å utføre oppsett %s", + "Invalid data specified" : "Ugyldige data er spesifisert", "Action does not exist" : "Handlingen finnes ikke", "Renewing …" : "Fornyer…", "Very weak password" : "Veldig svakt passord", @@ -33,7 +32,7 @@ OC.L10N.register( "No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt base DN. Revider oppsettet.", "More than 1,000 directory entries available." : "Mer enn 1.000 oppføringer er tilgjengelig i katalog.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} oppføring tilgjengelig i den angitte Base DN","{objectsFound} oppføringer tilgjengelig i den angitte Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppstod en feil. Sjekk base-DN, tilkoblingsoppsett og påloggingsdetaljer.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppsto en feil. Sjekk base-DN, tilkoblingsoppsett og påloggingsdetaljer.", "Do you really want to delete the current Server Configuration?" : "Er du sikker på at du vil slette den aktiver serverkonfigurasjon?", "Confirm Deletion" : "Bekreft sletting", "Mappings cleared successfully!" : "Tilknytningene ble fjernet!", @@ -47,17 +46,26 @@ OC.L10N.register( "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Bruker ikke funnet. Sjekk påloggingsattributtene og brukernavnet. Virksomt filter (kopier og lim inn for validering på kommandolinjen): <br/>", "User found and settings verified." : "Bruker funnet og innstillinger bekreftet.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvei å snevre inn søket ditt, siden det spenner over mange brukere, bare den første derav vil kunne logge inn.", - "An unspecified error occurred. Please check log and settings." : "En uspesifisert feil oppstod. Sjekk loggen og innstillingene.", + "An unspecified error occurred. Please check log and settings." : "En uspesifisert feil oppsto. Sjekk loggen og innstillingene.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søkefilteret er ugyldig, antakelig pga. syntaksproblemer som ulikt antall start- og sluttparenteser. Sjekk det.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Det oppsto en tilkoblingsfeil til LDAP/AD. Vennligst sjekk vert, port og legitimasjon.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Plassholderen \"%uid\" mangler. Det vil bli erstattet med påloggingsnavnet når det spørres etter LDAP/AD.", "Please provide a login name to test against" : "Oppgi et påloggingsnavn å teste mot", - "Password change rejected. Hint: " : "Passordendring avslått. Hint:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP/AD-serveren ikke støtter memberOf.", "Please login with the new password" : "Logg inn med det nye passordet", "LDAP User backend" : "LDAP-brukerbackend", "Your password will expire tomorrow." : "Passordet ditt utløper i morgen.", "Your password will expire today." : "Passordet ditt utløper i dag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."], - "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], - "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], + "LDAP/AD integration" : "LDAP/AD-integrasjon", + "LDAP Connection" : "LDAP-forbindelse", + "Invalid LDAP UUIDs" : "Ugyldige LDAP UUID-er", + "None found" : "Ingen funnet", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Det er funnet ugyldige UUID-er for LDAP-brukere eller -grupper. Gå gjennom innstillingene for «Overstyr UUID-deteksjon» i Ekspert-delen av LDAP-konfigurasjonen, og bruk «occ ldap:update-uuid» for å oppdatere dem.", + "_%n group found_::_%n groups found_" : ["%n gruppe funnet","%n grupper funnet"], + "> 1000 groups found" : "> 1000 grupper funnet", + "> 1000 users found" : "> 1000 brukere funnet", + "_%n user found_::_%n users found_" : ["%n bruker funnet","%n brukere funnet"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke påvise attributt for brukers visningsnavn. Du må selv spesifisere det i avanserte LDAP-innstillinger.", "Could not find the desired feature" : "Fant ikke den ønskede funksjonaliteten", "Invalid Host" : "Ugyldig server", @@ -77,10 +85,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-grupper som skal ha tilgang til %s-instansen.", "Verify settings and count the groups" : "Bekreft innstillingene og tell gruppene", "When logging in, %s will find the user based on the following attributes:" : "Ved pålogging vil %s finne brukeren basert på følgende attributter:", + "LDAP/AD Username:" : "LDAP/AD-brukernavn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillater pålogging mot LDAP/AD-brukernavnet, som enten er \"uid\" eller \"sAMAccountName\" og vil bli oppdaget.", + "LDAP/AD Email Address:" : "LDAP/AD e-postadresse:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillater innlogging mot en e-postattributt. \"mail\" og \"mailPrimaryAddress\" tillates.", "Other Attributes:" : "Andre attributter:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer et filter å legge til, når innlogging forsøkes. \"%%uid\" erstatter brukernavnet i innloggingshandlingen. Eksempel: \"uid=%%uid\"", "Test Loginname" : "Test påloggingsnavn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Forsøk på å motta en DN for det gitte påloggingsnavnet og det gjeldende påloggingsfilteret", "Verify settings" : "Sjekk innstillinger", "%s. Server:" : "%s. server:", "Add a new configuration" : "Legger til nytt oppsett", @@ -109,7 +121,7 @@ OC.L10N.register( "Back" : "Tilbake", "Continue" : "Fortsett", "Please renew your password." : "Forny passordet ditt.", - "An internal error occurred." : "En intern feil oppstod", + "An internal error occurred." : "En intern feil oppsto", "Please try again or contact your administrator." : "Prøv igjen eller kontakt en administrator.", "Current password" : "Nåværende passord", "New password" : "Nytt passord", @@ -144,6 +156,8 @@ OC.L10N.register( "One User Base DN per line" : "En base DN for brukere pr. linje", "User Search Attributes" : "Attributter for brukersøk", "Optional; one attribute per line" : "Valgfritt, en attributt per linje", + "Disable users missing from LDAP" : "Deaktiver brukere som mangler fra LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Når den er slått på, deaktiveres brukere importert fra LDAP som da mangler", "Group Display Name Field" : "Felt med gruppens visningsnavn", "The LDAP attribute to use to generate the groups's display name." : "LDAP attributten som skal brukes til å generere gruppens visningsnavn.", "Base Group Tree" : "Base for gruppetre", @@ -172,7 +186,29 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "La det være tomt for brukernavnet (standard). Ellers spesifiserer du et LDAP/AD-attributt.", "\"$home\" Placeholder Field" : "\"$home\" Plassholderfelt", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$homei en ekstern lagringskonfigurasjon vil bli erstattet med verdien for det angitte attributtet", + "User Profile Attributes" : "Attributter for brukerprofil", + "Phone Field" : "Telefonfelt", + "User profile Phone will be set from the specified attribute" : "Brukerprofil Telefon vil bli satt fra det angitte attributtet", + "Website Field" : "Nettstedfelt", + "User profile Website will be set from the specified attribute" : "Brukerprofil Nettsted vil bli satt fra det angitte attributtet", + "Address Field" : "Adressefelt", + "User profile Address will be set from the specified attribute" : "Brukerprofil Adresse vil bli satt fra det angitte attributtet", + "Twitter Field" : "Twitterfelt", + "User profile Twitter will be set from the specified attribute" : "Brukerprofil Twitter vil bli satt fra det angitte attributtet", + "Fediverse Field" : "Fediverse felt", + "User profile Fediverse will be set from the specified attribute" : "Brukerprofil Fediverse vil bli satt fra det angitte attributtet", + "Organisation Field" : "Organisasjonsfelt", + "User profile Organisation will be set from the specified attribute" : "Brukerprofil Organisasjon vil bli satt fra det angitte attributtet", + "Role Field" : "Rollefelt", + "User profile Role will be set from the specified attribute" : "Brukerprofil Rolle vil bli satt fra det angitte attributtet", + "Headline Field" : "Overskriftsfelt", + "User profile Headline will be set from the specified attribute" : "Brukerprofil Overskrift vil bli satt fra det angitte attributtet", + "Biography Field" : "Biografifelt", + "User profile Biography will be set from the specified attribute" : "Brukerprofil Biografi vil bli satt fra det angitte attributtet", + "Birthdate Field" : "Felt for fødselsdato", + "User profile Date of birth will be set from the specified attribute" : "Brukerprofil Fødselsdato vil bli satt fra det angitte attributtet", "Internal Username" : "Internt brukernavn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard vil det interne brukernavnet bli opprettet fra UUID-attributten. Den sørger for at brukernavnet er unikt og at tegn ikke trenger å konverteres. Det interne brukernavnet har en begrensning at kun disse tegnene er tillatt: [a-zA-Z0-9_.@-]. Andre tegn erstattes med deres ASCII-ekvivalent eller bare utelatt. Ved kollisjoner vil et tall legges til/økes. Det interne brukernavnet brukes til å identifisere en bruker internt. Det er også standardnavnet for brukerens hjemmeområde. Det er også en del av eksterne URL-er, for eksempel for alle DAV-tjenester. Med denne innstillingen kan standardoppførselen overstyres. Endringer vil bare ha effekt på nylig kartlagte (tillagte) LDAP-brukere. La det stå tomt for standard oppførsel.", "Internal Username Attribute:" : "Attributt for internt brukernavn:", "Override UUID detection" : "Overstyr UUID detektering", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som forvalg blir UUID attributten påvist automatisk. UUID attributten brukes til å identifisere LDAP brukere og grupper unikt. Det interne brukernavnet vil også bli laget basert på UUID, hvis ikke annet er spesifisert ovenfor. Du kan overstyre innstillingen og oppgi den attributten du ønsker. Du må forsikre deg om at din valgte attributt kan hentes ut både for brukere og for grupper og at den er unik. La stå tomt for forvalgt ppførsel. Endringer vil kun påvirke nylig tilknyttede (opprettede) LDAP brukere og grupper.", @@ -182,13 +218,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brukernavn brukes til å lagre og tildele metadata. For å identifisere og gjenkjenne brukere nøyaktig, vil hver LDAP-bruker ha et internt brukernavn. Dette krever en kartlegging fra brukernavn til LDAP-bruker. Det opprettede brukernavnet tilordnes UUID for LDAP-brukeren. I tillegg er DN også hurtigbufret for å redusere LDAP-interaksjon, men den brukes ikke til identifikasjon. Hvis DN endres, vil endringene bli funnet. Det interne brukernavnet brukes overalt. Å rydde kartleggingen vil ha rester overalt. Å rydde tilordningene er ikke konfigurasjonsfølsom, det påvirker alle LDAP-konfigurasjoner! Tøm aldri kartleggingen i et produksjonsmiljø, bare i et test- eller eksperimentelt stadium.", "Clear Username-LDAP User Mapping" : "Nullstill tilknytning av brukernavn til LDAP bruker", "Clear Groupname-LDAP Group Mapping" : "Nullstill tilknytning av gruppenavn til LDAP gruppe", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Det oppstod en feil ved tilkobling til LDAP / AD. Sjekk vertsnavn, portnummer og påloggingsdetaljer.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Plassholder \"%uid\" mangler. Den erstattes av påloggingsnavnet ved spørring mot LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP- / AD-serveren ikke støtter memberOf.", - "LDAP / AD integration" : "LDAP / AD integrasjon", - "LDAP / AD Username:" : "LDAP / AD brukernavn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillatter innlogging mot LDAP / AD-brukernavn, som er enten \"uid\" eller \"sAMAccountName\" og vil oppdages.", - "LDAP / AD Email Address:" : "LDAP / AD e-post adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som forvalg vil det interne brukernavnet opprettes fra UUID-attributten. Det sørger for at brukernavnet er unikt og at tegnene ikke må konverteres. Det interne brukernavnet har en begrensning i at bare disse tegnene tillates: [ a-zA-Z0-9_.@- ]. Andre tegn erstattes av deres motsatser i ASCII, eller blir sett bort fra. Ved kollisjoner vil et nummer bli lagt til/økt. Det interne brukernavnet brukes til å identifisere en bruker internt. Det er også forvalgt navn for brukerens hjemmemappe. Det er også en del av URL-er eksternt, for eksempel alle *DAV-tjenester. Med denne innstillingen, kan forvalgt oppførsel overstyres. La stå tom for forvalgt oppførsel. Endringer vil bare ha effekt på nylig knyttede (tillagte) LDAP brukere." + "Invalid configuration. Please have a look at the logs for further details." : "Oppsettet er ikke gyldig. Sjekk loggene for flere detaljer." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/nb.json b/apps/user_ldap/l10n/nb.json index 01a57a84b93..d39154abc80 100644 --- a/apps/user_ldap/l10n/nb.json +++ b/apps/user_ldap/l10n/nb.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Oppsettet er ugyldig: Anonym binding er ikke tillatt.", "Valid configuration, connection established!" : "Gyldig oppsett, tilkoblet.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Oppsettet er i orden, men binding mislyktes. Sjekk server-oppsettet og påloggingsinformasjonen.", - "Invalid configuration. Please have a look at the logs for further details." : "Oppsettet er ikke gyldig. Sjekk loggene for flere detaljer.", "No action specified" : "Ingen handling spesifisert", "No configuration specified" : "Ingen oppsett spesifisert", "No data specified" : "Ingen data spesifisert", - " Could not set configuration %s" : "Klarte ikke å utføre oppsett %s", + "Invalid data specified" : "Ugyldige data er spesifisert", "Action does not exist" : "Handlingen finnes ikke", "Renewing …" : "Fornyer…", "Very weak password" : "Veldig svakt passord", @@ -31,7 +30,7 @@ "No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt base DN. Revider oppsettet.", "More than 1,000 directory entries available." : "Mer enn 1.000 oppføringer er tilgjengelig i katalog.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} oppføring tilgjengelig i den angitte Base DN","{objectsFound} oppføringer tilgjengelig i den angitte Base DN"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppstod en feil. Sjekk base-DN, tilkoblingsoppsett og påloggingsdetaljer.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Det oppsto en feil. Sjekk base-DN, tilkoblingsoppsett og påloggingsdetaljer.", "Do you really want to delete the current Server Configuration?" : "Er du sikker på at du vil slette den aktiver serverkonfigurasjon?", "Confirm Deletion" : "Bekreft sletting", "Mappings cleared successfully!" : "Tilknytningene ble fjernet!", @@ -45,17 +44,26 @@ "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Bruker ikke funnet. Sjekk påloggingsattributtene og brukernavnet. Virksomt filter (kopier og lim inn for validering på kommandolinjen): <br/>", "User found and settings verified." : "Bruker funnet og innstillinger bekreftet.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Overvei å snevre inn søket ditt, siden det spenner over mange brukere, bare den første derav vil kunne logge inn.", - "An unspecified error occurred. Please check log and settings." : "En uspesifisert feil oppstod. Sjekk loggen og innstillingene.", + "An unspecified error occurred. Please check log and settings." : "En uspesifisert feil oppsto. Sjekk loggen og innstillingene.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Søkefilteret er ugyldig, antakelig pga. syntaksproblemer som ulikt antall start- og sluttparenteser. Sjekk det.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Det oppsto en tilkoblingsfeil til LDAP/AD. Vennligst sjekk vert, port og legitimasjon.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Plassholderen \"%uid\" mangler. Det vil bli erstattet med påloggingsnavnet når det spørres etter LDAP/AD.", "Please provide a login name to test against" : "Oppgi et påloggingsnavn å teste mot", - "Password change rejected. Hint: " : "Passordendring avslått. Hint:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP/AD-serveren ikke støtter memberOf.", "Please login with the new password" : "Logg inn med det nye passordet", "LDAP User backend" : "LDAP-brukerbackend", "Your password will expire tomorrow." : "Passordet ditt utløper i morgen.", "Your password will expire today." : "Passordet ditt utløper i dag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."], - "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], - "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], + "LDAP/AD integration" : "LDAP/AD-integrasjon", + "LDAP Connection" : "LDAP-forbindelse", + "Invalid LDAP UUIDs" : "Ugyldige LDAP UUID-er", + "None found" : "Ingen funnet", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Det er funnet ugyldige UUID-er for LDAP-brukere eller -grupper. Gå gjennom innstillingene for «Overstyr UUID-deteksjon» i Ekspert-delen av LDAP-konfigurasjonen, og bruk «occ ldap:update-uuid» for å oppdatere dem.", + "_%n group found_::_%n groups found_" : ["%n gruppe funnet","%n grupper funnet"], + "> 1000 groups found" : "> 1000 grupper funnet", + "> 1000 users found" : "> 1000 brukere funnet", + "_%n user found_::_%n users found_" : ["%n bruker funnet","%n brukere funnet"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunne ikke påvise attributt for brukers visningsnavn. Du må selv spesifisere det i avanserte LDAP-innstillinger.", "Could not find the desired feature" : "Fant ikke den ønskede funksjonaliteten", "Invalid Host" : "Ugyldig server", @@ -75,10 +83,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-grupper som skal ha tilgang til %s-instansen.", "Verify settings and count the groups" : "Bekreft innstillingene og tell gruppene", "When logging in, %s will find the user based on the following attributes:" : "Ved pålogging vil %s finne brukeren basert på følgende attributter:", + "LDAP/AD Username:" : "LDAP/AD-brukernavn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillater pålogging mot LDAP/AD-brukernavnet, som enten er \"uid\" eller \"sAMAccountName\" og vil bli oppdaget.", + "LDAP/AD Email Address:" : "LDAP/AD e-postadresse:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillater innlogging mot en e-postattributt. \"mail\" og \"mailPrimaryAddress\" tillates.", "Other Attributes:" : "Andre attributter:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definerer et filter å legge til, når innlogging forsøkes. \"%%uid\" erstatter brukernavnet i innloggingshandlingen. Eksempel: \"uid=%%uid\"", "Test Loginname" : "Test påloggingsnavn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Forsøk på å motta en DN for det gitte påloggingsnavnet og det gjeldende påloggingsfilteret", "Verify settings" : "Sjekk innstillinger", "%s. Server:" : "%s. server:", "Add a new configuration" : "Legger til nytt oppsett", @@ -107,7 +119,7 @@ "Back" : "Tilbake", "Continue" : "Fortsett", "Please renew your password." : "Forny passordet ditt.", - "An internal error occurred." : "En intern feil oppstod", + "An internal error occurred." : "En intern feil oppsto", "Please try again or contact your administrator." : "Prøv igjen eller kontakt en administrator.", "Current password" : "Nåværende passord", "New password" : "Nytt passord", @@ -142,6 +154,8 @@ "One User Base DN per line" : "En base DN for brukere pr. linje", "User Search Attributes" : "Attributter for brukersøk", "Optional; one attribute per line" : "Valgfritt, en attributt per linje", + "Disable users missing from LDAP" : "Deaktiver brukere som mangler fra LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Når den er slått på, deaktiveres brukere importert fra LDAP som da mangler", "Group Display Name Field" : "Felt med gruppens visningsnavn", "The LDAP attribute to use to generate the groups's display name." : "LDAP attributten som skal brukes til å generere gruppens visningsnavn.", "Base Group Tree" : "Base for gruppetre", @@ -170,7 +184,29 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "La det være tomt for brukernavnet (standard). Ellers spesifiserer du et LDAP/AD-attributt.", "\"$home\" Placeholder Field" : "\"$home\" Plassholderfelt", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$homei en ekstern lagringskonfigurasjon vil bli erstattet med verdien for det angitte attributtet", + "User Profile Attributes" : "Attributter for brukerprofil", + "Phone Field" : "Telefonfelt", + "User profile Phone will be set from the specified attribute" : "Brukerprofil Telefon vil bli satt fra det angitte attributtet", + "Website Field" : "Nettstedfelt", + "User profile Website will be set from the specified attribute" : "Brukerprofil Nettsted vil bli satt fra det angitte attributtet", + "Address Field" : "Adressefelt", + "User profile Address will be set from the specified attribute" : "Brukerprofil Adresse vil bli satt fra det angitte attributtet", + "Twitter Field" : "Twitterfelt", + "User profile Twitter will be set from the specified attribute" : "Brukerprofil Twitter vil bli satt fra det angitte attributtet", + "Fediverse Field" : "Fediverse felt", + "User profile Fediverse will be set from the specified attribute" : "Brukerprofil Fediverse vil bli satt fra det angitte attributtet", + "Organisation Field" : "Organisasjonsfelt", + "User profile Organisation will be set from the specified attribute" : "Brukerprofil Organisasjon vil bli satt fra det angitte attributtet", + "Role Field" : "Rollefelt", + "User profile Role will be set from the specified attribute" : "Brukerprofil Rolle vil bli satt fra det angitte attributtet", + "Headline Field" : "Overskriftsfelt", + "User profile Headline will be set from the specified attribute" : "Brukerprofil Overskrift vil bli satt fra det angitte attributtet", + "Biography Field" : "Biografifelt", + "User profile Biography will be set from the specified attribute" : "Brukerprofil Biografi vil bli satt fra det angitte attributtet", + "Birthdate Field" : "Felt for fødselsdato", + "User profile Date of birth will be set from the specified attribute" : "Brukerprofil Fødselsdato vil bli satt fra det angitte attributtet", "Internal Username" : "Internt brukernavn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard vil det interne brukernavnet bli opprettet fra UUID-attributten. Den sørger for at brukernavnet er unikt og at tegn ikke trenger å konverteres. Det interne brukernavnet har en begrensning at kun disse tegnene er tillatt: [a-zA-Z0-9_.@-]. Andre tegn erstattes med deres ASCII-ekvivalent eller bare utelatt. Ved kollisjoner vil et tall legges til/økes. Det interne brukernavnet brukes til å identifisere en bruker internt. Det er også standardnavnet for brukerens hjemmeområde. Det er også en del av eksterne URL-er, for eksempel for alle DAV-tjenester. Med denne innstillingen kan standardoppførselen overstyres. Endringer vil bare ha effekt på nylig kartlagte (tillagte) LDAP-brukere. La det stå tomt for standard oppførsel.", "Internal Username Attribute:" : "Attributt for internt brukernavn:", "Override UUID detection" : "Overstyr UUID detektering", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som forvalg blir UUID attributten påvist automatisk. UUID attributten brukes til å identifisere LDAP brukere og grupper unikt. Det interne brukernavnet vil også bli laget basert på UUID, hvis ikke annet er spesifisert ovenfor. Du kan overstyre innstillingen og oppgi den attributten du ønsker. Du må forsikre deg om at din valgte attributt kan hentes ut både for brukere og for grupper og at den er unik. La stå tomt for forvalgt ppførsel. Endringer vil kun påvirke nylig tilknyttede (opprettede) LDAP brukere og grupper.", @@ -180,13 +216,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Brukernavn brukes til å lagre og tildele metadata. For å identifisere og gjenkjenne brukere nøyaktig, vil hver LDAP-bruker ha et internt brukernavn. Dette krever en kartlegging fra brukernavn til LDAP-bruker. Det opprettede brukernavnet tilordnes UUID for LDAP-brukeren. I tillegg er DN også hurtigbufret for å redusere LDAP-interaksjon, men den brukes ikke til identifikasjon. Hvis DN endres, vil endringene bli funnet. Det interne brukernavnet brukes overalt. Å rydde kartleggingen vil ha rester overalt. Å rydde tilordningene er ikke konfigurasjonsfølsom, det påvirker alle LDAP-konfigurasjoner! Tøm aldri kartleggingen i et produksjonsmiljø, bare i et test- eller eksperimentelt stadium.", "Clear Username-LDAP User Mapping" : "Nullstill tilknytning av brukernavn til LDAP bruker", "Clear Groupname-LDAP Group Mapping" : "Nullstill tilknytning av gruppenavn til LDAP gruppe", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Det oppstod en feil ved tilkobling til LDAP / AD. Sjekk vertsnavn, portnummer og påloggingsdetaljer.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Plassholder \"%uid\" mangler. Den erstattes av påloggingsnavnet ved spørring mot LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP- / AD-serveren ikke støtter memberOf.", - "LDAP / AD integration" : "LDAP / AD integrasjon", - "LDAP / AD Username:" : "LDAP / AD brukernavn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillatter innlogging mot LDAP / AD-brukernavn, som er enten \"uid\" eller \"sAMAccountName\" og vil oppdages.", - "LDAP / AD Email Address:" : "LDAP / AD e-post adresse:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som forvalg vil det interne brukernavnet opprettes fra UUID-attributten. Det sørger for at brukernavnet er unikt og at tegnene ikke må konverteres. Det interne brukernavnet har en begrensning i at bare disse tegnene tillates: [ a-zA-Z0-9_.@- ]. Andre tegn erstattes av deres motsatser i ASCII, eller blir sett bort fra. Ved kollisjoner vil et nummer bli lagt til/økt. Det interne brukernavnet brukes til å identifisere en bruker internt. Det er også forvalgt navn for brukerens hjemmemappe. Det er også en del av URL-er eksternt, for eksempel alle *DAV-tjenester. Med denne innstillingen, kan forvalgt oppførsel overstyres. La stå tom for forvalgt oppførsel. Endringer vil bare ha effekt på nylig knyttede (tillagte) LDAP brukere." + "Invalid configuration. Please have a look at the logs for further details." : "Oppsettet er ikke gyldig. Sjekk loggene for flere detaljer." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js index 724c1d4a1f8..2d3fd78aa99 100644 --- a/apps/user_ldap/l10n/nl.js +++ b/apps/user_ldap/l10n/nl.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "De configuratie is ongeldig: anonieme bind is niet toegestaan.", "Valid configuration, connection established!" : "Geldige configuratie, verbinding tot stand gebracht", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Geldige configuratie, maar Binding mislukte. Controleer de serverinstellingen en inloggegevens.", - "Invalid configuration. Please have a look at the logs for further details." : "Ongeldige configuratie. Bekijk de logbestanden voor meer details.", "No action specified" : "Geen actie opgegeven", "No configuration specified" : "Geen configuratie opgegeven", "No data specified" : "Geen gegevens verstrekt", - " Could not set configuration %s" : "Kon configuratie %s niet instellen", "Action does not exist" : "Actie bestaat niet", "Renewing …" : "Herstellen ...", "Very weak password" : "Zeer zwak wachtwoord", @@ -53,15 +51,12 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP/AD.", "Please provide a login name to test against" : "Geef een inlognaam op om opnieuw tegen te testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP/AD server het attribuut memberOf niet ondersteunt.", - "Password change rejected. Hint: " : "Wachtwoordwijziging geweigerd. Hint:", "Please login with the new password" : "Login met je nieuwe wachtwoord", "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Je wachtwoord vervalt morgen.", "Your password will expire today." : "Je wachtwoord vervalt vandaag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Je wachtwoord verloopt binnen %n dag.","Je wachtwoord vervalt over %n dagen."], "LDAP/AD integration" : "LDAP/AD integratie", - "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], - "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde LDAP instellingen.", "Could not find the desired feature" : "Kon de gewenste functie niet vinden", "Invalid Host" : "Ongeldige server", @@ -180,23 +175,15 @@ OC.L10N.register( "\"$home\" Placeholder Field" : "\"$home\" Plaatshouder veld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in een externe opslag configuratie wordt vervangen door de waarde van het gespecificeerde attribuut", "Internal Username" : "Interne gebruikersnaam", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@-]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers.", "Internal Username Attribute:" : "Interne gebruikersnaam attribuut:", - "Override UUID detection" : "Negeren UUID detectie", + "Override UUID detection" : "UUID-detectie negeren", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standaard wordt het UUID-attribuut automatisch herkend. Het UUID attribuut wordt gebruikt om LDAP-gebruikers en -groepen uniek te identificeren. Ook zal de interne gebruikersnaam worden aangemaakt op basis van het UUID, tenzij deze hierboven anders is aangegeven. Je kunt de instelling overschrijven en zelf een waarde voor het attribuut opgeven. Je moet ervoor zorgen dat het ingestelde attribuut kan worden opgehaald voor zowel gebruikers als groepen en dat het uniek is. Laat het leeg voor standaard gedrag. Veranderingen worden alleen doorgevoerd op nieuw gekoppelde (toegevoegde) LDAP-gebruikers en-groepen.", - "UUID Attribute for Users:" : "UUID attribuut voor gebruikers:", - "UUID Attribute for Groups:" : "UUID attribuut voor groepen:", + "UUID Attribute for Users:" : "UUID-attribuut voor gebruikers:", + "UUID Attribute for Groups:" : "UUID-attribuut voor groepen:", "Username-LDAP User Mapping" : "Gebruikersnaam-LDAP gebruikers vertaling", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Gebruikersnamen worden gebruikt om metadata op te slaan en toe te wijzen. Om gebruikers uniek te identificeren, krijgt elke LDAP-gebruiker ook een interne gebruikersnaam. Dit vereist een koppeling van de gebruikersnaam naar een LDAP-gebruiker. De gecreëerde gebruikersnaam is gekoppeld aan de UUID van de LDAP-gebruiker. Aanvullend wordt ook de 'DN' gecached om het aantal LDAP-interacties te verminderen, maar dit wordt niet gebruikt voor identificatie. Als de DN verandert, zullen de veranderingen worden gevonden. De interne gebruikersnaam wordt overal gebruikt. Het wissen van de koppeling zal overal resten achterlaten. Het wissen van koppelingen is niet configuratiegevoelig, maar het raakt wel alle LDAP instellingen! Zorg ervoor dat deze koppelingen nooit in een productieomgeving gewist worden. Maak ze alleen leeg in een test- of ontwikkelomgeving.", "Clear Username-LDAP User Mapping" : "Leegmaken Gebruikersnaam-LDAP gebruikers vertaling", "Clear Groupname-LDAP Group Mapping" : "Leegmaken Groepsnaam-LDAP groep vertaling", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Er trad een verbindingsfout naar LDAP / AD op, controleer servernaam, poort en inloggegevens.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP / AD server het attribuut memberOf niet ondersteunt.", - "LDAP / AD integration" : "LDAP / AD integratie", - "LDAP / AD Username:" : "LDAP / AD gebruikersnaam:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Maakt inloggen tegen de LDAP / AD gebruikersnaam mogelijk, zowel \"uid\" en \"sAMAccountname\" wordt gedetecteerd.", - "LDAP / AD Email Address:" : "LDAP / AD e-mailadres:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@- ]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Laat het leeg voor de standaardwerkwijze. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers." + "Invalid configuration. Please have a look at the logs for further details." : "Ongeldige configuratie. Bekijk de logbestanden voor meer details." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json index d4c03ea2bcf..a54db70c9e7 100644 --- a/apps/user_ldap/l10n/nl.json +++ b/apps/user_ldap/l10n/nl.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "De configuratie is ongeldig: anonieme bind is niet toegestaan.", "Valid configuration, connection established!" : "Geldige configuratie, verbinding tot stand gebracht", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Geldige configuratie, maar Binding mislukte. Controleer de serverinstellingen en inloggegevens.", - "Invalid configuration. Please have a look at the logs for further details." : "Ongeldige configuratie. Bekijk de logbestanden voor meer details.", "No action specified" : "Geen actie opgegeven", "No configuration specified" : "Geen configuratie opgegeven", "No data specified" : "Geen gegevens verstrekt", - " Could not set configuration %s" : "Kon configuratie %s niet instellen", "Action does not exist" : "Actie bestaat niet", "Renewing …" : "Herstellen ...", "Very weak password" : "Zeer zwak wachtwoord", @@ -51,15 +49,12 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP/AD.", "Please provide a login name to test against" : "Geef een inlognaam op om opnieuw tegen te testen", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP/AD server het attribuut memberOf niet ondersteunt.", - "Password change rejected. Hint: " : "Wachtwoordwijziging geweigerd. Hint:", "Please login with the new password" : "Login met je nieuwe wachtwoord", "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Je wachtwoord vervalt morgen.", "Your password will expire today." : "Je wachtwoord vervalt vandaag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Je wachtwoord verloopt binnen %n dag.","Je wachtwoord vervalt over %n dagen."], "LDAP/AD integration" : "LDAP/AD integratie", - "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], - "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde LDAP instellingen.", "Could not find the desired feature" : "Kon de gewenste functie niet vinden", "Invalid Host" : "Ongeldige server", @@ -178,23 +173,15 @@ "\"$home\" Placeholder Field" : "\"$home\" Plaatshouder veld", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in een externe opslag configuratie wordt vervangen door de waarde van het gespecificeerde attribuut", "Internal Username" : "Interne gebruikersnaam", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@-]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers.", "Internal Username Attribute:" : "Interne gebruikersnaam attribuut:", - "Override UUID detection" : "Negeren UUID detectie", + "Override UUID detection" : "UUID-detectie negeren", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standaard wordt het UUID-attribuut automatisch herkend. Het UUID attribuut wordt gebruikt om LDAP-gebruikers en -groepen uniek te identificeren. Ook zal de interne gebruikersnaam worden aangemaakt op basis van het UUID, tenzij deze hierboven anders is aangegeven. Je kunt de instelling overschrijven en zelf een waarde voor het attribuut opgeven. Je moet ervoor zorgen dat het ingestelde attribuut kan worden opgehaald voor zowel gebruikers als groepen en dat het uniek is. Laat het leeg voor standaard gedrag. Veranderingen worden alleen doorgevoerd op nieuw gekoppelde (toegevoegde) LDAP-gebruikers en-groepen.", - "UUID Attribute for Users:" : "UUID attribuut voor gebruikers:", - "UUID Attribute for Groups:" : "UUID attribuut voor groepen:", + "UUID Attribute for Users:" : "UUID-attribuut voor gebruikers:", + "UUID Attribute for Groups:" : "UUID-attribuut voor groepen:", "Username-LDAP User Mapping" : "Gebruikersnaam-LDAP gebruikers vertaling", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Gebruikersnamen worden gebruikt om metadata op te slaan en toe te wijzen. Om gebruikers uniek te identificeren, krijgt elke LDAP-gebruiker ook een interne gebruikersnaam. Dit vereist een koppeling van de gebruikersnaam naar een LDAP-gebruiker. De gecreëerde gebruikersnaam is gekoppeld aan de UUID van de LDAP-gebruiker. Aanvullend wordt ook de 'DN' gecached om het aantal LDAP-interacties te verminderen, maar dit wordt niet gebruikt voor identificatie. Als de DN verandert, zullen de veranderingen worden gevonden. De interne gebruikersnaam wordt overal gebruikt. Het wissen van de koppeling zal overal resten achterlaten. Het wissen van koppelingen is niet configuratiegevoelig, maar het raakt wel alle LDAP instellingen! Zorg ervoor dat deze koppelingen nooit in een productieomgeving gewist worden. Maak ze alleen leeg in een test- of ontwikkelomgeving.", "Clear Username-LDAP User Mapping" : "Leegmaken Gebruikersnaam-LDAP gebruikers vertaling", "Clear Groupname-LDAP Group Mapping" : "Leegmaken Groepsnaam-LDAP groep vertaling", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Er trad een verbindingsfout naar LDAP / AD op, controleer servernaam, poort en inloggegevens.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP / AD server het attribuut memberOf niet ondersteunt.", - "LDAP / AD integration" : "LDAP / AD integratie", - "LDAP / AD Username:" : "LDAP / AD gebruikersnaam:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Maakt inloggen tegen de LDAP / AD gebruikersnaam mogelijk, zowel \"uid\" en \"sAMAccountname\" wordt gedetecteerd.", - "LDAP / AD Email Address:" : "LDAP / AD e-mailadres:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standaard wordt de interne gebruikersnaam afgeleid van het UUID attribuut. dat zorgt ervoor dat de gebruikersnaam uniek is en dat tekens niet hoeven te worden geconverteerd. De interne gebruikersnaam heeft de beperking dat alleen deze tekens zijn toegestaan: [ a-zA-Z0-9_.@- ]. Andere tekens worden vervangen door hun overeenkomstige ASCII-waarde of simpelweg weggelaten. Bij conflicten wordt een nummer toegevoegd/verhoogd. De interne gebruikersnaam wordt gebruikt om een gebruiker intern te identificeren. Het is ook de standaardnaam voor de thuis-map van de gebruiker. Het is ook onderdeel van de externe URLs, bijvoorbeeld voor alle *DAV services. Met deze instelling kan het standaardgedrag worden overschreven. Laat het leeg voor de standaardwerkwijze. Wijzigingen hebben alleen effect voor nieuw gekoppelde (toegevoegde) LDAP gebruikers." + "Invalid configuration. Please have a look at the logs for further details." : "Ongeldige configuratie. Bekijk de logbestanden voor meer details." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/nn_NO.js b/apps/user_ldap/l10n/nn_NO.js deleted file mode 100644 index c14fc8b78b9..00000000000 --- a/apps/user_ldap/l10n/nn_NO.js +++ /dev/null @@ -1,14 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Select groups" : "Vel grupper", - "Users" : "Brukarar", - "Groups" : "Grupper", - "Help" : "Hjelp", - "Host" : "Tenar", - "Password" : "Passord", - "Back" : "Tilbake", - "Continue" : "Gå vidare", - "Advanced" : "Avansert" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/nn_NO.json b/apps/user_ldap/l10n/nn_NO.json deleted file mode 100644 index 4cd54c39e08..00000000000 --- a/apps/user_ldap/l10n/nn_NO.json +++ /dev/null @@ -1,12 +0,0 @@ -{ "translations": { - "Select groups" : "Vel grupper", - "Users" : "Brukarar", - "Groups" : "Grupper", - "Help" : "Hjelp", - "Host" : "Tenar", - "Password" : "Passord", - "Back" : "Tilbake", - "Continue" : "Gå vidare", - "Advanced" : "Avansert" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/nqo.js b/apps/user_ldap/l10n/nqo.js deleted file mode 100644 index 5494dcae62e..00000000000 --- a/apps/user_ldap/l10n/nqo.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/nqo.json b/apps/user_ldap/l10n/nqo.json deleted file mode 100644 index 75f0f056cc4..00000000000 --- a/apps/user_ldap/l10n/nqo.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/oc.js b/apps/user_ldap/l10n/oc.js deleted file mode 100644 index 4a06d436198..00000000000 --- a/apps/user_ldap/l10n/oc.js +++ /dev/null @@ -1,157 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Error al moment de la supression de las associacions.", - "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor", - "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.", - "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valabla, mas lo bind a fracassat. Verificatz los paramètres del servidor e tanben vòstres identificants de connexion.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valabla. Consultatz los logs per mai de detalhs.", - "No action specified" : "Cap d'accion pas especificada", - "No configuration specified" : "Cap de configuration pas especificada", - "No data specified" : "Cap de donada pas especificada", - " Could not set configuration %s" : "Impossible d'especificar la configuracion %s", - "Action does not exist" : "L'accion existís pas", - "The Base DN appears to be wrong" : "Lo DN de basa es erronèu", - "Configuration incorrect" : "Configuracion incorrècta", - "Configuration incomplete" : "Configuracion incompleta", - "Configuration OK" : "Configuracion OK", - "Select groups" : "Seleccionatz los gropes", - "Select object classes" : "Seleccionar las classas d'objècte", - "Please check the credentials, they seem to be wrong." : "Verificatz vòstras informacions d'identificacion", - "Please specify the port, it could not be auto-detected." : "Especificatz lo pòrt, a pas pogut èsser detectat automaticament", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de basa a pas pogut èsser detectat automaticament. Verificatz las informacions d'identificacion, l'òste e lo pòrt.", - "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament", - "{nthServer}. Server" : "{nthServer}. Servidor", - "No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.", - "More than 1,000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.", - " entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.", - "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?", - "Confirm Deletion" : "Confirmar la supression", - "Mappings cleared successfully!" : "Associacions suprimidas amb succès !", - "Error while clearing the mappings." : "Error al moment de la supression de las associacions.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonima al servidor es probablament pas acceptada.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lo salvament a fracassat. Verificatz que la banca de donadas es operacionala. Recargatz abans de contunhar.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar de mòde activarà las requèstas LDAP automaticas. Segon la talha de vòstre annuari LDAP, aquò pòt préner del temps. Volètz totjorn cambiar de mòde ?", - "Mode switch" : "Cambiar de mòde", - "Select attributes" : "Seleccionar los atributs", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introbable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre efectiu (de copiar-pegar per validar en linha de comanda):<br/>", - "User found and settings verified." : "Utilizaire trobat e paramètres verificats.", - "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas sol lo primièr utilizaire se poirà connectar. Utilizatz puslèu un filtre mens restrictiu.", - "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valid, probablament a causa de problèmas de sintaxi tals coma de parentèsis mancantas. Corregissètz-los.", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'òste, lo pòrt e las informacions d'identificacion.", - "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La cadena %uid es mancanta. Aquesta cadena es remplaçada per l'identificant de connexion al moment de las requèstas LDAP / AD.", - "Please provide a login name to test against" : "Indicatz un identificant de connexion amb lo qual cal testar.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.", - "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"], - "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"], - "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.", - "Could not find the desired feature" : "Impossible de trobar la foncion desirada", - "Invalid Host" : "Òste invalid", - "Server" : "Servidor", - "Users" : "Utilizaires", - "Login Attributes" : "Atributs de login", - "Groups" : "Gropes", - "Test Configuration" : "Testar la configuracion", - "Help" : "Ajuda", - "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :", - "Only these object classes:" : "Solament aquestas classes d'objèctes :", - "Only from these groups:" : "Solament dins aquestes gropes :", - "Search groups" : "Cercar dins los gropes", - "Available groups" : "Gropes disponibles", - "Selected groups" : "Gropes seleccionats", - "Edit LDAP Query" : "Modificar la requèsta LDAP", - "LDAP Filter:" : "Filtre LDAP :", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre especifica quins gropes LDAP an accès a l'instància %s.", - "Verify settings and count groups" : "Verificar los paramètres e comptar los gropes", - "When logging in, %s will find the user based on the following attributes:" : "Al login, %s cercarà l'utilizaire sus basa d'aquestes atributs :", - "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :", - "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la deteccion es automatica). ", - "LDAP / AD Email Address:" : "Adreça mail LDAP / AD :", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.", - "Other Attributes:" : "Autres atributs :", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definís lo filtre d'aplicar al moment d'una temptativa de connexion. %%uid remplaça lo nom d'utilizaire. Exemple : \"uid=%%uid\"", - "Test Loginname" : "Loginname de tèst", - "Verify settings" : "Testar los paramètres", - "1. Server" : "1. Servidor", - "%s. Server:" : "%s. Servidor :", - "Add a new and blank configuration" : "Apondre una novèla configuracion verge", - "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla", - "Delete the current configuration" : "Suprimir la configuracion actuala", - "Host" : "Òste", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz ometre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://", - "Port" : "Pòrt", - "Detect Port" : "Detectar lo pòrt", - "User DN" : "DN Utilizaire", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client pel qual la ligason se deu far, per exemple uid=agent,dc=example,dc=com. Per un accès anonim, daissar lo DN e lo senhal voids.", - "Password" : "Senhal", - "For anonymous access, leave DN and Password empty." : "Per un accès anonim, daissar lo DN utilizaire e lo senhal voids.", - "One Base DN per line" : "Un DN de basa per linha", - "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar los DN de basa de vòstres utilizaires e gropes via l'onglet Avançat", - "Detect Base DN" : "Detectar lo DN de basa", - "Test Base DN" : "Testar lo DN de basa", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita las requèstas LDAP automaticas. Melhor per las installacions de grand ample, mas demanda de coneissenças en LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat pels annuaris de grand ample)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classas d'objèctes frequentas pels utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classa d'utilizar, demandatz a l'administrator de l'annuari.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre especifica quins utilizaires LDAP auràn accès a l'instància %s.", - "Verify settings and count users" : "Verificar los paramètres e comptar los utilizaires", - "Saving" : "Enregistrament...", - "Back" : "Retorn", - "Continue" : "Contunhar", - "LDAP" : "LDAP", - "Expert" : "Expèrt", - "Advanced" : "Avançat", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertiment :</b> Las aplicacions user_ldap e user_webdavauth son incompatiblas. De disfoncionaments se pòdon provesir. Contactatz vòstre administrator sistèma per que ne desactive una.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo modul php LDAP es pas installat, per consequéncia aquesta extension poirà pas foncionar. Contactatz vòstre administrator sistèma per tal que l'installe.", - "Connection Settings" : "Paramètres de connexion", - "Configuration Active" : "Configuracion activa", - "When unchecked, this configuration will be skipped." : "Quand pas marcada, la configuracion serà ignorada.", - "Backup (Replica) Host" : "Servidor de backup (replica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Provesir un servidor de backup opcional. Se deu agir d'una replica del servidor LDAP/AD principal.", - "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)", - "Disable Main Server" : "Desactivar lo servidor principal", - "Only connect to the replica server." : "Se connectar unicament a la replica", - "Turn off SSL certificate validation." : "Desactivar la validacion dels certificats SSL", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Pas recomandat, d'utilizar amb d'objectius de tèsts unicament. Se la connexion fonciona pas qu'amb aquesta opcion, importatz lo certificat SSL del servidor LDAP dins lo servidor %s.", - "Cache Time-To-Live" : "Durada de vida de l'escondedor (TTL)", - "in seconds. A change empties the cache." : "en segondas. Tot cambiament voida l'escondedor.", - "Directory Settings" : "Paramètres del repertòri", - "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire", - "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.", - "Base User Tree" : "DN raiç de l'arbre utilizaires", - "One User Base DN per line" : "Un DN de basa utilizaire per linha", - "User Search Attributes" : "Atributs de recèrca utilizaires", - "Optional; one attribute per line" : "Opcional, un atribut per linha", - "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop", - "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.", - "Base Group Tree" : "DN raiç de l'arbre gropes", - "One Group Base DN per line" : "Un DN de basa grop per linha", - "Group Search Attributes" : "Atributs de recèrca des gropes", - "Group-Member association" : "Associacion grop-membre", - "Nested Groups" : "Gropes imbricats", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes que contenon d'autres gropes son preses en carga (fonciona unicament se l'atribut membre del grop conten de DNs).", - "Paging chunksize" : "Paging chunksize", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per las recèrcas LDAP paginadas que pòdon tornar de resultats per lòts coma una enumeracion d'utilizaires o de gropes. (Configurar a 0 per desactivar las recèrcas LDAP paginadas)", - "Special Attributes" : "Atributs especials", - "Quota Field" : "Camp del quòta", - "Quota Default" : "Quòta per defaut", - "in bytes" : "en octets", - "Email Field" : "Camp Email", - "User Home Folder Naming Rule" : "Règla de nomenatge del repertòri utilizaire", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Daissar void per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.", - "Internal Username" : "Nom d'utilizaire intèrne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defaut lo nom d'utilizaire intèrne serà creat a partir de l'atribut UUID. Aquò permet d'assegurar que lo nom d'utilizaire es unic e que los caractèrs necessitan pas de conversion. Lo nom d'utilizaire intèrne deu contenir unicament los caractèrs seguents : [ a-zA-Z0-9_.@- ]. Los autres caractèrs son remplaçats per lor correspondéncia ASCII o simplament omeses. En cas de collision, un nombre es apondut/incrementat. Lo nom d'utilizaire intèrne es utilizat per identificar l'utilizaire al dintre del sistèma. Es tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Fa tanben partida de certans URL de servicis, per exemple per totes los servicis *DAV. Lo comportament per defaut pòt èsser modificat amb l'ajuda d'aqueste paramètre. Per obtenir un comportament similar a las versions precedentas a ownCloud 5, sasir lo nom d'utilizaire d'afichar dins lo camp seguent. Daissar a blanc pel comportement per defaut. Las modificacions prendràn efièch solament pels novèls (aponduts) utilizaires LDAP.", - "Internal Username Attribute:" : "Nom d'utilizaire intèrne :", - "Override UUID detection" : "Passar outra la deteccion des UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es detectat automaticament. Aqueste atribut es utilizat per identificar los utilizaires e gropes de faiçon fisabla. Un nom d'utilizaire intèrne basat sus l'UUID serà automaticament creat, levat s'es especificat autrament çaisús. Podètz modificar aqueste comportament e definir l'atribut que volètz. Vos cal alara vos assegurar que l'atribut que volètz pòt èsser recuperat pels utilizaires e tanben pels gropes e que siá unic. Daissar a blanc pel comportament per defaut. Las modificacions seràn efectivas unicament pels novèls (aponduts) utilizaires e gropes LDAP.", - "UUID Attribute for Users:" : "Atribut UUID pels Utilizaires :", - "UUID Attribute for Groups:" : "Atribut UUID pels Gropes :", - "Username-LDAP User Mapping" : "Associacion Nom d'utilizaire-Utilizaire LDAP", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los noms d'utilizaires son utilizats per l'emmagazinatge e l'assignacion de (meta) donadas. Per identificar e reconéisser precisament los utilizaires, cada utilizaire LDAP aurà un nom intèrne especific. Aquò requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire creat es associat a l'atribut UUID de l'utilizaire LDAP. Amai, lo DN es memorizat en escondedor per limitar las interaccions LDAP mas es pas utilizat per l'identificacion. Se lo DN es modificat, aquelas modificacions seràn retrobadas. Sol lo nom intèrne a ownCloud es utilizat al dintre del produch. Suprimir las associacions crearà d'orfanèls e l'accion afectarà totas las configuracions LDAP. SUPRIMISSÈTZ PAS JAMAI LAS ASSOCIACIONS EN ENVIRONAMENT DE PRODUCCION, mas unicament sus d'environaments de tèsts e d'experimentacions.", - "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire intèrne-utilizaire LDAP", - "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP" -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/oc.json b/apps/user_ldap/l10n/oc.json deleted file mode 100644 index ed63543180a..00000000000 --- a/apps/user_ldap/l10n/oc.json +++ /dev/null @@ -1,155 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Error al moment de la supression de las associacions.", - "Failed to delete the server configuration" : "Fracàs de la supression de la configuracion del servidor", - "The configuration is invalid: anonymous bind is not allowed." : "La configuracion es pas valida : lo ligam anonim es pas autorizat.", - "The configuration is valid and the connection could be established!" : "La configuracion es valida e la connexion pòt èsser establida !", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuracion es valabla, mas lo bind a fracassat. Verificatz los paramètres del servidor e tanben vòstres identificants de connexion.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuracion es pas valabla. Consultatz los logs per mai de detalhs.", - "No action specified" : "Cap d'accion pas especificada", - "No configuration specified" : "Cap de configuration pas especificada", - "No data specified" : "Cap de donada pas especificada", - " Could not set configuration %s" : "Impossible d'especificar la configuracion %s", - "Action does not exist" : "L'accion existís pas", - "The Base DN appears to be wrong" : "Lo DN de basa es erronèu", - "Configuration incorrect" : "Configuracion incorrècta", - "Configuration incomplete" : "Configuracion incompleta", - "Configuration OK" : "Configuracion OK", - "Select groups" : "Seleccionatz los gropes", - "Select object classes" : "Seleccionar las classas d'objècte", - "Please check the credentials, they seem to be wrong." : "Verificatz vòstras informacions d'identificacion", - "Please specify the port, it could not be auto-detected." : "Especificatz lo pòrt, a pas pogut èsser detectat automaticament", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Lo DN de basa a pas pogut èsser detectat automaticament. Verificatz las informacions d'identificacion, l'òste e lo pòrt.", - "Could not detect Base DN, please enter it manually." : "Impossible de detectar lo DN de basa, especificatz-lo manualament", - "{nthServer}. Server" : "{nthServer}. Servidor", - "No object found in the given Base DN. Please revise." : "Cap d'objècte pas trobat dins lo DN de basa especificat. Verificatz-lo.", - "More than 1,000 directory entries available." : "I a mai de 1000 entradas de repertòri disponiblas.", - " entries available within the provided Base DN" : "entradas disponiblas dins lo DN de basa especificat", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Una error s'es produsida. Verificatz lo DN de basa, e tanben los paramètres de connexion e las informacions d'identificacion.", - "Do you really want to delete the current Server Configuration?" : "Sètz segur que volètz escafar la configuracion servidor actuala ?", - "Confirm Deletion" : "Confirmar la supression", - "Mappings cleared successfully!" : "Associacions suprimidas amb succès !", - "Error while clearing the mappings." : "Error al moment de la supression de las associacions.", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "Lo ligam anonim es pas autorizat. Mercé de provesir lo DN d'un utilizaire e un senhal.", - "LDAP Operations error. Anonymous bind might not be allowed." : "Error LDAP. La connexion anonima al servidor es probablament pas acceptada.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Lo salvament a fracassat. Verificatz que la banca de donadas es operacionala. Recargatz abans de contunhar.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar de mòde activarà las requèstas LDAP automaticas. Segon la talha de vòstre annuari LDAP, aquò pòt préner del temps. Volètz totjorn cambiar de mòde ?", - "Mode switch" : "Cambiar de mòde", - "Select attributes" : "Seleccionar los atributs", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Utilizaire introbable. Verificatz los atributs de login e lo nom d'utilizaire. Filtre efectiu (de copiar-pegar per validar en linha de comanda):<br/>", - "User found and settings verified." : "Utilizaire trobat e paramètres verificats.", - "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Paramètres verificats, mas sol lo primièr utilizaire se poirà connectar. Utilizatz puslèu un filtre mens restrictiu.", - "An unspecified error occurred. Please check the settings and the log." : "Una error desconeguda s'es produsida. Verificatz los paramètres e lo log.", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Lo filtre de recèrca es pas valid, probablament a causa de problèmas de sintaxi tals coma de parentèsis mancantas. Corregissètz-los.", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Una error s'es produsida al moment de la connexion al LDAP / AD. Verificatz l'òste, lo pòrt e las informacions d'identificacion.", - "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "La cadena %uid es mancanta. Aquesta cadena es remplaçada per l'identificant de connexion al moment de las requèstas LDAP / AD.", - "Please provide a login name to test against" : "Indicatz un identificant de connexion amb lo qual cal testar.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Los gropes son desactivats perque lo servidor LDAP / AD pren pas en carga memberOf.", - "_%s group found_::_%s groups found_" : ["%s grop trobat","%s gropes trobats"], - "_%s user found_::_%s users found_" : ["%s utilizaire trobat","%s utilizaires trobats"], - "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de detectar l'atribut que conten lo nom d'afichatge des utilizaires. Indicatz-lo vos-meteis dins los paramètres ldap avançats.", - "Could not find the desired feature" : "Impossible de trobar la foncion desirada", - "Invalid Host" : "Òste invalid", - "Server" : "Servidor", - "Users" : "Utilizaires", - "Login Attributes" : "Atributs de login", - "Groups" : "Gropes", - "Test Configuration" : "Testar la configuracion", - "Help" : "Ajuda", - "Groups meeting these criteria are available in %s:" : "Los gropes que respèctan aquestes critèris son disponibles dins %s :", - "Only these object classes:" : "Solament aquestas classes d'objèctes :", - "Only from these groups:" : "Solament dins aquestes gropes :", - "Search groups" : "Cercar dins los gropes", - "Available groups" : "Gropes disponibles", - "Selected groups" : "Gropes seleccionats", - "Edit LDAP Query" : "Modificar la requèsta LDAP", - "LDAP Filter:" : "Filtre LDAP :", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Lo filtre especifica quins gropes LDAP an accès a l'instància %s.", - "Verify settings and count groups" : "Verificar los paramètres e comptar los gropes", - "When logging in, %s will find the user based on the following attributes:" : "Al login, %s cercarà l'utilizaire sus basa d'aquestes atributs :", - "LDAP / AD Username:" : "Nom d'utilizaire LDAP / AD :", - "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Autorizar lo login amb lo nom d'utilizaire LDAP / AD (uid o samaccountname, la deteccion es automatica). ", - "LDAP / AD Email Address:" : "Adreça mail LDAP / AD :", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Autorizar lo login amb una adreça mail. Mail e mailPrimaryAddress son autorizats.", - "Other Attributes:" : "Autres atributs :", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definís lo filtre d'aplicar al moment d'una temptativa de connexion. %%uid remplaça lo nom d'utilizaire. Exemple : \"uid=%%uid\"", - "Test Loginname" : "Loginname de tèst", - "Verify settings" : "Testar los paramètres", - "1. Server" : "1. Servidor", - "%s. Server:" : "%s. Servidor :", - "Add a new and blank configuration" : "Apondre una novèla configuracion verge", - "Copy current configuration into new directory binding" : "Copiar la configuracion actuala cap a una novèla", - "Delete the current configuration" : "Suprimir la configuracion actuala", - "Host" : "Òste", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Podètz ometre lo protocòl, levat se avètz besonh de SSL. Dins aqueste cas, prefixatz amb ldaps://", - "Port" : "Pòrt", - "Detect Port" : "Detectar lo pòrt", - "User DN" : "DN Utilizaire", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN de l'utilizaire client pel qual la ligason se deu far, per exemple uid=agent,dc=example,dc=com. Per un accès anonim, daissar lo DN e lo senhal voids.", - "Password" : "Senhal", - "For anonymous access, leave DN and Password empty." : "Per un accès anonim, daissar lo DN utilizaire e lo senhal voids.", - "One Base DN per line" : "Un DN de basa per linha", - "You can specify Base DN for users and groups in the Advanced tab" : "Podètz especificar los DN de basa de vòstres utilizaires e gropes via l'onglet Avançat", - "Detect Base DN" : "Detectar lo DN de basa", - "Test Base DN" : "Testar lo DN de basa", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita las requèstas LDAP automaticas. Melhor per las installacions de grand ample, mas demanda de coneissenças en LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Sasir los filtres LDAP manualament (recomandat pels annuaris de grand ample)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las classas d'objèctes frequentas pels utilizaires son : organizationalPerson, person, user e inetOrgPerson. Se sètz pas segur de la classa d'utilizar, demandatz a l'administrator de l'annuari.", - "The filter specifies which LDAP users shall have access to the %s instance." : "Lo filtre especifica quins utilizaires LDAP auràn accès a l'instància %s.", - "Verify settings and count users" : "Verificar los paramètres e comptar los utilizaires", - "Saving" : "Enregistrament...", - "Back" : "Retorn", - "Continue" : "Contunhar", - "LDAP" : "LDAP", - "Expert" : "Expèrt", - "Advanced" : "Avançat", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Avertiment :</b> Las aplicacions user_ldap e user_webdavauth son incompatiblas. De disfoncionaments se pòdon provesir. Contactatz vòstre administrator sistèma per que ne desactive una.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atencion :</b> Lo modul php LDAP es pas installat, per consequéncia aquesta extension poirà pas foncionar. Contactatz vòstre administrator sistèma per tal que l'installe.", - "Connection Settings" : "Paramètres de connexion", - "Configuration Active" : "Configuracion activa", - "When unchecked, this configuration will be skipped." : "Quand pas marcada, la configuracion serà ignorada.", - "Backup (Replica) Host" : "Servidor de backup (replica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Provesir un servidor de backup opcional. Se deu agir d'una replica del servidor LDAP/AD principal.", - "Backup (Replica) Port" : "Pòrt del servidor de backup (replica)", - "Disable Main Server" : "Desactivar lo servidor principal", - "Only connect to the replica server." : "Se connectar unicament a la replica", - "Turn off SSL certificate validation." : "Desactivar la validacion dels certificats SSL", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Pas recomandat, d'utilizar amb d'objectius de tèsts unicament. Se la connexion fonciona pas qu'amb aquesta opcion, importatz lo certificat SSL del servidor LDAP dins lo servidor %s.", - "Cache Time-To-Live" : "Durada de vida de l'escondedor (TTL)", - "in seconds. A change empties the cache." : "en segondas. Tot cambiament voida l'escondedor.", - "Directory Settings" : "Paramètres del repertòri", - "User Display Name Field" : "Camp \"nom d'afichatge\" de l'utilizaire", - "The LDAP attribute to use to generate the user's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge de l'utilizaire.", - "Base User Tree" : "DN raiç de l'arbre utilizaires", - "One User Base DN per line" : "Un DN de basa utilizaire per linha", - "User Search Attributes" : "Atributs de recèrca utilizaires", - "Optional; one attribute per line" : "Opcional, un atribut per linha", - "Group Display Name Field" : "Camp \"nom d'afichatge\" del grop", - "The LDAP attribute to use to generate the groups's display name." : "L'atribut LDAP utilizat per generar lo nom d'afichatge del grop.", - "Base Group Tree" : "DN raiç de l'arbre gropes", - "One Group Base DN per line" : "Un DN de basa grop per linha", - "Group Search Attributes" : "Atributs de recèrca des gropes", - "Group-Member association" : "Associacion grop-membre", - "Nested Groups" : "Gropes imbricats", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Se activat, los gropes que contenon d'autres gropes son preses en carga (fonciona unicament se l'atribut membre del grop conten de DNs).", - "Paging chunksize" : "Paging chunksize", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize utilizada per las recèrcas LDAP paginadas que pòdon tornar de resultats per lòts coma una enumeracion d'utilizaires o de gropes. (Configurar a 0 per desactivar las recèrcas LDAP paginadas)", - "Special Attributes" : "Atributs especials", - "Quota Field" : "Camp del quòta", - "Quota Default" : "Quòta per defaut", - "in bytes" : "en octets", - "Email Field" : "Camp Email", - "User Home Folder Naming Rule" : "Règla de nomenatge del repertòri utilizaire", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Daissar void per user name (defaut). Podètz tanben especificar un atribut LDAP / AD.", - "Internal Username" : "Nom d'utilizaire intèrne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Per defaut lo nom d'utilizaire intèrne serà creat a partir de l'atribut UUID. Aquò permet d'assegurar que lo nom d'utilizaire es unic e que los caractèrs necessitan pas de conversion. Lo nom d'utilizaire intèrne deu contenir unicament los caractèrs seguents : [ a-zA-Z0-9_.@- ]. Los autres caractèrs son remplaçats per lor correspondéncia ASCII o simplament omeses. En cas de collision, un nombre es apondut/incrementat. Lo nom d'utilizaire intèrne es utilizat per identificar l'utilizaire al dintre del sistèma. Es tanben lo nom per defaut del repertòri utilizaire dins ownCloud. Fa tanben partida de certans URL de servicis, per exemple per totes los servicis *DAV. Lo comportament per defaut pòt èsser modificat amb l'ajuda d'aqueste paramètre. Per obtenir un comportament similar a las versions precedentas a ownCloud 5, sasir lo nom d'utilizaire d'afichar dins lo camp seguent. Daissar a blanc pel comportement per defaut. Las modificacions prendràn efièch solament pels novèls (aponduts) utilizaires LDAP.", - "Internal Username Attribute:" : "Nom d'utilizaire intèrne :", - "Override UUID detection" : "Passar outra la deteccion des UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Per defaut, l'atribut UUID es detectat automaticament. Aqueste atribut es utilizat per identificar los utilizaires e gropes de faiçon fisabla. Un nom d'utilizaire intèrne basat sus l'UUID serà automaticament creat, levat s'es especificat autrament çaisús. Podètz modificar aqueste comportament e definir l'atribut que volètz. Vos cal alara vos assegurar que l'atribut que volètz pòt èsser recuperat pels utilizaires e tanben pels gropes e que siá unic. Daissar a blanc pel comportament per defaut. Las modificacions seràn efectivas unicament pels novèls (aponduts) utilizaires e gropes LDAP.", - "UUID Attribute for Users:" : "Atribut UUID pels Utilizaires :", - "UUID Attribute for Groups:" : "Atribut UUID pels Gropes :", - "Username-LDAP User Mapping" : "Associacion Nom d'utilizaire-Utilizaire LDAP", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los noms d'utilizaires son utilizats per l'emmagazinatge e l'assignacion de (meta) donadas. Per identificar e reconéisser precisament los utilizaires, cada utilizaire LDAP aurà un nom intèrne especific. Aquò requerís l'associacion d'un nom d'utilizaire ownCloud a un nom d'utilizaire LDAP. Lo nom d'utilizaire creat es associat a l'atribut UUID de l'utilizaire LDAP. Amai, lo DN es memorizat en escondedor per limitar las interaccions LDAP mas es pas utilizat per l'identificacion. Se lo DN es modificat, aquelas modificacions seràn retrobadas. Sol lo nom intèrne a ownCloud es utilizat al dintre del produch. Suprimir las associacions crearà d'orfanèls e l'accion afectarà totas las configuracions LDAP. SUPRIMISSÈTZ PAS JAMAI LAS ASSOCIACIONS EN ENVIRONAMENT DE PRODUCCION, mas unicament sus d'environaments de tèsts e d'experimentacions.", - "Clear Username-LDAP User Mapping" : "Suprimir l'associacion utilizaire intèrne-utilizaire LDAP", - "Clear Groupname-LDAP Group Mapping" : "Suprimir l'associacion nom de grop-grop LDAP" -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js index 314f8d6963c..5ffcf80e841 100644 --- a/apps/user_ldap/l10n/pl.js +++ b/apps/user_ldap/l10n/pl.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Nieprawidłowa konfiguracja: Anonimowe podpinanie jest niedozwolone.", "Valid configuration, connection established!" : "Konfiguracja poprawna, połączenie ustanowione!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfiguracja poprawna, ale powiązanie nie powiodło się. Sprawdź konfigurację serwera i poświadczenia.", - "Invalid configuration. Please have a look at the logs for further details." : "Nieprawidłowa konfiguracja. Sprawdź logi po więcej szczegółów.", + "Invalid configuration: %s" : "Nieprawidłowa konfiguracja: %s", "No action specified" : "Nie określono akcji", "No configuration specified" : "Nie określono konfiguracji", "No data specified" : "Nie określono danych", - " Could not set configuration %s" : "Nie można ustawić konfiguracji %s", + "Invalid data specified" : "Podano nieprawidłowe dane", + "Could not set configuration %1$s to %2$s" : "Nie można ustawić konfiguracji %1$s na %2$s", "Action does not exist" : "Akcja nie istnieje", "Renewing …" : "Odnawianie…", "Very weak password" : "Bardzo słabe hasło", @@ -53,15 +54,32 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Brak symbolu zastępczego \"%uid\". Zostanie zastąpiony nazwą logowania podczas odpytywania LDAP/AD.", "Please provide a login name to test against" : "Wprowadź nazwę użytkownika, aby wykonać test ponownie", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Pole do wpisu dla grupy zostało wyłączone, ponieważ LDAP/AD nie obsługuje memberOf.", - "Password change rejected. Hint: " : "Zmiana hasła odrzucona: Wskazówka:", + "Password change rejected. Hint: %s" : "Zmiana hasła odrzucona: Wskazówka: %s", + "Mandatory field \"%s\" left empty" : "Obowiązkowe pole \"%s\" pozostawiono puste", + "A password is given, but not an LDAP agent" : "Podano hasło, ale nie wskazano agenta LDAP", + "No password is given for the user agent" : "Nie podano hasła dla agenta użytkownika", + "No LDAP base DN was given" : "Nie podano bazowego DN LDAP", + "User base DN is not a subnode of global base DN" : "Bazowy DN użytkownika nie jest podwęzłem globalnego DN", + "Group base DN is not a subnode of global base DN" : "Bazowy DN grupy nie jest podwęzłem globalnego DN", + "Login filter does not contain %s placeholder." : "Filtr logowania nie zawiera zastępnika %s.", "Please login with the new password" : "Zaloguj się przy użyciu nowego hasła", "LDAP User backend" : "Moduł użytkownika LDAP", "Your password will expire tomorrow." : "Twoje hasło wygasa jutro.", "Your password will expire today." : "Twoje hasło wygasa dzisiaj.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Twoje hasło wygaśnie w ciągu %n dnia.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni."], "LDAP/AD integration" : "Integracja z LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup","%s znalezionych grup"], - "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników","%s znalezionych użytkowników"], + "LDAP Connection" : "Połączenie LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Dla tej konfiguracji LDAP: %s połączenie nie powiodło się","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Dla tej konfiguracji LDAP: %s wyszukiwanie nie powiodło się ","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Jest jedna nieaktywna konfiguracja LDAP\" %s","Istnieją %n nieaktywne konfiguracje LDAP: %s","Istnieje %n nieaktywnych konfiguracji LDAP: %s","Istnieje %n nieaktywnych konfiguracji LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Łączenie i wyszukiwanie działa dla skonfigurowanego połączenia LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %n skonfigurowanych połączeń LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %n skonfigurowanych połączeń LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %nskonfigurowanych połączeń LDAP (%s)"], + "Invalid LDAP UUIDs" : "Nieprawidłowy LDAP UUID", + "None found" : "Nie znaleziono", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Znaleziono nieprawidłowe identyfikatory UUID kont lub grup LDAP. Sprawdź ustawienia „Zastąp wykrywanie UUID” w części eksperckiej konfiguracji LDAP i użyj „occ ldap:update-uuid”, aby je zaktualizować.", + "_%n group found_::_%n groups found_" : ["Znaleziono %n grupę","Znaleziono %n grupy","Znaleziono %n grup","Znaleziono %n grup"], + "> 1000 groups found" : "> 1000 znalezionych grup", + "> 1000 users found" : "> 1000 znalezionych użytkowników", + "_%n user found_::_%n users found_" : ["Znaleziono %n użytkownika","Znaleziono %n użytkowników","Znaleziono %n użytkowników","Znaleziono %n użytkowników"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nie można wykryć atrybutu wyświetlania nazwy użytkownika.", "Could not find the desired feature" : "Nie można znaleźć żądanej funkcji", "Invalid Host" : "Nieprawidłowy host", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "Inne atrybuty:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definiuje filter do zastosowania podczas próby logowania. \"%%uid\" zastępuje nazwę użytkownika podczas logowania. Przykład: \"uid=%%uid\"", "Test Loginname" : "Testowa nazwa użytkownika", + "Attempts to receive a DN for the given loginname and the current login filter" : "Próbuje otrzymać nazwę wyróżniającą dla podanej nazwy użytkownika i bieżącego filtra logowania", "Verify settings" : "Weryfikuj ustawienia", "%s. Server:" : "%s. Serwer:", "Add a new configuration" : "Dodaj nową konfigurację", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "Jeden użytkownik Bazy DN na linię", "User Search Attributes" : "Szukaj atrybutów", "Optional; one attribute per line" : "Opcjonalnie; jeden atrybut w wierszu", + "Disable users missing from LDAP" : "Wyłącz brakujących użytkowników w LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Po włączeniu, użytkownicy zaimportowani z LDAP, których brakuje, zostaną wyłączeni", "Group Display Name Field" : "Pole wyświetlanej nazwy grupy", "The LDAP attribute to use to generate the groups's display name." : "Atrybut LDAP służący do generowania wyświetlanej nazwy grupy ownCloud.", "Base Group Tree" : "Drzewo bazy grup", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pozostaw puste dla nazwy użytkownika (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.", "\"$home\" Placeholder Field" : "Pole zastępcze \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home w zewnętrznej konfiguracji pamięci zostanie zastąpiony wartością określonego atrybutu", + "User Profile Attributes" : "Atrybuty profilu użytkownika", + "Phone Field" : "Pole Telefonu", + "User profile Phone will be set from the specified attribute" : "Telefon profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Website Field" : "Pole witryny internetowej", + "User profile Website will be set from the specified attribute" : "Witryna internetowa profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Address Field" : "Pole adresu", + "User profile Address will be set from the specified attribute" : "Adres profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Twitter Field" : "Pole Twittera/X", + "User profile Twitter will be set from the specified attribute" : "Twitter profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Fediverse Field" : "Pole Fediversum", + "User profile Fediverse will be set from the specified attribute" : "Fediverse profilu użytkownika zostanie ustawione na podstawie określonego atrybutu", + "Organisation Field" : "Pole organizacji", + "User profile Organisation will be set from the specified attribute" : "Organizacja profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Role Field" : "Pole roli", + "User profile Role will be set from the specified attribute" : "Rola w profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Headline Field" : "Pole nagłówka", + "User profile Headline will be set from the specified attribute" : "Nagłówek profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Biography Field" : "Pole biografii", + "User profile Biography will be set from the specified attribute" : "Biografia profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Birthdate Field" : "Pole daty urodzenia", + "User profile Date of birth will be set from the specified attribute" : "Data urodzenia w profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Pronouns Field" : "Pole zaimków", + "User profile Pronouns will be set from the specified attribute" : "Zaimki w profilu użytkownika zostaną ustawione na podstawie określonego atrybutu", "Internal Username" : "Wewnętrzna nazwa użytkownika", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP. Dla domyślnego zachowania pozostaw to puste.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP. Dla domyślnego zachowania pozostaw to puste.", "Internal Username Attribute:" : "Wewnętrzny atrybut nazwy uzżytkownika:", "Override UUID detection" : "Zastąp wykrywanie UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Domyślnie, atrybut UUID jest wykrywany automatycznie. Atrybut UUID jest używany do niepodważalnej identyfikacji użytkowników i grup LDAP. Również wewnętrzna nazwa użytkownika zostanie stworzona na bazie UUID, jeśli nie zostanie podana powyżej. Możesz nadpisać to ustawienie i użyć atrybutu wedle uznania. Musisz się jednak upewnić, że atrybut ten może zostać pobrany zarówno dla użytkowników, jak i grup i jest unikalny. Pozostaw puste dla domyślnego zachowania. Zmiany będą miały wpływ tylko na nowo przypisanych (dodanych) użytkowników i grupy LDAP.", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nazwy użytkowników służą do przechowywania i przypisywania metadanych. Aby precyzyjnie zidentyfikować i rozpoznać użytkowników, każdy użytkownik LDAP będzie miał wewnętrzną nazwę użytkownika. Wymaga to mapowania z nazwy użytkownika na użytkownika LDAP. Utworzona nazwa użytkownika jest mapowana na UUID użytkownika LDAP. Dodatkowo DN jest buforowany w celu zmniejszenia interakcji LDAP, ale nie jest używany do identyfikacji. Zmiany zostaną wykryte jeśli DN zmieni się. Wewnętrzna nazwa użytkownika jest używana wszędzie. Wyczyszczenie mapowań pozostawi pozostałości po nim. Wyczyszczenie mapowań nie ma wpływu na konfigurację, ale ma wpływ na wszystkie konfiguracje LDAP! Nigdy nie usuwaj mapowań w środowisku produkcyjnym, tylko na etapie testowym lub eksperymentalnym.", "Clear Username-LDAP User Mapping" : "Czyść Mapowanie użytkownika LDAP", "Clear Groupname-LDAP Group Mapping" : "Czyść Mapowanie nazwy grupy LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Wystąpił błąd połączenia z LDAP/AD, sprawdź host, port i poświadczenia.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Brakuje tekstu zastępczego \"%uid\". W trakcie odpytywania serwera LDAP/AD zostanie on zastąpiony nazwą logowania.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Wpisy dla grup zostały wyłączone, ponieważ LDAP/AD nie wspiera memberOf.", - "LDAP / AD integration" : "Integracja z LDAP/AD", - "LDAP / AD Username:" : "Nazwa użytkownika LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Zezwalaj również na logowanie typu LDAP/AD, który może być w postaci \"uid\" lub \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Adres e-mail LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Dla domyślnego zachowania pozostaw to puste. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Nieprawidłowa konfiguracja. Sprawdź logi po więcej szczegółów." }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json index e052d5bcb44..36ed7181b95 100644 --- a/apps/user_ldap/l10n/pl.json +++ b/apps/user_ldap/l10n/pl.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Nieprawidłowa konfiguracja: Anonimowe podpinanie jest niedozwolone.", "Valid configuration, connection established!" : "Konfiguracja poprawna, połączenie ustanowione!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfiguracja poprawna, ale powiązanie nie powiodło się. Sprawdź konfigurację serwera i poświadczenia.", - "Invalid configuration. Please have a look at the logs for further details." : "Nieprawidłowa konfiguracja. Sprawdź logi po więcej szczegółów.", + "Invalid configuration: %s" : "Nieprawidłowa konfiguracja: %s", "No action specified" : "Nie określono akcji", "No configuration specified" : "Nie określono konfiguracji", "No data specified" : "Nie określono danych", - " Could not set configuration %s" : "Nie można ustawić konfiguracji %s", + "Invalid data specified" : "Podano nieprawidłowe dane", + "Could not set configuration %1$s to %2$s" : "Nie można ustawić konfiguracji %1$s na %2$s", "Action does not exist" : "Akcja nie istnieje", "Renewing …" : "Odnawianie…", "Very weak password" : "Bardzo słabe hasło", @@ -51,15 +52,32 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Brak symbolu zastępczego \"%uid\". Zostanie zastąpiony nazwą logowania podczas odpytywania LDAP/AD.", "Please provide a login name to test against" : "Wprowadź nazwę użytkownika, aby wykonać test ponownie", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Pole do wpisu dla grupy zostało wyłączone, ponieważ LDAP/AD nie obsługuje memberOf.", - "Password change rejected. Hint: " : "Zmiana hasła odrzucona: Wskazówka:", + "Password change rejected. Hint: %s" : "Zmiana hasła odrzucona: Wskazówka: %s", + "Mandatory field \"%s\" left empty" : "Obowiązkowe pole \"%s\" pozostawiono puste", + "A password is given, but not an LDAP agent" : "Podano hasło, ale nie wskazano agenta LDAP", + "No password is given for the user agent" : "Nie podano hasła dla agenta użytkownika", + "No LDAP base DN was given" : "Nie podano bazowego DN LDAP", + "User base DN is not a subnode of global base DN" : "Bazowy DN użytkownika nie jest podwęzłem globalnego DN", + "Group base DN is not a subnode of global base DN" : "Bazowy DN grupy nie jest podwęzłem globalnego DN", + "Login filter does not contain %s placeholder." : "Filtr logowania nie zawiera zastępnika %s.", "Please login with the new password" : "Zaloguj się przy użyciu nowego hasła", "LDAP User backend" : "Moduł użytkownika LDAP", "Your password will expire tomorrow." : "Twoje hasło wygasa jutro.", "Your password will expire today." : "Twoje hasło wygasa dzisiaj.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Twoje hasło wygaśnie w ciągu %n dnia.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni."], "LDAP/AD integration" : "Integracja z LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup","%s znalezionych grup"], - "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników","%s znalezionych użytkowników"], + "LDAP Connection" : "Połączenie LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Dla tej konfiguracji LDAP: %s połączenie nie powiodło się","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s","Połączenie nie powiodło się dla %n konfiguracji LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Dla tej konfiguracji LDAP: %s wyszukiwanie nie powiodło się ","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s","Wyszukiwanie nie powiodło się dla %n konfiguracji LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Jest jedna nieaktywna konfiguracja LDAP\" %s","Istnieją %n nieaktywne konfiguracje LDAP: %s","Istnieje %n nieaktywnych konfiguracji LDAP: %s","Istnieje %n nieaktywnych konfiguracji LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Łączenie i wyszukiwanie działa dla skonfigurowanego połączenia LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %n skonfigurowanych połączeń LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %n skonfigurowanych połączeń LDAP (%s)","Łączenie i wyszukiwanie działa dla wszystkich %nskonfigurowanych połączeń LDAP (%s)"], + "Invalid LDAP UUIDs" : "Nieprawidłowy LDAP UUID", + "None found" : "Nie znaleziono", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Znaleziono nieprawidłowe identyfikatory UUID kont lub grup LDAP. Sprawdź ustawienia „Zastąp wykrywanie UUID” w części eksperckiej konfiguracji LDAP i użyj „occ ldap:update-uuid”, aby je zaktualizować.", + "_%n group found_::_%n groups found_" : ["Znaleziono %n grupę","Znaleziono %n grupy","Znaleziono %n grup","Znaleziono %n grup"], + "> 1000 groups found" : "> 1000 znalezionych grup", + "> 1000 users found" : "> 1000 znalezionych użytkowników", + "_%n user found_::_%n users found_" : ["Znaleziono %n użytkownika","Znaleziono %n użytkowników","Znaleziono %n użytkowników","Znaleziono %n użytkowników"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nie można wykryć atrybutu wyświetlania nazwy użytkownika.", "Could not find the desired feature" : "Nie można znaleźć żądanej funkcji", "Invalid Host" : "Nieprawidłowy host", @@ -86,6 +104,7 @@ "Other Attributes:" : "Inne atrybuty:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definiuje filter do zastosowania podczas próby logowania. \"%%uid\" zastępuje nazwę użytkownika podczas logowania. Przykład: \"uid=%%uid\"", "Test Loginname" : "Testowa nazwa użytkownika", + "Attempts to receive a DN for the given loginname and the current login filter" : "Próbuje otrzymać nazwę wyróżniającą dla podanej nazwy użytkownika i bieżącego filtra logowania", "Verify settings" : "Weryfikuj ustawienia", "%s. Server:" : "%s. Serwer:", "Add a new configuration" : "Dodaj nową konfigurację", @@ -149,6 +168,8 @@ "One User Base DN per line" : "Jeden użytkownik Bazy DN na linię", "User Search Attributes" : "Szukaj atrybutów", "Optional; one attribute per line" : "Opcjonalnie; jeden atrybut w wierszu", + "Disable users missing from LDAP" : "Wyłącz brakujących użytkowników w LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Po włączeniu, użytkownicy zaimportowani z LDAP, których brakuje, zostaną wyłączeni", "Group Display Name Field" : "Pole wyświetlanej nazwy grupy", "The LDAP attribute to use to generate the groups's display name." : "Atrybut LDAP służący do generowania wyświetlanej nazwy grupy ownCloud.", "Base Group Tree" : "Drzewo bazy grup", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pozostaw puste dla nazwy użytkownika (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.", "\"$home\" Placeholder Field" : "Pole zastępcze \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home w zewnętrznej konfiguracji pamięci zostanie zastąpiony wartością określonego atrybutu", + "User Profile Attributes" : "Atrybuty profilu użytkownika", + "Phone Field" : "Pole Telefonu", + "User profile Phone will be set from the specified attribute" : "Telefon profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Website Field" : "Pole witryny internetowej", + "User profile Website will be set from the specified attribute" : "Witryna internetowa profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Address Field" : "Pole adresu", + "User profile Address will be set from the specified attribute" : "Adres profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Twitter Field" : "Pole Twittera/X", + "User profile Twitter will be set from the specified attribute" : "Twitter profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Fediverse Field" : "Pole Fediversum", + "User profile Fediverse will be set from the specified attribute" : "Fediverse profilu użytkownika zostanie ustawione na podstawie określonego atrybutu", + "Organisation Field" : "Pole organizacji", + "User profile Organisation will be set from the specified attribute" : "Organizacja profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Role Field" : "Pole roli", + "User profile Role will be set from the specified attribute" : "Rola w profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Headline Field" : "Pole nagłówka", + "User profile Headline will be set from the specified attribute" : "Nagłówek profilu użytkownika zostanie ustawiony na podstawie określonego atrybutu", + "Biography Field" : "Pole biografii", + "User profile Biography will be set from the specified attribute" : "Biografia profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Birthdate Field" : "Pole daty urodzenia", + "User profile Date of birth will be set from the specified attribute" : "Data urodzenia w profilu użytkownika zostanie ustawiona na podstawie określonego atrybutu", + "Pronouns Field" : "Pole zaimków", + "User profile Pronouns will be set from the specified attribute" : "Zaimki w profilu użytkownika zostaną ustawione na podstawie określonego atrybutu", "Internal Username" : "Wewnętrzna nazwa użytkownika", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP. Dla domyślnego zachowania pozostaw to puste.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP. Dla domyślnego zachowania pozostaw to puste.", "Internal Username Attribute:" : "Wewnętrzny atrybut nazwy uzżytkownika:", "Override UUID detection" : "Zastąp wykrywanie UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Domyślnie, atrybut UUID jest wykrywany automatycznie. Atrybut UUID jest używany do niepodważalnej identyfikacji użytkowników i grup LDAP. Również wewnętrzna nazwa użytkownika zostanie stworzona na bazie UUID, jeśli nie zostanie podana powyżej. Możesz nadpisać to ustawienie i użyć atrybutu wedle uznania. Musisz się jednak upewnić, że atrybut ten może zostać pobrany zarówno dla użytkowników, jak i grup i jest unikalny. Pozostaw puste dla domyślnego zachowania. Zmiany będą miały wpływ tylko na nowo przypisanych (dodanych) użytkowników i grupy LDAP.", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Nazwy użytkowników służą do przechowywania i przypisywania metadanych. Aby precyzyjnie zidentyfikować i rozpoznać użytkowników, każdy użytkownik LDAP będzie miał wewnętrzną nazwę użytkownika. Wymaga to mapowania z nazwy użytkownika na użytkownika LDAP. Utworzona nazwa użytkownika jest mapowana na UUID użytkownika LDAP. Dodatkowo DN jest buforowany w celu zmniejszenia interakcji LDAP, ale nie jest używany do identyfikacji. Zmiany zostaną wykryte jeśli DN zmieni się. Wewnętrzna nazwa użytkownika jest używana wszędzie. Wyczyszczenie mapowań pozostawi pozostałości po nim. Wyczyszczenie mapowań nie ma wpływu na konfigurację, ale ma wpływ na wszystkie konfiguracje LDAP! Nigdy nie usuwaj mapowań w środowisku produkcyjnym, tylko na etapie testowym lub eksperymentalnym.", "Clear Username-LDAP User Mapping" : "Czyść Mapowanie użytkownika LDAP", "Clear Groupname-LDAP Group Mapping" : "Czyść Mapowanie nazwy grupy LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Wystąpił błąd połączenia z LDAP/AD, sprawdź host, port i poświadczenia.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Brakuje tekstu zastępczego \"%uid\". W trakcie odpytywania serwera LDAP/AD zostanie on zastąpiony nazwą logowania.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Wpisy dla grup zostały wyłączone, ponieważ LDAP/AD nie wspiera memberOf.", - "LDAP / AD integration" : "Integracja z LDAP/AD", - "LDAP / AD Username:" : "Nazwa użytkownika LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Zezwalaj również na logowanie typu LDAP/AD, który może być w postaci \"uid\" lub \"sAMAccountName\".", - "LDAP / AD Email Address:" : "Adres e-mail LDAP/AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Domyślnie wewnętrzna nazwa użytkownika zostanie utworzona z atrybutu UUID. Zapewnia to unikalność nazwy użytkownika, a znaki nie muszą być konwertowane. Wewnętrzna nazwa użytkownika ma ograniczenie, dlatego dozwolone są tylko znaki: [a-zA-Z0-9_.@-]. Inne znaki są zastępowane przez ich odpowiedniki ASCII lub po prostu pomijane. W przypadku kolizji zostanie dodany/zwiększony numer. Wewnętrzna nazwa użytkownika służy do wewnętrznej identyfikacji użytkownika. Jest również domyślną nazwą katalogu domowego użytkownika oraz częścią zdalnych adresów URL, na przykład dla wszystkich usług *DAV. Dzięki temu ustawieniu można zastąpić domyślne zachowanie. Dla domyślnego zachowania pozostaw to puste. Zmiany będą miały wpływ tylko na nowo zmapowanych (dodanych) użytkowników LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Nieprawidłowa konfiguracja. Sprawdź logi po więcej szczegółów." },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 92aacaf4045..c78cbca2108 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Configuração inválida: A ligação anônima não é permitida.", "Valid configuration, connection established!" : "Configuração válida, conexão estabelecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuração válida, mas a ligação falhou. Verifique as configurações e as credenciais do servidor.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuração inválida. Por favor dê uma olhada nos logs para mais detalhes.", + "Invalid configuration: %s" : "Configuração inválida: %s", "No action specified" : "Nenhuma ação especificada", "No configuration specified" : "Nenhuma configuração especificada", "No data specified" : "Nenhum dado especificado", - " Could not set configuration %s" : "Não foi possível definir a configuração %s", + "Invalid data specified" : "Dados inválidos especificados", + "Could not set configuration %1$s to %2$s" : "Não foi possível definir a configuração %1$s como %2$s", "Action does not exist" : "A ação não existe", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", @@ -32,7 +33,7 @@ OC.L10N.register( "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado na Base DN informada. Por favor revise.", "More than 1,000 directory entries available." : "Mais de 1.000 entradas de diretório disponíveis.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponível na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponível na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Um erro ocorreu. Por favor verifique a Base DN e também as configurações de conexão e credenciais.", "Do you really want to delete the current Server Configuration?" : "Você realmente quer excluir as configurações atuais do servidor?", "Confirm Deletion" : "Confirmar Exclusão", @@ -50,18 +51,35 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Ocorreu um erro não especificado. Verifique o log e as configurações.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de pesquisa é inválido, provavelmente devido a questões de sintaxe, como número ímpar de colchetes abertos e fechados. Por favor, revise.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ocorreu um erro de conexão com o LDAP/AD. Verifique o host, a porta e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "O \"%uid\" está faltando o marcador de posição. Ele será substituído pelo nome de login ao consultar o LDAP/AD.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "O espaço reservado \"%uid\" está faltando. Ele será substituído pelo nome de login ao consultar o LDAP/AD.", "Please provide a login name to test against" : "Por favor, forneça um nome de login para testar", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A caixa de grupo foi desabilitada porque o servidor LDAP/AD não oferece suporte a memberOf.", - "Password change rejected. Hint: " : "Troca de senha rejeitada. Dica:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A caixa de grupo foi desabilitada porque o servidor LDAP/AD não é compatível com memberOf.", + "Password change rejected. Hint: %s" : "Alteração de senha rejeitada. Dica: %s", + "Mandatory field \"%s\" left empty" : "Campo obrigatório \"%s\" deixado vazio", + "A password is given, but not an LDAP agent" : "É fornecida uma senha, mas não um agente LDAP", + "No password is given for the user agent" : "Nenhuma senha é fornecida para o agente do usuário", + "No LDAP base DN was given" : "Nenhum DN de base de LDAP foi fornecido", + "User base DN is not a subnode of global base DN" : "O DN de base do usuário não é um subnó do DN de base global", + "Group base DN is not a subnode of global base DN" : "O DN de base do grupo não é um subnó do DN de base global", + "Login filter does not contain %s placeholder." : "O filtro de login não contém o espaço reservado %s", "Please login with the new password" : "Logue-se com a nova senha", "LDAP User backend" : "Estrutura do Usuário LDAP", "Your password will expire tomorrow." : "Sua senha vai expirar amanhã.", "Your password will expire today." : "Sua senha vai expirar hoje.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias."], - "LDAP/AD integration" : "LDAP/AD integração", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["usuário %s encontrado","%s usuários encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias.","Sua senha vai expirar dentro de%ndias."], + "LDAP/AD integration" : "Integração LDAP/AD", + "LDAP Connection" : "Conexão LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Falha na ligação para essa configuração LDAP:%s","Falha na ligação para %n configurações LDAP:%s","Falha na ligação para %n configurações LDAP:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Falha na pesquisa dessa configuração LDAP: %s","Falha na pesquisa de %n configurações LDAP: %s","Falha na pesquisa de %n configurações LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existe uma configuração LDAP inativa: %s","Existem %n configurações LDAP inativas: %s","Existem %n configurações LDAP inativas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["A ligacão e a pesquisa funcionam na conexão LDAP configurada (%s)","A ligacão e a pesquisa funcionam em todas as %n conexões LDAP configuradas (%s)","A ligacão e a pesquisa funcionam em todas as %n conexões LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUIDs LDAP inválidos", + "None found" : "Nenhum encontrado", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Foram encontrados UUIDs inválidos de contas ou grupos LDAP. Por favor, revise as configurações de \"Substituir detecção UUID\" na parte Especialista da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-los.", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrado","%n grupos encontrados"], + "> 1000 groups found" : "> 1000 grupos encontrados", + "> 1000 users found" : "> 1000 usuários encontrados", + "_%n user found_::_%n users found_" : ["%n usuário encontrado","%n usuários encontrados","%n usuários encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Não foi possível detectar o atributo do nome de exibição do usuário. Por favor, especifique-o você mesmo nas configurações LDAP avançadas.", "Could not find the desired feature" : "Não foi possível encontrar o recurso desejado", "Invalid Host" : "Host inválido", @@ -83,11 +101,12 @@ OC.L10N.register( "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP/AD Username:" : "Nome de usuário LDAP/AD:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite o login com o nome de usuário LDAP/AD, que é \"uid\" ou \"sAMAccountName\" e será detectado.", - "LDAP/AD Email Address:" : "LDAP/AD Endereço de E-mail:", + "LDAP/AD Email Address:" : "Endereço de E-mail LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite login com um atributo de e-mail. \"Mail\" e \"mailPrimaryAddress\" são permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a aplicar quando o login é tentado. \"%%uid\" substitui o nome de usuário durante o login. Por exemplo: \"uid=%%uid\"", "Test Loginname" : "Testar nome de login", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta receber um DN para o nome de login fornecido e o filtro de login atual", "Verify settings" : "Verificar configurações", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Adiconar uma nova configuração", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "Um usuário de Base DN por linha", "User Search Attributes" : "Atributos de Busca de Usuário", "Optional; one attribute per line" : "Opcional; um atributo por linha", + "Disable users missing from LDAP" : "Desativar usuários ausentes no LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quando ativado, os usuários importados do LDAP que estiverem ausentes serão desativados", "Group Display Name Field" : "Campo de nome de exibição do Grupo", "The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP a usar para gerar o nome de apresentação do grupo.", "Base Group Tree" : "Árvore de Grupo Base", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixe em branco para o nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "\"$home\" Placeholder Field" : "Campo Reservado \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado", - "Internal Username" : "Nome de usuário interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isso garante que o nome de usuário seja único e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas estes caracteres são permitidos: [a-zA-Z0-9 _. @ -]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado / aumentado. O nome de usuário interno é usado para identificar um usuário internamente. É também o nome padrão da pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços * DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe em branco para o comportamento padrão.", + "User Profile Attributes" : "Atributos do Perfil do Usuário", + "Phone Field" : "Campo de Telefone", + "User profile Phone will be set from the specified attribute" : "O Telefone no perfil do usuário será definido a partir do atributo especificado", + "Website Field" : "Campo de Website", + "User profile Website will be set from the specified attribute" : "O Website no perfil do usuário será definido a partir do atributo especificado", + "Address Field" : "Campo de Endereço", + "User profile Address will be set from the specified attribute" : "O Endereço no perfil do usuário será definido a partir do atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "O Twitter no perfil do usuário será definido a partir do atributo especificado", + "Fediverse Field" : "Campo de Fediverso", + "User profile Fediverse will be set from the specified attribute" : "O Fediverso no perfil do usuário será definido a partir do atributo especificado", + "Organisation Field" : "Campo de Organização", + "User profile Organisation will be set from the specified attribute" : "A Organização no perfil do usuário será definida a partir do atributo especificado", + "Role Field" : "Campo de Função", + "User profile Role will be set from the specified attribute" : "A Função no perfil do usuário será definida a partir do atributo especificado", + "Headline Field" : "Campo do Título", + "User profile Headline will be set from the specified attribute" : "O Título do perfil do usuário será definido a partir do atributo especificado", + "Biography Field" : "Campo de Biografia", + "User profile Biography will be set from the specified attribute" : "A Biografia no perfil do usuário será definida a partir do atributo especificado", + "Birthdate Field" : "Campo de Data de Nascimento", + "User profile Date of birth will be set from the specified attribute" : "A Data de Nascimento no perfil do usuário será definida a partir do atributo especificado", + "Pronouns Field" : "Campo de Pronomes", + "User profile Pronouns will be set from the specified attribute" : "Os Pronomes no perfil do usuário serão definidos a partir do atributo especificado", + "Internal Username" : "Nome de Usuário Interno", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isso garante que o nome de usuário seja exclusivo e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas esses caracteres são permitidos: [a-zA-Z0-9_.@-]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado/aumentado. O nome de usuário interno é usado para identificar um usuário internamente. Também é o nome padrão para a pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe-a vazia para o comportamento padrão.", "Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:", "Override UUID detection" : "Substituir detecção UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por padrão, o atributo UUID é detectado automaticamente. O atributo UUID é usado para identificar corretamente os usuários e grupos LDAP. Além disso, o nome de usuário interno será criado com base no UUID, se não especificado acima. Você pode substituir a configuração e passar um atributo de sua escolha. Você deve certificar-se de que o atributo de sua escolha pode ser lido tanto por usuários quanto por grupos, e que seja único. Deixe-o em branco para o comportamento padrão. As alterações terão efeito apenas para usuários e grupos LDAP recém mapeados (adicionados).", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuários são usados para armazenar e atribuir metadados. Para identificar e reconhecer com precisão os usuários, cada usuário LDAP terá um nome de usuário interno. Isso requer um mapeamento do nome de usuário para o usuário LDAP. O nome de usuário criado é mapeado para o UUID do usuário LDAP. Além disso, o DN também é armazenado em cache para reduzir a interação LDAP, mas não é usado para identificação. Se o DN mudar, as alterações serão encontradas. O nome de usuário interno é usado em todo lugar. Limpar os mapeamentos gerará sobras em todos os lugares. Limpar os mapeamentos não é sensível à configuração e afeta todas as configurações do LDAP! Nunca limpe os mapeamentos em um ambiente de produção, apenas em um estágio de teste ou experimental.", "Clear Username-LDAP User Mapping" : "Limpar Mapeamento de Usuário username-LDAP", "Clear Groupname-LDAP Group Mapping" : "Limpar Mapeamento do Grupo groupname-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Um erro de conexão para LDAP / AD ocorreu, por favor, verifique host, porta e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "O marcador de posição \"%uid\" está faltando. Ele será substituído pelo nome de login quando consutando via LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada pois o servidor LDAP / AD não suporta memberOf.", - "LDAP / AD integration" : "Integração LDAP / AD", - "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite login com o nome de usuário LDAP / AD, o qual é \"uid\" ou \"sAMAccountName\" e será detectado.", - "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, um nome de usuário interno será criado a partir de um atributo UUID. Isso garante que o nome de usuário seja único e estes caracteres não precisam ser convertidos. um nome de usuário interno possui a restrição que somente estes caracteres são permitdos: [ a-zA-Z0-9_.@- ]. Outros caracteres serão substituidos por seus correspondentes ASCII ou simplesmente omitidos. Em caso de coincidências, um número será adicionado/incrementado. O nome de usuário interno é utilizado para identificar o usuário internamente. Também é o nome padrão da pasta principal do usuário. Também é uma parte das URL's remotas, por exemplo, para todos os serviços *DAV. Com esta configuração, o comportamento padrão pode ser alterado. Deixe em branco para que assuma o comportamento padrão. Alterações terão efeito apenas em novos usuários LDAP mapeados (adicionados)." + "Invalid configuration. Please have a look at the logs for further details." : "Configuração inválida. Por favor dê uma olhada nos logs para mais detalhes." }, -"nplurals=2; plural=(n > 1);"); +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index 016fa9654e7..9ea42ef697f 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Configuração inválida: A ligação anônima não é permitida.", "Valid configuration, connection established!" : "Configuração válida, conexão estabelecida!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Configuração válida, mas a ligação falhou. Verifique as configurações e as credenciais do servidor.", - "Invalid configuration. Please have a look at the logs for further details." : "Configuração inválida. Por favor dê uma olhada nos logs para mais detalhes.", + "Invalid configuration: %s" : "Configuração inválida: %s", "No action specified" : "Nenhuma ação especificada", "No configuration specified" : "Nenhuma configuração especificada", "No data specified" : "Nenhum dado especificado", - " Could not set configuration %s" : "Não foi possível definir a configuração %s", + "Invalid data specified" : "Dados inválidos especificados", + "Could not set configuration %1$s to %2$s" : "Não foi possível definir a configuração %1$s como %2$s", "Action does not exist" : "A ação não existe", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", @@ -30,7 +31,7 @@ "{nthServer}. Server" : "{nthServer}. Servidor", "No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado na Base DN informada. Por favor revise.", "More than 1,000 directory entries available." : "Mais de 1.000 entradas de diretório disponíveis.", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponível na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida"], + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} entrada disponível na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida","{objectsFound} entradas disponíveis na Base DN fornecida"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Um erro ocorreu. Por favor verifique a Base DN e também as configurações de conexão e credenciais.", "Do you really want to delete the current Server Configuration?" : "Você realmente quer excluir as configurações atuais do servidor?", "Confirm Deletion" : "Confirmar Exclusão", @@ -48,18 +49,35 @@ "An unspecified error occurred. Please check log and settings." : "Ocorreu um erro não especificado. Verifique o log e as configurações.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de pesquisa é inválido, provavelmente devido a questões de sintaxe, como número ímpar de colchetes abertos e fechados. Por favor, revise.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ocorreu um erro de conexão com o LDAP/AD. Verifique o host, a porta e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "O \"%uid\" está faltando o marcador de posição. Ele será substituído pelo nome de login ao consultar o LDAP/AD.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "O espaço reservado \"%uid\" está faltando. Ele será substituído pelo nome de login ao consultar o LDAP/AD.", "Please provide a login name to test against" : "Por favor, forneça um nome de login para testar", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A caixa de grupo foi desabilitada porque o servidor LDAP/AD não oferece suporte a memberOf.", - "Password change rejected. Hint: " : "Troca de senha rejeitada. Dica:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "A caixa de grupo foi desabilitada porque o servidor LDAP/AD não é compatível com memberOf.", + "Password change rejected. Hint: %s" : "Alteração de senha rejeitada. Dica: %s", + "Mandatory field \"%s\" left empty" : "Campo obrigatório \"%s\" deixado vazio", + "A password is given, but not an LDAP agent" : "É fornecida uma senha, mas não um agente LDAP", + "No password is given for the user agent" : "Nenhuma senha é fornecida para o agente do usuário", + "No LDAP base DN was given" : "Nenhum DN de base de LDAP foi fornecido", + "User base DN is not a subnode of global base DN" : "O DN de base do usuário não é um subnó do DN de base global", + "Group base DN is not a subnode of global base DN" : "O DN de base do grupo não é um subnó do DN de base global", + "Login filter does not contain %s placeholder." : "O filtro de login não contém o espaço reservado %s", "Please login with the new password" : "Logue-se com a nova senha", "LDAP User backend" : "Estrutura do Usuário LDAP", "Your password will expire tomorrow." : "Sua senha vai expirar amanhã.", "Your password will expire today." : "Sua senha vai expirar hoje.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias."], - "LDAP/AD integration" : "LDAP/AD integração", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["usuário %s encontrado","%s usuários encontrados"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias.","Sua senha vai expirar dentro de%ndias."], + "LDAP/AD integration" : "Integração LDAP/AD", + "LDAP Connection" : "Conexão LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Falha na ligação para essa configuração LDAP:%s","Falha na ligação para %n configurações LDAP:%s","Falha na ligação para %n configurações LDAP:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Falha na pesquisa dessa configuração LDAP: %s","Falha na pesquisa de %n configurações LDAP: %s","Falha na pesquisa de %n configurações LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existe uma configuração LDAP inativa: %s","Existem %n configurações LDAP inativas: %s","Existem %n configurações LDAP inativas: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["A ligacão e a pesquisa funcionam na conexão LDAP configurada (%s)","A ligacão e a pesquisa funcionam em todas as %n conexões LDAP configuradas (%s)","A ligacão e a pesquisa funcionam em todas as %n conexões LDAP configuradas (%s)"], + "Invalid LDAP UUIDs" : "UUIDs LDAP inválidos", + "None found" : "Nenhum encontrado", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Foram encontrados UUIDs inválidos de contas ou grupos LDAP. Por favor, revise as configurações de \"Substituir detecção UUID\" na parte Especialista da configuração LDAP e use \"occ ldap:update-uuid\" para atualizá-los.", + "_%n group found_::_%n groups found_" : ["%n grupo encontrado","%n grupos encontrado","%n grupos encontrados"], + "> 1000 groups found" : "> 1000 grupos encontrados", + "> 1000 users found" : "> 1000 usuários encontrados", + "_%n user found_::_%n users found_" : ["%n usuário encontrado","%n usuários encontrados","%n usuários encontrados"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Não foi possível detectar o atributo do nome de exibição do usuário. Por favor, especifique-o você mesmo nas configurações LDAP avançadas.", "Could not find the desired feature" : "Não foi possível encontrar o recurso desejado", "Invalid Host" : "Host inválido", @@ -81,11 +99,12 @@ "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP/AD Username:" : "Nome de usuário LDAP/AD:", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite o login com o nome de usuário LDAP/AD, que é \"uid\" ou \"sAMAccountName\" e será detectado.", - "LDAP/AD Email Address:" : "LDAP/AD Endereço de E-mail:", + "LDAP/AD Email Address:" : "Endereço de E-mail LDAP/AD:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Permite login com um atributo de e-mail. \"Mail\" e \"mailPrimaryAddress\" são permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a aplicar quando o login é tentado. \"%%uid\" substitui o nome de usuário durante o login. Por exemplo: \"uid=%%uid\"", "Test Loginname" : "Testar nome de login", + "Attempts to receive a DN for the given loginname and the current login filter" : "Tenta receber um DN para o nome de login fornecido e o filtro de login atual", "Verify settings" : "Verificar configurações", "%s. Server:" : "%s. Servidor:", "Add a new configuration" : "Adiconar uma nova configuração", @@ -149,6 +168,8 @@ "One User Base DN per line" : "Um usuário de Base DN por linha", "User Search Attributes" : "Atributos de Busca de Usuário", "Optional; one attribute per line" : "Opcional; um atributo por linha", + "Disable users missing from LDAP" : "Desativar usuários ausentes no LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Quando ativado, os usuários importados do LDAP que estiverem ausentes serão desativados", "Group Display Name Field" : "Campo de nome de exibição do Grupo", "The LDAP attribute to use to generate the groups's display name." : "O atributo LDAP a usar para gerar o nome de apresentação do grupo.", "Base Group Tree" : "Árvore de Grupo Base", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Deixe em branco para o nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "\"$home\" Placeholder Field" : "Campo Reservado \"$home\"", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home em uma configuração de armazenamento externo será substituído pelo valor do atributo especificado", - "Internal Username" : "Nome de usuário interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isso garante que o nome de usuário seja único e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas estes caracteres são permitidos: [a-zA-Z0-9 _. @ -]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado / aumentado. O nome de usuário interno é usado para identificar um usuário internamente. É também o nome padrão da pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços * DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe em branco para o comportamento padrão.", + "User Profile Attributes" : "Atributos do Perfil do Usuário", + "Phone Field" : "Campo de Telefone", + "User profile Phone will be set from the specified attribute" : "O Telefone no perfil do usuário será definido a partir do atributo especificado", + "Website Field" : "Campo de Website", + "User profile Website will be set from the specified attribute" : "O Website no perfil do usuário será definido a partir do atributo especificado", + "Address Field" : "Campo de Endereço", + "User profile Address will be set from the specified attribute" : "O Endereço no perfil do usuário será definido a partir do atributo especificado", + "Twitter Field" : "Campo de Twitter", + "User profile Twitter will be set from the specified attribute" : "O Twitter no perfil do usuário será definido a partir do atributo especificado", + "Fediverse Field" : "Campo de Fediverso", + "User profile Fediverse will be set from the specified attribute" : "O Fediverso no perfil do usuário será definido a partir do atributo especificado", + "Organisation Field" : "Campo de Organização", + "User profile Organisation will be set from the specified attribute" : "A Organização no perfil do usuário será definida a partir do atributo especificado", + "Role Field" : "Campo de Função", + "User profile Role will be set from the specified attribute" : "A Função no perfil do usuário será definida a partir do atributo especificado", + "Headline Field" : "Campo do Título", + "User profile Headline will be set from the specified attribute" : "O Título do perfil do usuário será definido a partir do atributo especificado", + "Biography Field" : "Campo de Biografia", + "User profile Biography will be set from the specified attribute" : "A Biografia no perfil do usuário será definida a partir do atributo especificado", + "Birthdate Field" : "Campo de Data de Nascimento", + "User profile Date of birth will be set from the specified attribute" : "A Data de Nascimento no perfil do usuário será definida a partir do atributo especificado", + "Pronouns Field" : "Campo de Pronomes", + "User profile Pronouns will be set from the specified attribute" : "Os Pronomes no perfil do usuário serão definidos a partir do atributo especificado", + "Internal Username" : "Nome de Usuário Interno", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Por padrão, o nome de usuário interno será criado a partir do atributo UUID. Isso garante que o nome de usuário seja exclusivo e os caracteres não precisem ser convertidos. O nome de usuário interno tem a restrição de que apenas esses caracteres são permitidos: [a-zA-Z0-9_.@-]. Outros caracteres são substituídos por sua correspondência ASCII ou simplesmente omitidos. Em colisões, um número será adicionado/aumentado. O nome de usuário interno é usado para identificar um usuário internamente. Também é o nome padrão para a pasta inicial do usuário. Também faz parte de URLs remotos, por exemplo, para todos os serviços DAV. Com essa configuração, o comportamento padrão pode ser substituído. As alterações terão efeito apenas em usuários LDAP recém-mapeados (adicionados). Deixe-a vazia para o comportamento padrão.", "Internal Username Attribute:" : "Atributo Interno de Nome de Usuário:", "Override UUID detection" : "Substituir detecção UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por padrão, o atributo UUID é detectado automaticamente. O atributo UUID é usado para identificar corretamente os usuários e grupos LDAP. Além disso, o nome de usuário interno será criado com base no UUID, se não especificado acima. Você pode substituir a configuração e passar um atributo de sua escolha. Você deve certificar-se de que o atributo de sua escolha pode ser lido tanto por usuários quanto por grupos, e que seja único. Deixe-o em branco para o comportamento padrão. As alterações terão efeito apenas para usuários e grupos LDAP recém mapeados (adicionados).", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Os nomes de usuários são usados para armazenar e atribuir metadados. Para identificar e reconhecer com precisão os usuários, cada usuário LDAP terá um nome de usuário interno. Isso requer um mapeamento do nome de usuário para o usuário LDAP. O nome de usuário criado é mapeado para o UUID do usuário LDAP. Além disso, o DN também é armazenado em cache para reduzir a interação LDAP, mas não é usado para identificação. Se o DN mudar, as alterações serão encontradas. O nome de usuário interno é usado em todo lugar. Limpar os mapeamentos gerará sobras em todos os lugares. Limpar os mapeamentos não é sensível à configuração e afeta todas as configurações do LDAP! Nunca limpe os mapeamentos em um ambiente de produção, apenas em um estágio de teste ou experimental.", "Clear Username-LDAP User Mapping" : "Limpar Mapeamento de Usuário username-LDAP", "Clear Groupname-LDAP Group Mapping" : "Limpar Mapeamento do Grupo groupname-LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Um erro de conexão para LDAP / AD ocorreu, por favor, verifique host, porta e as credenciais.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "O marcador de posição \"%uid\" está faltando. Ele será substituído pelo nome de login quando consutando via LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada pois o servidor LDAP / AD não suporta memberOf.", - "LDAP / AD integration" : "Integração LDAP / AD", - "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permite login com o nome de usuário LDAP / AD, o qual é \"uid\" ou \"sAMAccountName\" e será detectado.", - "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por padrão, um nome de usuário interno será criado a partir de um atributo UUID. Isso garante que o nome de usuário seja único e estes caracteres não precisam ser convertidos. um nome de usuário interno possui a restrição que somente estes caracteres são permitdos: [ a-zA-Z0-9_.@- ]. Outros caracteres serão substituidos por seus correspondentes ASCII ou simplesmente omitidos. Em caso de coincidências, um número será adicionado/incrementado. O nome de usuário interno é utilizado para identificar o usuário internamente. Também é o nome padrão da pasta principal do usuário. Também é uma parte das URL's remotas, por exemplo, para todos os serviços *DAV. Com esta configuração, o comportamento padrão pode ser alterado. Deixe em branco para que assuma o comportamento padrão. Alterações terão efeito apenas em novos usuários LDAP mapeados (adicionados)." -},"pluralForm" :"nplurals=2; plural=(n > 1);" + "Invalid configuration. Please have a look at the logs for further details." : "Configuração inválida. Por favor dê uma olhada nos logs para mais detalhes." +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/pt_PT.js b/apps/user_ldap/l10n/pt_PT.js index 3c4ef3cf7ad..cfa4702c62e 100644 --- a/apps/user_ldap/l10n/pt_PT.js +++ b/apps/user_ldap/l10n/pt_PT.js @@ -6,7 +6,6 @@ OC.L10N.register( "No action specified" : "Nenhuma ação especificada", "No configuration specified" : "Nenhuma configuração especificada", "No data specified" : "Nenhuns dados especificados", - " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", "Very weak password" : "Palavra-passe muito fraca", "Weak password" : "Palavra-passe fraca", @@ -25,9 +24,9 @@ OC.L10N.register( "Base DN could not be auto-detected, please revise credentials, host and port." : "Não foi possível detetar automaticamente o ND base, por favor, verifique as credenciais, anfitrião e porta.", "Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.", "{nthServer}. Server" : "{nthServer}. Servidor", - "No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.", + "No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado na Base DN fornecida. Por favor verifique.", "More than 1,000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor, verifique o ND Base, bem como as definições de ligação e as credenciais.", "Do you really want to delete the current Server Configuration?" : "Deseja eliminar a 'Configuração do Servidor' atual?", "Confirm Deletion" : "Confirmar Eliminação", "Mappings cleared successfully!" : "Mapas limpos com sucesso!", @@ -41,8 +40,7 @@ OC.L10N.register( "User found and settings verified." : "Utilizador encontrado e definições verificadas.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de procura é inválido, provavelmente devido a problemas de sintaxe. Verifique se existem números ímpares de parêntisis abertos e/ou fechados. Por favor reveja.", "Please provide a login name to test against" : "Por favor, indique um nome de sessão para testar", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["%s utilizador encontrado","%s utilizadores encontrados"], + "LDAP Connection" : "Ligação LDAP", "Could not find the desired feature" : "Não se encontrou a função desejada", "Invalid Host" : "Anfitrião Inválido", "Test Configuration" : "Testar a configuração", @@ -58,7 +56,7 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica quais grupos LDAP devem ter acesso à instância %s.", "When logging in, %s will find the user based on the following attributes:" : "Quando entrar no sistema, %s irá encontrar o utilizador baseando-se nos seguintes atributos:", "Other Attributes:" : "Outros Atributos:", - "Test Loginname" : "Testar nome de login", + "Test Loginname" : "Testar nome de início de sessão", "Verify settings" : "Verificar definições", "%s. Server:" : "%s. Servidor:", "Copy current configuration into new directory binding" : "Copiar a configuração atual para um novo registo de diretoria", @@ -74,8 +72,8 @@ OC.L10N.register( "Detect Base DN" : "Detetar Base DN", "Test Base DN" : "Testar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita pedidos LDAP automáticos. Melhor para grandes configurações, mas requer conhecimentos LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para directórios grandes)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Os objectos mais comuns para utilizadores são <em>organizationalPerson, person, user, and inetOrgPerson</em>. Se não tem a certeza de que classe de objecto deverá seleccionar, por favor, contacte o administrador do Directório.", + "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para diretórios grandes)", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Os objetos mais comuns para utilizadores são <em>organizationalPerson, person, user, and inetOrgPerson</em>. Se não tem a certeza de que classe de objeto deverá selecionar, por favor, contacte o administrador do diretório.", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica quais utilizadores do LDAP devem ter acesso à instância %s.", "Verify settings and count users" : "Verificar definições e contar utilizadores", "Saving" : "A guardar", @@ -100,13 +98,13 @@ OC.L10N.register( "Backup (Replica) Host" : "Anfitrião de Cópia de Segurança (Réplica)", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indique um anfitrião de cópia de segurança. Este deve ser uma réplica do servidor principal de LDAP/AD ", "Backup (Replica) Port" : "Porta do servidor de backup (Replica)", - "Disable Main Server" : "Desactivar servidor principal", + "Disable Main Server" : "Desativar servidor principal", "Only connect to the replica server." : "Ligar apenas ao servidor de réplicas.", "Turn off SSL certificate validation." : "Desligar a validação de certificado SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Não recomendado, use-o somente para teste! ligação só funciona com esta opção, importar o certificado SSL do servidor LDAP para o seu servidor %s.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Não recomendado, utilize-o apenas para testes! Se a ligação só funciona com esta opção, importe o certificado SSL do servidor LDAP para o seu servidor %s.", "Cache Time-To-Live" : "Cache do tempo de vida dos objetos no servidor", "in seconds. A change empties the cache." : "em segundos. Uma alteração esvazia a cache.", - "Directory Settings" : "Definições de directorias", + "Directory Settings" : "Definições de diretorias", "User Display Name Field" : "Mostrador do nome de utilizador.", "The LDAP attribute to use to generate the user's display name." : "O atributo de LDAP para gerar o nome a exibir do utilizador.", "2nd User Display Name Field" : "2.º Mostrador do Nome de Utilizador.", @@ -124,9 +122,9 @@ OC.L10N.register( "Dynamic Group Member URL" : "URL Dinâmica de Membro do Grupo", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos de grupo contém um URL de pesquisa LDAP que determina que objetos pertencem ao grupo. (Uma definição vazia desativa a funcionalidade de membros de grupo dinâmico.)", "Nested Groups" : "Grupos agrupados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado os grupos, os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando ativado, os grupos que contêm grupos são suportados. (Só funciona se o atributo de membro do grupo contiver DNs).", "Paging chunksize" : "Bloco de paginação", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamanho do bloco usado para pesquisas LDAP paginados que podem retornar resultados volumosos como utilizador ou grupo de enumeração. (Defini-lo 0 desactiva paginada das pesquisas LDAP nessas situações.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamanho do bloco usado para pesquisas LDAP paginados que podem retornar resultados volumosos como utilizador ou grupo de enumeração. (Defini-lo 0 desativa paginada das pesquisas LDAP nessas situações.)", "Special Attributes" : "Atributos especiais", "Quota Field" : "Quota", "Quota Default" : "Quota padrão", @@ -134,16 +132,12 @@ OC.L10N.register( "User Home Folder Naming Rule" : "Regra da pasta inicial do utilizador", "Internal Username" : "Nome de utilizador interno", "Internal Username Attribute:" : "Atributo do nome de utilizador interno", - "Override UUID detection" : "Passar a detecção do UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeito, o ownCloud detecta automaticamente o atributo UUID. Este atributo é usado para identificar inequivocamente grupos e utilizadores LDAP. Igualmente, o nome de utilizador interno é criado com base no UUID, se o contrário não for especificado. Pode sobrepor esta definição colocando um atributo à sua escolha. Tenha em atenção que esse atributo deve ser válido tanto para grupos como para utilizadores, e que é único. Deixe em branco para optar pelo comportamento por defeito. Estas alteração apenas terão efeito em novos utilizadores e grupos mapeados (adicionados).", + "Override UUID detection" : "Passar a deteção do UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeito, o ownCloud deteta automaticamente o atributo UUID. Este atributo é usado para identificar inequivocamente grupos e utilizadores LDAP. Igualmente, o nome de utilizador interno é criado com base no UUID, se o contrário não for especificado. Pode sobrepor esta definição colocando um atributo à sua escolha. Tenha em atenção que esse atributo deve ser válido tanto para grupos como para utilizadores, e que é único. Deixe em branco para optar pelo comportamento por defeito. Estas alteração apenas terão efeito em novos utilizadores e grupos mapeados (adicionados).", "UUID Attribute for Users:" : "Atributo UUID para utilizadores:", "UUID Attribute for Groups:" : "Atributo UUID para grupos:", "Username-LDAP User Mapping" : "Mapeamento do utilizador LDAP", "Clear Username-LDAP User Mapping" : "Limpar mapeamento do utilizador-LDAP", - "Clear Groupname-LDAP Group Mapping" : "Limpar o mapeamento do nome de grupo LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ocorreu um erro de ligação ao LDAP / AD. Por favor, verifique o anfitrião, porta e credenciais.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Uma vez que o servidor LDAP / AD não suporta a propriedade \"memberOf\" (grupos) a caixa de grupos foi desactivada.", - "LDAP / AD Username:" : "Nome de Utilizador LDAP / AD:", - "LDAP / AD Email Address:" : "Endereço de Correio Eletrónico LDPA / AD" + "Clear Groupname-LDAP Group Mapping" : "Limpar o mapeamento do nome de grupo LDAP" }, -"nplurals=2; plural=(n != 1);"); +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/pt_PT.json b/apps/user_ldap/l10n/pt_PT.json index 79bccf933c2..d508a7d7263 100644 --- a/apps/user_ldap/l10n/pt_PT.json +++ b/apps/user_ldap/l10n/pt_PT.json @@ -4,7 +4,6 @@ "No action specified" : "Nenhuma ação especificada", "No configuration specified" : "Nenhuma configuração especificada", "No data specified" : "Nenhuns dados especificados", - " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", "Very weak password" : "Palavra-passe muito fraca", "Weak password" : "Palavra-passe fraca", @@ -23,9 +22,9 @@ "Base DN could not be auto-detected, please revise credentials, host and port." : "Não foi possível detetar automaticamente o ND base, por favor, verifique as credenciais, anfitrião e porta.", "Could not detect Base DN, please enter it manually." : "Não foi possível detetar o ND de base, por favor introduza-o manualmente.", "{nthServer}. Server" : "{nthServer}. Servidor", - "No object found in the given Base DN. Please revise." : "Nenhum objecto encontrado na Base DN fornecida. Por favor verifique.", + "No object found in the given Base DN. Please revise." : "Nenhum objeto encontrado na Base DN fornecida. Por favor verifique.", "More than 1,000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor verifique o ND de base, bem como as definições de ligação e as credenciais.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Ocorreu um erro. Por favor, verifique o ND Base, bem como as definições de ligação e as credenciais.", "Do you really want to delete the current Server Configuration?" : "Deseja eliminar a 'Configuração do Servidor' atual?", "Confirm Deletion" : "Confirmar Eliminação", "Mappings cleared successfully!" : "Mapas limpos com sucesso!", @@ -39,8 +38,7 @@ "User found and settings verified." : "Utilizador encontrado e definições verificadas.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "O filtro de procura é inválido, provavelmente devido a problemas de sintaxe. Verifique se existem números ímpares de parêntisis abertos e/ou fechados. Por favor reveja.", "Please provide a login name to test against" : "Por favor, indique um nome de sessão para testar", - "_%s group found_::_%s groups found_" : ["%s grupo encontrado","%s grupos encontrados"], - "_%s user found_::_%s users found_" : ["%s utilizador encontrado","%s utilizadores encontrados"], + "LDAP Connection" : "Ligação LDAP", "Could not find the desired feature" : "Não se encontrou a função desejada", "Invalid Host" : "Anfitrião Inválido", "Test Configuration" : "Testar a configuração", @@ -56,7 +54,7 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica quais grupos LDAP devem ter acesso à instância %s.", "When logging in, %s will find the user based on the following attributes:" : "Quando entrar no sistema, %s irá encontrar o utilizador baseando-se nos seguintes atributos:", "Other Attributes:" : "Outros Atributos:", - "Test Loginname" : "Testar nome de login", + "Test Loginname" : "Testar nome de início de sessão", "Verify settings" : "Verificar definições", "%s. Server:" : "%s. Servidor:", "Copy current configuration into new directory binding" : "Copiar a configuração atual para um novo registo de diretoria", @@ -72,8 +70,8 @@ "Detect Base DN" : "Detetar Base DN", "Test Base DN" : "Testar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita pedidos LDAP automáticos. Melhor para grandes configurações, mas requer conhecimentos LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para directórios grandes)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Os objectos mais comuns para utilizadores são <em>organizationalPerson, person, user, and inetOrgPerson</em>. Se não tem a certeza de que classe de objecto deverá seleccionar, por favor, contacte o administrador do Directório.", + "Manually enter LDAP filters (recommended for large directories)" : "Introduzir filtros LDAP manualmente (recomendado para diretórios grandes)", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Os objetos mais comuns para utilizadores são <em>organizationalPerson, person, user, and inetOrgPerson</em>. Se não tem a certeza de que classe de objeto deverá selecionar, por favor, contacte o administrador do diretório.", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica quais utilizadores do LDAP devem ter acesso à instância %s.", "Verify settings and count users" : "Verificar definições e contar utilizadores", "Saving" : "A guardar", @@ -98,13 +96,13 @@ "Backup (Replica) Host" : "Anfitrião de Cópia de Segurança (Réplica)", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Indique um anfitrião de cópia de segurança. Este deve ser uma réplica do servidor principal de LDAP/AD ", "Backup (Replica) Port" : "Porta do servidor de backup (Replica)", - "Disable Main Server" : "Desactivar servidor principal", + "Disable Main Server" : "Desativar servidor principal", "Only connect to the replica server." : "Ligar apenas ao servidor de réplicas.", "Turn off SSL certificate validation." : "Desligar a validação de certificado SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Não recomendado, use-o somente para teste! ligação só funciona com esta opção, importar o certificado SSL do servidor LDAP para o seu servidor %s.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Não recomendado, utilize-o apenas para testes! Se a ligação só funciona com esta opção, importe o certificado SSL do servidor LDAP para o seu servidor %s.", "Cache Time-To-Live" : "Cache do tempo de vida dos objetos no servidor", "in seconds. A change empties the cache." : "em segundos. Uma alteração esvazia a cache.", - "Directory Settings" : "Definições de directorias", + "Directory Settings" : "Definições de diretorias", "User Display Name Field" : "Mostrador do nome de utilizador.", "The LDAP attribute to use to generate the user's display name." : "O atributo de LDAP para gerar o nome a exibir do utilizador.", "2nd User Display Name Field" : "2.º Mostrador do Nome de Utilizador.", @@ -122,9 +120,9 @@ "Dynamic Group Member URL" : "URL Dinâmica de Membro do Grupo", "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "O atributo LDAP que em objetos de grupo contém um URL de pesquisa LDAP que determina que objetos pertencem ao grupo. (Uma definição vazia desativa a funcionalidade de membros de grupo dinâmico.)", "Nested Groups" : "Grupos agrupados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando habilitado os grupos, os grupos são suportados. (Só funciona se o atributo de membro de grupo contém DNs.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Quando ativado, os grupos que contêm grupos são suportados. (Só funciona se o atributo de membro do grupo contiver DNs).", "Paging chunksize" : "Bloco de paginação", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamanho do bloco usado para pesquisas LDAP paginados que podem retornar resultados volumosos como utilizador ou grupo de enumeração. (Defini-lo 0 desactiva paginada das pesquisas LDAP nessas situações.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamanho do bloco usado para pesquisas LDAP paginados que podem retornar resultados volumosos como utilizador ou grupo de enumeração. (Defini-lo 0 desativa paginada das pesquisas LDAP nessas situações.)", "Special Attributes" : "Atributos especiais", "Quota Field" : "Quota", "Quota Default" : "Quota padrão", @@ -132,16 +130,12 @@ "User Home Folder Naming Rule" : "Regra da pasta inicial do utilizador", "Internal Username" : "Nome de utilizador interno", "Internal Username Attribute:" : "Atributo do nome de utilizador interno", - "Override UUID detection" : "Passar a detecção do UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeito, o ownCloud detecta automaticamente o atributo UUID. Este atributo é usado para identificar inequivocamente grupos e utilizadores LDAP. Igualmente, o nome de utilizador interno é criado com base no UUID, se o contrário não for especificado. Pode sobrepor esta definição colocando um atributo à sua escolha. Tenha em atenção que esse atributo deve ser válido tanto para grupos como para utilizadores, e que é único. Deixe em branco para optar pelo comportamento por defeito. Estas alteração apenas terão efeito em novos utilizadores e grupos mapeados (adicionados).", + "Override UUID detection" : "Passar a deteção do UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defeito, o ownCloud deteta automaticamente o atributo UUID. Este atributo é usado para identificar inequivocamente grupos e utilizadores LDAP. Igualmente, o nome de utilizador interno é criado com base no UUID, se o contrário não for especificado. Pode sobrepor esta definição colocando um atributo à sua escolha. Tenha em atenção que esse atributo deve ser válido tanto para grupos como para utilizadores, e que é único. Deixe em branco para optar pelo comportamento por defeito. Estas alteração apenas terão efeito em novos utilizadores e grupos mapeados (adicionados).", "UUID Attribute for Users:" : "Atributo UUID para utilizadores:", "UUID Attribute for Groups:" : "Atributo UUID para grupos:", "Username-LDAP User Mapping" : "Mapeamento do utilizador LDAP", "Clear Username-LDAP User Mapping" : "Limpar mapeamento do utilizador-LDAP", - "Clear Groupname-LDAP Group Mapping" : "Limpar o mapeamento do nome de grupo LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ocorreu um erro de ligação ao LDAP / AD. Por favor, verifique o anfitrião, porta e credenciais.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Uma vez que o servidor LDAP / AD não suporta a propriedade \"memberOf\" (grupos) a caixa de grupos foi desactivada.", - "LDAP / AD Username:" : "Nome de Utilizador LDAP / AD:", - "LDAP / AD Email Address:" : "Endereço de Correio Eletrónico LDPA / AD" -},"pluralForm" :"nplurals=2; plural=(n != 1);" + "Clear Groupname-LDAP Group Mapping" : "Limpar o mapeamento do nome de grupo LDAP" +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ro.js b/apps/user_ldap/l10n/ro.js deleted file mode 100644 index aac392c86b3..00000000000 --- a/apps/user_ldap/l10n/ro.js +++ /dev/null @@ -1,105 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Ștergerea mapărilor a eșuat.", - "Failed to delete the server configuration" : "Ștergerea configurației serverului a eșuat.", - "Valid configuration, connection established!" : "Configurație validată, conexiune stabilită!", - "No action specified" : "Nu este specificată nicio acțiune ", - "No configuration specified" : "Nu este specificată nicio configurație", - "No data specified" : "Nu au fost specificate date", - " Could not set configuration %s" : "Nu a putut fi setată configurația %s", - "Action does not exist" : "Acțiunea nu există", - "Renewing …" : "Reînnoiesc ...", - "Very weak password" : "Parolă foarte slabă", - "Weak password" : "Parolă slabă", - "So-so password" : "Parolă medie", - "Good password" : "Parolă bună", - "Strong password" : "Parolă puternică", - "The Base DN appears to be wrong" : "DN-ul de bază pare a fi greșit", - "Testing configuration…" : "Se testează configurația...", - "Configuration incorrect" : "Configurație incorectă", - "Configuration incomplete" : "Configurație incompletă", - "Configuration OK" : "Configurație validă", - "Select groups" : "Selectează grupuri ", - "Select object classes" : "Selectează clase de obiecte", - "Please check the credentials, they seem to be wrong." : "Verifică datele de autentificare, ele par a fi greșite.", - "Please specify the port, it could not be auto-detected." : "Specifică portul, nu a putut fi detectat automat.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "DN-ul de bază nu a putut fi detectat automat, te rugăm revizuiește datele de autentificare, gazda și portul.", - "Could not detect Base DN, please enter it manually." : "DN-ul de bază nu a putut fi detectat, introdu-l manual.", - "{nthServer}. Server" : "{nthServer}. Server", - "More than 1,000 directory entries available." : "Mai mult de 1000 de directoare disponibile.", - "Do you really want to delete the current Server Configuration?" : "Sigur vrei să ștergi configurația curentă a serverului?", - "Confirm Deletion" : "Confirmă ștergerea", - "Mappings cleared successfully!" : "Asocierile au fost șterse!", - "Error while clearing the mappings." : "Eroare la ștergerea asocierilor.", - "Select attributes" : "Selectaţi caracteristici", - "Your password will expire tomorrow." : "Parola ta va expira mâine.", - "Your password will expire today." : "Parola ta va expira astăzi.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parola ta va expira în %n zi.","Parola ta va expira în %n zile.","Parola ta va expira în %n zile."], - "_%s group found_::_%s groups found_" : ["%s grup găsit.","%s grupuri găsite.","%s grupuri găsite."], - "_%s user found_::_%s users found_" : ["%s utilizator găsit.","%s utilizatori găsiți.","%s utilizatori găsiți."], - "Could not find the desired feature" : "Nu s-a putut găsi funcționalitatea dorită.", - "Invalid Host" : "Host invalid", - "Test Configuration" : "Configurare test", - "Help" : "Ajutor", - "Search groups" : "Caută grupuri", - "Available groups" : "Grupuri disponibile", - "Selected groups" : "Grupurile selectate", - "LDAP Filter:" : "Filtru LDAP:", - "Other Attributes:" : "Alte caracteristici :", - "Verify settings" : "Verifică setările", - "%s. Server:" : "%s. Server:", - "Delete the current configuration" : "Șterge configurația curentă", - "Host" : "Gazdă", - "Port" : "Portul", - "Detect Port" : "Detectează portul", - "User DN" : "DN-ul utilizatorului", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN-ul utilizatorului cu care se va efectua asocierea, de exemplu uid=agent,dc=example,dc=com. Pentru acces anonim, lasă DN-ul și parola libere.", - "Password" : "Parolă", - "For anonymous access, leave DN and Password empty." : "Pentru acces anonim, lasă DN-ul și parola libere.", - "Save Credentials" : "Salvează datele de autentificare", - "One Base DN per line" : "Un DN de bază pe linie", - "You can specify Base DN for users and groups in the Advanced tab" : "Poți specifica DN-ul de bază pentru utilizatori și grupuri în fila Avansat", - "Detect Base DN" : "Detectează DN-ul de bază", - "Test Base DN" : "Testează DN-ul de bază", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evită solicitările LDAP automate. De preferat pentru instalările mai complexe, dar necesită câteva cunoștințe LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Introdu filtrele LDAP manual (recomandat pentru medii LDAP largi)", - "Verify settings and count users" : "Verifică setările și numără utilizatorii", - "Saving" : "Se salvează", - "Back" : "Înapoi", - "Continue" : "Continuă", - "Please renew your password." : "Te rog reînnoiește parola.", - "An internal error occurred." : "A apărut o eroare internă.", - "Please try again or contact your administrator." : "Încearcă din nou sau contactează-ți administratorul.", - "Current password" : "Parola curentă", - "New password" : "Noua parolă", - "Renew password" : "Reînnoiește parola", - "Wrong password." : "Parolă greșită.", - "Cancel" : "Anulează", - "Server" : "Server", - "Users" : "Utilizatori", - "Login Attributes" : "Atribute de autentificare", - "Groups" : "Grupuri", - "Expert" : "Expert", - "Advanced" : "Avansat", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atenție</b> Modulul PHP LDAP nu este instalat, infrastructura nu va funcționa. Contactează administratorul sistemului pentru al instala.", - "Connection Settings" : "Setările de conexiune", - "Configuration Active" : "Configurație activă", - "When unchecked, this configuration will be skipped." : "Dacă este debifat, se va sări peste această configurație.", - "Disable Main Server" : "Dezactivaţi serverul principal", - "Turn off SSL certificate validation." : "Oprește validarea certificatelor SSL ", - "in seconds. A change empties the cache." : "în secunde. O schimbare curăță memoria tampon.", - "Directory Settings" : "Setările directorului", - "User Display Name Field" : "Câmpul cu numele vizibil al utilizatorului", - "Base User Tree" : "Arborele de bază al utilizatorilor", - "One User Base DN per line" : "Un DN utilizator de bază pe linie", - "Group Display Name Field" : "Câmpul cu numele grupului", - "Base Group Tree" : "Arborele de bază al Grupurilor", - "One Group Base DN per line" : "Un Group Base DN pe linie", - "Group-Member association" : "Asocierea Grup-Membru", - "Special Attributes" : "Caracteristici speciale ", - "Internal Username" : "Nume utilizator intern", - "LDAP / AD integration" : "Integrare LDAP / AD", - "LDAP / AD Username:" : "Utilizator LDAP / AD" -}, -"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/user_ldap/l10n/ro.json b/apps/user_ldap/l10n/ro.json deleted file mode 100644 index eb2d70f7f25..00000000000 --- a/apps/user_ldap/l10n/ro.json +++ /dev/null @@ -1,103 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Ștergerea mapărilor a eșuat.", - "Failed to delete the server configuration" : "Ștergerea configurației serverului a eșuat.", - "Valid configuration, connection established!" : "Configurație validată, conexiune stabilită!", - "No action specified" : "Nu este specificată nicio acțiune ", - "No configuration specified" : "Nu este specificată nicio configurație", - "No data specified" : "Nu au fost specificate date", - " Could not set configuration %s" : "Nu a putut fi setată configurația %s", - "Action does not exist" : "Acțiunea nu există", - "Renewing …" : "Reînnoiesc ...", - "Very weak password" : "Parolă foarte slabă", - "Weak password" : "Parolă slabă", - "So-so password" : "Parolă medie", - "Good password" : "Parolă bună", - "Strong password" : "Parolă puternică", - "The Base DN appears to be wrong" : "DN-ul de bază pare a fi greșit", - "Testing configuration…" : "Se testează configurația...", - "Configuration incorrect" : "Configurație incorectă", - "Configuration incomplete" : "Configurație incompletă", - "Configuration OK" : "Configurație validă", - "Select groups" : "Selectează grupuri ", - "Select object classes" : "Selectează clase de obiecte", - "Please check the credentials, they seem to be wrong." : "Verifică datele de autentificare, ele par a fi greșite.", - "Please specify the port, it could not be auto-detected." : "Specifică portul, nu a putut fi detectat automat.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "DN-ul de bază nu a putut fi detectat automat, te rugăm revizuiește datele de autentificare, gazda și portul.", - "Could not detect Base DN, please enter it manually." : "DN-ul de bază nu a putut fi detectat, introdu-l manual.", - "{nthServer}. Server" : "{nthServer}. Server", - "More than 1,000 directory entries available." : "Mai mult de 1000 de directoare disponibile.", - "Do you really want to delete the current Server Configuration?" : "Sigur vrei să ștergi configurația curentă a serverului?", - "Confirm Deletion" : "Confirmă ștergerea", - "Mappings cleared successfully!" : "Asocierile au fost șterse!", - "Error while clearing the mappings." : "Eroare la ștergerea asocierilor.", - "Select attributes" : "Selectaţi caracteristici", - "Your password will expire tomorrow." : "Parola ta va expira mâine.", - "Your password will expire today." : "Parola ta va expira astăzi.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parola ta va expira în %n zi.","Parola ta va expira în %n zile.","Parola ta va expira în %n zile."], - "_%s group found_::_%s groups found_" : ["%s grup găsit.","%s grupuri găsite.","%s grupuri găsite."], - "_%s user found_::_%s users found_" : ["%s utilizator găsit.","%s utilizatori găsiți.","%s utilizatori găsiți."], - "Could not find the desired feature" : "Nu s-a putut găsi funcționalitatea dorită.", - "Invalid Host" : "Host invalid", - "Test Configuration" : "Configurare test", - "Help" : "Ajutor", - "Search groups" : "Caută grupuri", - "Available groups" : "Grupuri disponibile", - "Selected groups" : "Grupurile selectate", - "LDAP Filter:" : "Filtru LDAP:", - "Other Attributes:" : "Alte caracteristici :", - "Verify settings" : "Verifică setările", - "%s. Server:" : "%s. Server:", - "Delete the current configuration" : "Șterge configurația curentă", - "Host" : "Gazdă", - "Port" : "Portul", - "Detect Port" : "Detectează portul", - "User DN" : "DN-ul utilizatorului", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN-ul utilizatorului cu care se va efectua asocierea, de exemplu uid=agent,dc=example,dc=com. Pentru acces anonim, lasă DN-ul și parola libere.", - "Password" : "Parolă", - "For anonymous access, leave DN and Password empty." : "Pentru acces anonim, lasă DN-ul și parola libere.", - "Save Credentials" : "Salvează datele de autentificare", - "One Base DN per line" : "Un DN de bază pe linie", - "You can specify Base DN for users and groups in the Advanced tab" : "Poți specifica DN-ul de bază pentru utilizatori și grupuri în fila Avansat", - "Detect Base DN" : "Detectează DN-ul de bază", - "Test Base DN" : "Testează DN-ul de bază", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evită solicitările LDAP automate. De preferat pentru instalările mai complexe, dar necesită câteva cunoștințe LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Introdu filtrele LDAP manual (recomandat pentru medii LDAP largi)", - "Verify settings and count users" : "Verifică setările și numără utilizatorii", - "Saving" : "Se salvează", - "Back" : "Înapoi", - "Continue" : "Continuă", - "Please renew your password." : "Te rog reînnoiește parola.", - "An internal error occurred." : "A apărut o eroare internă.", - "Please try again or contact your administrator." : "Încearcă din nou sau contactează-ți administratorul.", - "Current password" : "Parola curentă", - "New password" : "Noua parolă", - "Renew password" : "Reînnoiește parola", - "Wrong password." : "Parolă greșită.", - "Cancel" : "Anulează", - "Server" : "Server", - "Users" : "Utilizatori", - "Login Attributes" : "Atribute de autentificare", - "Groups" : "Grupuri", - "Expert" : "Expert", - "Advanced" : "Avansat", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atenție</b> Modulul PHP LDAP nu este instalat, infrastructura nu va funcționa. Contactează administratorul sistemului pentru al instala.", - "Connection Settings" : "Setările de conexiune", - "Configuration Active" : "Configurație activă", - "When unchecked, this configuration will be skipped." : "Dacă este debifat, se va sări peste această configurație.", - "Disable Main Server" : "Dezactivaţi serverul principal", - "Turn off SSL certificate validation." : "Oprește validarea certificatelor SSL ", - "in seconds. A change empties the cache." : "în secunde. O schimbare curăță memoria tampon.", - "Directory Settings" : "Setările directorului", - "User Display Name Field" : "Câmpul cu numele vizibil al utilizatorului", - "Base User Tree" : "Arborele de bază al utilizatorilor", - "One User Base DN per line" : "Un DN utilizator de bază pe linie", - "Group Display Name Field" : "Câmpul cu numele grupului", - "Base Group Tree" : "Arborele de bază al Grupurilor", - "One Group Base DN per line" : "Un Group Base DN pe linie", - "Group-Member association" : "Asocierea Grup-Membru", - "Special Attributes" : "Caracteristici speciale ", - "Internal Username" : "Nume utilizator intern", - "LDAP / AD integration" : "Integrare LDAP / AD", - "LDAP / AD Username:" : "Utilizator LDAP / AD" -},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js index bfe80b48343..e9abc7d540c 100644 --- a/apps/user_ldap/l10n/ru.js +++ b/apps/user_ldap/l10n/ru.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Неверная конфигурация: анонимное связывание не разрешается.", "Valid configuration, connection established!" : "Конфигурация настроена верно, связь установлена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Конфигурация настроена верно, но связывание не удалось. Проверьте настройки сервера и реквизиты доступа.", - "Invalid configuration. Please have a look at the logs for further details." : "Неверная конфигурация. Просмотрите журналы для получения дополнительных сведений.", + "Invalid configuration: %s" : "Недопустимая конфигурация: %s", "No action specified" : "Действие не указано", "No configuration specified" : "Конфигурация не указана", "No data specified" : "Нет данных", - " Could not set configuration %s" : "Невозможно создать конфигурацию %s", + "Invalid data specified" : "Указаны некорректные данные", + "Could not set configuration %1$s to %2$s" : "Не удалось задать конфигурацию %1$s для %2$s", "Action does not exist" : "Действие не существует", "Renewing …" : "Обновление…", "Very weak password" : "Очень слабый пароль", @@ -25,12 +26,12 @@ OC.L10N.register( "Configuration OK" : "Конфигурация в порядке", "Select groups" : "Выберите группы", "Select object classes" : "Выберите объектные классы", - "Please check the credentials, they seem to be wrong." : "Пожалуйста проверьте учетный данные, возможно они не верны.", + "Please check the credentials, they seem to be wrong." : "Пожалуйста, проверьте учётные данные — возможно, они указаны неверно.", "Please specify the port, it could not be auto-detected." : "Пожалуйста укажите порт, он не может быть определен автоматически.", "Base DN could not be auto-detected, please revise credentials, host and port." : "База поиска не может быть определена автоматически, пожалуйста перепроверьте учетные данные, адрес и порт.", "Could not detect Base DN, please enter it manually." : "Невозможно обнаружить Base DN, пожалуйста, задайте вручную.", "{nthServer}. Server" : "Сервер {nthServer}.", - "No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.", + "No object found in the given Base DN. Please revise." : "В указанной базовой DN не найден ни один объект. Пожалуйста, перепроверьте.", "More than 1,000 directory entries available." : "В каталоге доступно более 1,000 записей.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} элемент доступен в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.", @@ -53,18 +54,35 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заполнитель \"%uid\" отсутствует. Он будет заменён именем пользователя при запросе LDAP/AD.", "Please provide a login name to test against" : "Пожалуйста, укажите логин для проверки", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Блок группы был отключен, поскольку сервер LDAP/AD не поддерживает memberOf.", - "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", + "Password change rejected. Hint: %s" : "Изменение пароля отклонено. Подсказка: %s", + "Mandatory field \"%s\" left empty" : "Обязательное поле «%s» оставлено пустым", + "A password is given, but not an LDAP agent" : "Пароль задан, но не указан LDAP-агент", + "No password is given for the user agent" : "Пароль для LDAP-агента не задан", + "No LDAP base DN was given" : "Не указана базовая DN LDAP", + "User base DN is not a subnode of global base DN" : "Базовая DN пользователей не является подузлом глобальной базовой DN", + "Group base DN is not a subnode of global base DN" : " Базовая DN групп не является подузлом глобальной базовой DN", + "Login filter does not contain %s placeholder." : "Фильтр входа не содержит плейсхолдер %s.", "Please login with the new password" : "Войдите в систему со своим новым паролем", "LDAP User backend" : "Механизм учета пользователей LDAP", "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", "Your password will expire today." : "Сегодня истекает срок действия пароля.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP/AD integration" : "LDAP/AD интеграция", - "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], - "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], + "LDAP Connection" : "Подключение по протоколу LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Не удалось выполнить привязку для этой конфигурации LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Ошибка поиска в этой конфигурации LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Найдена неактивная конфигурация LDAP: %s","Найдено %n неактивных конфигурации LDAP: %s","Найдено %n неактивных конфигураций LDAP: %s","Найдено %n неактивных конфигураций LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : [" Привязка и поиск работают в настроенном LDAP-соединении (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"], + "Invalid LDAP UUIDs" : "Недопустимые UUID LDAP", + "None found" : "Ничего не найдено", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Обнаружены недопустимые идентификаторы UUID учетных записей или групп LDAP. Пожалуйста, ознакомьтесь с вашими настройками \"Переопределение обнаружения UUID\" в экспертной части конфигурации LDAP и используйте \"occ ldap:update-uuid\", чтобы обновить их.", + "_%n group found_::_%n groups found_" : ["Найдена %n группа","Найдено %n группы","Найдено %n групп","Найдено %n группы"], + "> 1000 groups found" : "Найдено более 1000 групп", + "> 1000 users found" : "Найдено более 1000 пользователей", + "_%n user found_::_%n users found_" : ["Найден %n пользователь","Найдено %n пользователя","Найдено %n пользователей","Найдено %n пользователя"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не удалось автоматически определить атрибут, содержащий отображаемое имя пользователя. Зайдите в расширенные настройки LDAP и укажите его вручную.", "Could not find the desired feature" : "Не удается найти требуемую функциональность", - "Invalid Host" : "Некорректный адрес сервера", + "Invalid Host" : "Недопустимый адрес сервера", "LDAP user and group backend" : "Интерфейс пользователей и групп LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Это приложение позволяет администраторам подключать Nextcloud к каталогу пользователей на основе LDAP.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Это приложение позволяет администраторам подключать Nextcloud к каталогу пользователей на основе LDAP для аутентификации и подготовки пользователей, групп и пользовательских атрибутов. Администраторы могут настроить это приложение для подключения к одному или нескольким каталогам LDAP или Active Directory через интерфейс LDAP. Атрибуты, такие как пользовательская квота, электронная почта, изображения аватаров, членство в группах и многое другое, могут быть перенесены в Nextcloud из каталога с соответствующими запросами и фильтрами.\n\nПользователь регистрируется в Nextcloud со своими учетными данными LDAP или AD и получает доступ на основе запроса аутентификации, обрабатываемого сервером LDAP или AD. Nextcloud не хранит пароли LDAP или AD, а эти учетные данные используются для аутентификации пользователя, а затем Nextcloud использует сеанс для идентификатора пользователя. Дополнительная информация доступна в документации LDAP Пользователи и Группы.", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "Другие атрибуты:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Определяет фильтр для применения при попытке входа. «%% uid» заменяет имя пользователя для входа в систему. Например: \"uid=%%uid\"", "Test Loginname" : "Проверить логин", + "Attempts to receive a DN for the given loginname and the current login filter" : "Попытки получить DN для данного имени пользователя и текущего фильтра LDAP", "Verify settings" : "Проверить настройки", "%s. Server:" : "Сервер %s:", "Add a new configuration" : "Добавить новую конфигурацию", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "По одной базовому DN пользователей в строке.", "User Search Attributes" : "Атрибуты поиска пользователей", "Optional; one attribute per line" : "Опционально; один атрибут в строке", + "Disable users missing from LDAP" : "Отключить пользователей, отсутствующих в LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "При включении пользователи, которые были импортированы из LDAP, а затем отсутствуют в последующих синхронизациях, будут отключены", "Group Display Name Field" : "Поле отображаемого имени группы", "The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.", "Base Group Tree" : "База дерева групп", @@ -178,25 +199,41 @@ OC.L10N.register( "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию) или укажите атрибут LDAP/AD.", "\"$home\" Placeholder Field" : "Поле-заполнитель \"$home\"", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменен значением указанного атрибута", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменён значением указанного атрибута", + "User Profile Attributes" : "Атрибуты профиля пользователей", + "Phone Field" : "Поле телефона", + "User profile Phone will be set from the specified attribute" : "Телефон в профиле пользователя будет установлен из указанного атрибута", + "Website Field" : "Поле web-сайта", + "User profile Website will be set from the specified attribute" : "Web-сайт в профиле пользователя будет установлен из указанного атрибута", + "Address Field" : "Поле адреса", + "User profile Address will be set from the specified attribute" : "Адрес в профиле пользователя будет установлен из указанного атрибута", + "Twitter Field" : "Поле Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter в профиле пользователя будет установлен из указанного атрибута", + "Fediverse Field" : "Поле Федерации", + "User profile Fediverse will be set from the specified attribute" : "Федерация в профиле пользователя будет установлена из указанного атрибута", + "Organisation Field" : "Поле организации", + "User profile Organisation will be set from the specified attribute" : "Организация в профиле пользователя будет установлена из указанного атрибута", + "Role Field" : "Поле роли", + "User profile Role will be set from the specified attribute" : "Роль в профиле пользователя будет установлена из указанного атрибута", + "Headline Field" : "Поле заголовка", + "User profile Headline will be set from the specified attribute" : "Заголовок в профиле пользователя будет установлен из указанного атрибута", + "Biography Field" : "Поле биографии", + "User profile Biography will be set from the specified attribute" : "Биография в профиле пользователя будет установлена из указанного атрибута", + "Birthdate Field" : "Поле Даты рождения", + "User profile Date of birth will be set from the specified attribute" : "Дата рождения профиля пользователя будет установлена на основе указанного атрибута", + "Pronouns Field" : " Поле местоимений", + "User profile Pronouns will be set from the specified attribute" : "Местоимения в профиле пользователя будут заданы из указанного атрибута", "Internal Username" : "Внутреннее имя пользователя", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Это даёт гарантию того, что имя пользователя уникально и символы не нужно конвертировать. Внутреннее имя пользователя имеет ограничение на то, что только эти символы допустимы: [ a-zA-Z0-9_.@-]. Другие символы замещаются их корреспондирующими символами ASCII или же просто отбрасываются. При коллизиях добавляется или увеличивается номер. Внутреннее имя пользователя используется для идентификации пользователя внутри системы. Также это по умолчанию имя для домашней папки пользователя. Также это часть адресов URL, например для всех служб *DAV. С помощью этой установки, поведение по умолчанию может быть изменено. Оставьте его пустым для поведения по умолчанию. Изменения будут иметь эффект только для вновь спроецированных (добавленных) пользователей LDAP. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По умолчанию внутреннее имя пользователя будет создано на основе атрибута UUID. Это гарантирует, что имя пользователя будет уникальным и символы не нужно будет преобразовывать. Внутреннее имя пользователя имеет ограничение – разрешены только эти символы: [a-zA-Z0-9_.@-]. Другие символы заменяются их ASCII-кодами или просто опускаются. При совпадениях число будет добавлено/увеличено. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Оно также является именем по умолчанию для домашней папки пользователя. Оно также является частью удалённых URL-адресов, например, для всех служб DAV. С помощью этого параметра можно переопределить поведение по умолчанию. Изменения будут иметь силу только для новых сопоставленных (добавленных) пользователей LDAP. Оставьте этот параметр пустым для поведения по умолчанию.", "Internal Username Attribute:" : "Атрибут для внутреннего имени:", "Override UUID detection" : "Переопределить нахождение UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию атрибут UUID определяется автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", "UUID Attribute for Users:" : "UUID-атрибуты для пользователей:", "UUID Attribute for Groups:" : "UUID-атрибуты для групп:", "Username-LDAP User Mapping" : "Соответствия Имя-Пользователь LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Имена пользователей используются для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется DN для уменьшения числа обращений к LDAP, однако он не используется для идентификации. Если DN был изменён, то изменения будут найдены. Внутреннее имя используется повсеместно. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.", "Clear Username-LDAP User Mapping" : "Очистить соответствия Имя-Пользователь LDAP", "Clear Groupname-LDAP Group Mapping" : "Очистить соответствия Группа-Группа LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Произошла ошибка подключения к LDAP / AD, пожалуйста проверьте настройки подключения и учетные данные.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Отсутствует заполнитель «%uid». Он будет заменен на логин при запросе к LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", - "LDAP / AD integration" : "Интеграция LDAP / AD", - "LDAP / AD Username:" : "Имя пользователя LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Позволяет вход в LDAP / AD с помощью имени пользователя, которое может определяться как «uid», так и «sAMAccountName».", - "LDAP / AD Email Address:" : "Адрес email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Это даёт гарантию того, что имя пользователя уникально и символы не нужно конвертировать. Внутреннее имя пользователя имеет ограничение на то, что только эти символы допустимы: [ a-zA-Z0-9_.@- ]. Другие символы замещаются их корреспондирующими символами ASCII или же просто отбрасываются. При коллизиях добавляется или увеличивается номер. Внутреннее имя пользователя используется для идентификации пользователя внутри системы. Также это по умолчанию имя для домашней папки пользователя. Также это часть адресов URL, например для всех служб *DAV. С помощью этой установки, поведение по умолчанию может быть изменено. Оставьте его пустым для поведения по умолчанию. Изменения будут иметь эффект только для вновь спроецированных (добавленных) пользователей LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Неверная конфигурация. Просмотрите журналы для получения дополнительных сведений." }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json index 7a6470e66a0..97ac0b1eeb3 100644 --- a/apps/user_ldap/l10n/ru.json +++ b/apps/user_ldap/l10n/ru.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Неверная конфигурация: анонимное связывание не разрешается.", "Valid configuration, connection established!" : "Конфигурация настроена верно, связь установлена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Конфигурация настроена верно, но связывание не удалось. Проверьте настройки сервера и реквизиты доступа.", - "Invalid configuration. Please have a look at the logs for further details." : "Неверная конфигурация. Просмотрите журналы для получения дополнительных сведений.", + "Invalid configuration: %s" : "Недопустимая конфигурация: %s", "No action specified" : "Действие не указано", "No configuration specified" : "Конфигурация не указана", "No data specified" : "Нет данных", - " Could not set configuration %s" : "Невозможно создать конфигурацию %s", + "Invalid data specified" : "Указаны некорректные данные", + "Could not set configuration %1$s to %2$s" : "Не удалось задать конфигурацию %1$s для %2$s", "Action does not exist" : "Действие не существует", "Renewing …" : "Обновление…", "Very weak password" : "Очень слабый пароль", @@ -23,12 +24,12 @@ "Configuration OK" : "Конфигурация в порядке", "Select groups" : "Выберите группы", "Select object classes" : "Выберите объектные классы", - "Please check the credentials, they seem to be wrong." : "Пожалуйста проверьте учетный данные, возможно они не верны.", + "Please check the credentials, they seem to be wrong." : "Пожалуйста, проверьте учётные данные — возможно, они указаны неверно.", "Please specify the port, it could not be auto-detected." : "Пожалуйста укажите порт, он не может быть определен автоматически.", "Base DN could not be auto-detected, please revise credentials, host and port." : "База поиска не может быть определена автоматически, пожалуйста перепроверьте учетные данные, адрес и порт.", "Could not detect Base DN, please enter it manually." : "Невозможно обнаружить Base DN, пожалуйста, задайте вручную.", "{nthServer}. Server" : "Сервер {nthServer}.", - "No object found in the given Base DN. Please revise." : "Не найдено объектов в Base DN. Пожалуйста перепроверьте.", + "No object found in the given Base DN. Please revise." : "В указанной базовой DN не найден ни один объект. Пожалуйста, перепроверьте.", "More than 1,000 directory entries available." : "В каталоге доступно более 1,000 записей.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} элемент доступен в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN","{objectsFound} элементов доступно в предоставленном базовом DN"], "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Произошла ошибка. Пожалуйста проверьте базу поиска DN, а также настройки подключения и учетные данные.", @@ -51,18 +52,35 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заполнитель \"%uid\" отсутствует. Он будет заменён именем пользователя при запросе LDAP/AD.", "Please provide a login name to test against" : "Пожалуйста, укажите логин для проверки", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Блок группы был отключен, поскольку сервер LDAP/AD не поддерживает memberOf.", - "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", + "Password change rejected. Hint: %s" : "Изменение пароля отклонено. Подсказка: %s", + "Mandatory field \"%s\" left empty" : "Обязательное поле «%s» оставлено пустым", + "A password is given, but not an LDAP agent" : "Пароль задан, но не указан LDAP-агент", + "No password is given for the user agent" : "Пароль для LDAP-агента не задан", + "No LDAP base DN was given" : "Не указана базовая DN LDAP", + "User base DN is not a subnode of global base DN" : "Базовая DN пользователей не является подузлом глобальной базовой DN", + "Group base DN is not a subnode of global base DN" : " Базовая DN групп не является подузлом глобальной базовой DN", + "Login filter does not contain %s placeholder." : "Фильтр входа не содержит плейсхолдер %s.", "Please login with the new password" : "Войдите в систему со своим новым паролем", "LDAP User backend" : "Механизм учета пользователей LDAP", "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", "Your password will expire today." : "Сегодня истекает срок действия пароля.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP/AD integration" : "LDAP/AD интеграция", - "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], - "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], + "LDAP Connection" : "Подключение по протоколу LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Не удалось выполнить привязку для этой конфигурации LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s","Не удалось выполнить привязку для %n конфигураций LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Ошибка поиска в этой конфигурации LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s","Ошибка поиска в %n конфигурациях LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Найдена неактивная конфигурация LDAP: %s","Найдено %n неактивных конфигурации LDAP: %s","Найдено %n неактивных конфигураций LDAP: %s","Найдено %n неактивных конфигураций LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : [" Привязка и поиск работают в настроенном LDAP-соединении (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"," Привязка и поиск работают во всех %n настроенных LDAP-соединениях (%s)"], + "Invalid LDAP UUIDs" : "Недопустимые UUID LDAP", + "None found" : "Ничего не найдено", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Обнаружены недопустимые идентификаторы UUID учетных записей или групп LDAP. Пожалуйста, ознакомьтесь с вашими настройками \"Переопределение обнаружения UUID\" в экспертной части конфигурации LDAP и используйте \"occ ldap:update-uuid\", чтобы обновить их.", + "_%n group found_::_%n groups found_" : ["Найдена %n группа","Найдено %n группы","Найдено %n групп","Найдено %n группы"], + "> 1000 groups found" : "Найдено более 1000 групп", + "> 1000 users found" : "Найдено более 1000 пользователей", + "_%n user found_::_%n users found_" : ["Найден %n пользователь","Найдено %n пользователя","Найдено %n пользователей","Найдено %n пользователя"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не удалось автоматически определить атрибут, содержащий отображаемое имя пользователя. Зайдите в расширенные настройки LDAP и укажите его вручную.", "Could not find the desired feature" : "Не удается найти требуемую функциональность", - "Invalid Host" : "Некорректный адрес сервера", + "Invalid Host" : "Недопустимый адрес сервера", "LDAP user and group backend" : "Интерфейс пользователей и групп LDAP", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Это приложение позволяет администраторам подключать Nextcloud к каталогу пользователей на основе LDAP.", "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Это приложение позволяет администраторам подключать Nextcloud к каталогу пользователей на основе LDAP для аутентификации и подготовки пользователей, групп и пользовательских атрибутов. Администраторы могут настроить это приложение для подключения к одному или нескольким каталогам LDAP или Active Directory через интерфейс LDAP. Атрибуты, такие как пользовательская квота, электронная почта, изображения аватаров, членство в группах и многое другое, могут быть перенесены в Nextcloud из каталога с соответствующими запросами и фильтрами.\n\nПользователь регистрируется в Nextcloud со своими учетными данными LDAP или AD и получает доступ на основе запроса аутентификации, обрабатываемого сервером LDAP или AD. Nextcloud не хранит пароли LDAP или AD, а эти учетные данные используются для аутентификации пользователя, а затем Nextcloud использует сеанс для идентификатора пользователя. Дополнительная информация доступна в документации LDAP Пользователи и Группы.", @@ -86,6 +104,7 @@ "Other Attributes:" : "Другие атрибуты:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Определяет фильтр для применения при попытке входа. «%% uid» заменяет имя пользователя для входа в систему. Например: \"uid=%%uid\"", "Test Loginname" : "Проверить логин", + "Attempts to receive a DN for the given loginname and the current login filter" : "Попытки получить DN для данного имени пользователя и текущего фильтра LDAP", "Verify settings" : "Проверить настройки", "%s. Server:" : "Сервер %s:", "Add a new configuration" : "Добавить новую конфигурацию", @@ -149,6 +168,8 @@ "One User Base DN per line" : "По одной базовому DN пользователей в строке.", "User Search Attributes" : "Атрибуты поиска пользователей", "Optional; one attribute per line" : "Опционально; один атрибут в строке", + "Disable users missing from LDAP" : "Отключить пользователей, отсутствующих в LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "При включении пользователи, которые были импортированы из LDAP, а затем отсутствуют в последующих синхронизациях, будут отключены", "Group Display Name Field" : "Поле отображаемого имени группы", "The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, который используется для генерации отображаемого имени группы.", "Base Group Tree" : "База дерева групп", @@ -176,25 +197,41 @@ "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию) или укажите атрибут LDAP/AD.", "\"$home\" Placeholder Field" : "Поле-заполнитель \"$home\"", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменен значением указанного атрибута", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "В конфигурации внешнего хранилища $home будет заменён значением указанного атрибута", + "User Profile Attributes" : "Атрибуты профиля пользователей", + "Phone Field" : "Поле телефона", + "User profile Phone will be set from the specified attribute" : "Телефон в профиле пользователя будет установлен из указанного атрибута", + "Website Field" : "Поле web-сайта", + "User profile Website will be set from the specified attribute" : "Web-сайт в профиле пользователя будет установлен из указанного атрибута", + "Address Field" : "Поле адреса", + "User profile Address will be set from the specified attribute" : "Адрес в профиле пользователя будет установлен из указанного атрибута", + "Twitter Field" : "Поле Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter в профиле пользователя будет установлен из указанного атрибута", + "Fediverse Field" : "Поле Федерации", + "User profile Fediverse will be set from the specified attribute" : "Федерация в профиле пользователя будет установлена из указанного атрибута", + "Organisation Field" : "Поле организации", + "User profile Organisation will be set from the specified attribute" : "Организация в профиле пользователя будет установлена из указанного атрибута", + "Role Field" : "Поле роли", + "User profile Role will be set from the specified attribute" : "Роль в профиле пользователя будет установлена из указанного атрибута", + "Headline Field" : "Поле заголовка", + "User profile Headline will be set from the specified attribute" : "Заголовок в профиле пользователя будет установлен из указанного атрибута", + "Biography Field" : "Поле биографии", + "User profile Biography will be set from the specified attribute" : "Биография в профиле пользователя будет установлена из указанного атрибута", + "Birthdate Field" : "Поле Даты рождения", + "User profile Date of birth will be set from the specified attribute" : "Дата рождения профиля пользователя будет установлена на основе указанного атрибута", + "Pronouns Field" : " Поле местоимений", + "User profile Pronouns will be set from the specified attribute" : "Местоимения в профиле пользователя будут заданы из указанного атрибута", "Internal Username" : "Внутреннее имя пользователя", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Это даёт гарантию того, что имя пользователя уникально и символы не нужно конвертировать. Внутреннее имя пользователя имеет ограничение на то, что только эти символы допустимы: [ a-zA-Z0-9_.@-]. Другие символы замещаются их корреспондирующими символами ASCII или же просто отбрасываются. При коллизиях добавляется или увеличивается номер. Внутреннее имя пользователя используется для идентификации пользователя внутри системы. Также это по умолчанию имя для домашней папки пользователя. Также это часть адресов URL, например для всех служб *DAV. С помощью этой установки, поведение по умолчанию может быть изменено. Оставьте его пустым для поведения по умолчанию. Изменения будут иметь эффект только для вновь спроецированных (добавленных) пользователей LDAP. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "По умолчанию внутреннее имя пользователя будет создано на основе атрибута UUID. Это гарантирует, что имя пользователя будет уникальным и символы не нужно будет преобразовывать. Внутреннее имя пользователя имеет ограничение – разрешены только эти символы: [a-zA-Z0-9_.@-]. Другие символы заменяются их ASCII-кодами или просто опускаются. При совпадениях число будет добавлено/увеличено. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Оно также является именем по умолчанию для домашней папки пользователя. Оно также является частью удалённых URL-адресов, например, для всех служб DAV. С помощью этого параметра можно переопределить поведение по умолчанию. Изменения будут иметь силу только для новых сопоставленных (добавленных) пользователей LDAP. Оставьте этот параметр пустым для поведения по умолчанию.", "Internal Username Attribute:" : "Атрибут для внутреннего имени:", "Override UUID detection" : "Переопределить нахождение UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию атрибут UUID определяется автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", "UUID Attribute for Users:" : "UUID-атрибуты для пользователей:", "UUID Attribute for Groups:" : "UUID-атрибуты для групп:", "Username-LDAP User Mapping" : "Соответствия Имя-Пользователь LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Имена пользователей используются для хранения и назначения метаданных. Для точной идентификации и распознавания пользователей, каждый пользователь LDAP будет иметь свое внутреннее имя пользователя. Это требует привязки имени пользователя к пользователю LDAP. При создании имя пользователя назначается идентификатору UUID пользователя LDAP. Помимо этого кешируется DN для уменьшения числа обращений к LDAP, однако он не используется для идентификации. Если DN был изменён, то изменения будут найдены. Внутреннее имя используется повсеместно. После сброса привязок в базе могут сохраниться остатки старой информации. Сброс привязок не привязан к конфигурации, он повлияет на все LDAP подключения! Ни в коем случае не рекомендуется сбрасывать привязки если система уже находится в эксплуатации, только на этапе тестирования.", "Clear Username-LDAP User Mapping" : "Очистить соответствия Имя-Пользователь LDAP", "Clear Groupname-LDAP Group Mapping" : "Очистить соответствия Группа-Группа LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Произошла ошибка подключения к LDAP / AD, пожалуйста проверьте настройки подключения и учетные данные.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Отсутствует заполнитель «%uid». Он будет заменен на логин при запросе к LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", - "LDAP / AD integration" : "Интеграция LDAP / AD", - "LDAP / AD Username:" : "Имя пользователя LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Позволяет вход в LDAP / AD с помощью имени пользователя, которое может определяться как «uid», так и «sAMAccountName».", - "LDAP / AD Email Address:" : "Адрес email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Это даёт гарантию того, что имя пользователя уникально и символы не нужно конвертировать. Внутреннее имя пользователя имеет ограничение на то, что только эти символы допустимы: [ a-zA-Z0-9_.@- ]. Другие символы замещаются их корреспондирующими символами ASCII или же просто отбрасываются. При коллизиях добавляется или увеличивается номер. Внутреннее имя пользователя используется для идентификации пользователя внутри системы. Также это по умолчанию имя для домашней папки пользователя. Также это часть адресов URL, например для всех служб *DAV. С помощью этой установки, поведение по умолчанию может быть изменено. Оставьте его пустым для поведения по умолчанию. Изменения будут иметь эффект только для вновь спроецированных (добавленных) пользователей LDAP. " + "Invalid configuration. Please have a look at the logs for further details." : "Неверная конфигурация. Просмотрите журналы для получения дополнительных сведений." },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sc.js b/apps/user_ldap/l10n/sc.js index 928dc2e44c4..801f642fe73 100644 --- a/apps/user_ldap/l10n/sc.js +++ b/apps/user_ldap/l10n/sc.js @@ -5,12 +5,10 @@ OC.L10N.register( "Failed to delete the server configuration" : "No at fatu a cantzellare sa cunfiguratzione de su serbidore", "Invalid configuration: Anonymous binding is not allowed." : "Cunfiguratzione non bàlida: is ligòngios anònimos no sunt permìtidos.", "Valid configuration, connection established!" : "Cunfiguratzione bàlida, connessione istabilida!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cunfiguratzione bàlida, ma ligòngiu no istabilidu. Càstia is impostatziones de su serbidore e is credentziales.", - "Invalid configuration. Please have a look at the logs for further details." : "Cunfiguratzione non bàlida. Càstia is registros pro detàllios in prus.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cunfiguratzione bàlida, ma ligòngiu no istabilidu. Càstia sa cunfiguratzione de su serbidore e is credentziales.", "No action specified" : "Peruna atzione ispetzificada", "No configuration specified" : "Peruna cunfiguratzione ispetzificada", "No data specified" : "Perunu datu ispetzificadu", - " Could not set configuration %s" : "No at fatu a impostare sa cunfiguratzione %s", "Action does not exist" : "S'atzione no esistit", "Renewing …" : "Renovende ...", "Very weak password" : "Crae dèbile a beru", @@ -33,7 +31,7 @@ OC.L10N.register( "No object found in the given Base DN. Please revise." : "No s'at agatadu perunu ogetu in sa Base DN dada. Torra a castiare.", "More than 1,000 directory entries available." : "B'at prus de 1000 elementos de cartella a disponimentu.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} elementos a disponimentu a intro de sa Base DN frunida","{objectsFound} elementos a disponimentu a intro de sa Base DN frunida"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "B'at àpidu un'errore. Controlla sa Base DN, paris cun is impostatzione de connessione e is credentziales.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "B'at àpidu un'errore. Controlla sa Base DN, paris cun sa cunfiguratzione de connessione e is credentziales.", "Do you really want to delete the current Server Configuration?" : "A beru boles cantzellare sa Cunfiguratzione de Serbidore currente?", "Confirm Deletion" : "Cunfirma Cantzelladura", "Mappings cleared successfully!" : "Assignatziones limpiadas!", @@ -45,24 +43,21 @@ OC.L10N.register( "Mode switch" : "Càmbia modalidade", "Select attributes" : "Seletziona atributos", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Utente no agatadu. Càstia is atributos de atzessu e su nùmene de utente. Filtru eficatze (de copiare pro sa balidatzione de sa lìnia de cumandu): <br/>", - "User found and settings verified." : "Utente agatadu e impostatziones averiguadas.", + "User found and settings verified." : "Utente agatadu e cunfiguratzione averiguada.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Proa a istrìnghere sa chirca, ca includit medas utèntzias, aici isceti sa prima de custas at a pòdere fàghere s'atzessu.", - "An unspecified error occurred. Please check log and settings." : "B'at àpidu un'errore no ispetzificadu. Càstia su registru e is impostatziones.", + "An unspecified error occurred. Please check log and settings." : "B'at àpidu un'errore no ispetzificadu. Càstia su registru e sa cunfiguratzione.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Su filtru de chirca no est bàlidu, forsis pro problemas de sintassi comente unu nùmeru dìspari de parèntesi abertas e serradas. Torra a castiare.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "B'at àpidu un'errore de connessione a LDAP/AD. Càstia su retzidore, sa porta e is credentziales.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Mancat s'elementu provisòriu\"%uid\". At a èssere cambiadu cun su nùmene de atzessu cando s'at a preguntare LDAP/AP.", "Please provide a login name to test against" : "Fruni unu nùmene de atzessu pro torrare a fàghere sa proa", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Sa casella de grupu est istada disativada, ca su serbidore LDAP/AP no suportat memberOf.", - "Password change rejected. Hint: " : "Càmbiu de sa crae refudadu. Cussìgiu:", "Please login with the new password" : "Torra a fàghere s'atzessu cun sa crae noa", "LDAP User backend" : "Motore utente LDAP", "Your password will expire tomorrow." : "Sa crae tua at a iscadire cras.", "Your password will expire today." : "Sa crae tua at a iscadire oe.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sa crae tua at a iscadire a intro de %n dies.","Sa crae tua at a iscadire a intro de %n dies."], "LDAP/AD integration" : "Integratziones LDAP/AP", - "_%s group found_::_%s groups found_" : ["%s grupos agatados","%s grupos agatados"], - "_%s user found_::_%s users found_" : ["%sutente agatadu","%s utentes agatados"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No at fatu a rilevare s'atributu nùmene visualizadu dae s'utente. Ispetzìfica•ddu tue in is impostatziones avantzadas LDAP.", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No at fatu a rilevare s'atributu nùmene visualizadu dae s'utente. Ispetzìfica·ddu tue in is cunfiguratziones avantzadas LDAP.", "Could not find the desired feature" : "No at fatu a agatare sa funtzione disigiada", "Invalid Host" : "Retzidore no bàlidu", "LDAP user and group backend" : "Motore utente e grupos LDAP", @@ -79,7 +74,7 @@ OC.L10N.register( "Edit LDAP Query" : "Modìfica sa rechesta LDAP/AP", "LDAP Filter:" : "Filtru LDAP/AP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Su filtru ispetzìficat cales grupos LDAP ant a tènnere atzessu a s'istàntzia %s.", - "Verify settings and count the groups" : "Averìgua is impostatziones e conta is grupos", + "Verify settings and count the groups" : "Averìgua sa cunfiguratzione e conta is grupos", "When logging in, %s will find the user based on the following attributes:" : "Faghende s'atzessu, %s at a agatare s'utente in sa base de custos atributos:", "LDAP/AD Username:" : "Nùmene utente LDAP/AD", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permitit s'atzessu tràmite su nùmene utente LDAP/AD, chi est o \"uid\" o \"sAMAccountName\" e at a èssere rilevadu.", @@ -88,7 +83,7 @@ OC.L10N.register( "Other Attributes:" : "Àteros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definit su filtru de aplicare, cando si proat a intrare. Su nùmene utente est cambiadu cun \"%%uid\" in su momentu de s'atzessu. Esèmpiu: \"uid=%%uid\"", "Test Loginname" : "Proa de su nùmene de atzessu", - "Verify settings" : "Averìgua is impostatziones", + "Verify settings" : "Averìgua sa cunfiguratzione", "%s. Server:" : "%s. Serbidore: ", "Add a new configuration" : "Agiunghe una cunfiguratzione noa", "Copy current configuration into new directory binding" : "Còpia sa cunfiguratzione currente in sa cartella de assòtziu noa", @@ -111,7 +106,7 @@ OC.L10N.register( "Listing and searching for users is constrained by these criteria:" : "S'elencu e sa chirca de utentes tenet custos critèrios:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Is classes de ogetos prus comunes pro is utentes sunt organizationalPerson, person, user, and inetOrgPerson. Si no tenes seguresa de sa classe de s'ogetu de seberare, pregonta a s'amministratzione de sa cartella tua.", "The filter specifies which LDAP users shall have access to the %s instance." : "Su filtru ispetzìficat cales utentes LDAP ant a tènnere atzessu a sa %s istàntzia.", - "Verify settings and count users" : "Averìgua is impostatziones e conta is utentes", + "Verify settings and count users" : "Averìgua sa cunfiguratzione e conta is utentes", "Saving" : "Sarvende", "Back" : "In segus", "Continue" : "Sighi", @@ -130,7 +125,7 @@ OC.L10N.register( "Expert" : "Connoschèntzia arta meda", "Advanced" : "Connoschèntzia avantzada", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atentzione:</b> Su mòdulu PHP LDAP no est installadu, su motore no at a funtzionare. Pedi a s'amministratzione de sistema de ddu installare.", - "Connection Settings" : "Impostatziones de connessione", + "Connection Settings" : "Cunfiguratzione de connessione", "Configuration Active" : "Cunfiguratzione Ativa", "When unchecked, this configuration will be skipped." : "Chi no est averiguada, custa cunfiguratzione s'at a sartare.", "Backup (Replica) Host" : "Retzidore de còpia de seguresa (Repitu)", @@ -141,8 +136,8 @@ OC.L10N.register( "Turn off SSL certificate validation." : "Disativa sa balidatzione de su tzertificadu SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No est cussigiadu, imprea isceti pro sa proa! Si sa connessione traballat isceti cun custa optzione, importa su tzertificadu SSL de su serbidore LDAP in su serbidore tuo %s.", "Cache Time-To-Live" : "Memòria temporànea TTL", - "in seconds. A change empties the cache." : "tra pagos segundos.Su càmbiu isbòidat sa memòria temporànea.", - "Directory Settings" : "Impostatziones de sa cartella", + "in seconds. A change empties the cache." : "de immoe a pagos segundos. Su càmbiu isbòidat sa memòria temporànea.", + "Directory Settings" : "Cunfiguratzione de sa cartella", "User Display Name Field" : "Campu pro sa visualizatzione de su nùmene utente", "The LDAP attribute to use to generate the user's display name." : "S'atributu LDAP de impreare pro generare su nùmene visualizadu dae s'utente.", "2nd User Display Name Field" : "Segundu campu pro sa visualizatzione de su nùmene utente", @@ -158,11 +153,11 @@ OC.L10N.register( "Group Search Attributes" : "Atributos de chirca de grupu", "Group-Member association" : "Assòtziu grupu-utente", "Dynamic Group Member URL" : "URL utente de grupu dinàmicu", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "S'atributu LDAP chi in is ogetos de su grupu cuntenet unu URL de chirca LDAP chi sèberat cales ogetos apartentent a su grupu. (Un'impostatzione bòida disativat sa funtzionalidade de apartenèntzia a unu grupu dinàmicu.)", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "S'atributu LDAP chi in is ogetos de su grupu cuntenet unu URL de chirca LDAP chi sèberat cales ogetos apartentent a su grupu. (Una cunfiguratzione bòida disativat sa funtzionalidade de apartenèntzia a unu grupu dinàmicu.)", "Nested Groups" : "Grupos a nidu", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Chi est ativadu, is grupos chi cuntenent grupos sunt suportados. (Funtzionat isceti si s'atributu de s'utente de su grupu cuntenet DNs.)", "Paging chunksize" : "Mannària de is framentos de paginatzione.", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mannària de framentos impreada pro chircas LDAP paginadas chi diant pòdere torrare resurtados graes comente s'enumeratzione de utentes o grupos. (S'impostatzione a 0 disativat is chircas LDAP paginadas in custas situatziones.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mannària de framentos impreada pro chircas LDAP paginadas chi diant pòdere torrare resurtados graes comente s'enumeratzione de utentes o grupos. (Sa cunfiguratzione a 0 disativat is chircas LDAP paginadas in custas situatziones.)", "Enable LDAP password changes per user" : "Ativat is càmbios de crae LDAP pro utente", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permitit a is utentes LDAP de cambiare sa crae issoro e permitit a Super Amministratziones e Grupos de Amministratzione de cambiare sa crae de is utentes LDAP issoro. Funtzionat isceti cando is critèrios de controllu de atzessu sunt cunfiguradas segundu su serbidore LDAP. Dadu ca is craes sunt imbiadas a craru a su serbidore LDAP, tocat a impreare sa tzifradura de tràmuda e a cunfigurare in su serbidore sa creatzione de unu hash pro sa crae.", "(New password is sent as plain text to LDAP)" : "(Sa crae noa s'imbiat a craru a su LDAP)", @@ -172,31 +167,32 @@ OC.L10N.register( "Quota Field" : "Campu cuota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Lassa bòidu pro sa cuota utente predefinida. Si nono, ispetzìfica un'atributu LDAP/AD.", "Quota Default" : "Cuota predefinida", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Subraiscriet una cuota predefinida por utentes LDAP chi non tenent unu valore impostadu in su campu cuota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Subriscriet una cuota predefinida pro utentes LDAP chi non tenent unu valore cunfiguradu in su campu cuota.", "Email Field" : "Campu posta eletrònica", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Imposta s'indiritzu de posta de is utentes dae s'atributu LDAP issoro. Lassa bòidu pro su funtzionamentu predefinidu.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Cunfigura s'indiritzu de posta de is utentes dae s'atributu LDAP issoro. Lassa bòidu pro su funtzionamentu predefinidu.", "User Home Folder Naming Rule" : "Règula de assignatzione de su nùmene de sa cartella utente", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lassa bòidu pro su nùmene utente (predefinidu). Si nono, ispetzìfica un'atributu LDAP/AD.", "\"$home\" Placeholder Field" : "\"$home\" Campu sostitutu temporàneu", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in una cunfiguratzione de archiviatzione de foras s'at a cambiare cun su valore de s'atributu ispetzìficu", + "Website Field" : "Campu Situ web", + "Organisation Field" : "Campu organizatzione", + "User profile Organisation will be set from the specified attribute" : "Su profilu de organizatzione de s'utente at a èssere cunfiguradu dae s'atributu ispetzificadu", + "Role Field" : "Campu de faina", + "User profile Role will be set from the specified attribute" : "Sa faina de su profilu de utente at a èssere cunfigurada dae s'atributu ispetzificadu", + "Headline Field" : "Campu de tìtulu", + "User profile Headline will be set from the specified attribute" : "Su tìtulu de su profilu de utente at a èssere cunfiguradu dae s'atributu ispetzificadu", + "Biography Field" : "Campu Biografia", + "User profile Biography will be set from the specified attribute" : "Sa biografia de su profilu de utente at a èssere cunfigurada dae s'atributu ispetzìficu", "Internal Username" : "Nùmene utente de intro", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "A manera predefinida, su nùmene utente de intro s'at a creare dae s'atributu UUID. Si segurat chi su nùmene utente siat ùnicu e chi non si depant cunvertire is caràteres. Su nùmene utente de intro permitit s'impreu de caràteres ispetzìficos: [a-zA-Z0-9_.@-]. Is àteros caràteres si cambiant cun sa currispondèntzia ASCII o non si ponent. S'in casu de cunflitu, s'agiunghet/creschet unu nùmeru. Su nùmene utente de intro s'impreat pro identificare un'utente de intro. Est puru su nùmene predefinidu pro sa cartella printzipale de s'utente. Est puru una parte de URL remotos, pro esèmpiu pro totu is servìtzios *DAV. Cun custa impostatzione, su funtzionamentu predefinidu si podet brincare. Is càmbios ant a èssere efetivos isceti in is utèntzias noas assotziadas LDAP (agiuntas). Lassa bòidu pro funtzionamentu predefinidu.", "Internal Username Attribute:" : "Atributu nùmene utente de intro:", "Override UUID detection" : "Ignora rilevada UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "A manera predefinida, s'atributu UUID si rilevat in automàticu. S'atributu UUID est impreadu pro identificare cun seguresa is utentes e grupos LDAP. In prus, su nùmene utente de intro s'at a creare basadu subra de s'UUID, si non s'ispetzìficat àteru. Podes ignorare s'impostatzione e frunire un'atributu seberadu dae te. Ti depes segurare chi s'atributu seberadu si potzat otènnere siat pro utenets siat pro grupos e chi siat ùnicu. Lassa bòidu pro funtzionamentu predefinidu. Is càmbios ant a èssere efetivos isceti pro is ùtèntzias e grupos noos LDAP assotziados (agiuntos).", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "A manera predefinida, s'atributu UUID si rilevat in automàticu. S'atributu UUID est impreadu pro identificare cun seguresa is utentes e grupos LDAP. In prus, su nùmene utente de intro s'at a creare basadu subra de s'UUID, si non s'ispetzìficat àteru. Podes ignorare sa cunfiguratzione e frunire un'atributu seberadu dae te. Ti depes segurare chi s'atributu seberadu si potzat otènnere siat pro utenets siat pro grupos e chi siat ùnicu. Lassa bòidu pro funtzionamentu predefinidu. Is càmbios ant a èssere efetivos isceti pro is ùtèntzias e grupos noos LDAP assotziados (agiuntos).", "UUID Attribute for Users:" : "Atributu UUID pro is utentes:", "UUID Attribute for Groups:" : "Atributu UUID pro is grupos:", "Username-LDAP User Mapping" : "Assòtziu Nùmene utente-Utente LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Is nùmenes utente d'impreant pro archiviare e assignare is metadatos. Pro identificare a pretzisu e connòschere is utentes, cada utente LDAP at a tènnere unu nùmene utente de intro. Custu rechedet un'assòtziu dae nùmene utente a utente LDAP. Su nùmene utente creadu est assotziadu a s'UUID de s'utente LDAP. In prus su DN si ponet in memòria temporànea pro minimare s'interatzione cun LDAP, ma non s'impreat pro s'identificatzione. Si su DN càmbiat, is càmbios s'ant a agatare. Su nùmene utente de intro s'impreat in totue. Limpiende is assòtzios s'ant a lassare arrastos a s'at a interessare totu sa cunfiguratzione LDAP! Non limpies mai is assòtzios in un'ambiente de produtzione, ma isceti in una fase de proa o isperimentos.", "Clear Username-LDAP User Mapping" : "Lìmpia assòtziu Nùmene utente-Utente LDAP", "Clear Groupname-LDAP Group Mapping" : "Lìmpia assòtziu Nùmene de su grupu-Grupu LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "B'at àpidu un'errore de connessione a LDAP/AD, càstia su retzidore, sa porta e is credentziales.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Mancat s'elementu provisòriu\"%uid\". At a èssere cambiadu cun su nùmene de atzessu cando s'at a preguntare LDAP/AP.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Sa casella de grupu est istada disativada, ca su serbidore LDAP/AP no suportat memberOf.", - "LDAP / AD integration" : "Integratziones LDAP/AD", - "LDAP / AD Username:" : "Nùmene utente LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permitit s'atzessu tràmite su nùmene utente LDAP/AD, chi est o \"uid\" o \"sAMAccountName\" e at a èssere rilevadu.", - "LDAP / AD Email Address:" : "Indiritzu Posta Eletrònica LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "A manera predefinida, su nùmene utente de intro s'at a creare dae s'atributu UUID. Si segurat chi su nùmene utente siat ùnicu e chi non si depant cunvertire is caràteres. Su nùmene utente de intro permitit s'impreu de caràteres ispetzìficos: [a-zA-Z0-9_.@-]. Is àteros caràteres si càmbiant cun sa currispondèntzia ASCII o non si ponent. S'in casu de cunflitu, s'agiunghet/creschet unu nùmeru. Su nùmene utente de intro s'impreat pro identificare un'utente de intro. Est puru su nùmene predefinidu pro sa cartella printzipale de s'utente. Est puru una parte de URL remotos, pro esèmpiu pro totu is servìtzios *DAV. Cun custa impostatzione, su funtzionamentu predefinidu si podet brincare. Is càmbios ant a èssere efetivos isceti in is utèntzias noas assotziadas LDAP (agiuntas)." + "Invalid configuration. Please have a look at the logs for further details." : "Cunfiguratzione non bàlida. Càstia is registros pro detàllios in prus." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sc.json b/apps/user_ldap/l10n/sc.json index 9e6da6998d6..b11458c74ca 100644 --- a/apps/user_ldap/l10n/sc.json +++ b/apps/user_ldap/l10n/sc.json @@ -3,12 +3,10 @@ "Failed to delete the server configuration" : "No at fatu a cantzellare sa cunfiguratzione de su serbidore", "Invalid configuration: Anonymous binding is not allowed." : "Cunfiguratzione non bàlida: is ligòngios anònimos no sunt permìtidos.", "Valid configuration, connection established!" : "Cunfiguratzione bàlida, connessione istabilida!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cunfiguratzione bàlida, ma ligòngiu no istabilidu. Càstia is impostatziones de su serbidore e is credentziales.", - "Invalid configuration. Please have a look at the logs for further details." : "Cunfiguratzione non bàlida. Càstia is registros pro detàllios in prus.", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "Cunfiguratzione bàlida, ma ligòngiu no istabilidu. Càstia sa cunfiguratzione de su serbidore e is credentziales.", "No action specified" : "Peruna atzione ispetzificada", "No configuration specified" : "Peruna cunfiguratzione ispetzificada", "No data specified" : "Perunu datu ispetzificadu", - " Could not set configuration %s" : "No at fatu a impostare sa cunfiguratzione %s", "Action does not exist" : "S'atzione no esistit", "Renewing …" : "Renovende ...", "Very weak password" : "Crae dèbile a beru", @@ -31,7 +29,7 @@ "No object found in the given Base DN. Please revise." : "No s'at agatadu perunu ogetu in sa Base DN dada. Torra a castiare.", "More than 1,000 directory entries available." : "B'at prus de 1000 elementos de cartella a disponimentu.", "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["{objectsFound} elementos a disponimentu a intro de sa Base DN frunida","{objectsFound} elementos a disponimentu a intro de sa Base DN frunida"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "B'at àpidu un'errore. Controlla sa Base DN, paris cun is impostatzione de connessione e is credentziales.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "B'at àpidu un'errore. Controlla sa Base DN, paris cun sa cunfiguratzione de connessione e is credentziales.", "Do you really want to delete the current Server Configuration?" : "A beru boles cantzellare sa Cunfiguratzione de Serbidore currente?", "Confirm Deletion" : "Cunfirma Cantzelladura", "Mappings cleared successfully!" : "Assignatziones limpiadas!", @@ -43,24 +41,21 @@ "Mode switch" : "Càmbia modalidade", "Select attributes" : "Seletziona atributos", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Utente no agatadu. Càstia is atributos de atzessu e su nùmene de utente. Filtru eficatze (de copiare pro sa balidatzione de sa lìnia de cumandu): <br/>", - "User found and settings verified." : "Utente agatadu e impostatziones averiguadas.", + "User found and settings verified." : "Utente agatadu e cunfiguratzione averiguada.", "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Proa a istrìnghere sa chirca, ca includit medas utèntzias, aici isceti sa prima de custas at a pòdere fàghere s'atzessu.", - "An unspecified error occurred. Please check log and settings." : "B'at àpidu un'errore no ispetzificadu. Càstia su registru e is impostatziones.", + "An unspecified error occurred. Please check log and settings." : "B'at àpidu un'errore no ispetzificadu. Càstia su registru e sa cunfiguratzione.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Su filtru de chirca no est bàlidu, forsis pro problemas de sintassi comente unu nùmeru dìspari de parèntesi abertas e serradas. Torra a castiare.", "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "B'at àpidu un'errore de connessione a LDAP/AD. Càstia su retzidore, sa porta e is credentziales.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Mancat s'elementu provisòriu\"%uid\". At a èssere cambiadu cun su nùmene de atzessu cando s'at a preguntare LDAP/AP.", "Please provide a login name to test against" : "Fruni unu nùmene de atzessu pro torrare a fàghere sa proa", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Sa casella de grupu est istada disativada, ca su serbidore LDAP/AP no suportat memberOf.", - "Password change rejected. Hint: " : "Càmbiu de sa crae refudadu. Cussìgiu:", "Please login with the new password" : "Torra a fàghere s'atzessu cun sa crae noa", "LDAP User backend" : "Motore utente LDAP", "Your password will expire tomorrow." : "Sa crae tua at a iscadire cras.", "Your password will expire today." : "Sa crae tua at a iscadire oe.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sa crae tua at a iscadire a intro de %n dies.","Sa crae tua at a iscadire a intro de %n dies."], "LDAP/AD integration" : "Integratziones LDAP/AP", - "_%s group found_::_%s groups found_" : ["%s grupos agatados","%s grupos agatados"], - "_%s user found_::_%s users found_" : ["%sutente agatadu","%s utentes agatados"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No at fatu a rilevare s'atributu nùmene visualizadu dae s'utente. Ispetzìfica•ddu tue in is impostatziones avantzadas LDAP.", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "No at fatu a rilevare s'atributu nùmene visualizadu dae s'utente. Ispetzìfica·ddu tue in is cunfiguratziones avantzadas LDAP.", "Could not find the desired feature" : "No at fatu a agatare sa funtzione disigiada", "Invalid Host" : "Retzidore no bàlidu", "LDAP user and group backend" : "Motore utente e grupos LDAP", @@ -77,7 +72,7 @@ "Edit LDAP Query" : "Modìfica sa rechesta LDAP/AP", "LDAP Filter:" : "Filtru LDAP/AP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Su filtru ispetzìficat cales grupos LDAP ant a tènnere atzessu a s'istàntzia %s.", - "Verify settings and count the groups" : "Averìgua is impostatziones e conta is grupos", + "Verify settings and count the groups" : "Averìgua sa cunfiguratzione e conta is grupos", "When logging in, %s will find the user based on the following attributes:" : "Faghende s'atzessu, %s at a agatare s'utente in sa base de custos atributos:", "LDAP/AD Username:" : "Nùmene utente LDAP/AD", "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permitit s'atzessu tràmite su nùmene utente LDAP/AD, chi est o \"uid\" o \"sAMAccountName\" e at a èssere rilevadu.", @@ -86,7 +81,7 @@ "Other Attributes:" : "Àteros atributos:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definit su filtru de aplicare, cando si proat a intrare. Su nùmene utente est cambiadu cun \"%%uid\" in su momentu de s'atzessu. Esèmpiu: \"uid=%%uid\"", "Test Loginname" : "Proa de su nùmene de atzessu", - "Verify settings" : "Averìgua is impostatziones", + "Verify settings" : "Averìgua sa cunfiguratzione", "%s. Server:" : "%s. Serbidore: ", "Add a new configuration" : "Agiunghe una cunfiguratzione noa", "Copy current configuration into new directory binding" : "Còpia sa cunfiguratzione currente in sa cartella de assòtziu noa", @@ -109,7 +104,7 @@ "Listing and searching for users is constrained by these criteria:" : "S'elencu e sa chirca de utentes tenet custos critèrios:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Is classes de ogetos prus comunes pro is utentes sunt organizationalPerson, person, user, and inetOrgPerson. Si no tenes seguresa de sa classe de s'ogetu de seberare, pregonta a s'amministratzione de sa cartella tua.", "The filter specifies which LDAP users shall have access to the %s instance." : "Su filtru ispetzìficat cales utentes LDAP ant a tènnere atzessu a sa %s istàntzia.", - "Verify settings and count users" : "Averìgua is impostatziones e conta is utentes", + "Verify settings and count users" : "Averìgua sa cunfiguratzione e conta is utentes", "Saving" : "Sarvende", "Back" : "In segus", "Continue" : "Sighi", @@ -128,7 +123,7 @@ "Expert" : "Connoschèntzia arta meda", "Advanced" : "Connoschèntzia avantzada", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Atentzione:</b> Su mòdulu PHP LDAP no est installadu, su motore no at a funtzionare. Pedi a s'amministratzione de sistema de ddu installare.", - "Connection Settings" : "Impostatziones de connessione", + "Connection Settings" : "Cunfiguratzione de connessione", "Configuration Active" : "Cunfiguratzione Ativa", "When unchecked, this configuration will be skipped." : "Chi no est averiguada, custa cunfiguratzione s'at a sartare.", "Backup (Replica) Host" : "Retzidore de còpia de seguresa (Repitu)", @@ -139,8 +134,8 @@ "Turn off SSL certificate validation." : "Disativa sa balidatzione de su tzertificadu SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No est cussigiadu, imprea isceti pro sa proa! Si sa connessione traballat isceti cun custa optzione, importa su tzertificadu SSL de su serbidore LDAP in su serbidore tuo %s.", "Cache Time-To-Live" : "Memòria temporànea TTL", - "in seconds. A change empties the cache." : "tra pagos segundos.Su càmbiu isbòidat sa memòria temporànea.", - "Directory Settings" : "Impostatziones de sa cartella", + "in seconds. A change empties the cache." : "de immoe a pagos segundos. Su càmbiu isbòidat sa memòria temporànea.", + "Directory Settings" : "Cunfiguratzione de sa cartella", "User Display Name Field" : "Campu pro sa visualizatzione de su nùmene utente", "The LDAP attribute to use to generate the user's display name." : "S'atributu LDAP de impreare pro generare su nùmene visualizadu dae s'utente.", "2nd User Display Name Field" : "Segundu campu pro sa visualizatzione de su nùmene utente", @@ -156,11 +151,11 @@ "Group Search Attributes" : "Atributos de chirca de grupu", "Group-Member association" : "Assòtziu grupu-utente", "Dynamic Group Member URL" : "URL utente de grupu dinàmicu", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "S'atributu LDAP chi in is ogetos de su grupu cuntenet unu URL de chirca LDAP chi sèberat cales ogetos apartentent a su grupu. (Un'impostatzione bòida disativat sa funtzionalidade de apartenèntzia a unu grupu dinàmicu.)", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "S'atributu LDAP chi in is ogetos de su grupu cuntenet unu URL de chirca LDAP chi sèberat cales ogetos apartentent a su grupu. (Una cunfiguratzione bòida disativat sa funtzionalidade de apartenèntzia a unu grupu dinàmicu.)", "Nested Groups" : "Grupos a nidu", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Chi est ativadu, is grupos chi cuntenent grupos sunt suportados. (Funtzionat isceti si s'atributu de s'utente de su grupu cuntenet DNs.)", "Paging chunksize" : "Mannària de is framentos de paginatzione.", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mannària de framentos impreada pro chircas LDAP paginadas chi diant pòdere torrare resurtados graes comente s'enumeratzione de utentes o grupos. (S'impostatzione a 0 disativat is chircas LDAP paginadas in custas situatziones.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Mannària de framentos impreada pro chircas LDAP paginadas chi diant pòdere torrare resurtados graes comente s'enumeratzione de utentes o grupos. (Sa cunfiguratzione a 0 disativat is chircas LDAP paginadas in custas situatziones.)", "Enable LDAP password changes per user" : "Ativat is càmbios de crae LDAP pro utente", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permitit a is utentes LDAP de cambiare sa crae issoro e permitit a Super Amministratziones e Grupos de Amministratzione de cambiare sa crae de is utentes LDAP issoro. Funtzionat isceti cando is critèrios de controllu de atzessu sunt cunfiguradas segundu su serbidore LDAP. Dadu ca is craes sunt imbiadas a craru a su serbidore LDAP, tocat a impreare sa tzifradura de tràmuda e a cunfigurare in su serbidore sa creatzione de unu hash pro sa crae.", "(New password is sent as plain text to LDAP)" : "(Sa crae noa s'imbiat a craru a su LDAP)", @@ -170,31 +165,32 @@ "Quota Field" : "Campu cuota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Lassa bòidu pro sa cuota utente predefinida. Si nono, ispetzìfica un'atributu LDAP/AD.", "Quota Default" : "Cuota predefinida", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Subraiscriet una cuota predefinida por utentes LDAP chi non tenent unu valore impostadu in su campu cuota.", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Subriscriet una cuota predefinida pro utentes LDAP chi non tenent unu valore cunfiguradu in su campu cuota.", "Email Field" : "Campu posta eletrònica", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Imposta s'indiritzu de posta de is utentes dae s'atributu LDAP issoro. Lassa bòidu pro su funtzionamentu predefinidu.", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Cunfigura s'indiritzu de posta de is utentes dae s'atributu LDAP issoro. Lassa bòidu pro su funtzionamentu predefinidu.", "User Home Folder Naming Rule" : "Règula de assignatzione de su nùmene de sa cartella utente", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lassa bòidu pro su nùmene utente (predefinidu). Si nono, ispetzìfica un'atributu LDAP/AD.", "\"$home\" Placeholder Field" : "\"$home\" Campu sostitutu temporàneu", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home in una cunfiguratzione de archiviatzione de foras s'at a cambiare cun su valore de s'atributu ispetzìficu", + "Website Field" : "Campu Situ web", + "Organisation Field" : "Campu organizatzione", + "User profile Organisation will be set from the specified attribute" : "Su profilu de organizatzione de s'utente at a èssere cunfiguradu dae s'atributu ispetzificadu", + "Role Field" : "Campu de faina", + "User profile Role will be set from the specified attribute" : "Sa faina de su profilu de utente at a èssere cunfigurada dae s'atributu ispetzificadu", + "Headline Field" : "Campu de tìtulu", + "User profile Headline will be set from the specified attribute" : "Su tìtulu de su profilu de utente at a èssere cunfiguradu dae s'atributu ispetzificadu", + "Biography Field" : "Campu Biografia", + "User profile Biography will be set from the specified attribute" : "Sa biografia de su profilu de utente at a èssere cunfigurada dae s'atributu ispetzìficu", "Internal Username" : "Nùmene utente de intro", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "A manera predefinida, su nùmene utente de intro s'at a creare dae s'atributu UUID. Si segurat chi su nùmene utente siat ùnicu e chi non si depant cunvertire is caràteres. Su nùmene utente de intro permitit s'impreu de caràteres ispetzìficos: [a-zA-Z0-9_.@-]. Is àteros caràteres si cambiant cun sa currispondèntzia ASCII o non si ponent. S'in casu de cunflitu, s'agiunghet/creschet unu nùmeru. Su nùmene utente de intro s'impreat pro identificare un'utente de intro. Est puru su nùmene predefinidu pro sa cartella printzipale de s'utente. Est puru una parte de URL remotos, pro esèmpiu pro totu is servìtzios *DAV. Cun custa impostatzione, su funtzionamentu predefinidu si podet brincare. Is càmbios ant a èssere efetivos isceti in is utèntzias noas assotziadas LDAP (agiuntas). Lassa bòidu pro funtzionamentu predefinidu.", "Internal Username Attribute:" : "Atributu nùmene utente de intro:", "Override UUID detection" : "Ignora rilevada UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "A manera predefinida, s'atributu UUID si rilevat in automàticu. S'atributu UUID est impreadu pro identificare cun seguresa is utentes e grupos LDAP. In prus, su nùmene utente de intro s'at a creare basadu subra de s'UUID, si non s'ispetzìficat àteru. Podes ignorare s'impostatzione e frunire un'atributu seberadu dae te. Ti depes segurare chi s'atributu seberadu si potzat otènnere siat pro utenets siat pro grupos e chi siat ùnicu. Lassa bòidu pro funtzionamentu predefinidu. Is càmbios ant a èssere efetivos isceti pro is ùtèntzias e grupos noos LDAP assotziados (agiuntos).", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "A manera predefinida, s'atributu UUID si rilevat in automàticu. S'atributu UUID est impreadu pro identificare cun seguresa is utentes e grupos LDAP. In prus, su nùmene utente de intro s'at a creare basadu subra de s'UUID, si non s'ispetzìficat àteru. Podes ignorare sa cunfiguratzione e frunire un'atributu seberadu dae te. Ti depes segurare chi s'atributu seberadu si potzat otènnere siat pro utenets siat pro grupos e chi siat ùnicu. Lassa bòidu pro funtzionamentu predefinidu. Is càmbios ant a èssere efetivos isceti pro is ùtèntzias e grupos noos LDAP assotziados (agiuntos).", "UUID Attribute for Users:" : "Atributu UUID pro is utentes:", "UUID Attribute for Groups:" : "Atributu UUID pro is grupos:", "Username-LDAP User Mapping" : "Assòtziu Nùmene utente-Utente LDAP", "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Is nùmenes utente d'impreant pro archiviare e assignare is metadatos. Pro identificare a pretzisu e connòschere is utentes, cada utente LDAP at a tènnere unu nùmene utente de intro. Custu rechedet un'assòtziu dae nùmene utente a utente LDAP. Su nùmene utente creadu est assotziadu a s'UUID de s'utente LDAP. In prus su DN si ponet in memòria temporànea pro minimare s'interatzione cun LDAP, ma non s'impreat pro s'identificatzione. Si su DN càmbiat, is càmbios s'ant a agatare. Su nùmene utente de intro s'impreat in totue. Limpiende is assòtzios s'ant a lassare arrastos a s'at a interessare totu sa cunfiguratzione LDAP! Non limpies mai is assòtzios in un'ambiente de produtzione, ma isceti in una fase de proa o isperimentos.", "Clear Username-LDAP User Mapping" : "Lìmpia assòtziu Nùmene utente-Utente LDAP", "Clear Groupname-LDAP Group Mapping" : "Lìmpia assòtziu Nùmene de su grupu-Grupu LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "B'at àpidu un'errore de connessione a LDAP/AD, càstia su retzidore, sa porta e is credentziales.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Mancat s'elementu provisòriu\"%uid\". At a èssere cambiadu cun su nùmene de atzessu cando s'at a preguntare LDAP/AP.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Sa casella de grupu est istada disativada, ca su serbidore LDAP/AP no suportat memberOf.", - "LDAP / AD integration" : "Integratziones LDAP/AD", - "LDAP / AD Username:" : "Nùmene utente LDAP/AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Permitit s'atzessu tràmite su nùmene utente LDAP/AD, chi est o \"uid\" o \"sAMAccountName\" e at a èssere rilevadu.", - "LDAP / AD Email Address:" : "Indiritzu Posta Eletrònica LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "A manera predefinida, su nùmene utente de intro s'at a creare dae s'atributu UUID. Si segurat chi su nùmene utente siat ùnicu e chi non si depant cunvertire is caràteres. Su nùmene utente de intro permitit s'impreu de caràteres ispetzìficos: [a-zA-Z0-9_.@-]. Is àteros caràteres si càmbiant cun sa currispondèntzia ASCII o non si ponent. S'in casu de cunflitu, s'agiunghet/creschet unu nùmeru. Su nùmene utente de intro s'impreat pro identificare un'utente de intro. Est puru su nùmene predefinidu pro sa cartella printzipale de s'utente. Est puru una parte de URL remotos, pro esèmpiu pro totu is servìtzios *DAV. Cun custa impostatzione, su funtzionamentu predefinidu si podet brincare. Is càmbios ant a èssere efetivos isceti in is utèntzias noas assotziadas LDAP (agiuntas)." + "Invalid configuration. Please have a look at the logs for further details." : "Cunfiguratzione non bàlida. Càstia is registros pro detàllios in prus." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sk.js b/apps/user_ldap/l10n/sk.js index 1357c768044..0a9764a3962 100644 --- a/apps/user_ldap/l10n/sk.js +++ b/apps/user_ldap/l10n/sk.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Neplatné nastavenie: anonymné pripojenie nie je povolené.", "Valid configuration, connection established!" : "Platná konfigurácia, spojenie nadviazané!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Nastavenie je v poriadku, ale pripojenie zlyhalo. Skontrolujte nastavenia servera a prihlasovacie údaje.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurácia je chybná. Prosím, pozrite sa do logov pre ďalšie podrobnosti.", "No action specified" : "Nie je vybraná akcia", "No configuration specified" : "Nie je určená konfigurácia", "No data specified" : "Nie sú vybraté dáta", - " Could not set configuration %s" : "Nemôžem nastaviť konfiguráciu %s", + "Invalid data specified" : "Boli zadané neplatné dáta", "Action does not exist" : "Takáto akcia neexistuje", "Renewing …" : "Obnovujem...", "Very weak password" : "Veľmi slabé heslo", @@ -53,15 +52,24 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Chýba zástupný znak %uid. Bude nahradený prihlasovacím menom pri požiadavke do LDAP/AD.", "Please provide a login name to test against" : "Zadajte prihlasovacie meno na otestovanie", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Pole skupín bolo vypnuté, pretože LDAP/AD server nepodporuje memberOf.", - "Password change rejected. Hint: " : "Zmena hesla zamietnutá. Vodítko:", "Please login with the new password" : "Prihláste sa prosím novým heslom", "LDAP User backend" : "Podporná vrstva pre LDAP používateľa", "Your password will expire tomorrow." : "Vaše heslo expiruje zajtra.", "Your password will expire today." : "Vaše heslo expiruje dnes.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaše heslo expiruje o %n deň.","Vaše heslo expiruje o %n dni.","Vaše heslo expiruje o %n dní.","Vaše heslo expiruje o %n dní."], "LDAP/AD integration" : "Integrácia s LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s nájdená skupina","%s nájdené skupiny","%s nájdených skupín","%s nájdených skupín"], - "_%s user found_::_%s users found_" : ["%s nájdený používateľ","%s nájdení používatelia","%s nájdených používateľov","%s nájdených používateľov"], + "LDAP Connection" : "Pripojenie LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Pripojenie zlyhalo pre túto konfiguráciu LDAP: %s","Pripojenie zlyhalo pre %n konfigurácie LDAP: %s","Pripojenie zlyhalo pre %n konfigurácií LDAP: %s","Pripojenie zlyhalo pre %n konfigurácií LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Vyhľadávanie zlyhalo pre túto konfiguráciu LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácií LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácií LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existuje neaktívna konfigurácie LDAP: %s","Existujú %n neaktívne konfigurácie LDAP: %s","Existujú %n neaktívných konfigurácie LDAP: %s","Existujú %n neaktívných konfigurácie LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Pripojenie a vyhľadávanie funguje na nakonfigurovanom LDAP pripojení (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)"], + "Invalid LDAP UUIDs" : "Neplatné LDAP UUIDs", + "None found" : "Nenájdené", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Boli nájdené neplatné UUID účtov alebo skupín LDAP. Skontrolujte svoje nastavenia „Prepísať detekciu UUID“ v expertnej časti konfigurácie LDAP a použite „occ ldap:update-uuid“ na ich aktualizáciu.", + "_%n group found_::_%n groups found_" : ["%n nájdená skupina","%n nájdené skupiny","%n nájdených skupín","%n nájdených skupín"], + "> 1000 groups found" : "> 1000 nájdených skupín", + "> 1000 users found" : "> 1000 nájdených užívateľov", + "_%n user found_::_%n users found_" : ["%n nájdený užívateľ","%n nájdený užívatelia","%n nájdených užívateľov","%n nájdených používateľov"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nepodarilo sa zistiť atribút pre zobrazenie mena používateľa. Zadajte ho sami v rozšírených nastaveniach LDAP.", "Could not find the desired feature" : "Nemožno nájsť požadovanú funkciu", "Invalid Host" : "Neplatný hostiteľ", @@ -88,6 +96,7 @@ OC.L10N.register( "Other Attributes:" : "Iné atribúty:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definuje filter, ktorý sa použije pri pokuse o prihlásenie. „%%uid“ je nahradené používateľským menom v prihlasovacej akcii. Príklad: „uid %%uid„“", "Test Loginname" : "Testovacie prihlasovacie meno", + "Attempts to receive a DN for the given loginname and the current login filter" : "Pokusy o získanie DN pre zadané prihlasovacie meno a aktuálny filter prihlásenia.", "Verify settings" : "Overiť nastavenia", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Pridať novú konfiguráciu", @@ -151,6 +160,8 @@ OC.L10N.register( "One User Base DN per line" : "Jedna používateľská základná DN na riadok", "User Search Attributes" : "Atribúty vyhľadávania používateľov", "Optional; one attribute per line" : "Voliteľné, jeden atribút na jeden riadok", + "Disable users missing from LDAP" : "Zakázať užívateľov chýbajúcich v LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Keď je zapnuté, užívatelia ktorý nie sú importovaní z LDAP, budú zakázaní.", "Group Display Name Field" : "Pole pre zobrazenie mena skupiny", "The LDAP attribute to use to generate the groups's display name." : "Atribút LDAP použitý na vygenerovanie zobrazovaného mena skupiny.", "Base Group Tree" : "Základný skupinový strom", @@ -179,8 +190,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ak chcete použiť užívateľské meno (predvolené), nechajte prázdne. V opačnom prípade zadajte atribút LDAP/AD.", "\"$home\" Placeholder Field" : "Výplňová kolónka „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$ home bude v nastavení externého úložiska nahradená hodnotou zadaného atribútu ", + "User Profile Attributes" : "Atribúty užívateľského profilu", + "Phone Field" : "Pole pre telefón", + "User profile Phone will be set from the specified attribute" : "Telefón užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Website Field" : "Pole pre webovú stránku", + "User profile Website will be set from the specified attribute" : "Webová stránka užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Address Field" : "Pridať pole", + "User profile Address will be set from the specified attribute" : "Adresa užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Twitter Field" : "Pole Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Fediverse Field" : "Pole Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Organisation Field" : "Pole Organizácia", + "User profile Organisation will be set from the specified attribute" : "Organizácia užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Role Field" : "Pole Rola", + "User profile Role will be set from the specified attribute" : "Rola užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Headline Field" : "Pole Hlavička", + "User profile Headline will be set from the specified attribute" : "Hlavička užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Biography Field" : "Pole Životopis", + "User profile Biography will be set from the specified attribute" : "Životopis užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Birthdate Field" : "Kolónka Dátum narodenia", + "User profile Date of birth will be set from the specified attribute" : "Dátum narodenia uživateľského profilu sa nastaví zo zadaného atribútu", + "Pronouns Field" : "Kolónka Oslovenie", + "User profile Pronouns will be set from the specified attribute" : "Oslovenie uživateľského profilu sa nastaví zo zadaného atribútu", "Internal Username" : "Interné používateľské meno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "V predvolenom nastavení sa interné používateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť používateľského mena a nie je potrebné meniť znaky. Interné používateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je to tiež predvolený názov domovského priečinka používateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Nechajte prázdne ak chcete nechať predvolené nastavenie. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "V predvolenom nastavení sa interné užívateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť užívateľského mena a znaky nie je potrebné konvertovať. Interné užívateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné užívateľské meno sa používa na internú identifikáciu užívateľa. Je to tiež predvolený názov domovského priečinka užívateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP. Nechajte prázdne ak chcete nechať predvolené nastavenie.", "Internal Username Attribute:" : "Atribút interného používateľského mena:", "Override UUID detection" : "Prepísať UUID detekciu", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "V predvolenom nastavení sa atribút UUID deteguje automaticky. Atribút UUID sa používa na jednoznačnú identifikáciu používateľov a skupín z LDAPu. Naviac sa na základe UUID vytvára aj interné používateľské meno, ak nie je nastavené inak. Môžete predvolené nastavenie prepísať a použiť atribút ktorý si sami zvolíte. Musíte sa ale ubezpečiť, že atribút, ktorý vyberiete, bude uvedený pri používateľoch aj pri skupinách a bude jedinečný. Ak voľbu ponecháte prázdnu, použije sa predvolené správanie. Zmena bude mať vplyv len na novo namapovaných (pridaných) používateľov a skupiny z LDAPu.", @@ -190,13 +224,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Používateľské mená sa používajú na ukladanie a prideľovanie meta údajov. Pre presnú identifikáciu a rozpoznávanie má každý používateľ LDAP interné používateľské meno. To si vyžaduje mapovanie používateľského mena na užívateľa LDAP. Vytvorené meno používateľa je mapované na UUID používateľa LDAP. Okrem toho sa DN ukladá aj do vyrovnávacej pamäte, aby sa znížila interakcia LDAP, ale nepoužíva sa na identifikáciu. Ak sa DN zmení, zmeny sa nájdu. Interné používateľské meno sa používa všade. Vymazanie mápovania bude mať pozostatky všade. Vymazanie mapovania nie je citlivé na nastavenie, ovplyvňuje všetky nastavenia LDAP! Nikdy nemažte mapovanie vo produkčnom prostredí, ale iba v testovacej alebo experimentálnej fáze.", "Clear Username-LDAP User Mapping" : "Zrušiť mapovanie LDAP používateľských mien", "Clear Groupname-LDAP Group Mapping" : "Zrušiť mapovanie názvov LDAP skupín", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Nastala chyba pri pripojení k LDAP / AD, skontrolujte položky host, port a prihlasovacie údaje.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Chýba zástupný znak %uid. Bude nahradený prihlasovacím menom pri požiadavke do LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Pole skupín bolo vypnuté, pretože LDAP / AD server nepodporuje memberOf.", - "LDAP / AD integration" : "Spolupráca s LDAP/AD", - "LDAP / AD Username:" : "Používateľské meno LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje prihlásenie pomocou užívateľského mena LDAP/AD, ktoré je buď „uid“ alebo „sAMAccountName“ a bude zistené.", - "LDAP / AD Email Address:" : "LDAP / AD emailová adresa:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "V predvolenom nastavení sa interné používateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť používateľského mena a nie je potrebné meniť znaky. Interné používateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je to tiež predvolený názov domovského priečinka používateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Nechajte prázdne ak chcete nechať predvolené nastavenie. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurácia je chybná. Prosím, pozrite sa do logov pre ďalšie podrobnosti." }, "nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/user_ldap/l10n/sk.json b/apps/user_ldap/l10n/sk.json index 66408813e4c..8ff68e5a466 100644 --- a/apps/user_ldap/l10n/sk.json +++ b/apps/user_ldap/l10n/sk.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Neplatné nastavenie: anonymné pripojenie nie je povolené.", "Valid configuration, connection established!" : "Platná konfigurácia, spojenie nadviazané!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Nastavenie je v poriadku, ale pripojenie zlyhalo. Skontrolujte nastavenia servera a prihlasovacie údaje.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurácia je chybná. Prosím, pozrite sa do logov pre ďalšie podrobnosti.", "No action specified" : "Nie je vybraná akcia", "No configuration specified" : "Nie je určená konfigurácia", "No data specified" : "Nie sú vybraté dáta", - " Could not set configuration %s" : "Nemôžem nastaviť konfiguráciu %s", + "Invalid data specified" : "Boli zadané neplatné dáta", "Action does not exist" : "Takáto akcia neexistuje", "Renewing …" : "Obnovujem...", "Very weak password" : "Veľmi slabé heslo", @@ -51,15 +50,24 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Chýba zástupný znak %uid. Bude nahradený prihlasovacím menom pri požiadavke do LDAP/AD.", "Please provide a login name to test against" : "Zadajte prihlasovacie meno na otestovanie", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Pole skupín bolo vypnuté, pretože LDAP/AD server nepodporuje memberOf.", - "Password change rejected. Hint: " : "Zmena hesla zamietnutá. Vodítko:", "Please login with the new password" : "Prihláste sa prosím novým heslom", "LDAP User backend" : "Podporná vrstva pre LDAP používateľa", "Your password will expire tomorrow." : "Vaše heslo expiruje zajtra.", "Your password will expire today." : "Vaše heslo expiruje dnes.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Vaše heslo expiruje o %n deň.","Vaše heslo expiruje o %n dni.","Vaše heslo expiruje o %n dní.","Vaše heslo expiruje o %n dní."], "LDAP/AD integration" : "Integrácia s LDAP/AD", - "_%s group found_::_%s groups found_" : ["%s nájdená skupina","%s nájdené skupiny","%s nájdených skupín","%s nájdených skupín"], - "_%s user found_::_%s users found_" : ["%s nájdený používateľ","%s nájdení používatelia","%s nájdených používateľov","%s nájdených používateľov"], + "LDAP Connection" : "Pripojenie LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Pripojenie zlyhalo pre túto konfiguráciu LDAP: %s","Pripojenie zlyhalo pre %n konfigurácie LDAP: %s","Pripojenie zlyhalo pre %n konfigurácií LDAP: %s","Pripojenie zlyhalo pre %n konfigurácií LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Vyhľadávanie zlyhalo pre túto konfiguráciu LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácie LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácií LDAP: %s","Vyhľadávanie zlyhalo pre %n konfigurácií LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Existuje neaktívna konfigurácie LDAP: %s","Existujú %n neaktívne konfigurácie LDAP: %s","Existujú %n neaktívných konfigurácie LDAP: %s","Existujú %n neaktívných konfigurácie LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Pripojenie a vyhľadávanie funguje na nakonfigurovanom LDAP pripojení (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)","Pripojenie a vyhľadávanie funguje na všetkých %n nakonfigurovaných LDAP pripojeniach (%s)"], + "Invalid LDAP UUIDs" : "Neplatné LDAP UUIDs", + "None found" : "Nenájdené", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Boli nájdené neplatné UUID účtov alebo skupín LDAP. Skontrolujte svoje nastavenia „Prepísať detekciu UUID“ v expertnej časti konfigurácie LDAP a použite „occ ldap:update-uuid“ na ich aktualizáciu.", + "_%n group found_::_%n groups found_" : ["%n nájdená skupina","%n nájdené skupiny","%n nájdených skupín","%n nájdených skupín"], + "> 1000 groups found" : "> 1000 nájdených skupín", + "> 1000 users found" : "> 1000 nájdených užívateľov", + "_%n user found_::_%n users found_" : ["%n nájdený užívateľ","%n nájdený užívatelia","%n nájdených užívateľov","%n nájdených používateľov"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nepodarilo sa zistiť atribút pre zobrazenie mena používateľa. Zadajte ho sami v rozšírených nastaveniach LDAP.", "Could not find the desired feature" : "Nemožno nájsť požadovanú funkciu", "Invalid Host" : "Neplatný hostiteľ", @@ -86,6 +94,7 @@ "Other Attributes:" : "Iné atribúty:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definuje filter, ktorý sa použije pri pokuse o prihlásenie. „%%uid“ je nahradené používateľským menom v prihlasovacej akcii. Príklad: „uid %%uid„“", "Test Loginname" : "Testovacie prihlasovacie meno", + "Attempts to receive a DN for the given loginname and the current login filter" : "Pokusy o získanie DN pre zadané prihlasovacie meno a aktuálny filter prihlásenia.", "Verify settings" : "Overiť nastavenia", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Pridať novú konfiguráciu", @@ -149,6 +158,8 @@ "One User Base DN per line" : "Jedna používateľská základná DN na riadok", "User Search Attributes" : "Atribúty vyhľadávania používateľov", "Optional; one attribute per line" : "Voliteľné, jeden atribút na jeden riadok", + "Disable users missing from LDAP" : "Zakázať užívateľov chýbajúcich v LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Keď je zapnuté, užívatelia ktorý nie sú importovaní z LDAP, budú zakázaní.", "Group Display Name Field" : "Pole pre zobrazenie mena skupiny", "The LDAP attribute to use to generate the groups's display name." : "Atribút LDAP použitý na vygenerovanie zobrazovaného mena skupiny.", "Base Group Tree" : "Základný skupinový strom", @@ -177,8 +188,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Ak chcete použiť užívateľské meno (predvolené), nechajte prázdne. V opačnom prípade zadajte atribút LDAP/AD.", "\"$home\" Placeholder Field" : "Výplňová kolónka „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$ home bude v nastavení externého úložiska nahradená hodnotou zadaného atribútu ", + "User Profile Attributes" : "Atribúty užívateľského profilu", + "Phone Field" : "Pole pre telefón", + "User profile Phone will be set from the specified attribute" : "Telefón užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Website Field" : "Pole pre webovú stránku", + "User profile Website will be set from the specified attribute" : "Webová stránka užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Address Field" : "Pridať pole", + "User profile Address will be set from the specified attribute" : "Adresa užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Twitter Field" : "Pole Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Fediverse Field" : "Pole Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Organisation Field" : "Pole Organizácia", + "User profile Organisation will be set from the specified attribute" : "Organizácia užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Role Field" : "Pole Rola", + "User profile Role will be set from the specified attribute" : "Rola užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Headline Field" : "Pole Hlavička", + "User profile Headline will be set from the specified attribute" : "Hlavička užívateľského profilu bude nastavená zo špecifikovaného atribútu.", + "Biography Field" : "Pole Životopis", + "User profile Biography will be set from the specified attribute" : "Životopis užívateľského profilu bude nastavený zo špecifikovaného atribútu.", + "Birthdate Field" : "Kolónka Dátum narodenia", + "User profile Date of birth will be set from the specified attribute" : "Dátum narodenia uživateľského profilu sa nastaví zo zadaného atribútu", + "Pronouns Field" : "Kolónka Oslovenie", + "User profile Pronouns will be set from the specified attribute" : "Oslovenie uživateľského profilu sa nastaví zo zadaného atribútu", "Internal Username" : "Interné používateľské meno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "V predvolenom nastavení sa interné používateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť používateľského mena a nie je potrebné meniť znaky. Interné používateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je to tiež predvolený názov domovského priečinka používateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Nechajte prázdne ak chcete nechať predvolené nastavenie. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "V predvolenom nastavení sa interné užívateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť užívateľského mena a znaky nie je potrebné konvertovať. Interné užívateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné užívateľské meno sa používa na internú identifikáciu užívateľa. Je to tiež predvolený názov domovského priečinka užívateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP. Nechajte prázdne ak chcete nechať predvolené nastavenie.", "Internal Username Attribute:" : "Atribút interného používateľského mena:", "Override UUID detection" : "Prepísať UUID detekciu", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "V predvolenom nastavení sa atribút UUID deteguje automaticky. Atribút UUID sa používa na jednoznačnú identifikáciu používateľov a skupín z LDAPu. Naviac sa na základe UUID vytvára aj interné používateľské meno, ak nie je nastavené inak. Môžete predvolené nastavenie prepísať a použiť atribút ktorý si sami zvolíte. Musíte sa ale ubezpečiť, že atribút, ktorý vyberiete, bude uvedený pri používateľoch aj pri skupinách a bude jedinečný. Ak voľbu ponecháte prázdnu, použije sa predvolené správanie. Zmena bude mať vplyv len na novo namapovaných (pridaných) používateľov a skupiny z LDAPu.", @@ -188,13 +222,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Používateľské mená sa používajú na ukladanie a prideľovanie meta údajov. Pre presnú identifikáciu a rozpoznávanie má každý používateľ LDAP interné používateľské meno. To si vyžaduje mapovanie používateľského mena na užívateľa LDAP. Vytvorené meno používateľa je mapované na UUID používateľa LDAP. Okrem toho sa DN ukladá aj do vyrovnávacej pamäte, aby sa znížila interakcia LDAP, ale nepoužíva sa na identifikáciu. Ak sa DN zmení, zmeny sa nájdu. Interné používateľské meno sa používa všade. Vymazanie mápovania bude mať pozostatky všade. Vymazanie mapovania nie je citlivé na nastavenie, ovplyvňuje všetky nastavenia LDAP! Nikdy nemažte mapovanie vo produkčnom prostredí, ale iba v testovacej alebo experimentálnej fáze.", "Clear Username-LDAP User Mapping" : "Zrušiť mapovanie LDAP používateľských mien", "Clear Groupname-LDAP Group Mapping" : "Zrušiť mapovanie názvov LDAP skupín", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Nastala chyba pri pripojení k LDAP / AD, skontrolujte položky host, port a prihlasovacie údaje.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Chýba zástupný znak %uid. Bude nahradený prihlasovacím menom pri požiadavke do LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Pole skupín bolo vypnuté, pretože LDAP / AD server nepodporuje memberOf.", - "LDAP / AD integration" : "Spolupráca s LDAP/AD", - "LDAP / AD Username:" : "Používateľské meno LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Umožňuje prihlásenie pomocou užívateľského mena LDAP/AD, ktoré je buď „uid“ alebo „sAMAccountName“ a bude zistené.", - "LDAP / AD Email Address:" : "LDAP / AD emailová adresa:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "V predvolenom nastavení sa interné používateľské meno vytvorí z atribútu UUID. Zabezpečuje jedinečnosť používateľského mena a nie je potrebné meniť znaky. Interné používateľské meno má obmedzenia, ktoré povoľujú iba tieto znaky: [a-zA-Z0-9 _. @ -]. Ostatné znaky sa nahradia zodpovedajúcimi znakmi ASCII alebo sa jednoducho vynechajú. Pri konfliktoch bude pridané/zvýšené číslo. Interné používateľské meno sa používa na internú identifikáciu používateľa. Je to tiež predvolený názov domovského priečinka používateľa. Je tiež súčasťou URL, napríklad pre všetky služby * DAV. Týmto nastavením môže byť predvolené správanie zmenené. Nechajte prázdne ak chcete nechať predvolené nastavenie. Zmeny majú vplyv iba na novo namapovaných (pridaných) užívateľov LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurácia je chybná. Prosím, pozrite sa do logov pre ďalšie podrobnosti." },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sl.js b/apps/user_ldap/l10n/sl.js index bb9857d4a01..5edb617e5b1 100644 --- a/apps/user_ldap/l10n/sl.js +++ b/apps/user_ldap/l10n/sl.js @@ -6,11 +6,10 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Neveljavne nastavitve: brezimne vezi niso dovoljene.", "Valid configuration, connection established!" : "Veljavne nastavitve: povezava je vzpostavljena!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Veljavne nastavitve, a je povezava vseeno spodletela: preverite nastavitve strežnika in poverila.", - "Invalid configuration. Please have a look at the logs for further details." : "Neveljavne nastavitve: za več podrobnosti si oglejte dnevniške zapise.", "No action specified" : "Ni določenega dejanja", "No configuration specified" : "Ni določenih nastavitev", "No data specified" : "Ni navedenih podatkov", - " Could not set configuration %s" : "Ni mogoče uveljaviti nastavitev %s", + "Invalid data specified" : "Določeni so neveljavni podatki", "Action does not exist" : "Dejanje ne obstaja", "Renewing …" : "Poteka ponastavljanje ...", "Very weak password" : "Zelo šibko geslo", @@ -53,15 +52,16 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manjka vsebnik »ID %u«. Zamenjan bo z uporabniškim imenom pri poizvedbah LDAP / AD.", "Please provide a login name to test against" : "Vpisati je treba uporabniško ime za preizkus", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Skupina je onemogočena, ker na strežniku LDAP / AD ni omogočena podpora atributu memberOf.", - "Password change rejected. Hint: " : "Spreminjanje gesla je zavrnjeno. Namig: ", "Please login with the new password" : "Prijavite se z novim geslom", "LDAP User backend" : "Uporabniška povezava LDAP", "Your password will expire tomorrow." : "Vaše geslo bo jutri poteklo.", "Your password will expire today." : "Geslo vam poteče danes!", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Geslo bo poteklo čez %n dan.","Geslo bo poteklo čez %n dneva","Geslo bo poteklo čez %n dni.","Geslo bo poteklo čez %n dni."], "LDAP/AD integration" : "Združevalnik za LDAP / AD", - "_%s group found_::_%s groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], - "_%s user found_::_%s users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], + "_%n group found_::_%n groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], + "> 1000 groups found" : "> 1000 najdenih skupin", + "> 1000 users found" : "> 1000 najdenih uporabnikov", + "_%n user found_::_%n users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Ni mogoče zaznati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", "Could not find the desired feature" : "Želene zmožnosti ni mogoče najti", "Invalid Host" : "Neveljaven gostitelj", @@ -179,8 +179,10 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pustite prazno za uporabniško ime (privzeto), sicer navedite atribut LDAP/AD.", "\"$home\" Placeholder Field" : "Polje vsebnika »$home«", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Vrednost »$home« bo znotraj nastavitev zunanje shrambe zamenjaj z vrednostjo določenega atributa.", + "User Profile Attributes" : "Atributi profila uporabnika", + "Phone Field" : "Polje številke telefona", "Internal Username" : "Programsko uporabniško ime", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notrajne uporabniško ime ima določeno omejitev uporabe izključno znakov [a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzetega sistema prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP. Za privzeto delovanje mora biti polje prazno.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notranje uporabniško ime ima določeno omejitev uporabe izključno znakov [a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami, ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzetega sistema prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP. Za privzeto delovanje mora biti polje prazno.", "Internal Username Attribute:" : "Programski atribut uporabniškega imena:", "Override UUID detection" : "Prezri zaznavo UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Privzeto je atribut UUID samodejno zaznan. Uporabljen je za določevanje uporabnikov LDAP in skupin. Notranje uporabniško ime je določeno prav na atributu UUID, če ni določeno drugače. To nastavitev je mogoče prepisati in poslati poljuben atribut. Zagotoviti je treba le, da je ta pridobljen kot enolični podatek za uporabnika ali skupino. Prazno polje določa privzeti način. Spremembe bodo vplivale na novo preslikane (dodane) uporabnike LDAP in skupine.", @@ -190,13 +192,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Uporabniška imena se uporabljajo za shranjevanje in dodeljevanje metapodatkov. Za natančno določevanje uporabnikov je vsakemu uporabniku LDAP preslikano tudi notranje uporabniško ime in sicer na UUID uporabnika LDAP. Poleg tega se enoznačno ime DN shrani tudi v predpomnilnik, da se zmanjša število poslanih zahtevkov na strežnik, a se to ne uporablja za določevanje. Če se enoznačno ime spremeni, bodo usrezno usklajene tudi spremembe. Notranje uporabniško ime se sicer uporablja na več mestih, zato je pričakovati, da ostanejo pri čiščenju preslikav nepovezani podatki. To brisanje ne vpliva upošteva ravni nastavitev, ampak deluje na vse nastavitve LDAP! Preslikav ni nikoli piporočljivo počistiti v produkcijskem okolju, je pa to mogoče v preizkusnem. ", "Clear Username-LDAP User Mapping" : "Izbriši preslikavo uporabniškega imena na LDAP", "Clear Groupname-LDAP Group Mapping" : "Izbriši preslikavo skupine na LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Prišlo je do napake povezave z LDAP / AD. Preverite podatke o gostitelju, vratih in poverilih.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Manjka vsebnik »%uid«. Zamenjan bo z uporabniškim imenom pri poizvedbah LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupina je onemogočena, ker na strežniku LDAP / AD ni omogočena podpora atributu memberOf.", - "LDAP / AD integration" : "Združevalnik za LDAP / AD", - "LDAP / AD Username:" : "Uporabniško ime LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Omogoča prijavo prek uporabniškega imena LDAP / AD, ki je ali »UID« ali ime računa »sAMAccountName«, ki bo zaznano.", - "LDAP / AD Email Address:" : "Elektronski naslov LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notrajne uporabniško ime ima določeno omejitev uporabe izključno znakov [ a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzet sistem prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Neveljavne nastavitve: za več podrobnosti si oglejte dnevniške zapise." }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/user_ldap/l10n/sl.json b/apps/user_ldap/l10n/sl.json index 1fb1444d8d8..1c3c57768b9 100644 --- a/apps/user_ldap/l10n/sl.json +++ b/apps/user_ldap/l10n/sl.json @@ -4,11 +4,10 @@ "Invalid configuration: Anonymous binding is not allowed." : "Neveljavne nastavitve: brezimne vezi niso dovoljene.", "Valid configuration, connection established!" : "Veljavne nastavitve: povezava je vzpostavljena!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Veljavne nastavitve, a je povezava vseeno spodletela: preverite nastavitve strežnika in poverila.", - "Invalid configuration. Please have a look at the logs for further details." : "Neveljavne nastavitve: za več podrobnosti si oglejte dnevniške zapise.", "No action specified" : "Ni določenega dejanja", "No configuration specified" : "Ni določenih nastavitev", "No data specified" : "Ni navedenih podatkov", - " Could not set configuration %s" : "Ni mogoče uveljaviti nastavitev %s", + "Invalid data specified" : "Določeni so neveljavni podatki", "Action does not exist" : "Dejanje ne obstaja", "Renewing …" : "Poteka ponastavljanje ...", "Very weak password" : "Zelo šibko geslo", @@ -51,15 +50,16 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manjka vsebnik »ID %u«. Zamenjan bo z uporabniškim imenom pri poizvedbah LDAP / AD.", "Please provide a login name to test against" : "Vpisati je treba uporabniško ime za preizkus", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Skupina je onemogočena, ker na strežniku LDAP / AD ni omogočena podpora atributu memberOf.", - "Password change rejected. Hint: " : "Spreminjanje gesla je zavrnjeno. Namig: ", "Please login with the new password" : "Prijavite se z novim geslom", "LDAP User backend" : "Uporabniška povezava LDAP", "Your password will expire tomorrow." : "Vaše geslo bo jutri poteklo.", "Your password will expire today." : "Geslo vam poteče danes!", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Geslo bo poteklo čez %n dan.","Geslo bo poteklo čez %n dneva","Geslo bo poteklo čez %n dni.","Geslo bo poteklo čez %n dni."], "LDAP/AD integration" : "Združevalnik za LDAP / AD", - "_%s group found_::_%s groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], - "_%s user found_::_%s users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], + "_%n group found_::_%n groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], + "> 1000 groups found" : "> 1000 najdenih skupin", + "> 1000 users found" : "> 1000 najdenih uporabnikov", + "_%n user found_::_%n users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Ni mogoče zaznati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", "Could not find the desired feature" : "Želene zmožnosti ni mogoče najti", "Invalid Host" : "Neveljaven gostitelj", @@ -177,8 +177,10 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Pustite prazno za uporabniško ime (privzeto), sicer navedite atribut LDAP/AD.", "\"$home\" Placeholder Field" : "Polje vsebnika »$home«", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Vrednost »$home« bo znotraj nastavitev zunanje shrambe zamenjaj z vrednostjo določenega atributa.", + "User Profile Attributes" : "Atributi profila uporabnika", + "Phone Field" : "Polje številke telefona", "Internal Username" : "Programsko uporabniško ime", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notrajne uporabniško ime ima določeno omejitev uporabe izključno znakov [a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzetega sistema prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP. Za privzeto delovanje mora biti polje prazno.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notranje uporabniško ime ima določeno omejitev uporabe izključno znakov [a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami, ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzetega sistema prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP. Za privzeto delovanje mora biti polje prazno.", "Internal Username Attribute:" : "Programski atribut uporabniškega imena:", "Override UUID detection" : "Prezri zaznavo UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Privzeto je atribut UUID samodejno zaznan. Uporabljen je za določevanje uporabnikov LDAP in skupin. Notranje uporabniško ime je določeno prav na atributu UUID, če ni določeno drugače. To nastavitev je mogoče prepisati in poslati poljuben atribut. Zagotoviti je treba le, da je ta pridobljen kot enolični podatek za uporabnika ali skupino. Prazno polje določa privzeti način. Spremembe bodo vplivale na novo preslikane (dodane) uporabnike LDAP in skupine.", @@ -188,13 +190,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Uporabniška imena se uporabljajo za shranjevanje in dodeljevanje metapodatkov. Za natančno določevanje uporabnikov je vsakemu uporabniku LDAP preslikano tudi notranje uporabniško ime in sicer na UUID uporabnika LDAP. Poleg tega se enoznačno ime DN shrani tudi v predpomnilnik, da se zmanjša število poslanih zahtevkov na strežnik, a se to ne uporablja za določevanje. Če se enoznačno ime spremeni, bodo usrezno usklajene tudi spremembe. Notranje uporabniško ime se sicer uporablja na več mestih, zato je pričakovati, da ostanejo pri čiščenju preslikav nepovezani podatki. To brisanje ne vpliva upošteva ravni nastavitev, ampak deluje na vse nastavitve LDAP! Preslikav ni nikoli piporočljivo počistiti v produkcijskem okolju, je pa to mogoče v preizkusnem. ", "Clear Username-LDAP User Mapping" : "Izbriši preslikavo uporabniškega imena na LDAP", "Clear Groupname-LDAP Group Mapping" : "Izbriši preslikavo skupine na LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Prišlo je do napake povezave z LDAP / AD. Preverite podatke o gostitelju, vratih in poverilih.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Manjka vsebnik »%uid«. Zamenjan bo z uporabniškim imenom pri poizvedbah LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupina je onemogočena, ker na strežniku LDAP / AD ni omogočena podpora atributu memberOf.", - "LDAP / AD integration" : "Združevalnik za LDAP / AD", - "LDAP / AD Username:" : "Uporabniško ime LDAP / AD:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Omogoča prijavo prek uporabniškega imena LDAP / AD, ki je ali »UID« ali ime računa »sAMAccountName«, ki bo zaznano.", - "LDAP / AD Email Address:" : "Elektronski naslov LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Privzeto je notranje uporabniško ime ustvarjeno po atributu UUID. To zagotavlja, da je uporabniško ime enkratno in da znakov ni treba posebej pretvarjati. Notrajne uporabniško ime ima določeno omejitev uporabe izključno znakov [ a-zA-Z0-9_.@- ]. Vsi drugi znaki so zamenjani z ustreznimi ASCII zamenjavami ali pa so enostavno izpuščeni. V primeru spora je k imenu dodana še številka. Notranje uporabniško ime je namenjeno določitvi istovetnosti in je hkrati tudi privzeto ime uporabnikove osebne mape. Je tudi del oddaljenega naslova URL, na primer za vse storitve *DAV. Ta možnost nastavitve privzet sistem prepiše, spremembe pa se uveljavijo le za na novo dodane (preslikane) uporabnike LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Neveljavne nastavitve: za več podrobnosti si oglejte dnevniške zapise." },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js index f385bd9ec8d..8c45bd37c00 100644 --- a/apps/user_ldap/l10n/sq.js +++ b/apps/user_ldap/l10n/sq.js @@ -6,11 +6,9 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Konfigurim i pavlefshëm: Lidhja anonim nuk është e lejueshme.", "Valid configuration, connection established!" : "Konfigurim i vlefshëm, lidhja u krijuar!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigurime të vlefshme, por lidhja dështoi. Ju lutem kontrolloni konfigurimet dhe kredencialet e serverit.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurime të pavlefshme. Ju lutem shikoni hyrjet për detaje të mëtejshme.", "No action specified" : "S’është treguar veprim", "No configuration specified" : "S’u dha formësim", "No data specified" : "S’u treguan të dhëna", - " Could not set configuration %s" : "S’vuri dot në punë formësimin %s", "Action does not exist" : "Veprimi s’ekziston", "Renewing …" : "Duke rinovuar...", "Very weak password" : "Fjalëkalim shumë i dobët", @@ -49,13 +47,10 @@ OC.L10N.register( "An unspecified error occurred. Please check log and settings." : "Një gabim i pa specifikuar ndodhi. Ju lutem kontrolloni hyrjet dhe konfigurimet.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtri i kërkimit është i pavlefshëm, ndoshta për shkak problemesh sintakse, të tillë si një numër jo i njëjtë kllpash të hapura dhe mbyllura. Ju lutemi, rishikojeni.", "Please provide a login name to test against" : "Ju lutemi, jepni një emër hyrjesh që të ritestohet", - "Password change rejected. Hint: " : "Ndryshimi i fjalëkalimit u refuzua. Informatë:", "Please login with the new password" : "Ju lutem kyçuni me fjalëkalimin e ri", "Your password will expire tomorrow." : "Fjalëkalimi juaj do të skadojë nesër", "Your password will expire today." : "Fjalëkalimi juaj do të skadojë sot.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Fjalëkalimi juaj do të skadojë brenad %n ditëve","Fjalëkalimi juaj do të skadojë brenad %n ditëve"], - "_%s group found_::_%s groups found_" : ["U gjet %s grup","U gjetën %s grupe"], - "_%s user found_::_%s users found_" : ["U gjet %s përdorues","U gjetën %s përdorues"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nuk mund të zbulohej atributi i emrit të ekranit të përdoruesit. Ju lutemi specifikoni vetë në avancë parametrat e LDAP.", "Could not find the desired feature" : "S’u gjet dot veçoria e dëshiruar", "Invalid Host" : "Strehë e Pavlefshme", @@ -171,12 +166,6 @@ OC.L10N.register( "Username-LDAP User Mapping" : "Përshoqërim Emër përdoruesi-Përdorues LDAP", "Clear Username-LDAP User Mapping" : "Pastro Përshoqërimin Emër përdoruesi-Përdorues LDAP", "Clear Groupname-LDAP Group Mapping" : "Pastro Përshoqërimin Emër grupi-Grup LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ndodhi një gabim lidhje te LDAP / AD, ju lutemi, kontrolloni strehën, portën dhe kredencialet.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Vendi \"%uis\" po mungon. Do të zëvendësohet me emrin e identifikimit kur të kërkohet LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kutia e grupeve u çaktivizua, ngaqë shërbyesi LDAP / AD nuk mbulon memberOf.", - "LDAP / AD integration" : "Integrimi LDAP / AD", - "LDAP / AD Username:" : "Emër përdoruesi LDAP / AD:", - "LDAP / AD Email Address:" : "Adresë Email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Në paracaktim, emri i brendshëm i përdoruesit do të krijohet nga atributi UUID. Sigurohuni që emri i përdoruesit është unik dhe karakteret nuk kanë nevojë të konvertohen. Emri i përdoruesit të brendshëm ka kufizim që lejohen vetëm këto karaktere: [a-zA-Z0-9 _. @ -]. Karaktere të tjera zëvendësohen me korrespondencën e tyre ASCII ose thjesht hiqen. Për goditjet një numër do të shtohet / rritet. Emri i brendshëm përdoret për të identifikuar një përdorues brenda. Është gjithashtu emri i parazgjedhur për dosjen e përdoruesit në shtëpi. Është gjithashtu një pjesë e URL-ve të largëta, për shembull për të gjitha shërbimet * DAV. Me këtë cilësim, sjellja e parazgjedhur mund të fshihet. Lëreni bosh për sjelljen e paracaktuar. Ndryshimet do të kenë efekt vetëm në përdoruesit e sapo hartuar (shtuar) LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurime të pavlefshme. Ju lutem shikoni hyrjet për detaje të mëtejshme." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json index ab890b29181..aa6123c6a9c 100644 --- a/apps/user_ldap/l10n/sq.json +++ b/apps/user_ldap/l10n/sq.json @@ -4,11 +4,9 @@ "Invalid configuration: Anonymous binding is not allowed." : "Konfigurim i pavlefshëm: Lidhja anonim nuk është e lejueshme.", "Valid configuration, connection established!" : "Konfigurim i vlefshëm, lidhja u krijuar!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Konfigurime të vlefshme, por lidhja dështoi. Ju lutem kontrolloni konfigurimet dhe kredencialet e serverit.", - "Invalid configuration. Please have a look at the logs for further details." : "Konfigurime të pavlefshme. Ju lutem shikoni hyrjet për detaje të mëtejshme.", "No action specified" : "S’është treguar veprim", "No configuration specified" : "S’u dha formësim", "No data specified" : "S’u treguan të dhëna", - " Could not set configuration %s" : "S’vuri dot në punë formësimin %s", "Action does not exist" : "Veprimi s’ekziston", "Renewing …" : "Duke rinovuar...", "Very weak password" : "Fjalëkalim shumë i dobët", @@ -47,13 +45,10 @@ "An unspecified error occurred. Please check log and settings." : "Një gabim i pa specifikuar ndodhi. Ju lutem kontrolloni hyrjet dhe konfigurimet.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtri i kërkimit është i pavlefshëm, ndoshta për shkak problemesh sintakse, të tillë si një numër jo i njëjtë kllpash të hapura dhe mbyllura. Ju lutemi, rishikojeni.", "Please provide a login name to test against" : "Ju lutemi, jepni një emër hyrjesh që të ritestohet", - "Password change rejected. Hint: " : "Ndryshimi i fjalëkalimit u refuzua. Informatë:", "Please login with the new password" : "Ju lutem kyçuni me fjalëkalimin e ri", "Your password will expire tomorrow." : "Fjalëkalimi juaj do të skadojë nesër", "Your password will expire today." : "Fjalëkalimi juaj do të skadojë sot.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Fjalëkalimi juaj do të skadojë brenad %n ditëve","Fjalëkalimi juaj do të skadojë brenad %n ditëve"], - "_%s group found_::_%s groups found_" : ["U gjet %s grup","U gjetën %s grupe"], - "_%s user found_::_%s users found_" : ["U gjet %s përdorues","U gjetën %s përdorues"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Nuk mund të zbulohej atributi i emrit të ekranit të përdoruesit. Ju lutemi specifikoni vetë në avancë parametrat e LDAP.", "Could not find the desired feature" : "S’u gjet dot veçoria e dëshiruar", "Invalid Host" : "Strehë e Pavlefshme", @@ -169,12 +164,6 @@ "Username-LDAP User Mapping" : "Përshoqërim Emër përdoruesi-Përdorues LDAP", "Clear Username-LDAP User Mapping" : "Pastro Përshoqërimin Emër përdoruesi-Përdorues LDAP", "Clear Groupname-LDAP Group Mapping" : "Pastro Përshoqërimin Emër grupi-Grup LDAP", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ndodhi një gabim lidhje te LDAP / AD, ju lutemi, kontrolloni strehën, portën dhe kredencialet.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Vendi \"%uis\" po mungon. Do të zëvendësohet me emrin e identifikimit kur të kërkohet LDAP / AD.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kutia e grupeve u çaktivizua, ngaqë shërbyesi LDAP / AD nuk mbulon memberOf.", - "LDAP / AD integration" : "Integrimi LDAP / AD", - "LDAP / AD Username:" : "Emër përdoruesi LDAP / AD:", - "LDAP / AD Email Address:" : "Adresë Email LDAP / AD:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Në paracaktim, emri i brendshëm i përdoruesit do të krijohet nga atributi UUID. Sigurohuni që emri i përdoruesit është unik dhe karakteret nuk kanë nevojë të konvertohen. Emri i përdoruesit të brendshëm ka kufizim që lejohen vetëm këto karaktere: [a-zA-Z0-9 _. @ -]. Karaktere të tjera zëvendësohen me korrespondencën e tyre ASCII ose thjesht hiqen. Për goditjet një numër do të shtohet / rritet. Emri i brendshëm përdoret për të identifikuar një përdorues brenda. Është gjithashtu emri i parazgjedhur për dosjen e përdoruesit në shtëpi. Është gjithashtu një pjesë e URL-ve të largëta, për shembull për të gjitha shërbimet * DAV. Me këtë cilësim, sjellja e parazgjedhur mund të fshihet. Lëreni bosh për sjelljen e paracaktuar. Ndryshimet do të kenë efekt vetëm në përdoruesit e sapo hartuar (shtuar) LDAP." + "Invalid configuration. Please have a look at the logs for further details." : "Konfigurime të pavlefshme. Ju lutem shikoni hyrjet për detaje të mëtejshme." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js index 1544382d3f2..4d4ef42ffba 100644 --- a/apps/user_ldap/l10n/sr.js +++ b/apps/user_ldap/l10n/sr.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Неисправна конфигурација: Анонимно везивање није дозвољено.", "Valid configuration, connection established!" : "Исправна конфигурација, веза успостављена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Исправна конфигурација, али везивање није успело. Проверите поставке сервера и акредитиве.", - "Invalid configuration. Please have a look at the logs for further details." : "Неисправна конфигурација. Погледајте дневник за више детаља.", + "Invalid configuration: %s" : "Неисправна конфигурације: %s", "No action specified" : "Није наведена радња", "No configuration specified" : "Није наведена постава", "No data specified" : "Нису наведени подаци", - " Could not set configuration %s" : "Нисам могао да подесим конфигурацију %s", + "Invalid data specified" : "Наведени су неисправни подаци", + "Could not set configuration %1$s to %2$s" : "Конфигурација %1$s није могла да се постави на %2$s", "Action does not exist" : "Радња не постоји", "Renewing …" : "Обнављам …", "Very weak password" : "Веома слаба лозинка", @@ -49,15 +50,36 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Размислите и да смањите претрагу, пошто обухвата много корисника, од којих ће само први моћи да се пријави.", "An unspecified error occurred. Please check log and settings." : "Десила се непозната грешка. Погледајте дневник и подешавања.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Филтер претраге је неисправан, вероватно због синтаксе попут неједнаког броја отворених и затворених заграда. Проверите.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Дошло је до грешко приликом повезивања на LDAP/AD. Молимо вас да проверите хост, порт и креденцијале.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Недостаје „%uid” чувар места. Замениће се именом за пријаву када се буде вршио упит LDAP/AD.", "Please provide a login name to test against" : "Наведите пријавно име за тест са", - "Password change rejected. Hint: " : "Промена лозинке није прихваћена. Смерница:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Кутија групе је искључена јер LDAP/AD сервер не подржава memberOf.", + "Password change rejected. Hint: %s" : "Промена лозинке није прихваћена. Савет: %s", + "Mandatory field \"%s\" left empty" : "Обавезно поље „%s” је остављено празно", + "A password is given, but not an LDAP agent" : "Лозинка је наведена, али LDAP агент није", + "No password is given for the user agent" : "Није наведена ниједна лозинка за корисничког агента", + "No LDAP base DN was given" : "Није наведен ниједан LDAP базни DN", + "User base DN is not a subnode of global base DN" : "Корисников базни DN није подчвор глобалног базног DN", + "Group base DN is not a subnode of global base DN" : "Базни DN групе није подчвор глобалног базног DN", + "Login filter does not contain %s placeholder." : "Филтер пријаве не садржи %s чувар места", "Please login with the new password" : "Пријавите се са новом лозинком", "LDAP User backend" : "LDAP позадина за кориснике", "Your password will expire tomorrow." : "Ваша лозинка ће истећи сутра.", "Your password will expire today." : "Ваша лозинка ће истећи данас.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ваша лозинка ће истећи за %n дан.","Ваша лозинка ће истећи за %n дана.","Ваша лозинка ће истећи за %n дана."], - "_%s group found_::_%s groups found_" : ["нађена %s група","нађене %s групе","Нађено %s група"], - "_%s user found_::_%s users found_" : ["нађен %s корисник","нађена %s корисника","Нађено %s корисника"], + "LDAP/AD integration" : "LDAP/AD интеграција", + "LDAP Connection" : "LDAP веза", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Није успело везивање за ову LDAP конфигурацију: %s","Није успело везивање за %n LDAP конфигурације: %s","Није успело везивање за %n LDAP конфигурација: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Није успела претрага за ову LDAP конфигурацију: %s","Није успела претрага за %n LDAP конфигурације: %s","Није успела претрага за %n LDAP конфигурација: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Постоји неактивна LDAP конфигурација: %s","Постоје %n неактивне LDAP конфигурације: %s","Постоји %n неактивних LDAP конфигурација: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Везивање и претрага функционишу на конфигурисаној LDAP вези (%s)","Везивање и претрага функционишу на свих %n конфигурисаних LDAP веза (%s)","Везивање и претрага функционишу на свих %n конфигурисаних LDAP веза (%s)"], + "Invalid LDAP UUIDs" : "Неисправни LDAP UUID идентификатори", + "None found" : "Није пронађен ниједан", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Пронађени су неисправни UUID бројеви LDAP налога или група. Молимо вас да ревидирате своја „Премости UUID детекцију\" подешавања у Експерт делу LDAP конфигурације и употребите „occ ldap:update-uuid” да их ажурирате.", + "_%n group found_::_%n groups found_" : ["пронађена је %n група","пронађене су %n групе","пронађено је %n група"], + "> 1000 groups found" : "пронађено је >1000 група", + "> 1000 users found" : "пронаћено је > 1000 корисника", + "_%n user found_::_%n users found_" : ["пронађен је %n корисник","пронађено је %n корисника","пронађено је %n корисника"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не могу да пронађем атрибут имена за приказ корисника. Молимо сами га наведите у LDAP напредним подешавањима.", "Could not find the desired feature" : "Не могу да пронађем жељену особину", "Invalid Host" : "Неисправан домаћин", @@ -77,10 +99,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Филтер прецизира које ће LDAP групе требају имати приступ %s случају.", "Verify settings and count the groups" : "Верификуј поставке и преброј групе", "When logging in, %s will find the user based on the following attributes:" : "При пријављивању, %s ће пронаћи корисника на основу следећих атрибута:", + "LDAP/AD Username:" : "LDAP/AD корисничко име:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Омогућава пријаву према LDAP/AD корисничком имену, што је или „uid” или „sAMAccountName” и детектоваће се.", + "LDAP/AD Email Address:" : "LDAP/AD и-мејл адреса:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Дозволи пријављивање преко атрибута адресе е-поште. „mail“ и „mailPrimaryAddress“ су дозвољени.", "Other Attributes:" : "Остали атрибути:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Дефинише филтер који ће се применити, када се покуша пријава. „%%uid“ замењује корисничко име у пријави. Пример: „uid=%%uid“", "Test Loginname" : "Испробај име за пријаву", + "Attempts to receive a DN for the given loginname and the current login filter" : "Покушава да прими Име домена за наведено име пријаве и текући филтер пријаве", "Verify settings" : "Провери поставке", "%s. Server:" : "%s. Сервер:", "Add a new configuration" : "Додај нову поставку", @@ -144,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "Један Корисников јединствени назив DN по линији", "User Search Attributes" : "Параметри претраге корисника", "Optional; one attribute per line" : "Опционо; један параметар по линији", + "Disable users missing from LDAP" : "Искључи кориниске којих нема у LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Када је укључено, корисници који се увезу из LDAP па онда недостају ће се искључити", "Group Display Name Field" : "Име приказа групе", "The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.", "Base Group Tree" : "Стабло основне групе", @@ -172,7 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.", "\"$home\" Placeholder Field" : "Резервисано место за поље „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home ће се у подешавању спољног складишта заменити са вредношћу задатог атрибута", + "User Profile Attributes" : "Атрибути корисничког профила", + "Phone Field" : "Поље телефона", + "User profile Phone will be set from the specified attribute" : "Телефон корисничког профила ће се поставити из наведеног атрибута", + "Website Field" : "Поље веб сајта", + "User profile Website will be set from the specified attribute" : "Веб сајт корисничког профила ће се поставити из наведеног атрибута", + "Address Field" : "Поље адресе", + "User profile Address will be set from the specified attribute" : "Адреса корисничког профила ће се поставити из наведеног атрибута", + "Twitter Field" : "Twitter поље", + "User profile Twitter will be set from the specified attribute" : "Twitter налог корисничког профила ће се поставити из наведеног атрибута", + "Fediverse Field" : "Fediverse поље", + "User profile Fediverse will be set from the specified attribute" : "Fediverse налог корисничког профила ће се поставити из наведеног атрибута", + "Organisation Field" : "Поље организације", + "User profile Organisation will be set from the specified attribute" : "Организација корисничког профила ће се поставити из наведеног атрибута", + "Role Field" : "Поље улоге", + "User profile Role will be set from the specified attribute" : "Улога корисничког профила ће се поставити из наведеног атрибута", + "Headline Field" : "Поље насловне линије", + "User profile Headline will be set from the specified attribute" : "Насловна линија корисничког профила ће се поставити из наведеног атрибута", + "Biography Field" : "Поље биографије", + "User profile Biography will be set from the specified attribute" : "Биографија корисничког профила ће се поставити из наведеног атрибута", + "Birthdate Field" : "Пође рођендана", + "User profile Date of birth will be set from the specified attribute" : "Датум рођења за кориснички профил ће да се постави из наведеног атрибута", + "Pronouns Field" : "Поље заменица", + "User profile Pronouns will be set from the specified attribute" : "Заменице корисничког профила ће се поставити из наведеног атрибута", "Internal Username" : "Интерно корисничко име:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Интерно име ће се подразумевано креирати из UUID атрибута. Тако се обезбеђује да је корисничко име јединствено и да нема потребе да се карактери конвертују. Интерно корисничко име је ограничено тако да су дозвољени само следећи карактери: [a-zA-Z0-9_.@-]. Остали карактери ће се заменити својим одговарајућим ASCII карактерима или ће се једноставно изоставити. У случају колизија, дописаће се/увећати број. Интерно корисничко име се користи да се корисник интерно идентификује. То је такође и подразумевано име за коринсиков почетни фолдер. Такође је део удаљених URL адреса, на пример за све DAV сервисе. Овим подешавањем је могуће преиначење подразумеваног понашања. Измене ће ступити на снагу само за ново мапиране (додате) LDAP кориснике. Оставите празно ако желите подразумевано понашање.", "Internal Username Attribute:" : "Интерни параметри корисничког имена:", "Override UUID detection" : "Прескочи UUID откривање", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Подразумевано, атрибут UUID се аутоматски детектује. Атрибут UUID се користи за сигурну идентификацију LDAP корисника и група. Такође, локално корисничко име ће бити креирано на основу UUID-a, ако није другачије назначено. Можете заобићи поставке и проследити други атрибут по вашем избору. Морате бити сигурни да је изабрани атрибут јединствен и да га корисници и групе могу преносити. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.", @@ -182,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Корисничка имена се користи за чување и додељивање метаподатака. Да би се прецизно идентификовали и препознавали кориснике, сваки LDAP корисник ће имати локално корисничко име. Ово захтева мапирање од корисничког имена до LDAP корисника. Креирано корисничко име се мапира у UUID LDAP корисника. Поред тога, DN се кешира да смањи LDAP интеракцију, али се не користи за идентификацију. Ако се DN мења, промене се могу наћи. Локално корисничко име се користи свуда. Чишћење мапирања оставља свуда остатке. Чишћење мапирања није осетљиво на конфигурацију, оно утиче на све LDAP конфигурације! Никада не користит чишћење мапирања у радном окружењу, већ само у тестирању или експерименталној фази.", "Clear Username-LDAP User Mapping" : "Очисти Username-LDAP мапирање корисника", "Clear Groupname-LDAP Group Mapping" : "Очисти Groupname-LDAP мапирање група", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Дошло је до грешке LDAP / AD везе. Проверите домаћина, порт и акредитиве.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "„%uid“ резервисано поље недостаје. Биће замењено са корисничким именом када се ради упит над LDAP / AD-ом.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Поље групе је искључено јер LDAP / AD сервер не подржава припадност групи.", - "LDAP / AD integration" : "LDAP / AD интеграција", - "LDAP / AD Username:" : "LDAP / AD корисничко име:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Дозволи пријављивање преко LDAP / AD корисничког имена, које је или „uid“ или „sAMAccountName“ и биће детектовано.", - "LDAP / AD Email Address:" : "LDAP / AD адреса е-поште:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Подразумевано се интерно корисничко име креира од UUID атрибута. Тиме се гарантује да се корисничко име јединствено и да карактери не морају да се конвертују. Интерно корисничко име има ограничења да су дозвољени само следећи карактери: [ a-zA-Z0-9_.@- ]. Остали карактери ће или бити замењени ASCII еквивалентима или ће бити прескочени. Ако се деси поклапање са постојећим корисничким именом, додаће се број на крај имена. Интерно корисничко име се користи да идентификује корисника интерно. Такође се користи и као подразумевано име за име корисничку фасцикле, а и део је удаљених адреса, нпр. свих *DAV сервиса. Уз помоћ овог подешавања, може да се промени подразумевано понашање. Оставите га празним за подразумевано понашање. Промене ће се тицати само новомапираних (додатих) LDAP корисника." + "Invalid configuration. Please have a look at the logs for further details." : "Неисправна конфигурација. Погледајте дневник за више детаља." }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json index 55c5d5a0bd8..d2c8defd599 100644 --- a/apps/user_ldap/l10n/sr.json +++ b/apps/user_ldap/l10n/sr.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Неисправна конфигурација: Анонимно везивање није дозвољено.", "Valid configuration, connection established!" : "Исправна конфигурација, веза успостављена!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Исправна конфигурација, али везивање није успело. Проверите поставке сервера и акредитиве.", - "Invalid configuration. Please have a look at the logs for further details." : "Неисправна конфигурација. Погледајте дневник за више детаља.", + "Invalid configuration: %s" : "Неисправна конфигурације: %s", "No action specified" : "Није наведена радња", "No configuration specified" : "Није наведена постава", "No data specified" : "Нису наведени подаци", - " Could not set configuration %s" : "Нисам могао да подесим конфигурацију %s", + "Invalid data specified" : "Наведени су неисправни подаци", + "Could not set configuration %1$s to %2$s" : "Конфигурација %1$s није могла да се постави на %2$s", "Action does not exist" : "Радња не постоји", "Renewing …" : "Обнављам …", "Very weak password" : "Веома слаба лозинка", @@ -47,15 +48,36 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Размислите и да смањите претрагу, пошто обухвата много корисника, од којих ће само први моћи да се пријави.", "An unspecified error occurred. Please check log and settings." : "Десила се непозната грешка. Погледајте дневник и подешавања.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Филтер претраге је неисправан, вероватно због синтаксе попут неједнаког броја отворених и затворених заграда. Проверите.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Дошло је до грешко приликом повезивања на LDAP/AD. Молимо вас да проверите хост, порт и креденцијале.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Недостаје „%uid” чувар места. Замениће се именом за пријаву када се буде вршио упит LDAP/AD.", "Please provide a login name to test against" : "Наведите пријавно име за тест са", - "Password change rejected. Hint: " : "Промена лозинке није прихваћена. Смерница:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Кутија групе је искључена јер LDAP/AD сервер не подржава memberOf.", + "Password change rejected. Hint: %s" : "Промена лозинке није прихваћена. Савет: %s", + "Mandatory field \"%s\" left empty" : "Обавезно поље „%s” је остављено празно", + "A password is given, but not an LDAP agent" : "Лозинка је наведена, али LDAP агент није", + "No password is given for the user agent" : "Није наведена ниједна лозинка за корисничког агента", + "No LDAP base DN was given" : "Није наведен ниједан LDAP базни DN", + "User base DN is not a subnode of global base DN" : "Корисников базни DN није подчвор глобалног базног DN", + "Group base DN is not a subnode of global base DN" : "Базни DN групе није подчвор глобалног базног DN", + "Login filter does not contain %s placeholder." : "Филтер пријаве не садржи %s чувар места", "Please login with the new password" : "Пријавите се са новом лозинком", "LDAP User backend" : "LDAP позадина за кориснике", "Your password will expire tomorrow." : "Ваша лозинка ће истећи сутра.", "Your password will expire today." : "Ваша лозинка ће истећи данас.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ваша лозинка ће истећи за %n дан.","Ваша лозинка ће истећи за %n дана.","Ваша лозинка ће истећи за %n дана."], - "_%s group found_::_%s groups found_" : ["нађена %s група","нађене %s групе","Нађено %s група"], - "_%s user found_::_%s users found_" : ["нађен %s корисник","нађена %s корисника","Нађено %s корисника"], + "LDAP/AD integration" : "LDAP/AD интеграција", + "LDAP Connection" : "LDAP веза", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Није успело везивање за ову LDAP конфигурацију: %s","Није успело везивање за %n LDAP конфигурације: %s","Није успело везивање за %n LDAP конфигурација: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Није успела претрага за ову LDAP конфигурацију: %s","Није успела претрага за %n LDAP конфигурације: %s","Није успела претрага за %n LDAP конфигурација: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Постоји неактивна LDAP конфигурација: %s","Постоје %n неактивне LDAP конфигурације: %s","Постоји %n неактивних LDAP конфигурација: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Везивање и претрага функционишу на конфигурисаној LDAP вези (%s)","Везивање и претрага функционишу на свих %n конфигурисаних LDAP веза (%s)","Везивање и претрага функционишу на свих %n конфигурисаних LDAP веза (%s)"], + "Invalid LDAP UUIDs" : "Неисправни LDAP UUID идентификатори", + "None found" : "Није пронађен ниједан", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Пронађени су неисправни UUID бројеви LDAP налога или група. Молимо вас да ревидирате своја „Премости UUID детекцију\" подешавања у Експерт делу LDAP конфигурације и употребите „occ ldap:update-uuid” да их ажурирате.", + "_%n group found_::_%n groups found_" : ["пронађена је %n група","пронађене су %n групе","пронађено је %n група"], + "> 1000 groups found" : "пронађено је >1000 група", + "> 1000 users found" : "пронаћено је > 1000 корисника", + "_%n user found_::_%n users found_" : ["пронађен је %n корисник","пронађено је %n корисника","пронађено је %n корисника"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не могу да пронађем атрибут имена за приказ корисника. Молимо сами га наведите у LDAP напредним подешавањима.", "Could not find the desired feature" : "Не могу да пронађем жељену особину", "Invalid Host" : "Неисправан домаћин", @@ -75,10 +97,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Филтер прецизира које ће LDAP групе требају имати приступ %s случају.", "Verify settings and count the groups" : "Верификуј поставке и преброј групе", "When logging in, %s will find the user based on the following attributes:" : "При пријављивању, %s ће пронаћи корисника на основу следећих атрибута:", + "LDAP/AD Username:" : "LDAP/AD корисничко име:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Омогућава пријаву према LDAP/AD корисничком имену, што је или „uid” или „sAMAccountName” и детектоваће се.", + "LDAP/AD Email Address:" : "LDAP/AD и-мејл адреса:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Дозволи пријављивање преко атрибута адресе е-поште. „mail“ и „mailPrimaryAddress“ су дозвољени.", "Other Attributes:" : "Остали атрибути:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Дефинише филтер који ће се применити, када се покуша пријава. „%%uid“ замењује корисничко име у пријави. Пример: „uid=%%uid“", "Test Loginname" : "Испробај име за пријаву", + "Attempts to receive a DN for the given loginname and the current login filter" : "Покушава да прими Име домена за наведено име пријаве и текући филтер пријаве", "Verify settings" : "Провери поставке", "%s. Server:" : "%s. Сервер:", "Add a new configuration" : "Додај нову поставку", @@ -142,6 +168,8 @@ "One User Base DN per line" : "Један Корисников јединствени назив DN по линији", "User Search Attributes" : "Параметри претраге корисника", "Optional; one attribute per line" : "Опционо; један параметар по линији", + "Disable users missing from LDAP" : "Искључи кориниске којих нема у LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Када је укључено, корисници који се увезу из LDAP па онда недостају ће се искључити", "Group Display Name Field" : "Име приказа групе", "The LDAP attribute to use to generate the groups's display name." : "LDAP параметар за формирање имена за приказ група.", "Base Group Tree" : "Стабло основне групе", @@ -170,7 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Оставите празно за корисничко име (подразумевано). У супротном, наведите особину LDAP/AD.", "\"$home\" Placeholder Field" : "Резервисано место за поље „$home“", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home ће се у подешавању спољног складишта заменити са вредношћу задатог атрибута", + "User Profile Attributes" : "Атрибути корисничког профила", + "Phone Field" : "Поље телефона", + "User profile Phone will be set from the specified attribute" : "Телефон корисничког профила ће се поставити из наведеног атрибута", + "Website Field" : "Поље веб сајта", + "User profile Website will be set from the specified attribute" : "Веб сајт корисничког профила ће се поставити из наведеног атрибута", + "Address Field" : "Поље адресе", + "User profile Address will be set from the specified attribute" : "Адреса корисничког профила ће се поставити из наведеног атрибута", + "Twitter Field" : "Twitter поље", + "User profile Twitter will be set from the specified attribute" : "Twitter налог корисничког профила ће се поставити из наведеног атрибута", + "Fediverse Field" : "Fediverse поље", + "User profile Fediverse will be set from the specified attribute" : "Fediverse налог корисничког профила ће се поставити из наведеног атрибута", + "Organisation Field" : "Поље организације", + "User profile Organisation will be set from the specified attribute" : "Организација корисничког профила ће се поставити из наведеног атрибута", + "Role Field" : "Поље улоге", + "User profile Role will be set from the specified attribute" : "Улога корисничког профила ће се поставити из наведеног атрибута", + "Headline Field" : "Поље насловне линије", + "User profile Headline will be set from the specified attribute" : "Насловна линија корисничког профила ће се поставити из наведеног атрибута", + "Biography Field" : "Поље биографије", + "User profile Biography will be set from the specified attribute" : "Биографија корисничког профила ће се поставити из наведеног атрибута", + "Birthdate Field" : "Пође рођендана", + "User profile Date of birth will be set from the specified attribute" : "Датум рођења за кориснички профил ће да се постави из наведеног атрибута", + "Pronouns Field" : "Поље заменица", + "User profile Pronouns will be set from the specified attribute" : "Заменице корисничког профила ће се поставити из наведеног атрибута", "Internal Username" : "Интерно корисничко име:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Интерно име ће се подразумевано креирати из UUID атрибута. Тако се обезбеђује да је корисничко име јединствено и да нема потребе да се карактери конвертују. Интерно корисничко име је ограничено тако да су дозвољени само следећи карактери: [a-zA-Z0-9_.@-]. Остали карактери ће се заменити својим одговарајућим ASCII карактерима или ће се једноставно изоставити. У случају колизија, дописаће се/увећати број. Интерно корисничко име се користи да се корисник интерно идентификује. То је такође и подразумевано име за коринсиков почетни фолдер. Такође је део удаљених URL адреса, на пример за све DAV сервисе. Овим подешавањем је могуће преиначење подразумеваног понашања. Измене ће ступити на снагу само за ново мапиране (додате) LDAP кориснике. Оставите празно ако желите подразумевано понашање.", "Internal Username Attribute:" : "Интерни параметри корисничког имена:", "Override UUID detection" : "Прескочи UUID откривање", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Подразумевано, атрибут UUID се аутоматски детектује. Атрибут UUID се користи за сигурну идентификацију LDAP корисника и група. Такође, локално корисничко име ће бити креирано на основу UUID-a, ако није другачије назначено. Можете заобићи поставке и проследити други атрибут по вашем избору. Морате бити сигурни да је изабрани атрибут јединствен и да га корисници и групе могу преносити. Оставите празно за подразумевано понашање. Промене ће имати дејство само на новомапираним (доданим) LDAP корисницима и групама.", @@ -180,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Корисничка имена се користи за чување и додељивање метаподатака. Да би се прецизно идентификовали и препознавали кориснике, сваки LDAP корисник ће имати локално корисничко име. Ово захтева мапирање од корисничког имена до LDAP корисника. Креирано корисничко име се мапира у UUID LDAP корисника. Поред тога, DN се кешира да смањи LDAP интеракцију, али се не користи за идентификацију. Ако се DN мења, промене се могу наћи. Локално корисничко име се користи свуда. Чишћење мапирања оставља свуда остатке. Чишћење мапирања није осетљиво на конфигурацију, оно утиче на све LDAP конфигурације! Никада не користит чишћење мапирања у радном окружењу, већ само у тестирању или експерименталној фази.", "Clear Username-LDAP User Mapping" : "Очисти Username-LDAP мапирање корисника", "Clear Groupname-LDAP Group Mapping" : "Очисти Groupname-LDAP мапирање група", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Дошло је до грешке LDAP / AD везе. Проверите домаћина, порт и акредитиве.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "„%uid“ резервисано поље недостаје. Биће замењено са корисничким именом када се ради упит над LDAP / AD-ом.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Поље групе је искључено јер LDAP / AD сервер не подржава припадност групи.", - "LDAP / AD integration" : "LDAP / AD интеграција", - "LDAP / AD Username:" : "LDAP / AD корисничко име:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Дозволи пријављивање преко LDAP / AD корисничког имена, које је или „uid“ или „sAMAccountName“ и биће детектовано.", - "LDAP / AD Email Address:" : "LDAP / AD адреса е-поште:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Подразумевано се интерно корисничко име креира од UUID атрибута. Тиме се гарантује да се корисничко име јединствено и да карактери не морају да се конвертују. Интерно корисничко име има ограничења да су дозвољени само следећи карактери: [ a-zA-Z0-9_.@- ]. Остали карактери ће или бити замењени ASCII еквивалентима или ће бити прескочени. Ако се деси поклапање са постојећим корисничким именом, додаће се број на крај имена. Интерно корисничко име се користи да идентификује корисника интерно. Такође се користи и као подразумевано име за име корисничку фасцикле, а и део је удаљених адреса, нпр. свих *DAV сервиса. Уз помоћ овог подешавања, може да се промени подразумевано понашање. Оставите га празним за подразумевано понашање. Промене ће се тицати само новомапираних (додатих) LDAP корисника." + "Invalid configuration. Please have a look at the logs for further details." : "Неисправна конфигурација. Погледајте дневник за више детаља." },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sr@latin.js b/apps/user_ldap/l10n/sr@latin.js deleted file mode 100644 index 7769a4b6bda..00000000000 --- a/apps/user_ldap/l10n/sr@latin.js +++ /dev/null @@ -1,14 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Server" : "Server", - "Users" : "Korisnici", - "Groups" : "Grupe", - "Help" : "Pomoć", - "Host" : "Računar", - "Port" : "Port", - "Password" : "Lozinka", - "Continue" : "Nastavi", - "Advanced" : "Napredno" -}, -"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_ldap/l10n/sr@latin.json b/apps/user_ldap/l10n/sr@latin.json deleted file mode 100644 index ad4492827f7..00000000000 --- a/apps/user_ldap/l10n/sr@latin.json +++ /dev/null @@ -1,12 +0,0 @@ -{ "translations": { - "Server" : "Server", - "Users" : "Korisnici", - "Groups" : "Grupe", - "Help" : "Pomoć", - "Host" : "Računar", - "Port" : "Port", - "Password" : "Lozinka", - "Continue" : "Nastavi", - "Advanced" : "Napredno" -},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/su.js b/apps/user_ldap/l10n/su.js deleted file mode 100644 index 5494dcae62e..00000000000 --- a/apps/user_ldap/l10n/su.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/su.json b/apps/user_ldap/l10n/su.json deleted file mode 100644 index 75f0f056cc4..00000000000 --- a/apps/user_ldap/l10n/su.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js index 6048151ac39..67024534e36 100644 --- a/apps/user_ldap/l10n/sv.js +++ b/apps/user_ldap/l10n/sv.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Ogiltig konfiguration: Anonym bindning är inte tillåten.", "Valid configuration, connection established!" : "Giltig konfiguration, anslutning upprättad!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Giltig konfiguration, men bindning misslyckades. Vänligen kontrollera uppgifter och serverinställningarna.", - "Invalid configuration. Please have a look at the logs for further details." : "Ogiltig konfiguration. Vänligen undersök loggar för mer detaljer.", - "No action specified" : "Ingen åtgärd har angetts", + "Invalid configuration: %s" : "Ogiltig konfiguration: %s", + "No action specified" : "Ingen funktion har angetts", "No configuration specified" : "Ingen konfiguration har angetts", "No data specified" : "Inga data har angetts", - " Could not set configuration %s" : "Kunde inte sätta inställning %s", + "Invalid data specified" : "Ogiltig data har angetts", + "Could not set configuration %1$s to %2$s" : "Kunde inte ställa in konfigurationen %1$s till %2$s", "Action does not exist" : "Åtgärd finns inte", "Renewing …" : "Förnyar ...", "Very weak password" : "Väldigt svagt lösenord", @@ -49,15 +50,36 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Överväg att specificera din sökning eftersom den resulterade i många användare och bara den första kommer att kunna logga in.", "An unspecified error occurred. Please check log and settings." : "Ett ospecificerat fel inträffade. Vänligen kontrollera loggen och inställningarna.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Sökfiltret är ogiltigt, troligen på grund av syntaxproblem som ojämnt antal öppna och slutna klamrar. Vänligen granska.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ett anslutningsfel till LDAP/AD uppstod. Kontrollera server, port och inloggningsuppgifter.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%uid\"-platshållaren saknas. Den kommer att ersättas med inloggningsnamn när LDAP/AD efterfrågas.", "Please provide a login name to test against" : "Ange ett inloggningsnamn att försöka ansluta med", - "Password change rejected. Hint: " : "Lösenordsbyte nekad. Anledning/tips: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Grupprutan inaktiverades eftersom LDAP/AD-servern inte stöder memberOf.", + "Password change rejected. Hint: %s" : "Lösenordsändring avvisad. Anledning/tips: %s", + "Mandatory field \"%s\" left empty" : "Obligatoriskt fält \"%s\" lämnad tom", + "A password is given, but not an LDAP agent" : "Ett lösenord har angetts, men ingen LDAP-agent", + "No password is given for the user agent" : "Inget lösenord har angetts för användaragenten", + "No LDAP base DN was given" : "Ingen LDAP-base DN har angetts", + "User base DN is not a subnode of global base DN" : "Användarens base DN är inte en undernod till den globala base DN", + "Group base DN is not a subnode of global base DN" : "Gruppens base DN är inte en undernod till den globala base DN", + "Login filter does not contain %s placeholder." : "Inloggningsfiltret innehåller inte %s platshållare.", "Please login with the new password" : "Vänligen logga in med det nya lösenordet", "LDAP User backend" : "LDAP användarbackend", "Your password will expire tomorrow." : "Ditt lösenord kommer att gå ut imorgon.", "Your password will expire today." : "Ditt lösenord kommer att gå ut idag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ditt lösenord kommer gå ut inom %n dag.","Ditt lösenord kommer gå ut inom %n dagar."], - "_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"], - "_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"], + "LDAP/AD integration" : "LDAP/AD-integration", + "LDAP Connection" : "LDAP-anslutning", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindning misslyckades för denna LDAP-konfiguration: %s","Bindning misslyckades för %n LDAP-konfigurationer: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Sökning misslyckades för denna LDAP-konfiguration: %s","Sökning misslyckades för %n LDAP-konfigurationer: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Det finns en inaktiv LDAP-konfiguration: %s","Det finns %n inaktiva LDAP-konfigurationer: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindning och sökning fungerar på den konfigurerade LDAP-anslutningen (%s)","Bindning och sökning fungerar på alla %n konfigurerade LDAP-anslutningar (%s)"], + "Invalid LDAP UUIDs" : "Ogiltiga LDAP UUIDs", + "None found" : "Ingen hittades", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ogiltiga UUID för LDAP-användare eller -grupper har hittats. Granska dina \"Åsidosätt UUID-detektering\"-inställningar i expertdelen av LDAP-konfigurationen och använd \"occ ldap:update-uuid\" för att uppdatera dem.", + "_%n group found_::_%n groups found_" : ["%n grupp hittades","%n grupper hittades"], + "> 1000 groups found" : "> 1000 grupper hittades", + "> 1000 users found" : "> 1000 användare hittades", + "_%n user found_::_%n users found_" : ["%n användare hittades","%n användare hittades"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunde inte upptäcka ditt visningsnamnsattribut. Vänligen specificera det själv i avancerade inställningar för LDAP.", "Could not find the desired feature" : "Det gick inte hitta den önskade funktionen", "Invalid Host" : "Felaktig värd", @@ -77,10 +99,14 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtret specificerar vilka LDAD-grupper som ska ha åtkomst till %s instans", "Verify settings and count the groups" : "Verifiera inställningar och räkna grupperna", "When logging in, %s will find the user based on the following attributes:" : "Vid inloggning, %s kan hitta användaren baserat på följande attribut:", + "LDAP/AD Username:" : "LDAP/AD Användarnamn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillåter inloggning med LDAP/AD-användarnamn, som antingen är \"uid\" eller \"sAMAccountName\" vilket kommer att upptäckas.", + "LDAP/AD Email Address:" : "LDAP/AD E-postadress:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillåter inloggning mot ett e-post-attribut. \"mail\" och \"mailPrimaryAddress\" tillåtna.", "Other Attributes:" : "Övriga attribut:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definierar filtret som ska appliceras vid inloggningsförsök. \"%%uid\" ersätter användarnamnet i inloggningshändelsen. Exempel: \"uid=%%uid\"", "Test Loginname" : "Testa inloggningsnamn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Försöker att få ett DN för det angivna inloggningsnamnet och det aktuella inloggningsfiltret", "Verify settings" : "Verifiera inställningar", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Lägg till en ny konfiguration", @@ -139,11 +165,13 @@ OC.L10N.register( "User Display Name Field" : "Attribut för användarnamn", "The LDAP attribute to use to generate the user's display name." : "LDAP-attributet som ska användas för att generera användarens visningsnamn.", "2nd User Display Name Field" : "2:a Visningsnamns Fält", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Frivilligt. Ett LDAP-attribut att läggas till visningsnamnet i parentes. Resulterar i t.ex. »John Doe (john.doe@example.org)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Frivilligt. Ett LDAP-attribut att läggas till visningsnamnet i parentes. Resulterar i t.ex. \"John Doe (john.doe@example.org)\".", "Base User Tree" : "Bas för användare i katalogtjänst", "One User Base DN per line" : "En användarstart-DN per rad", "User Search Attributes" : "Användarsökningsattribut", "Optional; one attribute per line" : "Valfritt; ett attribut per rad", + "Disable users missing from LDAP" : "Inaktivera användare som saknas via LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "När aktiverad kommer användare som importerats från LDAP som sedan saknas att inaktiveras", "Group Display Name Field" : "Attribut för gruppnamn", "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.", "Base Group Tree" : "Bas för grupper i katalogtjänst", @@ -172,7 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.", "\"$home\" Placeholder Field" : "\"$home\" Platshållare-fält", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet", + "User Profile Attributes" : "Användarprofilattribut", + "Phone Field" : "Telefon", + "User profile Phone will be set from the specified attribute" : "Telefon i användarprofilen kommer att ställas in från det angivna attributet", + "Website Field" : "Webbplats", + "User profile Website will be set from the specified attribute" : "Webbplats i användarprofilen kommer att ställas in från det angivna attributet", + "Address Field" : "Adress", + "User profile Address will be set from the specified attribute" : "Adress i användarprofilen kommer att ställas in från det angivna attributet", + "Twitter Field" : "Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter i användarprofilen kommer att ställas in från det angivna attributet", + "Fediverse Field" : "Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse i användarprofilen kommer att ställas in från det angivna attributet", + "Organisation Field" : "Organisation", + "User profile Organisation will be set from the specified attribute" : "Organisation i användarprofilen kommer att ställas in från det angivna attributet", + "Role Field" : "Roll", + "User profile Role will be set from the specified attribute" : "Roll i användarprofilen kommer att ställas in från det angivna attributet", + "Headline Field" : "Rubrik", + "User profile Headline will be set from the specified attribute" : "Rubrik i användarprofilen kommer att ställas in från det angivna attributet", + "Biography Field" : "Biografi", + "User profile Biography will be set from the specified attribute" : "Biografi i användarprofilen kommer att ställas in från det angivna attributet", + "Birthdate Field" : "Fält för födelsedatum", + "User profile Date of birth will be set from the specified attribute" : "Födelsedatum i användarprofilen kommer att ställas in från det angivna attributet", + "Pronouns Field" : "Fält för pronomen", + "User profile Pronouns will be set from the specified attribute" : "Pronomen i användarprofilen kommer att ställas in från det angivna attributet", "Internal Username" : "Internt användarnamn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa webbadresser, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare. Lämna tomt för standardbeteende.", "Internal Username Attribute:" : "Internt användarnamnsattribut:", "Override UUID detection" : "Åsidosätt UUID-detektion", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.", @@ -182,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Användarnamn används för att lagra och tilldela metadata. För att exakt identifiera användare har varje LDAP-användare ett internt användarnamn. Detta kräver en mappning från användarnamn till LDAP-användare. Det skapade användarnamnet är mappat till UUID för LDAP-användaren. Dessutom cachas DN för att minska LDAP-interaktion, men den används inte för identifiering. Om DN ändras kommer ändringarna att hittas. Det interna användarnamnet används på nytt. Att rensa mappningarna kommer att ha rester överallt. Att rensa mappningarna är inte konfigurationskänsligt, det påverkar alla LDAP-konfigurationer! Rensa aldrig mappningarna i en produktionsmiljö, bara i en test- eller experimentfas.", "Clear Username-LDAP User Mapping" : "Rensa användarnamn-LDAP användarmappning", "Clear Groupname-LDAP Group Mapping" : "Rensa gruppnamn-LDAP gruppmappning", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ett anslutningsfel till LDAP / AD uppstod. Granska värd, port och inloggningsuppgifter.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : " \"%uid\"-platshållaren saknas. Den kommer bli ersatt med inloggningsnamn när LDAP / AD efterfrågas.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Grupplådan var inaktiverat eftersom LDAP/AD-servern inte stödjer memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP / AD Användarnamn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillåter inloggning mot LDAP / AD-användarnamn, vilket är antingen \"uid\" eller \"sAMAccountName\" och kommer att upptäckas.", - "LDAP / AD Email Address:" : "LDAP / AD E-postadress:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa webbadresser, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare." + "Invalid configuration. Please have a look at the logs for further details." : "Ogiltig konfiguration. Vänligen undersök loggar för mer detaljer." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json index b8e7ca43ef2..d8f95dc5c97 100644 --- a/apps/user_ldap/l10n/sv.json +++ b/apps/user_ldap/l10n/sv.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Ogiltig konfiguration: Anonym bindning är inte tillåten.", "Valid configuration, connection established!" : "Giltig konfiguration, anslutning upprättad!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Giltig konfiguration, men bindning misslyckades. Vänligen kontrollera uppgifter och serverinställningarna.", - "Invalid configuration. Please have a look at the logs for further details." : "Ogiltig konfiguration. Vänligen undersök loggar för mer detaljer.", - "No action specified" : "Ingen åtgärd har angetts", + "Invalid configuration: %s" : "Ogiltig konfiguration: %s", + "No action specified" : "Ingen funktion har angetts", "No configuration specified" : "Ingen konfiguration har angetts", "No data specified" : "Inga data har angetts", - " Could not set configuration %s" : "Kunde inte sätta inställning %s", + "Invalid data specified" : "Ogiltig data har angetts", + "Could not set configuration %1$s to %2$s" : "Kunde inte ställa in konfigurationen %1$s till %2$s", "Action does not exist" : "Åtgärd finns inte", "Renewing …" : "Förnyar ...", "Very weak password" : "Väldigt svagt lösenord", @@ -47,15 +48,36 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Överväg att specificera din sökning eftersom den resulterade i många användare och bara den första kommer att kunna logga in.", "An unspecified error occurred. Please check log and settings." : "Ett ospecificerat fel inträffade. Vänligen kontrollera loggen och inställningarna.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Sökfiltret är ogiltigt, troligen på grund av syntaxproblem som ojämnt antal öppna och slutna klamrar. Vänligen granska.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Ett anslutningsfel till LDAP/AD uppstod. Kontrollera server, port och inloggningsuppgifter.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%uid\"-platshållaren saknas. Den kommer att ersättas med inloggningsnamn när LDAP/AD efterfrågas.", "Please provide a login name to test against" : "Ange ett inloggningsnamn att försöka ansluta med", - "Password change rejected. Hint: " : "Lösenordsbyte nekad. Anledning/tips: ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Grupprutan inaktiverades eftersom LDAP/AD-servern inte stöder memberOf.", + "Password change rejected. Hint: %s" : "Lösenordsändring avvisad. Anledning/tips: %s", + "Mandatory field \"%s\" left empty" : "Obligatoriskt fält \"%s\" lämnad tom", + "A password is given, but not an LDAP agent" : "Ett lösenord har angetts, men ingen LDAP-agent", + "No password is given for the user agent" : "Inget lösenord har angetts för användaragenten", + "No LDAP base DN was given" : "Ingen LDAP-base DN har angetts", + "User base DN is not a subnode of global base DN" : "Användarens base DN är inte en undernod till den globala base DN", + "Group base DN is not a subnode of global base DN" : "Gruppens base DN är inte en undernod till den globala base DN", + "Login filter does not contain %s placeholder." : "Inloggningsfiltret innehåller inte %s platshållare.", "Please login with the new password" : "Vänligen logga in med det nya lösenordet", "LDAP User backend" : "LDAP användarbackend", "Your password will expire tomorrow." : "Ditt lösenord kommer att gå ut imorgon.", "Your password will expire today." : "Ditt lösenord kommer att gå ut idag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ditt lösenord kommer gå ut inom %n dag.","Ditt lösenord kommer gå ut inom %n dagar."], - "_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"], - "_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"], + "LDAP/AD integration" : "LDAP/AD-integration", + "LDAP Connection" : "LDAP-anslutning", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bindning misslyckades för denna LDAP-konfiguration: %s","Bindning misslyckades för %n LDAP-konfigurationer: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Sökning misslyckades för denna LDAP-konfiguration: %s","Sökning misslyckades för %n LDAP-konfigurationer: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Det finns en inaktiv LDAP-konfiguration: %s","Det finns %n inaktiva LDAP-konfigurationer: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Bindning och sökning fungerar på den konfigurerade LDAP-anslutningen (%s)","Bindning och sökning fungerar på alla %n konfigurerade LDAP-anslutningar (%s)"], + "Invalid LDAP UUIDs" : "Ogiltiga LDAP UUIDs", + "None found" : "Ingen hittades", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Ogiltiga UUID för LDAP-användare eller -grupper har hittats. Granska dina \"Åsidosätt UUID-detektering\"-inställningar i expertdelen av LDAP-konfigurationen och använd \"occ ldap:update-uuid\" för att uppdatera dem.", + "_%n group found_::_%n groups found_" : ["%n grupp hittades","%n grupper hittades"], + "> 1000 groups found" : "> 1000 grupper hittades", + "> 1000 users found" : "> 1000 användare hittades", + "_%n user found_::_%n users found_" : ["%n användare hittades","%n användare hittades"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kunde inte upptäcka ditt visningsnamnsattribut. Vänligen specificera det själv i avancerade inställningar för LDAP.", "Could not find the desired feature" : "Det gick inte hitta den önskade funktionen", "Invalid Host" : "Felaktig värd", @@ -75,10 +97,14 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtret specificerar vilka LDAD-grupper som ska ha åtkomst till %s instans", "Verify settings and count the groups" : "Verifiera inställningar och räkna grupperna", "When logging in, %s will find the user based on the following attributes:" : "Vid inloggning, %s kan hitta användaren baserat på följande attribut:", + "LDAP/AD Username:" : "LDAP/AD Användarnamn:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillåter inloggning med LDAP/AD-användarnamn, som antingen är \"uid\" eller \"sAMAccountName\" vilket kommer att upptäckas.", + "LDAP/AD Email Address:" : "LDAP/AD E-postadress:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Tillåter inloggning mot ett e-post-attribut. \"mail\" och \"mailPrimaryAddress\" tillåtna.", "Other Attributes:" : "Övriga attribut:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definierar filtret som ska appliceras vid inloggningsförsök. \"%%uid\" ersätter användarnamnet i inloggningshändelsen. Exempel: \"uid=%%uid\"", "Test Loginname" : "Testa inloggningsnamn", + "Attempts to receive a DN for the given loginname and the current login filter" : "Försöker att få ett DN för det angivna inloggningsnamnet och det aktuella inloggningsfiltret", "Verify settings" : "Verifiera inställningar", "%s. Server:" : "%s. Server:", "Add a new configuration" : "Lägg till en ny konfiguration", @@ -137,11 +163,13 @@ "User Display Name Field" : "Attribut för användarnamn", "The LDAP attribute to use to generate the user's display name." : "LDAP-attributet som ska användas för att generera användarens visningsnamn.", "2nd User Display Name Field" : "2:a Visningsnamns Fält", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Frivilligt. Ett LDAP-attribut att läggas till visningsnamnet i parentes. Resulterar i t.ex. »John Doe (john.doe@example.org)«.", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Frivilligt. Ett LDAP-attribut att läggas till visningsnamnet i parentes. Resulterar i t.ex. \"John Doe (john.doe@example.org)\".", "Base User Tree" : "Bas för användare i katalogtjänst", "One User Base DN per line" : "En användarstart-DN per rad", "User Search Attributes" : "Användarsökningsattribut", "Optional; one attribute per line" : "Valfritt; ett attribut per rad", + "Disable users missing from LDAP" : "Inaktivera användare som saknas via LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "När aktiverad kommer användare som importerats från LDAP som sedan saknas att inaktiveras", "Group Display Name Field" : "Attribut för gruppnamn", "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.", "Base Group Tree" : "Bas för grupper i katalogtjänst", @@ -170,7 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.", "\"$home\" Placeholder Field" : "\"$home\" Platshållare-fält", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home i en extern lagringskonfiguration kommer ersättas med värdet av det angivna attributet", + "User Profile Attributes" : "Användarprofilattribut", + "Phone Field" : "Telefon", + "User profile Phone will be set from the specified attribute" : "Telefon i användarprofilen kommer att ställas in från det angivna attributet", + "Website Field" : "Webbplats", + "User profile Website will be set from the specified attribute" : "Webbplats i användarprofilen kommer att ställas in från det angivna attributet", + "Address Field" : "Adress", + "User profile Address will be set from the specified attribute" : "Adress i användarprofilen kommer att ställas in från det angivna attributet", + "Twitter Field" : "Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter i användarprofilen kommer att ställas in från det angivna attributet", + "Fediverse Field" : "Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse i användarprofilen kommer att ställas in från det angivna attributet", + "Organisation Field" : "Organisation", + "User profile Organisation will be set from the specified attribute" : "Organisation i användarprofilen kommer att ställas in från det angivna attributet", + "Role Field" : "Roll", + "User profile Role will be set from the specified attribute" : "Roll i användarprofilen kommer att ställas in från det angivna attributet", + "Headline Field" : "Rubrik", + "User profile Headline will be set from the specified attribute" : "Rubrik i användarprofilen kommer att ställas in från det angivna attributet", + "Biography Field" : "Biografi", + "User profile Biography will be set from the specified attribute" : "Biografi i användarprofilen kommer att ställas in från det angivna attributet", + "Birthdate Field" : "Fält för födelsedatum", + "User profile Date of birth will be set from the specified attribute" : "Födelsedatum i användarprofilen kommer att ställas in från det angivna attributet", + "Pronouns Field" : "Fält för pronomen", + "User profile Pronouns will be set from the specified attribute" : "Pronomen i användarprofilen kommer att ställas in från det angivna attributet", "Internal Username" : "Internt användarnamn", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa webbadresser, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare. Lämna tomt för standardbeteende.", "Internal Username Attribute:" : "Internt användarnamnsattribut:", "Override UUID detection" : "Åsidosätt UUID-detektion", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.", @@ -180,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Användarnamn används för att lagra och tilldela metadata. För att exakt identifiera användare har varje LDAP-användare ett internt användarnamn. Detta kräver en mappning från användarnamn till LDAP-användare. Det skapade användarnamnet är mappat till UUID för LDAP-användaren. Dessutom cachas DN för att minska LDAP-interaktion, men den används inte för identifiering. Om DN ändras kommer ändringarna att hittas. Det interna användarnamnet används på nytt. Att rensa mappningarna kommer att ha rester överallt. Att rensa mappningarna är inte konfigurationskänsligt, det påverkar alla LDAP-konfigurationer! Rensa aldrig mappningarna i en produktionsmiljö, bara i en test- eller experimentfas.", "Clear Username-LDAP User Mapping" : "Rensa användarnamn-LDAP användarmappning", "Clear Groupname-LDAP Group Mapping" : "Rensa gruppnamn-LDAP gruppmappning", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Ett anslutningsfel till LDAP / AD uppstod. Granska värd, port och inloggningsuppgifter.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : " \"%uid\"-platshållaren saknas. Den kommer bli ersatt med inloggningsnamn när LDAP / AD efterfrågas.", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Grupplådan var inaktiverat eftersom LDAP/AD-servern inte stödjer memberOf.", - "LDAP / AD integration" : "LDAP / AD integration", - "LDAP / AD Username:" : "LDAP / AD Användarnamn:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Tillåter inloggning mot LDAP / AD-användarnamn, vilket är antingen \"uid\" eller \"sAMAccountName\" och kommer att upptäckas.", - "LDAP / AD Email Address:" : "LDAP / AD E-postadress:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard kommer de interna användarnamnen skapas från UUID-attributen. Det säkerställer att användarnamnet är unikt och att tecken inte behöver konverteras. Det interna användarnamnet har begränsningen att bara dessa tecken tillåts: [ a-zA-Z0-9_.@- ]. Andra tecken kommer att ersättas med deras korresponderande ASCII-kod eller utelämnas. Vid kollisioner kommer ett nummer läggas till/ökas. Det interna användarnamnet används för att identifiera en användare internt. Det är också standardnamnet för användarens hemmapp. Det är också en del av externa webbadresser, till exempel för alla *DAV-tjänster. Med denna inställning, kan standardbeteendet bli överskrivet. Lämna det tomt för standardbeteende. Ändringar kommer att bara gälla för nya mappningar (tillagda) LDAP-användare." + "Invalid configuration. Please have a look at the logs for further details." : "Ogiltig konfiguration. Vänligen undersök loggar för mer detaljer." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/sw_KE.js b/apps/user_ldap/l10n/sw_KE.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/sw_KE.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sw_KE.json b/apps/user_ldap/l10n/sw_KE.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/sw_KE.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/tg_TJ.js b/apps/user_ldap/l10n/tg_TJ.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/tg_TJ.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/tg_TJ.json b/apps/user_ldap/l10n/tg_TJ.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/tg_TJ.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/th.js b/apps/user_ldap/l10n/th.js index 2004e927395..c33d42a4871 100644 --- a/apps/user_ldap/l10n/th.js +++ b/apps/user_ldap/l10n/th.js @@ -1,147 +1,140 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "ล้มเหลวขณะล้าง Mappings", + "Failed to clear the mappings." : "ไม่สามารถล้างการแมป", "Failed to delete the server configuration" : "ลบการกำหนดค่าเซิร์ฟเวอร์ล้มเหลว", "No action specified" : "ไม่ได้ระบุการดำเนินการ", - "No configuration specified" : "ไม่ได้กำหนดค่า", - "No data specified" : "ไม่มีข้อมูลที่ระบุ", - " Could not set configuration %s" : "ไม่สามารถตั้งค่า %s", - "Action does not exist" : "ไม่มีการดำเนินการ", - "Very weak password" : "รหัสผ่านระดับต่ำมาก", - "Weak password" : "รหัสผ่านระดับต่ำ", - "So-so password" : "รหัสผ่านระดับปกติ", + "No configuration specified" : "ไม่ได้ระบุการกำหนดค่า", + "No data specified" : "ไม่ได้ระบุข้อมูล", + "Action does not exist" : "ไม่มีการดำเนินการนี้อยู่", + "Very weak password" : "รหัสผ่านคาดเดาง่ายมาก", + "Weak password" : "รหัสผ่านคาดเดาง่าย", + "So-so password" : "รหัสผ่านระดับพอใช้", "Good password" : "รหัสผ่านระดับดี", - "Strong password" : "รหัสผ่านระดับดีมาก", + "Strong password" : "รหัสผ่านคาดเดายาก", "The Base DN appears to be wrong" : "Base DN ดูเหมือนจะไม่ถูกต้อง", - "Testing configuration…" : "กำลังทดสอบการตั้งค่า ...", + "Testing configuration…" : "กำลังทดสอบการตั้งค่า...", "Configuration incorrect" : "การกำหนดค่าไม่ถูกต้อง", - "Configuration incomplete" : "กำหนดค่าไม่สำเร็จ", - "Configuration OK" : "กำหนดค่าเสร็จสมบูรณ์", + "Configuration incomplete" : "การกำหนดค่าไม่ครบถ้วน", + "Configuration OK" : "การกำหนดค่าใช้งานได้", "Select groups" : "เลือกกลุ่ม", "Select object classes" : "เลือกคลาสวัตถุ", - "Please check the credentials, they seem to be wrong." : "กรุณาตรวจสอบข้อมูลประจำตัวของพวกเขาดูเหมือนจะมีข้อผิดพลาด", - "Please specify the port, it could not be auto-detected." : "กรุณาระบุพอร์ต มันไม่สามารถตรวจพบอัตโนมัติ", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN ไม่สามารถตรวจพบโดยอัตโนมัติกรุณาแก้ไขข้อมูลของโฮสต์และพอร์ต", - "Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดเลือกด้วยตนเอง", + "Please check the credentials, they seem to be wrong." : "กรุณาตรวจสอบข้อมูลประจำตัว ดูเหมือนจะใส่ไม่ถูกต้อง", + "Please specify the port, it could not be auto-detected." : "กรุณาระบุพอร์ต เนื่องจากไม่สามารถตรวจพบโดยอัตโนมัติ", + "Base DN could not be auto-detected, please revise credentials, host and port." : "ไม่สามารถตรวจพบ Base DN โดยอัตโนมัติ กรุณาแก้ไขข้อมูลประจำตัว โฮสต์ และพอร์ต", + "Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดระบุด้วยตนเอง", "{nthServer}. Server" : "เซิร์ฟเวอร์ {nthServer}", - "No object found in the given Base DN. Please revise." : "ไม่พบวัตถุที่กำหนดใน Base DN กรุณาแก้ไข", + "No object found in the given Base DN. Please revise." : "ไม่พบวัตถุใน Base DN ที่ให้ไว้ กรุณาแก้ไข", "More than 1,000 directory entries available." : "ไดเรกทอรีมีอยู่มากกว่า 1,000 รายการ", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN เช่นเดียวกับการตั้งค่าการเชื่อมต่อและข้อมูลที่สำคัญ", - "Do you really want to delete the current Server Configuration?" : "คุณแน่ใจแล้วหรือว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบันทิ้งไป?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN รวมถึงการตั้งค่าการเชื่อมต่อและข้อมูลประจำตัว", + "Do you really want to delete the current Server Configuration?" : "คุณแน่ใจหรือไม่ว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบัน?", "Confirm Deletion" : "ยืนยันการลบทิ้ง", - "Mappings cleared successfully!" : "ล้าง Mappings เรียบร้อยแล้ว", - "Error while clearing the mappings." : "เกิดข้อผิดพลาดขณะล้าง Mappings", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "บุคคลนิรนามไม่ได้รับอนุญาต กรุณาระบุ DN ของผู้ใช้และรหัสผ่าน", - "LDAP Operations error. Anonymous bind might not be allowed." : "ข้อผิดพลาดในการดำเนินการ LDAP บุคคลนิรนามอาจจะไม่ได้รับอนุญาต ", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "บันทึกล้มเหลว โปรดตรวจสอบฐานข้อมูลที่อยู่ในการดำเนินงาน โหลดหน้าใหม่อีกครั้งก่อนดำเนินการต่อ", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "โหมดสลับจะช่วยค้นหา LDAP อัตโนมัติ ขึ้นอยู่กับขนาด LDAP ของคุณมันอาจใช้เวลาสักครู่ คุณยังยังต้องการใช้โหมดสลับ?", - "Mode switch" : "โหมดสลับ", - "Select attributes" : "เลือกคุณลักษณะ", + "Mappings cleared successfully!" : "ล้างการแมปเรียบร้อยแล้ว", + "Error while clearing the mappings." : "เกิดข้อผิดพลาดขณะล้างการแมป", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "การผูกนิรนามไม่ได้รับอนุญาต กรุณาระบุ DN ของผู้ใช้และรหัสผ่าน", + "LDAP Operations error. Anonymous bind might not be allowed." : "ข้อผิดพลาดในการดำเนินการ LDAP การผูกนิรนามอาจจะไม่ได้รับอนุญาต ", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "การบันทึกล้มเหลว โปรดตรวจสอบว่าฐานข้อมูลอยู่ใน Operation โหลดหน้าใหม่ก่อนดำเนินการต่อ", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "การสลับโหมดจะเปิดใช้คิวรี LDAP อัตโนมัติ ซึ่งอาจใช้เวลาสักครู่ขึ้นอยู่กับขนาด LDAP ของคุณ คุณยังต้องการสลับโหมดหรือไม่?", + "Mode switch" : "สลับโหมด", + "Select attributes" : "เลือกแอททริบิวต์", "User found and settings verified." : "พบผู้ใช้และการตั้งค่าได้รับการตรวจสอบแล้ว", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ตัวกรองการค้นหาไม่ถูกต้องอาจเป็นเพราะปัญหาไวยากรณ์เช่นหมายเลขที่ไม่สม่ำเสมอของวงเล็บเปิดและปิด กรุณาแก้ไข", - "Please provide a login name to test against" : "โปรดระบุชื่อที่ใช้ในการเข้าสู่ระบบเพื่อทดสอบข้อขัดแย้ง", - "_%s group found_::_%s groups found_" : ["พบ %s กลุ่ม"], - "_%s user found_::_%s users found_" : ["พบผู้ใช้ %s คน"], + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ตัวกรองการค้นหาไม่ถูกต้อง อาจเป็นเพราะปัญหาไวยากรณ์ เช่น จำนวนวงเล็บเปิดและปิดที่ไม่สม่ำเสมอ กรุณาแก้ไข", + "Please provide a login name to test against" : "โปรดระบุชื่อที่ใช้ในการเข้าสู่ระบบเพื่อทดสอบ", "Could not find the desired feature" : "ไม่พบคุณลักษณะที่ต้องการ", "Invalid Host" : "โฮสต์ไม่ถูกต้อง", "Test Configuration" : "ทดสอบการตั้งค่า", "Help" : "ช่วยเหลือ", - "Groups meeting these criteria are available in %s:" : "การประชุมกลุ่มเหล่านี้มีหลักเกณฑ์อยู่ใน %s:", + "Groups meeting these criteria are available in %s:" : "กลุ่มที่เข้าเกณฑ์เหล่านี้มีอยู่ใน %s:", "Only these object classes:" : "เฉพาะคลาสของวัตถุเหล่านี้:", "Only from these groups:" : "เฉพาะจากกลุ่มเหล่านี้:", "Search groups" : "ค้นหากลุ่ม", "Available groups" : "กลุ่มที่สามารถใช้ได้", "Selected groups" : "กลุ่มที่เลือก", - "Edit LDAP Query" : "แก้ไข LDAP Query", + "Edit LDAP Query" : "แก้ไขคิวรี LDAP", "LDAP Filter:" : "ตัวกรอง LDAP:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "ระบุตัวกรองกลุ่ม LDAP ที่จะเข้าถึง %s", - "When logging in, %s will find the user based on the following attributes:" : "เมื่อเข้าสู่ระบบ %s จะได้พบกับผู้ใช้ตามลักษณะดังต่อไปนี้:", - "Other Attributes:" : "คุณลักษณะอื่นๆ:", - "Test Loginname" : "ทดสอบชื่อที่ใช้ในการเข้าสู่ระบบ", + "The filter specifies which LDAP groups shall have access to the %s instance." : "ตัวกรองระบุว่ากลุ่ม LDAP ใดบ้างจะสามารถเข้าถึงเซิร์ฟเวอร์ %s", + "When logging in, %s will find the user based on the following attributes:" : "เมื่อเข้าสู่ระบบ %s จะค้นหาผู้ใช้ตามแอททริบิวต์ดังต่อไปนี้:", + "Other Attributes:" : "คุณลักษณะอื่น ๆ:", + "Test Loginname" : "ทดสอบชื่อที่ใช้เข้าสู่ระบบ", "Verify settings" : "ตรวจสอบการตั้งค่า", - "%s. Server:" : "เซิร์ฟเวอร์%s", - "Copy current configuration into new directory binding" : "คัดลอกการตั้งค่าปัจจุบันลงในไดเรกทอรีใหม่ที่ผูกกัน", - "Delete the current configuration" : "ลบการตั้งค่าปัจจุบัน", + "%s. Server:" : "%s เซิร์ฟเวอร์:", + "Copy current configuration into new directory binding" : "คัดลอกการตั้งค่าปัจจุบันลงในการผูกไดเรกทอรีใหม่", + "Delete the current configuration" : "ลบการกำหนดค่าปัจจุบัน", "Host" : "โฮสต์", "Port" : "พอร์ต", - "Detect Port" : "ตรวจพบพอร์ต", + "Detect Port" : "ตรวจจับพอร์ต", "User DN" : "DN ของผู้ใช้งาน", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN ของผู้ใช้ไคลเอ็นต์อะไรก็ตามที่ผูกอยู่ด้วย เช่น uid=agent, dc=example, dc=com, สำหรับการเข้าถึงโดยบุคคลนิรนาม, ให้เว้นว่าง DN และรหัสผ่านเอาไว้", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN ของผู้ใช้ไคลเอ็นต์ที่ต้องการทำการผูก เช่น uid=agent,dc=example,dc=com สำหรับการเข้าถึงโดยบุคคลนิรนาม ให้เว้นว่างช่อง DN และรหัสผ่าน", "Password" : "รหัสผ่าน", - "For anonymous access, leave DN and Password empty." : "สำหรับการเข้าถึงโดยบุคคลนิรนาม ให้เว้นว่าง DN และรหัสผ่านไว้", + "For anonymous access, leave DN and Password empty." : "สำหรับการเข้าถึงนิรนาม ให้เว้นช่อง DN และรหัสผ่านไว้", "One Base DN per line" : "หนึ่ง Base DN ต่อหนึ่งบรรทัด", - "You can specify Base DN for users and groups in the Advanced tab" : "คุณสามารถระบุ Base DN หลักสำหรับผู้ใช้งานและกลุ่มต่างๆในแท็บขั้นสูงได้", - "Detect Base DN" : "ตรวจพบ Base DN", + "You can specify Base DN for users and groups in the Advanced tab" : "คุณสามารถระบุ Base DN หลักสำหรับผู้ใช้งานและกลุ่มต่าง ๆ ได้ในแท็บขั้นสูง", + "Detect Base DN" : "ตรวจจับ Base DN", "Test Base DN" : "ทดสอบ Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "หลีกเลี่ยงการร้องขอ LDAP อัตโนมัติ ดีกว่าสำหรับการตั้งค่าที่มากกว่า แต่ต้องมีความรู้เรื่อง LDAP", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "หลีกเลี่ยงคำขอ LDAP อัตโนมัติ ดีกว่าสำหรับการตั้งค่าที่มากกว่า แต่ต้องพอมีความรู้เรื่อง LDAP", "Manually enter LDAP filters (recommended for large directories)" : "ป้อนตัวกรอง LDAP ด้วยตนเอง (แนะนำสำหรับไดเรกทอรีขนาดใหญ่)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "คลาสวัตถุที่พบมากที่สุดสำหรับผู้ใช้มี organizationalPerson, person, user และ inetOrgPerson หากคุณไม่แน่ใจว่าต้องเลือกคลาสวัตถุตัวไหนโปรดปรึกษาผู้ดูแลระบบไดเรกทอรีของคุณ", - "The filter specifies which LDAP users shall have access to the %s instance." : "ระบุตัวกรองที่ผู้ใช้ LDAP จะมีการเข้าถึง %s", - "Verify settings and count users" : "ตรวจสอบการตั้งค่าและการนับจำนวนผู้ใช้", - "Saving" : "บันทึก", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "คลาสวัตถุที่พบมากที่สุดสำหรับผู้ใช้มี organizationalPerson, person, user และ inetOrgPerson หากคุณไม่แน่ใจว่าต้องเลือกคลาสวัตถุตัวไหน โปรดปรึกษาผู้ดูแลระบบไดเรกทอรีของคุณ", + "The filter specifies which LDAP users shall have access to the %s instance." : "ตัวกรองระบุว่าผู้ใช้ LDAP ใดบ้างจะสามารถเข้าถึงเซิร์ฟเวอร์ %s", + "Verify settings and count users" : "ตรวจสอบการตั้งค่าและนับจำนวนผู้ใช้", + "Saving" : "กำลังบันทึก", "Back" : "ย้อนกลับ", "Continue" : "ดำเนินการต่อ", "An internal error occurred." : "เกิดข้อผิดพลาดภายใน", - "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ", + "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบของคุณ", "Current password" : "รหัสผ่านปัจจุบัน", "New password" : "รหัสผ่านใหม่", - "Wrong password." : "รหัสผ่านผิดพลาด", + "Wrong password." : "รหัสผ่านไม่ถูกต้อง", "Cancel" : "ยกเลิก", "Server" : "เซิร์ฟเวอร์", "Users" : "ผู้ใช้งาน", - "Login Attributes" : "คุณลักษณะการเข้าสู่ระบบ", + "Login Attributes" : "แอททริบิวต์การเข้าสู่ระบบ", "Groups" : "กลุ่ม", "Expert" : "ผู้เชี่ยวชาญ", "Advanced" : "ขั้นสูง", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>คำเตือน:</b> โมดูล PHP LDAP ยังไม่ได้ถูกติดตั้ง, ระบบด้านหลังจะไม่สามารถทำงานได้ กรุณาติดต่อผู้ดูแลระบบของคุณเพื่อทำการติดตั้งโมดูลดังกล่าว", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>คำเตือน:</b> โมดูล PHP LDAP ยังไม่ได้ถูกติดตั้ง แบ็กเอนด์จะไม่สามารถทำงานได้ กรุณาติดต่อให้ผู้ดูแลระบบของคุณทำการติดตั้ง", "Connection Settings" : "ตั้งค่าการเชื่อมต่อ", - "Configuration Active" : "ตั้งค่าการใช้งาน", - "When unchecked, this configuration will be skipped." : "ถ้าไม่เลือก การตั้งค่านี้จะถูกข้ามไป", - "Backup (Replica) Host" : "การสำรองข้อมูลโฮสต์ (สำรอง) ", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ให้โฮสต์สำรองข้อมูลที่จำเป็นของเซิร์ฟเวอร์ LDAP/AD หลัก", - "Backup (Replica) Port" : "สำรองข้อมูลพอร์ต (จำลอง) ", + "Configuration Active" : "การกำหนดค่าใช้งานอยู่", + "When unchecked, this configuration will be skipped." : "เมื่อไม่เลือก การกำหนดค่านี้จะถูกข้ามไป", + "Backup (Replica) Host" : "โฮสต์สำรอง (จำลอง) ", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ให้โฮสต์สำรอง (ไม่จำเป็น) ซึ่งต้องเป็นแบบจำลองของเซิร์ฟเวอร์ LDAP/AD หลัก", + "Backup (Replica) Port" : "พอร์ตสำรอง (จำลอง) ", "Disable Main Server" : "ปิดใช้งานเซิร์ฟเวอร์หลัก", - "Only connect to the replica server." : "เฉพาะเชื่อมต่อกับเซิร์ฟเวอร์แบบจำลอง", - "Turn off SSL certificate validation." : "ปิดใช้งานการตรวจสอบความถูกต้องของใบรับรองความปลอดภัย SSL", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "ไม่แนะนำ ควรใช้สำหรับการทดสอบเท่านั้น! ถ้าการเชื่อมต่อใช้งานได้เฉพาะกับตัวเลือกนี้ นำเข้าใบรับรอง SSL เซิร์ฟเวอร์ LDAP ในเซิร์ฟเวอร์ %s ของคุณ ", - "Cache Time-To-Live" : "แคช TTL", - "in seconds. A change empties the cache." : "ในอีกไม่กี่วินาที ระบบจะล้างข้อมูลในแคชให้ว่างเปล่า", - "Directory Settings" : "ตั้งค่าไดเร็กทอรี่", - "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งาน", - "The LDAP attribute to use to generate the user's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของผู้ใช้", - "2nd User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานคนที่ 2", + "Only connect to the replica server." : "เชื่อมต่อกับเซิร์ฟเวอร์แบบจำลองเท่านั้น", + "Turn off SSL certificate validation." : "ปิดใช้งานการตรวจสอบใบรับรอง SSL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "ไม่แนะนำ ควรใช้สำหรับการทดสอบเท่านั้น! ถ้าการเชื่อมต่อใช้งานได้เฉพาะกับตัวเลือกนี้ นำเข้าใบรับรอง SSL ของเซิร์ฟเวอร์ LDAP ในเซิร์ฟเวอร์ %s ของคุณ ", + "Cache Time-To-Live" : "เวลาที่ดำรงอยู่ของแคช", + "in seconds. A change empties the cache." : "ในวินาที การเปลี่ยนค่านี้จะล้างข้อมูลในแคช", + "Directory Settings" : "ตั้งค่าไดเร็กทอรี", + "User Display Name Field" : "ช่องชื่อที่แสดงของผู้ใช้", + "The LDAP attribute to use to generate the user's display name." : "แอททริบิวต์ LDAP เพื่อใช้ในการสร้างชื่อที่แสดงของผู้ใช้", + "2nd User Display Name Field" : "ช่องชื่อที่แสดงของผู้ใช้ที่ 2", "Base User Tree" : "รายการผู้ใช้งานหลักแบบ Tree", - "One User Base DN per line" : "หนึ่งผู้ใช้ Base DN ต่อหนึ่งบรรทัด", + "One User Base DN per line" : "หนึ่ง Base DN ผู้ใช้ ต่อหนึ่งบรรทัด", "User Search Attributes" : "คุณลักษณะการค้นหาชื่อผู้ใช้", "Optional; one attribute per line" : "ตัวเลือกเพิ่มเติม; หนึ่งคุณลักษณะต่อบรรทัด", - "Group Display Name Field" : "ช่องแสดงชื่อกลุ่มที่ต้องการ", - "The LDAP attribute to use to generate the groups's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของกลุ่ม", + "Group Display Name Field" : "ช่องชื่อที่แสดงของกลุ่ม", + "The LDAP attribute to use to generate the groups's display name." : "แอททริบิวต์ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของกลุ่ม", "Base Group Tree" : "รายการกลุ่มหลักแบบ Tree", - "One Group Base DN per line" : "หนึ่ง Group Base DN ต่อหนึ่งบรรทัด", - "Group Search Attributes" : "คุณลักษณะการค้นหาแบบกลุ่ม", - "Group-Member association" : "ความสัมพันธ์ของสมาชิกในกลุ่ม", + "One Group Base DN per line" : "หนึ่ง Base DN กลุ่ม ต่อหนึ่งบรรทัด", + "Group Search Attributes" : "แอททริบิวต์การค้นหากลุ่ม", + "Group-Member association" : "ความสัมพันธ์ของกลุ่ม-สมาชิก", "Nested Groups" : "กลุ่มที่ซ้อนกัน", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "เมื่อเปิดสวิตซ์ กลุ่มจะได้รับการสนันสนุน (เฉพาะการทำงานถ้าคุณลักษณะสมาชิกกลุ่มมี DN)", - "Paging chunksize" : "ขนาด Paging chunk", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize ใช้สำหรับการค้นหาเพจ LDAP มันส่งคืนผลลัพธ์ที่มีขนาดใหญ่เช่นการนับผู้ใช้หรือกลุ่ม (ตั้งค่าเป็น 0 เพื่อปิดการใช้งาน)", - "Special Attributes" : "คุณลักษณะพิเศษ", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "เมื่อเปิดสวิตซ์ กลุ่มที่มีกลุ่มอยู่ด้านในจะได้รับการสนับสนุน (ใช้ได้เฉพาะถ้าแอททริบิวต์สมาชิกกลุ่มมี DN)", + "Paging chunksize" : "ขนาดกลุ่มเพจ", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "ขนาดกลุ่มที่ใช้สำหรับการค้นหา LDAP แบบเพจ ที่อาจส่งคืนผลลัพธ์ขนาดใหญ่ เช่น การนับผู้ใช้หรือกลุ่ม (ตั้งค่าเป็น 0 เพื่อปิดการใช้งานการค้นหา LDAP แบบเพจในสถานการณ์เหล่านั้น)", + "Special Attributes" : "แอททริบิวต์พิเศษ", "Quota Field" : "ช่องโควต้า", "Quota Default" : "โควต้าเริ่มต้น", "Email Field" : "ช่องอีเมล", - "User Home Folder Naming Rule" : "กฎการตั้งชื่อโฟลเดอร์แรกของผู้ใช้", + "User Home Folder Naming Rule" : "กฎการตั้งชื่อโฮมโฟลเดอร์ของผู้ใช้", "Internal Username" : "ชื่อผู้ใช้ภายใน", - "Internal Username Attribute:" : "ชื่อผู้ใช้ภายในคุณสมบัติ:", - "Override UUID detection" : "แทนที่การตรวจสอบ UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "โดยค่าเริ่มต้นแอตทริบิวต์ UUID มีถูกตรวจพบโดยอัตโนมัติ แอตทริบิวต์ UUID จะใช้เพื่อระบุผู้ใช้ของ LDAP และกลุ่ม นอกจากนี้ยังมีชื่อผู้ใช้ภายในจะถูกสร้างขึ้นบนพื้นฐาน UUID หากไม่ได้ระบุไว้ข้างต้น คุณสามารถแทนที่การตั้งค่าและส่งแอตทริบิวต์ที่คุณเลือก คุณต้องให้แน่ใจว่าแอตทริบิวต์ที่คุณเลือกสามารถเป็นจริงสำหรับทั้งผู้ใช้และกลุ่มและมันควรจะไม่ซ้ำกัน ปล่อยให้มันว่างเปล่าสำหรับการทำงานเริ่มต้น การเปลี่ยนแปลงจะมีผลเฉพาะในแมปใหม่ (เพิ่ม) ผู้ใช้ LDAP และกลุ่ม", - "UUID Attribute for Users:" : "แอตทริบิวต์ UUID สำหรับผู้ใช้:", - "UUID Attribute for Groups:" : "แอตทริบิวต์ UUID สำหรับกลุ่ม:", - "Username-LDAP User Mapping" : "Username-LDAP ผู้ใช้ Mapping", - "Clear Username-LDAP User Mapping" : "ล้าง Username-LDAP ผู้ใช้ Mapping", - "Clear Groupname-LDAP Group Mapping" : "ล้าง Groupname-LDAP กลุ่ม Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "เกิดข้อผิดพลาดขณะเชื่อมต่อไปยัง LDAP/AD โปรดตรวจสอบโฮสต์พอร์ตและข้อมูลอื่นๆ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "กล่องข้อความกลุ่มถูกปิดการใช้งานเนื่องจากเซิร์ฟเวอร์ LDAP/AD ไม่สนับสนุน memberOf", - "LDAP / AD Username:" : "ชื่อผู้ใช้ LDAP/AD:", - "LDAP / AD Email Address:" : "ที่อยู่อีเมล LDAP/AD:" + "Internal Username Attribute:" : "แอททริบิวต์ชื่อผู้ใช้ภายใน:", + "Override UUID detection" : "ยกเว้นการตรวจสอบ UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "โดยค่าเริ่มต้น แอททริบิวต์ UUID จะถูกตรวจพบโดยอัตโนมัติ แอททริบิวต์ UUID จะใช้เพื่อระบุผู้ใช้และกลุ่มของ LDAP โดยไม่ต้องสงสัย นอกจากนี้ หากไม่ได้ระบุไว้ข้างต้น ชื่อผู้ใช้ภายในจะถูกสร้างขึ้นโดยใช้ UUID เป็นฐาน คุณสามารถแทนที่การตั้งค่าและส่งแอททริบิวต์ที่คุณเลือกได้ คุณต้องให้แน่ใจว่าแอททริบิวต์ที่คุณเลือกสามารถดึงได้สำหรับทั้งผู้ใช้และกลุ่มและต้องไม่ซ้ำกัน ปล่อยว่างไว้สำหรับรูปแบบการทำงานเริ่มต้น การเปลี่ยนแปลงจะมีผลเฉพาะผู้ใช้ LDAP และกลุ่มที่เพิ่งแมปใหม่ (เพิ่งเพิ่ม)", + "UUID Attribute for Users:" : "แอททริบิวต์ UUID สำหรับผู้ใช้:", + "UUID Attribute for Groups:" : "แอททริบิวต์ UUID สำหรับกลุ่ม:", + "Username-LDAP User Mapping" : "การแมปชื่อผู้ใช้-ผู้ใช้ LDAP", + "Clear Username-LDAP User Mapping" : "ล้างการแมปชื่อผู้ใช้-ผู้ใช้ LDAP", + "Clear Groupname-LDAP Group Mapping" : "ล้างการแมปกลุ่ม Groupname-LDAP" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/th.json b/apps/user_ldap/l10n/th.json index 38f8109dc4b..3c745186c56 100644 --- a/apps/user_ldap/l10n/th.json +++ b/apps/user_ldap/l10n/th.json @@ -1,145 +1,138 @@ { "translations": { - "Failed to clear the mappings." : "ล้มเหลวขณะล้าง Mappings", + "Failed to clear the mappings." : "ไม่สามารถล้างการแมป", "Failed to delete the server configuration" : "ลบการกำหนดค่าเซิร์ฟเวอร์ล้มเหลว", "No action specified" : "ไม่ได้ระบุการดำเนินการ", - "No configuration specified" : "ไม่ได้กำหนดค่า", - "No data specified" : "ไม่มีข้อมูลที่ระบุ", - " Could not set configuration %s" : "ไม่สามารถตั้งค่า %s", - "Action does not exist" : "ไม่มีการดำเนินการ", - "Very weak password" : "รหัสผ่านระดับต่ำมาก", - "Weak password" : "รหัสผ่านระดับต่ำ", - "So-so password" : "รหัสผ่านระดับปกติ", + "No configuration specified" : "ไม่ได้ระบุการกำหนดค่า", + "No data specified" : "ไม่ได้ระบุข้อมูล", + "Action does not exist" : "ไม่มีการดำเนินการนี้อยู่", + "Very weak password" : "รหัสผ่านคาดเดาง่ายมาก", + "Weak password" : "รหัสผ่านคาดเดาง่าย", + "So-so password" : "รหัสผ่านระดับพอใช้", "Good password" : "รหัสผ่านระดับดี", - "Strong password" : "รหัสผ่านระดับดีมาก", + "Strong password" : "รหัสผ่านคาดเดายาก", "The Base DN appears to be wrong" : "Base DN ดูเหมือนจะไม่ถูกต้อง", - "Testing configuration…" : "กำลังทดสอบการตั้งค่า ...", + "Testing configuration…" : "กำลังทดสอบการตั้งค่า...", "Configuration incorrect" : "การกำหนดค่าไม่ถูกต้อง", - "Configuration incomplete" : "กำหนดค่าไม่สำเร็จ", - "Configuration OK" : "กำหนดค่าเสร็จสมบูรณ์", + "Configuration incomplete" : "การกำหนดค่าไม่ครบถ้วน", + "Configuration OK" : "การกำหนดค่าใช้งานได้", "Select groups" : "เลือกกลุ่ม", "Select object classes" : "เลือกคลาสวัตถุ", - "Please check the credentials, they seem to be wrong." : "กรุณาตรวจสอบข้อมูลประจำตัวของพวกเขาดูเหมือนจะมีข้อผิดพลาด", - "Please specify the port, it could not be auto-detected." : "กรุณาระบุพอร์ต มันไม่สามารถตรวจพบอัตโนมัติ", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN ไม่สามารถตรวจพบโดยอัตโนมัติกรุณาแก้ไขข้อมูลของโฮสต์และพอร์ต", - "Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดเลือกด้วยตนเอง", + "Please check the credentials, they seem to be wrong." : "กรุณาตรวจสอบข้อมูลประจำตัว ดูเหมือนจะใส่ไม่ถูกต้อง", + "Please specify the port, it could not be auto-detected." : "กรุณาระบุพอร์ต เนื่องจากไม่สามารถตรวจพบโดยอัตโนมัติ", + "Base DN could not be auto-detected, please revise credentials, host and port." : "ไม่สามารถตรวจพบ Base DN โดยอัตโนมัติ กรุณาแก้ไขข้อมูลประจำตัว โฮสต์ และพอร์ต", + "Could not detect Base DN, please enter it manually." : "ไม่สามารถตรวจสอบ Base DN โปรดระบุด้วยตนเอง", "{nthServer}. Server" : "เซิร์ฟเวอร์ {nthServer}", - "No object found in the given Base DN. Please revise." : "ไม่พบวัตถุที่กำหนดใน Base DN กรุณาแก้ไข", + "No object found in the given Base DN. Please revise." : "ไม่พบวัตถุใน Base DN ที่ให้ไว้ กรุณาแก้ไข", "More than 1,000 directory entries available." : "ไดเรกทอรีมีอยู่มากกว่า 1,000 รายการ", - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN เช่นเดียวกับการตั้งค่าการเชื่อมต่อและข้อมูลที่สำคัญ", - "Do you really want to delete the current Server Configuration?" : "คุณแน่ใจแล้วหรือว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบันทิ้งไป?", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "เกิดข้อผิดพลาด กรุณาตรวจสอบ Base DN รวมถึงการตั้งค่าการเชื่อมต่อและข้อมูลประจำตัว", + "Do you really want to delete the current Server Configuration?" : "คุณแน่ใจหรือไม่ว่าต้องการลบการกำหนดค่าเซิร์ฟเวอร์ปัจจุบัน?", "Confirm Deletion" : "ยืนยันการลบทิ้ง", - "Mappings cleared successfully!" : "ล้าง Mappings เรียบร้อยแล้ว", - "Error while clearing the mappings." : "เกิดข้อผิดพลาดขณะล้าง Mappings", - "Anonymous bind is not allowed. Please provide a User DN and Password." : "บุคคลนิรนามไม่ได้รับอนุญาต กรุณาระบุ DN ของผู้ใช้และรหัสผ่าน", - "LDAP Operations error. Anonymous bind might not be allowed." : "ข้อผิดพลาดในการดำเนินการ LDAP บุคคลนิรนามอาจจะไม่ได้รับอนุญาต ", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "บันทึกล้มเหลว โปรดตรวจสอบฐานข้อมูลที่อยู่ในการดำเนินงาน โหลดหน้าใหม่อีกครั้งก่อนดำเนินการต่อ", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "โหมดสลับจะช่วยค้นหา LDAP อัตโนมัติ ขึ้นอยู่กับขนาด LDAP ของคุณมันอาจใช้เวลาสักครู่ คุณยังยังต้องการใช้โหมดสลับ?", - "Mode switch" : "โหมดสลับ", - "Select attributes" : "เลือกคุณลักษณะ", + "Mappings cleared successfully!" : "ล้างการแมปเรียบร้อยแล้ว", + "Error while clearing the mappings." : "เกิดข้อผิดพลาดขณะล้างการแมป", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "การผูกนิรนามไม่ได้รับอนุญาต กรุณาระบุ DN ของผู้ใช้และรหัสผ่าน", + "LDAP Operations error. Anonymous bind might not be allowed." : "ข้อผิดพลาดในการดำเนินการ LDAP การผูกนิรนามอาจจะไม่ได้รับอนุญาต ", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "การบันทึกล้มเหลว โปรดตรวจสอบว่าฐานข้อมูลอยู่ใน Operation โหลดหน้าใหม่ก่อนดำเนินการต่อ", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "การสลับโหมดจะเปิดใช้คิวรี LDAP อัตโนมัติ ซึ่งอาจใช้เวลาสักครู่ขึ้นอยู่กับขนาด LDAP ของคุณ คุณยังต้องการสลับโหมดหรือไม่?", + "Mode switch" : "สลับโหมด", + "Select attributes" : "เลือกแอททริบิวต์", "User found and settings verified." : "พบผู้ใช้และการตั้งค่าได้รับการตรวจสอบแล้ว", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ตัวกรองการค้นหาไม่ถูกต้องอาจเป็นเพราะปัญหาไวยากรณ์เช่นหมายเลขที่ไม่สม่ำเสมอของวงเล็บเปิดและปิด กรุณาแก้ไข", - "Please provide a login name to test against" : "โปรดระบุชื่อที่ใช้ในการเข้าสู่ระบบเพื่อทดสอบข้อขัดแย้ง", - "_%s group found_::_%s groups found_" : ["พบ %s กลุ่ม"], - "_%s user found_::_%s users found_" : ["พบผู้ใช้ %s คน"], + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ตัวกรองการค้นหาไม่ถูกต้อง อาจเป็นเพราะปัญหาไวยากรณ์ เช่น จำนวนวงเล็บเปิดและปิดที่ไม่สม่ำเสมอ กรุณาแก้ไข", + "Please provide a login name to test against" : "โปรดระบุชื่อที่ใช้ในการเข้าสู่ระบบเพื่อทดสอบ", "Could not find the desired feature" : "ไม่พบคุณลักษณะที่ต้องการ", "Invalid Host" : "โฮสต์ไม่ถูกต้อง", "Test Configuration" : "ทดสอบการตั้งค่า", "Help" : "ช่วยเหลือ", - "Groups meeting these criteria are available in %s:" : "การประชุมกลุ่มเหล่านี้มีหลักเกณฑ์อยู่ใน %s:", + "Groups meeting these criteria are available in %s:" : "กลุ่มที่เข้าเกณฑ์เหล่านี้มีอยู่ใน %s:", "Only these object classes:" : "เฉพาะคลาสของวัตถุเหล่านี้:", "Only from these groups:" : "เฉพาะจากกลุ่มเหล่านี้:", "Search groups" : "ค้นหากลุ่ม", "Available groups" : "กลุ่มที่สามารถใช้ได้", "Selected groups" : "กลุ่มที่เลือก", - "Edit LDAP Query" : "แก้ไข LDAP Query", + "Edit LDAP Query" : "แก้ไขคิวรี LDAP", "LDAP Filter:" : "ตัวกรอง LDAP:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "ระบุตัวกรองกลุ่ม LDAP ที่จะเข้าถึง %s", - "When logging in, %s will find the user based on the following attributes:" : "เมื่อเข้าสู่ระบบ %s จะได้พบกับผู้ใช้ตามลักษณะดังต่อไปนี้:", - "Other Attributes:" : "คุณลักษณะอื่นๆ:", - "Test Loginname" : "ทดสอบชื่อที่ใช้ในการเข้าสู่ระบบ", + "The filter specifies which LDAP groups shall have access to the %s instance." : "ตัวกรองระบุว่ากลุ่ม LDAP ใดบ้างจะสามารถเข้าถึงเซิร์ฟเวอร์ %s", + "When logging in, %s will find the user based on the following attributes:" : "เมื่อเข้าสู่ระบบ %s จะค้นหาผู้ใช้ตามแอททริบิวต์ดังต่อไปนี้:", + "Other Attributes:" : "คุณลักษณะอื่น ๆ:", + "Test Loginname" : "ทดสอบชื่อที่ใช้เข้าสู่ระบบ", "Verify settings" : "ตรวจสอบการตั้งค่า", - "%s. Server:" : "เซิร์ฟเวอร์%s", - "Copy current configuration into new directory binding" : "คัดลอกการตั้งค่าปัจจุบันลงในไดเรกทอรีใหม่ที่ผูกกัน", - "Delete the current configuration" : "ลบการตั้งค่าปัจจุบัน", + "%s. Server:" : "%s เซิร์ฟเวอร์:", + "Copy current configuration into new directory binding" : "คัดลอกการตั้งค่าปัจจุบันลงในการผูกไดเรกทอรีใหม่", + "Delete the current configuration" : "ลบการกำหนดค่าปัจจุบัน", "Host" : "โฮสต์", "Port" : "พอร์ต", - "Detect Port" : "ตรวจพบพอร์ต", + "Detect Port" : "ตรวจจับพอร์ต", "User DN" : "DN ของผู้ใช้งาน", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN ของผู้ใช้ไคลเอ็นต์อะไรก็ตามที่ผูกอยู่ด้วย เช่น uid=agent, dc=example, dc=com, สำหรับการเข้าถึงโดยบุคคลนิรนาม, ให้เว้นว่าง DN และรหัสผ่านเอาไว้", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN ของผู้ใช้ไคลเอ็นต์ที่ต้องการทำการผูก เช่น uid=agent,dc=example,dc=com สำหรับการเข้าถึงโดยบุคคลนิรนาม ให้เว้นว่างช่อง DN และรหัสผ่าน", "Password" : "รหัสผ่าน", - "For anonymous access, leave DN and Password empty." : "สำหรับการเข้าถึงโดยบุคคลนิรนาม ให้เว้นว่าง DN และรหัสผ่านไว้", + "For anonymous access, leave DN and Password empty." : "สำหรับการเข้าถึงนิรนาม ให้เว้นช่อง DN และรหัสผ่านไว้", "One Base DN per line" : "หนึ่ง Base DN ต่อหนึ่งบรรทัด", - "You can specify Base DN for users and groups in the Advanced tab" : "คุณสามารถระบุ Base DN หลักสำหรับผู้ใช้งานและกลุ่มต่างๆในแท็บขั้นสูงได้", - "Detect Base DN" : "ตรวจพบ Base DN", + "You can specify Base DN for users and groups in the Advanced tab" : "คุณสามารถระบุ Base DN หลักสำหรับผู้ใช้งานและกลุ่มต่าง ๆ ได้ในแท็บขั้นสูง", + "Detect Base DN" : "ตรวจจับ Base DN", "Test Base DN" : "ทดสอบ Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "หลีกเลี่ยงการร้องขอ LDAP อัตโนมัติ ดีกว่าสำหรับการตั้งค่าที่มากกว่า แต่ต้องมีความรู้เรื่อง LDAP", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "หลีกเลี่ยงคำขอ LDAP อัตโนมัติ ดีกว่าสำหรับการตั้งค่าที่มากกว่า แต่ต้องพอมีความรู้เรื่อง LDAP", "Manually enter LDAP filters (recommended for large directories)" : "ป้อนตัวกรอง LDAP ด้วยตนเอง (แนะนำสำหรับไดเรกทอรีขนาดใหญ่)", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "คลาสวัตถุที่พบมากที่สุดสำหรับผู้ใช้มี organizationalPerson, person, user และ inetOrgPerson หากคุณไม่แน่ใจว่าต้องเลือกคลาสวัตถุตัวไหนโปรดปรึกษาผู้ดูแลระบบไดเรกทอรีของคุณ", - "The filter specifies which LDAP users shall have access to the %s instance." : "ระบุตัวกรองที่ผู้ใช้ LDAP จะมีการเข้าถึง %s", - "Verify settings and count users" : "ตรวจสอบการตั้งค่าและการนับจำนวนผู้ใช้", - "Saving" : "บันทึก", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "คลาสวัตถุที่พบมากที่สุดสำหรับผู้ใช้มี organizationalPerson, person, user และ inetOrgPerson หากคุณไม่แน่ใจว่าต้องเลือกคลาสวัตถุตัวไหน โปรดปรึกษาผู้ดูแลระบบไดเรกทอรีของคุณ", + "The filter specifies which LDAP users shall have access to the %s instance." : "ตัวกรองระบุว่าผู้ใช้ LDAP ใดบ้างจะสามารถเข้าถึงเซิร์ฟเวอร์ %s", + "Verify settings and count users" : "ตรวจสอบการตั้งค่าและนับจำนวนผู้ใช้", + "Saving" : "กำลังบันทึก", "Back" : "ย้อนกลับ", "Continue" : "ดำเนินการต่อ", "An internal error occurred." : "เกิดข้อผิดพลาดภายใน", - "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ", + "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบของคุณ", "Current password" : "รหัสผ่านปัจจุบัน", "New password" : "รหัสผ่านใหม่", - "Wrong password." : "รหัสผ่านผิดพลาด", + "Wrong password." : "รหัสผ่านไม่ถูกต้อง", "Cancel" : "ยกเลิก", "Server" : "เซิร์ฟเวอร์", "Users" : "ผู้ใช้งาน", - "Login Attributes" : "คุณลักษณะการเข้าสู่ระบบ", + "Login Attributes" : "แอททริบิวต์การเข้าสู่ระบบ", "Groups" : "กลุ่ม", "Expert" : "ผู้เชี่ยวชาญ", "Advanced" : "ขั้นสูง", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>คำเตือน:</b> โมดูล PHP LDAP ยังไม่ได้ถูกติดตั้ง, ระบบด้านหลังจะไม่สามารถทำงานได้ กรุณาติดต่อผู้ดูแลระบบของคุณเพื่อทำการติดตั้งโมดูลดังกล่าว", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>คำเตือน:</b> โมดูล PHP LDAP ยังไม่ได้ถูกติดตั้ง แบ็กเอนด์จะไม่สามารถทำงานได้ กรุณาติดต่อให้ผู้ดูแลระบบของคุณทำการติดตั้ง", "Connection Settings" : "ตั้งค่าการเชื่อมต่อ", - "Configuration Active" : "ตั้งค่าการใช้งาน", - "When unchecked, this configuration will be skipped." : "ถ้าไม่เลือก การตั้งค่านี้จะถูกข้ามไป", - "Backup (Replica) Host" : "การสำรองข้อมูลโฮสต์ (สำรอง) ", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ให้โฮสต์สำรองข้อมูลที่จำเป็นของเซิร์ฟเวอร์ LDAP/AD หลัก", - "Backup (Replica) Port" : "สำรองข้อมูลพอร์ต (จำลอง) ", + "Configuration Active" : "การกำหนดค่าใช้งานอยู่", + "When unchecked, this configuration will be skipped." : "เมื่อไม่เลือก การกำหนดค่านี้จะถูกข้ามไป", + "Backup (Replica) Host" : "โฮสต์สำรอง (จำลอง) ", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ให้โฮสต์สำรอง (ไม่จำเป็น) ซึ่งต้องเป็นแบบจำลองของเซิร์ฟเวอร์ LDAP/AD หลัก", + "Backup (Replica) Port" : "พอร์ตสำรอง (จำลอง) ", "Disable Main Server" : "ปิดใช้งานเซิร์ฟเวอร์หลัก", - "Only connect to the replica server." : "เฉพาะเชื่อมต่อกับเซิร์ฟเวอร์แบบจำลอง", - "Turn off SSL certificate validation." : "ปิดใช้งานการตรวจสอบความถูกต้องของใบรับรองความปลอดภัย SSL", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "ไม่แนะนำ ควรใช้สำหรับการทดสอบเท่านั้น! ถ้าการเชื่อมต่อใช้งานได้เฉพาะกับตัวเลือกนี้ นำเข้าใบรับรอง SSL เซิร์ฟเวอร์ LDAP ในเซิร์ฟเวอร์ %s ของคุณ ", - "Cache Time-To-Live" : "แคช TTL", - "in seconds. A change empties the cache." : "ในอีกไม่กี่วินาที ระบบจะล้างข้อมูลในแคชให้ว่างเปล่า", - "Directory Settings" : "ตั้งค่าไดเร็กทอรี่", - "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งาน", - "The LDAP attribute to use to generate the user's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของผู้ใช้", - "2nd User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานคนที่ 2", + "Only connect to the replica server." : "เชื่อมต่อกับเซิร์ฟเวอร์แบบจำลองเท่านั้น", + "Turn off SSL certificate validation." : "ปิดใช้งานการตรวจสอบใบรับรอง SSL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "ไม่แนะนำ ควรใช้สำหรับการทดสอบเท่านั้น! ถ้าการเชื่อมต่อใช้งานได้เฉพาะกับตัวเลือกนี้ นำเข้าใบรับรอง SSL ของเซิร์ฟเวอร์ LDAP ในเซิร์ฟเวอร์ %s ของคุณ ", + "Cache Time-To-Live" : "เวลาที่ดำรงอยู่ของแคช", + "in seconds. A change empties the cache." : "ในวินาที การเปลี่ยนค่านี้จะล้างข้อมูลในแคช", + "Directory Settings" : "ตั้งค่าไดเร็กทอรี", + "User Display Name Field" : "ช่องชื่อที่แสดงของผู้ใช้", + "The LDAP attribute to use to generate the user's display name." : "แอททริบิวต์ LDAP เพื่อใช้ในการสร้างชื่อที่แสดงของผู้ใช้", + "2nd User Display Name Field" : "ช่องชื่อที่แสดงของผู้ใช้ที่ 2", "Base User Tree" : "รายการผู้ใช้งานหลักแบบ Tree", - "One User Base DN per line" : "หนึ่งผู้ใช้ Base DN ต่อหนึ่งบรรทัด", + "One User Base DN per line" : "หนึ่ง Base DN ผู้ใช้ ต่อหนึ่งบรรทัด", "User Search Attributes" : "คุณลักษณะการค้นหาชื่อผู้ใช้", "Optional; one attribute per line" : "ตัวเลือกเพิ่มเติม; หนึ่งคุณลักษณะต่อบรรทัด", - "Group Display Name Field" : "ช่องแสดงชื่อกลุ่มที่ต้องการ", - "The LDAP attribute to use to generate the groups's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของกลุ่ม", + "Group Display Name Field" : "ช่องชื่อที่แสดงของกลุ่ม", + "The LDAP attribute to use to generate the groups's display name." : "แอททริบิวต์ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของกลุ่ม", "Base Group Tree" : "รายการกลุ่มหลักแบบ Tree", - "One Group Base DN per line" : "หนึ่ง Group Base DN ต่อหนึ่งบรรทัด", - "Group Search Attributes" : "คุณลักษณะการค้นหาแบบกลุ่ม", - "Group-Member association" : "ความสัมพันธ์ของสมาชิกในกลุ่ม", + "One Group Base DN per line" : "หนึ่ง Base DN กลุ่ม ต่อหนึ่งบรรทัด", + "Group Search Attributes" : "แอททริบิวต์การค้นหากลุ่ม", + "Group-Member association" : "ความสัมพันธ์ของกลุ่ม-สมาชิก", "Nested Groups" : "กลุ่มที่ซ้อนกัน", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "เมื่อเปิดสวิตซ์ กลุ่มจะได้รับการสนันสนุน (เฉพาะการทำงานถ้าคุณลักษณะสมาชิกกลุ่มมี DN)", - "Paging chunksize" : "ขนาด Paging chunk", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize ใช้สำหรับการค้นหาเพจ LDAP มันส่งคืนผลลัพธ์ที่มีขนาดใหญ่เช่นการนับผู้ใช้หรือกลุ่ม (ตั้งค่าเป็น 0 เพื่อปิดการใช้งาน)", - "Special Attributes" : "คุณลักษณะพิเศษ", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "เมื่อเปิดสวิตซ์ กลุ่มที่มีกลุ่มอยู่ด้านในจะได้รับการสนับสนุน (ใช้ได้เฉพาะถ้าแอททริบิวต์สมาชิกกลุ่มมี DN)", + "Paging chunksize" : "ขนาดกลุ่มเพจ", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "ขนาดกลุ่มที่ใช้สำหรับการค้นหา LDAP แบบเพจ ที่อาจส่งคืนผลลัพธ์ขนาดใหญ่ เช่น การนับผู้ใช้หรือกลุ่ม (ตั้งค่าเป็น 0 เพื่อปิดการใช้งานการค้นหา LDAP แบบเพจในสถานการณ์เหล่านั้น)", + "Special Attributes" : "แอททริบิวต์พิเศษ", "Quota Field" : "ช่องโควต้า", "Quota Default" : "โควต้าเริ่มต้น", "Email Field" : "ช่องอีเมล", - "User Home Folder Naming Rule" : "กฎการตั้งชื่อโฟลเดอร์แรกของผู้ใช้", + "User Home Folder Naming Rule" : "กฎการตั้งชื่อโฮมโฟลเดอร์ของผู้ใช้", "Internal Username" : "ชื่อผู้ใช้ภายใน", - "Internal Username Attribute:" : "ชื่อผู้ใช้ภายในคุณสมบัติ:", - "Override UUID detection" : "แทนที่การตรวจสอบ UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "โดยค่าเริ่มต้นแอตทริบิวต์ UUID มีถูกตรวจพบโดยอัตโนมัติ แอตทริบิวต์ UUID จะใช้เพื่อระบุผู้ใช้ของ LDAP และกลุ่ม นอกจากนี้ยังมีชื่อผู้ใช้ภายในจะถูกสร้างขึ้นบนพื้นฐาน UUID หากไม่ได้ระบุไว้ข้างต้น คุณสามารถแทนที่การตั้งค่าและส่งแอตทริบิวต์ที่คุณเลือก คุณต้องให้แน่ใจว่าแอตทริบิวต์ที่คุณเลือกสามารถเป็นจริงสำหรับทั้งผู้ใช้และกลุ่มและมันควรจะไม่ซ้ำกัน ปล่อยให้มันว่างเปล่าสำหรับการทำงานเริ่มต้น การเปลี่ยนแปลงจะมีผลเฉพาะในแมปใหม่ (เพิ่ม) ผู้ใช้ LDAP และกลุ่ม", - "UUID Attribute for Users:" : "แอตทริบิวต์ UUID สำหรับผู้ใช้:", - "UUID Attribute for Groups:" : "แอตทริบิวต์ UUID สำหรับกลุ่ม:", - "Username-LDAP User Mapping" : "Username-LDAP ผู้ใช้ Mapping", - "Clear Username-LDAP User Mapping" : "ล้าง Username-LDAP ผู้ใช้ Mapping", - "Clear Groupname-LDAP Group Mapping" : "ล้าง Groupname-LDAP กลุ่ม Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "เกิดข้อผิดพลาดขณะเชื่อมต่อไปยัง LDAP/AD โปรดตรวจสอบโฮสต์พอร์ตและข้อมูลอื่นๆ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "กล่องข้อความกลุ่มถูกปิดการใช้งานเนื่องจากเซิร์ฟเวอร์ LDAP/AD ไม่สนับสนุน memberOf", - "LDAP / AD Username:" : "ชื่อผู้ใช้ LDAP/AD:", - "LDAP / AD Email Address:" : "ที่อยู่อีเมล LDAP/AD:" + "Internal Username Attribute:" : "แอททริบิวต์ชื่อผู้ใช้ภายใน:", + "Override UUID detection" : "ยกเว้นการตรวจสอบ UUID", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "โดยค่าเริ่มต้น แอททริบิวต์ UUID จะถูกตรวจพบโดยอัตโนมัติ แอททริบิวต์ UUID จะใช้เพื่อระบุผู้ใช้และกลุ่มของ LDAP โดยไม่ต้องสงสัย นอกจากนี้ หากไม่ได้ระบุไว้ข้างต้น ชื่อผู้ใช้ภายในจะถูกสร้างขึ้นโดยใช้ UUID เป็นฐาน คุณสามารถแทนที่การตั้งค่าและส่งแอททริบิวต์ที่คุณเลือกได้ คุณต้องให้แน่ใจว่าแอททริบิวต์ที่คุณเลือกสามารถดึงได้สำหรับทั้งผู้ใช้และกลุ่มและต้องไม่ซ้ำกัน ปล่อยว่างไว้สำหรับรูปแบบการทำงานเริ่มต้น การเปลี่ยนแปลงจะมีผลเฉพาะผู้ใช้ LDAP และกลุ่มที่เพิ่งแมปใหม่ (เพิ่งเพิ่ม)", + "UUID Attribute for Users:" : "แอททริบิวต์ UUID สำหรับผู้ใช้:", + "UUID Attribute for Groups:" : "แอททริบิวต์ UUID สำหรับกลุ่ม:", + "Username-LDAP User Mapping" : "การแมปชื่อผู้ใช้-ผู้ใช้ LDAP", + "Clear Username-LDAP User Mapping" : "ล้างการแมปชื่อผู้ใช้-ผู้ใช้ LDAP", + "Clear Groupname-LDAP Group Mapping" : "ล้างการแมปกลุ่ม Groupname-LDAP" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/tl_PH.js b/apps/user_ldap/l10n/tl_PH.js deleted file mode 100644 index 95c97db2f9c..00000000000 --- a/apps/user_ldap/l10n/tl_PH.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/tl_PH.json b/apps/user_ldap/l10n/tl_PH.json deleted file mode 100644 index 8e0cd6f6783..00000000000 --- a/apps/user_ldap/l10n/tl_PH.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 3ae29739b27..d0f0f55c247 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "Yapılandırma geçersiz: Adsız bağlantı kurulmasına izin verilmiyor.", "Valid configuration, connection established!" : "Yapılandırma geçerli, bağlantı kuruldu.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Yapılandırma geçerli ancak bağlantı kurulamadı. Lütfen sunucu ayarları ve kimlik doğrulama bilgilerini denetleyin.", - "Invalid configuration. Please have a look at the logs for further details." : "Yapılandırma geçersiz. Lütfen ayrıntılı bilgi almak için günlük dosyasına bakın.", + "Invalid configuration: %s" : "Yapılandırma geçersiz: %s", "No action specified" : "Hehrangi bir işlem belirtilmemiş", "No configuration specified" : "Henüz bir yapılandırma belirtilmemiş", "No data specified" : "Henüz bir veri belirtilmemiş", - " Could not set configuration %s" : "%s yapılandırması ayarlanamadı", + "Invalid data specified" : "Belirtilen veriler geçersiz", + "Could not set configuration %1$s to %2$s" : "%1$s yapılandırması %2$s için ayarlanamadı", "Action does not exist" : "İşlem bulunamadı", "Renewing …" : "Yenileniyor …", "Very weak password" : "Parola çok zayıf", @@ -26,8 +27,8 @@ OC.L10N.register( "Select groups" : "Grupları seçin", "Select object classes" : "Nesne sınıflarını seçin", "Please check the credentials, they seem to be wrong." : "Lütfen kimlik doğrulama bilgilerini denetleyin, yanlış görünüyor.", - "Please specify the port, it could not be auto-detected." : "Lütfen kapı numarasını belirtin. Otomatik olarak algılanamadı.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN otomatik olarak algılanamadı. Lütfen kimlik doğrulama bilgilerini, sunucu ve kapı numarasını gözden geçirin.", + "Please specify the port, it could not be auto-detected." : "Lütfen bağlantı noktasını belirtin. Otomatik olarak algılanamadı.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN otomatik olarak algılanamadı. Lütfen kimlik doğrulama bilgilerini, sunucu ve bağlantı noktasını gözden geçirin.", "Could not detect Base DN, please enter it manually." : "Base DN algılanamadı. Lütfen el ile yazın.", "{nthServer}. Server" : "{nthServer}. Sunucu", "No object found in the given Base DN. Please revise." : "Belirtilen Base DN içerisinde herhangi bir nesne bulunamadı. Lütfen gözden geçirin.", @@ -40,39 +41,56 @@ OC.L10N.register( "Error while clearing the mappings." : "Eşleştirmeler temizlenirken sorun çıktı.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonim atamaya izin verilmiyor. Lütfen bir Kullanıcı DN ve parola belirtin.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP işleminde sorun çıktı. Anonim bağlamaya izin verilmiyor.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Kaydedilemedi. Veritabanının çalışıyor olduğundan emin olun. Devam etmeden yeniden yükleyin.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Kipi değiştirmek otomatik LDAP sorgularını etkinleştirir. LDAP sisteminizin boyutlarına göre bu işlem uzun sürebilir. Kipi yine de değiştirmek istiyor musunuz?", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Kaydedilemedi. Veri tabanının çalışıyor olduğundan emin olun. İlerlemeden önce yeniden yükleyin.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Kipi değiştirmek otomatik LDAP sorgularını açar. LDAP sisteminizin boyutlarına göre bu işlem uzun sürebilir. Kipi yine de değiştirmek istiyor musunuz?", "Mode switch" : "Kip değişimi", "Select attributes" : "Öznitelikleri seçin", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Kullanıcı bulunamadı. Lütfen oturum açma özniteliklerini ve kullanıcı adını denetleyin. Etkin süzgeç (komut satırı doğrulamasında kullanmak için kopyalayıp yapıştırın): <br/>", "User found and settings verified." : "Kullanıcı bulundu ve ayarlar doğrulandı.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Çok sayıda kullanıcı bulunduğundan ve yalnız birinci kullanıcı oturum açabileceğinden arama ölçütlerinizi sıkılaştırmayı deneyin.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Çok sayıda kullanıcı bulunduğundan ve yalnızca birinci kullanıcı oturum açabileceğinden arama ölçütlerinizi sıkılaştırmayı deneyin.", "An unspecified error occurred. Please check log and settings." : "Bilinmeyen bir sorun çıktı. Lütfen günlüğü ve ayarları denetleyin.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Arama süzgeci, açılmış ve kapatılmış parantez sayılarının eşit olmaması gibi bir söz dizimi sorunu nedeniyle geçersiz. Lütfen gözden geçirin.", - "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Bir LDAP/AD bağlantı sorunu çıktı. Lütfen istemci, kapı numarası ve kimlik doğrulama bilgilerini denetleyin.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Bir LDAP/AD bağlantı sorunu çıktı. Lütfen istemci, bağlantı noktası ve kimlik doğrulama bilgilerini denetleyin.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "LDAP/AD sorgularında kullanıcı adı ile değiştirilecek \"%uid\" yer belirleyicisi eksik. ", "Please provide a login name to test against" : "Lütfen deneme için kullanılacak bir kullanıcı adı yazın", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", - "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD sunucusu memberOf parametresini desteklemediğinden grup kutusu kullanımdan kaldırıldı.", + "Password change rejected. Hint: %s" : "Parola değişimi reddedildi. İpucu: %s", + "Mandatory field \"%s\" left empty" : "\"%s\" zorunlu alanı boş olamaz", + "A password is given, but not an LDAP agent" : "Bir parola belirtilmiş ancak bir LDAP aracısı değil", + "No password is given for the user agent" : "Kullanıcı uygulaması için bir parola belirtilmemiş", + "No LDAP base DN was given" : "LDAP base DN değeri belirtilmemiş", + "User base DN is not a subnode of global base DN" : "Kullanıcı base DN değeri genel base DN düğümünün bir alt düğümü değil ", + "Group base DN is not a subnode of global base DN" : "Grup base DN değeri genel base DN düğümünün bir alt düğümü değil ", + "Login filter does not contain %s placeholder." : "Oturum açma süzgecinde %s yer belirticisi bulunmuyor", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", "LDAP User backend" : "LDAP kullanıcı arka yüzü", - "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", - "Your password will expire today." : "Parolanızın süresi bugün dolacak.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], + "Your password will expire tomorrow." : "Parolanızın geçerlilik süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın geçerlilik süresi bugün dolacak.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın geçerlilik süresi %n gün içinde dolacak."], "LDAP/AD integration" : "LDAP/AD bütünleştirmesi", - "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], - "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], + "LDAP Connection" : "LDAP bağlantısı", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bu LDAP yapılandırması için bağlantı kurulamadı: %s","%n LDAP yapılandırması için bağlantı kurulamadı: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Bu LDAP yapılandırması için arama tamamlanamadı: %s","%n LDAP yapılandırması için arama tamamlanamadı: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Etkin olmayan bir LDAP yapılandırması var: %s","Etkin olmayan %n LDAP yapılandırması var: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Yapılandırılmış LDAP bağlantısında (%s) bağlantı ve arama çalışıyor","Yapılandırılmış %n LDAP bağlantısında (%s) bağlantı ve arama çalışıyor"], + "Invalid LDAP UUIDs" : "LDAP UUID değerleri geçersiz", + "None found" : "Herhangi bir şey bulunamadı", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP hesapları ya da grupları için geçersiz UUID değerleri bulundu. Lütfen LDAP yapılandırmasının Uzman bölümündeki \"UUID algılaması değiştirilsin\" seçeneğini gözden geçirin ve bunları güncellemek için \"occ ldap:update-uuid\" komutunu kullanın.", + "_%n group found_::_%n groups found_" : ["%n grup bulundu","%n grup bulundu"], + "> 1000 groups found" : "> 1000 grup bulundu", + "> 1000 users found" : "> 1000 kullanıcı bulundu", + "_%n user found_::_%n users found_" : ["%n kullanıcı bulundu","%n kullanıcı bulundu"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Görüntülenecek kullanıcı adı özniteliği algılanamadı. Lütfen gelişmiş LDAP ayarları bölümünden siz belirtin.", "Could not find the desired feature" : "İstenilen özellik bulunamadı", "Invalid Host" : "Sunucu geçersiz", "LDAP user and group backend" : "LDAP kullanıcı ve grup arka yüzü", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama BT yöneticilerinin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud Kullanıcı Kodu için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud kullanıcı kimliği için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.", "Test Configuration" : "Yapılandırmayı sına", "Help" : "Yardım", "Groups meeting these criteria are available in %s:" : "%s içinde bu ölçüte uygun gruplar var:", - "Only these object classes:" : "Yalnız şu nesne sınıflarına:", - "Only from these groups:" : "Yalnız şu gruplardan:", + "Only these object classes:" : "Yalnızca şu nesne sınıflarına:", + "Only from these groups:" : "Yalnızca şu gruplardan:", "Search groups" : "Grup arama", "Available groups" : "Kullanılabilecek gruplar", "Selected groups" : "Seçilmiş gruplar", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "Diğer öznitelikler:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Oturum açma girişiminde uygulanacak süzgeci tanımlar. Oturum açma işleminde \"%%uid\" kullanıcı adı ile değiştirilir. Örnek: \"uid=%%uid\"", "Test Loginname" : "Kullanıcı adını sına", + "Attempts to receive a DN for the given loginname and the current login filter" : "Belirtilen oturum açma adı ve geçerli oturum açma süzgeci için bir etki alanı adı almayı dener", "Verify settings" : "Ayarları doğrula", "%s. Server:" : "%s. sunucu:", "Add a new configuration" : "Yeni bir yapılandırma ekle", @@ -95,8 +114,8 @@ OC.L10N.register( "Delete the current configuration" : "Geçerli yapılandırmayı sil", "Host" : "Sunucu", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "SSL gerekmiyorsa iletişim kuralı belirtilmeyebilir. Gerekiyorsa ldaps:// ile başlayın", - "Port" : "Kapı numarası", - "Detect Port" : "Kapı numarasını algıla", + "Port" : "Bağlantı noktası", + "Detect Port" : "Bağlantı noktasını algıla", "User DN" : "Kullanıcı DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Yapılacak bağlama için iİstemci kullanıcısının DN değeri. Örnek: uid=agent,dc=ornek,dc=com. Anonim erişim için DN ve Parolayı boş bırakın.", "Password" : "Parola", @@ -117,7 +136,7 @@ OC.L10N.register( "Continue" : "Sürdür", "Please renew your password." : "Lütfen parolanızı yenileyin.", "An internal error occurred." : "İçeride bir sorun çıktı.", - "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticinizle görüşün.", + "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticiniz ile görüşün.", "Current password" : "Geçerli parola", "New password" : "Yeni parola", "Renew password" : "Parolayı yenile", @@ -129,74 +148,92 @@ OC.L10N.register( "Groups" : "Gruplar", "Expert" : "Uzman", "Advanced" : "Gelişmiş", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurması için BT yöneticinizle görüşün.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka yüz çalışmayacak. Lütfen kurması için BT yöneticiniz ile görüşün.", "Connection Settings" : "Bağlantı Ayarları", - "Configuration Active" : "Yapılandırma Etkin", + "Configuration Active" : "Yapılandırma etkin", "When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.", "Backup (Replica) Host" : "Yedek (Replika) Sunucu", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "İsteğe bağlı olarak bir yedekleme sunucusu belirtin. Ana LDAP/AD sunucusunun kopyası olmalıdır.", - "Backup (Replica) Port" : "Yedek (Replika) Kapı Numarası", - "Disable Main Server" : "Ana Sunucuyu Devre Dışı Bırak", - "Only connect to the replica server." : "Yalnız yedek sunucu ile bağlantı kurulsun.", + "Backup (Replica) Port" : "Yedek (Replika) bağlantı noktası", + "Disable Main Server" : "Ana sunucuyu kullanımdan kaldır", + "Only connect to the replica server." : "Yalnızca yedek sunucu ile bağlantı kurulsun.", "Turn off SSL certificate validation." : "SSL sertifika doğrulaması kullanılmasın.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Önerilmez, yalnız deneme amacıyla kullanın! Bağlantı yalnız bu seçenek etkinleştirildiğinde çalışıyorsa LDAP sunucusunun SSL sertifikasını %s sunucuzun içine aktarın.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Önerilmez, yalnızca deneme amacıyla kullanın! Bağlantı yalnızca bu seçenek ile çalışıyorsa LDAP sunucusunun SSL sertifikasını %s sunucuzun içine aktarın.", "Cache Time-To-Live" : "Ön Bellek Time-To-Live Değeri", "in seconds. A change empties the cache." : "saniye cinsinden. Değişiklik ön belleği temizler.", "Directory Settings" : "Dizin Ayarları", "User Display Name Field" : "Görüntülenecek Kullanıcı Adı Alanı", - "The LDAP attribute to use to generate the user's display name." : "Görüntülenecek kullanıcı adını oluşturmak için kullanılacak LDAP özniteliği.", + "The LDAP attribute to use to generate the user's display name." : "Görüntülenecek kullanıcı adını üretmek için kullanılacak LDAP özniteliği.", "2nd User Display Name Field" : "2. Görüntülenecek Kullanıcı Adı Alanı", "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "İsteğe bağlı. Görüntülenecek ada parantez içinde eklenecek LDAP özniteliği. Örnek sonuç: »John Doe (john.doe@example.org)«.", "Base User Tree" : "Temel Kullanıcı Ağacı", "One User Base DN per line" : "Her Satıra Bir Kullanıcı Base DN", - "User Search Attributes" : "Kullanıcı Arama Öznitelikleri", + "User Search Attributes" : "Kullanıcı arama öznitelikleri", "Optional; one attribute per line" : "İsteğe bağlı; her satıra bir öznitelik", + "Disable users missing from LDAP" : "LDAP üzerinde bulunmayan kullanıcılar kullanımdan kaldırılsın", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Açıldığında, LDAP üzerinden içe aktarılmış ancak daha sonra kaybolmuş kullanıcılar kullanımdan kaldırılır", "Group Display Name Field" : "Görüntülenecek Grup Adı Alanı", - "The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını oluşturmak için kullanılacak LDAP özniteliği.", + "The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını üretmek için kullanılacak LDAP özniteliği.", "Base Group Tree" : "Temel Grup Ağacı", "One Group Base DN per line" : "Her Satıra Bir Grup Base DN", "Group Search Attributes" : "Grup Arama Öznitelikleri", "Group-Member association" : "Grup-Üye İlişkisi", "Dynamic Group Member URL" : "Devingen Grup Üye Adresi", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Bu grup nesneleri üzerindeki LDAP özniteliği, grupa hangi nesnelerin ait olduğunu bulan bir LDAP arama adresi içeriyor (Seçenek boş bırakıldığında dinamik grup üyeliği özelliği devre dışı kalır).", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Bu grup nesneleri üzerindeki LDAP özniteliğinde, gruba hangi nesnelerin ait olduğunu bulan bir LDAP arama adresi bulunuyor (seçenek boş bırakıldığında dinamik grup üyeliği özelliği kapatılır).", "Nested Groups" : "İç İçe Gruplar", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Bu seçenek etkinleştirildiğinde, gruplar içinde gruplar desteklenir (Yalnız grup üyesi özniteliği DN içeriyorsa çalışır).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Açılırsa, gruplar içinde gruplar desteklenir (Yalnızca grup üyesi özniteliğinde DN bulunuyorsa çalışır).", "Paging chunksize" : "Sayfalandırma yığın boyutu", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Yığın boyutu, kullanıcı ya da grup listeleri gibi, çok sayıda sonuç verebilen sayfalandırılmış LDAP aramaları için kullanılır (0 olarak ayarlandığında bu durumlarda sayfalandırılmış LDAP aramaları devre dışı kalır).", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Yığın boyutu, kullanıcı ya da grup listeleri gibi, çok sayıda sonuç verebilen sayfalandırılmış LDAP aramaları için kullanılır (0 olarak ayarlandığında bu durumlarda sayfalandırılmış LDAP aramaları kapatılır).", "Enable LDAP password changes per user" : "Kullanıcılar LDAP parolalarını değiştirebilsin", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : " Bu seçenek etkinleştirildiğinde, LDAP kullanıcıları kendi parolalarını değiştirebilir ve Süper Yöneticiler ile Grup Yöneticileri kendi LDAP kullanıcılarının parolalarını değiştirebilir. Yalnız erişim denetimi ilkeleri LDAP sunucuya uygun olarak yapılandırılmış ise çalışır. Parolalar LDAP sunucuya düz metin biçiminde aktarıldığından, LDAP sunucu üzerinde aktarım şifrelemesi ve parola karması kullanılmalıdır.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP kullanıcıları kendi parolalarını değiştirebilir ve Süper Yöneticiler ile Grup Yöneticileri kendi LDAP kullanıcılarının parolalarını değiştirebilir. Yalnızca erişim denetimi ilkeleri LDAP sunucusuna uygun olarak yapılandırılmış ise çalışır. Parolalar LDAP sunucusuna düz metin biçiminde aktarıldığından, LDAP sunucusu üzerinde aktarım şifrelemesi ve parola karması kullanılmalıdır.", "(New password is sent as plain text to LDAP)" : "(Yeni parola LDAP üzerine düz metin olarak gönderildi)", "Default password policy DN" : "Varsayılan parola ilkesi DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Parola süresinin sona erme işlemleri için kullanılacak varsayılan parola ilkesi için DN. Yalnız her kullanıcı için LDAP parola değişikliği etkinleştirilmiş ise çalışır ve yalnız OpenLDAP tarafından desteklenir. Parola süresi sona erme işlemlerini devre dışı bırakmak için boş bırakın.", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Parola geçerlilik süresinin sona erme işlemleri için kullanılacak varsayılan parola ilkesinin etki alanı adı (DN). Yalnızca her kullanıcı için LDAP parola değişikliği açıksa çalışır ve yalnızca OpenLDAP tarafından desteklenir. Parola süresi sona erme işlemlerini kapatmak için boş bırakın.", "Special Attributes" : "Özel Öznitelikler", "Quota Field" : "Kota Alanı", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Kullanıcının varsayılan kotasının kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "Quota Default" : "Varsayılan Kota", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Kota Alanına bir kota değeri yazılmamış olan LDAP kullanıcıları için kullanılacak varsayılan kota değerini yazın.", - "Email Field" : "E-posta Alanı", + "Email Field" : "E-posta alanı", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Kullanıcı varsayılan e-posta adresinin kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.", "\"$home\" Placeholder Field" : "\"$home\" Yer Belirleyici Alanı", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Bir dış depolama yapılandırmasında $home yerine belirtilen öznitelik konulur", + "User Profile Attributes" : "Kullanıcı profili öznitelikleri", + "Phone Field" : "Telefon alanı", + "User profile Phone will be set from the specified attribute" : "Kullanıcı profilindeki telefon alanının değeri belirtilen öznitelikten alınır", + "Website Field" : "Site alanı", + "User profile Website will be set from the specified attribute" : "Kullanıcı profilindeki site alanının değeri belirtilen öznitelikten alınır", + "Address Field" : "Adres alanı", + "User profile Address will be set from the specified attribute" : "Kullanıcı profilindeki adres alanının değeri belirtilen öznitelikten alınır", + "Twitter Field" : "Twitter alanı", + "User profile Twitter will be set from the specified attribute" : "Kullanıcı profilindeki Twitter alanının değeri belirtilen öznitelikten alınır", + "Fediverse Field" : "Fediverse alanı", + "User profile Fediverse will be set from the specified attribute" : "Kullanıcı profilindeki Fediverse alanının değeri belirtilen öznitelikten alınır", + "Organisation Field" : "Kuruluş alanı", + "User profile Organisation will be set from the specified attribute" : "Kullanıcı profilindeki kuruluş alanının değeri belirtilen öznitelikten alınır", + "Role Field" : "Rol alanı", + "User profile Role will be set from the specified attribute" : "Kullanıcı profilindeki rol alanının değeri belirtilen öznitelikten alınır", + "Headline Field" : "Başlık alanı", + "User profile Headline will be set from the specified attribute" : "Kullanıcı profilindeki başlık alanının değeri belirtilen öznitelikten alınır", + "Biography Field" : "Özgeçmiş alanı", + "User profile Biography will be set from the specified attribute" : "Kullanıcı profilindeki özgeçmiş alanının değeri belirtilen öznitelikten alınır", + "Birthdate Field" : "Doğum tarihi alanı", + "User profile Date of birth will be set from the specified attribute" : "Kullanıcı profilindeki doğum tarihi alanının değeri belirtilen öznitelikten alınır", + "Pronouns Field" : "Hitap alanı", + "User profile Pronouns will be set from the specified attribute" : "Kullanıcı profilindeki hitap alanının değeri belirtilen öznitelikten alınır", "Internal Username" : "İç kullanıcı adı", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışı kullanmak için boş bırakın. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnızca şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin DAV hizmetlerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnızca yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışın kullanılması için boş bırakın.", "Internal Username Attribute:" : "İç kullanıcı adı özniteliği:", "Override UUID detection" : "UUID algılaması değiştirilsin", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Varsayılan olarak, UUID özniteliği otomatik olarak algılanır. UUID özniteliği LDAP kullanıcı ve gruplarını kesin olarak belirlemek için kullanılır. Yukarıda başka türlü belirtilmemişse, bu UUID için bir iç kullanıcı adı oluşturulur. Bu ayarı değiştirerek istenilen bir öznitelik belirtilebilir. Ancak istenilen özniteliğin eşsiz olduğundan ve hem kullanıcı hem de gruplar tarafından kullanıldığından emin olunmalıdır. Varsayılan davranış için boş bırakın. Değişiklikler yalnız yeni eşleştirilen (eklenen) LDAP kullanıcı ve gruplarını etkiler.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Varsayılan olarak, UUID özniteliği otomatik olarak algılanır. UUID özniteliği LDAP kullanıcı ve gruplarını kesin olarak belirlemek için kullanılır. Yukarıda başka türlü belirtilmemişse, bu UUID için bir iç kullanıcı adı oluşturulur. Bu ayarı değiştirerek istenilen bir öznitelik belirtilebilir. Ancak istenilen özniteliğin eşsiz olduğundan ve hem kullanıcı hem de gruplar tarafından kullanıldığından emin olunmalıdır. Varsayılan davranış için boş bırakın. Değişiklikler yalnızca yeni eşleştirilen (eklenen) LDAP kullanıcı ve gruplarını etkiler.", "UUID Attribute for Users:" : "Kullanıcılar için UUID Özniteliği:", "UUID Attribute for Groups:" : "Gruplar için UUID Özniteliği:", "Username-LDAP User Mapping" : "Kullanıcı Adı-LDAP Kullanıcısı Eşleştirme", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Kullanıcı adları, üst veri depolaması ve ataması için kullanılır. Kullanıcıları kesin olarak belirlemek ve algılamak için, her LDAP kullanıcısına bir iç kullanıcı verilir. Bu kullanıcı adı ile LDAP kullanıcısının eşleştirilmesi gerekir. Oluşturulan kullanıcı adı LDAP kullanıcısının UUID değeri ile eşleştirilir. Bunun yanında LDAP etkileşimini azaltmak için DN ön belleğe alınır ancak bu işlem kimlik belirleme için kullanılmaz. DN üzerinde yapılan değişiklikler aktarılır. İç kullanıcı her yerde kullanıldığından, bir eşleştirmeyi kaldırmak pek çok yerde kalıntılar bırakır. Eşleştirmeleri kaldırmak yalnız yapılandırmaya bağlı değildir, tüm LDAP yapılandırmalarını etkiler! Üretim ortamında eşleştirmeleri asla kaldırmayın, yalnız sınama ya da deney aşamalarında kullanın.", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Kullanıcı adları, üst veri depolaması ve ataması için kullanılır. Kullanıcıları kesin olarak belirlemek ve algılamak için, her LDAP kullanıcısına bir iç kullanıcı verilir. Bu kullanıcı adı ile LDAP kullanıcısının eşleştirilmesi gerekir. Oluşturulan kullanıcı adı LDAP kullanıcısının UUID değeri ile eşleştirilir. Bunun yanında LDAP etkileşimini azaltmak için DN ön belleğe alınır ancak bu işlem kimlik belirleme için kullanılmaz. DN üzerinde yapılan değişiklikler aktarılır. İç kullanıcı her yerde kullanıldığından, bir eşleştirmeyi kaldırmak pek çok yerde kalıntılar bırakır. Eşleştirmeleri kaldırmak yalnızca yapılandırmaya bağlı değildir, tüm LDAP yapılandırmalarını etkiler! Üretim ortamında eşleştirmeleri asla kaldırmayın, yalnızca sınama ya da deney aşamalarında kullanın.", "Clear Username-LDAP User Mapping" : "Kullanıcı Adı-LDAP Kullanıcısı Eşleştirmesini Kaldır", "Clear Groupname-LDAP Group Mapping" : "Grup Adı-LDAP Grubu Eşleştirmesini Kaldır", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD için bir bağlantı sorunu çıktı. Lütfen istemci, kapı numarası ve kimlik doğrulama bilgilerini denetleyin.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "LDAP / AD sorgularında kullanıcı adı ile değiştirilecek \"%uid\" yer belirleyicisi eksik. ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP / AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", - "LDAP / AD integration" : "LDAP / AD bütünleştirmesi", - "LDAP / AD Username:" : "LDAP / AD Kullanıcı Adı:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD kullanıcı adı ile oturum açılmasını sağlar. Kullanıcı adı \"uid\" ya da \"sAMAccountName\" olabilir ve algılanır.", - "LDAP / AD Email Address:" : "LDAP / AD E-posta Adresi:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler." + "Invalid configuration. Please have a look at the logs for further details." : "Yapılandırma geçersiz. Lütfen ayrıntılı bilgi almak için günlük dosyasına bakın." }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index 4b3341a1ac9..f5c2c7306dd 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "Yapılandırma geçersiz: Adsız bağlantı kurulmasına izin verilmiyor.", "Valid configuration, connection established!" : "Yapılandırma geçerli, bağlantı kuruldu.", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Yapılandırma geçerli ancak bağlantı kurulamadı. Lütfen sunucu ayarları ve kimlik doğrulama bilgilerini denetleyin.", - "Invalid configuration. Please have a look at the logs for further details." : "Yapılandırma geçersiz. Lütfen ayrıntılı bilgi almak için günlük dosyasına bakın.", + "Invalid configuration: %s" : "Yapılandırma geçersiz: %s", "No action specified" : "Hehrangi bir işlem belirtilmemiş", "No configuration specified" : "Henüz bir yapılandırma belirtilmemiş", "No data specified" : "Henüz bir veri belirtilmemiş", - " Could not set configuration %s" : "%s yapılandırması ayarlanamadı", + "Invalid data specified" : "Belirtilen veriler geçersiz", + "Could not set configuration %1$s to %2$s" : "%1$s yapılandırması %2$s için ayarlanamadı", "Action does not exist" : "İşlem bulunamadı", "Renewing …" : "Yenileniyor …", "Very weak password" : "Parola çok zayıf", @@ -24,8 +25,8 @@ "Select groups" : "Grupları seçin", "Select object classes" : "Nesne sınıflarını seçin", "Please check the credentials, they seem to be wrong." : "Lütfen kimlik doğrulama bilgilerini denetleyin, yanlış görünüyor.", - "Please specify the port, it could not be auto-detected." : "Lütfen kapı numarasını belirtin. Otomatik olarak algılanamadı.", - "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN otomatik olarak algılanamadı. Lütfen kimlik doğrulama bilgilerini, sunucu ve kapı numarasını gözden geçirin.", + "Please specify the port, it could not be auto-detected." : "Lütfen bağlantı noktasını belirtin. Otomatik olarak algılanamadı.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN otomatik olarak algılanamadı. Lütfen kimlik doğrulama bilgilerini, sunucu ve bağlantı noktasını gözden geçirin.", "Could not detect Base DN, please enter it manually." : "Base DN algılanamadı. Lütfen el ile yazın.", "{nthServer}. Server" : "{nthServer}. Sunucu", "No object found in the given Base DN. Please revise." : "Belirtilen Base DN içerisinde herhangi bir nesne bulunamadı. Lütfen gözden geçirin.", @@ -38,39 +39,56 @@ "Error while clearing the mappings." : "Eşleştirmeler temizlenirken sorun çıktı.", "Anonymous bind is not allowed. Please provide a User DN and Password." : "Anonim atamaya izin verilmiyor. Lütfen bir Kullanıcı DN ve parola belirtin.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP işleminde sorun çıktı. Anonim bağlamaya izin verilmiyor.", - "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Kaydedilemedi. Veritabanının çalışıyor olduğundan emin olun. Devam etmeden yeniden yükleyin.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Kipi değiştirmek otomatik LDAP sorgularını etkinleştirir. LDAP sisteminizin boyutlarına göre bu işlem uzun sürebilir. Kipi yine de değiştirmek istiyor musunuz?", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Kaydedilemedi. Veri tabanının çalışıyor olduğundan emin olun. İlerlemeden önce yeniden yükleyin.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Kipi değiştirmek otomatik LDAP sorgularını açar. LDAP sisteminizin boyutlarına göre bu işlem uzun sürebilir. Kipi yine de değiştirmek istiyor musunuz?", "Mode switch" : "Kip değişimi", "Select attributes" : "Öznitelikleri seçin", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Kullanıcı bulunamadı. Lütfen oturum açma özniteliklerini ve kullanıcı adını denetleyin. Etkin süzgeç (komut satırı doğrulamasında kullanmak için kopyalayıp yapıştırın): <br/>", "User found and settings verified." : "Kullanıcı bulundu ve ayarlar doğrulandı.", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Çok sayıda kullanıcı bulunduğundan ve yalnız birinci kullanıcı oturum açabileceğinden arama ölçütlerinizi sıkılaştırmayı deneyin.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Çok sayıda kullanıcı bulunduğundan ve yalnızca birinci kullanıcı oturum açabileceğinden arama ölçütlerinizi sıkılaştırmayı deneyin.", "An unspecified error occurred. Please check log and settings." : "Bilinmeyen bir sorun çıktı. Lütfen günlüğü ve ayarları denetleyin.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Arama süzgeci, açılmış ve kapatılmış parantez sayılarının eşit olmaması gibi bir söz dizimi sorunu nedeniyle geçersiz. Lütfen gözden geçirin.", - "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Bir LDAP/AD bağlantı sorunu çıktı. Lütfen istemci, kapı numarası ve kimlik doğrulama bilgilerini denetleyin.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Bir LDAP/AD bağlantı sorunu çıktı. Lütfen istemci, bağlantı noktası ve kimlik doğrulama bilgilerini denetleyin.", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "LDAP/AD sorgularında kullanıcı adı ile değiştirilecek \"%uid\" yer belirleyicisi eksik. ", "Please provide a login name to test against" : "Lütfen deneme için kullanılacak bir kullanıcı adı yazın", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", - "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "LDAP/AD sunucusu memberOf parametresini desteklemediğinden grup kutusu kullanımdan kaldırıldı.", + "Password change rejected. Hint: %s" : "Parola değişimi reddedildi. İpucu: %s", + "Mandatory field \"%s\" left empty" : "\"%s\" zorunlu alanı boş olamaz", + "A password is given, but not an LDAP agent" : "Bir parola belirtilmiş ancak bir LDAP aracısı değil", + "No password is given for the user agent" : "Kullanıcı uygulaması için bir parola belirtilmemiş", + "No LDAP base DN was given" : "LDAP base DN değeri belirtilmemiş", + "User base DN is not a subnode of global base DN" : "Kullanıcı base DN değeri genel base DN düğümünün bir alt düğümü değil ", + "Group base DN is not a subnode of global base DN" : "Grup base DN değeri genel base DN düğümünün bir alt düğümü değil ", + "Login filter does not contain %s placeholder." : "Oturum açma süzgecinde %s yer belirticisi bulunmuyor", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", "LDAP User backend" : "LDAP kullanıcı arka yüzü", - "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", - "Your password will expire today." : "Parolanızın süresi bugün dolacak.", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], + "Your password will expire tomorrow." : "Parolanızın geçerlilik süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın geçerlilik süresi bugün dolacak.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın geçerlilik süresi %n gün içinde dolacak."], "LDAP/AD integration" : "LDAP/AD bütünleştirmesi", - "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], - "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], + "LDAP Connection" : "LDAP bağlantısı", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Bu LDAP yapılandırması için bağlantı kurulamadı: %s","%n LDAP yapılandırması için bağlantı kurulamadı: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Bu LDAP yapılandırması için arama tamamlanamadı: %s","%n LDAP yapılandırması için arama tamamlanamadı: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Etkin olmayan bir LDAP yapılandırması var: %s","Etkin olmayan %n LDAP yapılandırması var: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Yapılandırılmış LDAP bağlantısında (%s) bağlantı ve arama çalışıyor","Yapılandırılmış %n LDAP bağlantısında (%s) bağlantı ve arama çalışıyor"], + "Invalid LDAP UUIDs" : "LDAP UUID değerleri geçersiz", + "None found" : "Herhangi bir şey bulunamadı", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP hesapları ya da grupları için geçersiz UUID değerleri bulundu. Lütfen LDAP yapılandırmasının Uzman bölümündeki \"UUID algılaması değiştirilsin\" seçeneğini gözden geçirin ve bunları güncellemek için \"occ ldap:update-uuid\" komutunu kullanın.", + "_%n group found_::_%n groups found_" : ["%n grup bulundu","%n grup bulundu"], + "> 1000 groups found" : "> 1000 grup bulundu", + "> 1000 users found" : "> 1000 kullanıcı bulundu", + "_%n user found_::_%n users found_" : ["%n kullanıcı bulundu","%n kullanıcı bulundu"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Görüntülenecek kullanıcı adı özniteliği algılanamadı. Lütfen gelişmiş LDAP ayarları bölümünden siz belirtin.", "Could not find the desired feature" : "İstenilen özellik bulunamadı", "Invalid Host" : "Sunucu geçersiz", "LDAP user and group backend" : "LDAP kullanıcı ve grup arka yüzü", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama BT yöneticilerinin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud Kullanıcı Kodu için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud kullanıcı kimliği için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.", "Test Configuration" : "Yapılandırmayı sına", "Help" : "Yardım", "Groups meeting these criteria are available in %s:" : "%s içinde bu ölçüte uygun gruplar var:", - "Only these object classes:" : "Yalnız şu nesne sınıflarına:", - "Only from these groups:" : "Yalnız şu gruplardan:", + "Only these object classes:" : "Yalnızca şu nesne sınıflarına:", + "Only from these groups:" : "Yalnızca şu gruplardan:", "Search groups" : "Grup arama", "Available groups" : "Kullanılabilecek gruplar", "Selected groups" : "Seçilmiş gruplar", @@ -86,6 +104,7 @@ "Other Attributes:" : "Diğer öznitelikler:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Oturum açma girişiminde uygulanacak süzgeci tanımlar. Oturum açma işleminde \"%%uid\" kullanıcı adı ile değiştirilir. Örnek: \"uid=%%uid\"", "Test Loginname" : "Kullanıcı adını sına", + "Attempts to receive a DN for the given loginname and the current login filter" : "Belirtilen oturum açma adı ve geçerli oturum açma süzgeci için bir etki alanı adı almayı dener", "Verify settings" : "Ayarları doğrula", "%s. Server:" : "%s. sunucu:", "Add a new configuration" : "Yeni bir yapılandırma ekle", @@ -93,8 +112,8 @@ "Delete the current configuration" : "Geçerli yapılandırmayı sil", "Host" : "Sunucu", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "SSL gerekmiyorsa iletişim kuralı belirtilmeyebilir. Gerekiyorsa ldaps:// ile başlayın", - "Port" : "Kapı numarası", - "Detect Port" : "Kapı numarasını algıla", + "Port" : "Bağlantı noktası", + "Detect Port" : "Bağlantı noktasını algıla", "User DN" : "Kullanıcı DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Yapılacak bağlama için iİstemci kullanıcısının DN değeri. Örnek: uid=agent,dc=ornek,dc=com. Anonim erişim için DN ve Parolayı boş bırakın.", "Password" : "Parola", @@ -115,7 +134,7 @@ "Continue" : "Sürdür", "Please renew your password." : "Lütfen parolanızı yenileyin.", "An internal error occurred." : "İçeride bir sorun çıktı.", - "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticinizle görüşün.", + "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticiniz ile görüşün.", "Current password" : "Geçerli parola", "New password" : "Yeni parola", "Renew password" : "Parolayı yenile", @@ -127,74 +146,92 @@ "Groups" : "Gruplar", "Expert" : "Uzman", "Advanced" : "Gelişmiş", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurması için BT yöneticinizle görüşün.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka yüz çalışmayacak. Lütfen kurması için BT yöneticiniz ile görüşün.", "Connection Settings" : "Bağlantı Ayarları", - "Configuration Active" : "Yapılandırma Etkin", + "Configuration Active" : "Yapılandırma etkin", "When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.", "Backup (Replica) Host" : "Yedek (Replika) Sunucu", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "İsteğe bağlı olarak bir yedekleme sunucusu belirtin. Ana LDAP/AD sunucusunun kopyası olmalıdır.", - "Backup (Replica) Port" : "Yedek (Replika) Kapı Numarası", - "Disable Main Server" : "Ana Sunucuyu Devre Dışı Bırak", - "Only connect to the replica server." : "Yalnız yedek sunucu ile bağlantı kurulsun.", + "Backup (Replica) Port" : "Yedek (Replika) bağlantı noktası", + "Disable Main Server" : "Ana sunucuyu kullanımdan kaldır", + "Only connect to the replica server." : "Yalnızca yedek sunucu ile bağlantı kurulsun.", "Turn off SSL certificate validation." : "SSL sertifika doğrulaması kullanılmasın.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Önerilmez, yalnız deneme amacıyla kullanın! Bağlantı yalnız bu seçenek etkinleştirildiğinde çalışıyorsa LDAP sunucusunun SSL sertifikasını %s sunucuzun içine aktarın.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Önerilmez, yalnızca deneme amacıyla kullanın! Bağlantı yalnızca bu seçenek ile çalışıyorsa LDAP sunucusunun SSL sertifikasını %s sunucuzun içine aktarın.", "Cache Time-To-Live" : "Ön Bellek Time-To-Live Değeri", "in seconds. A change empties the cache." : "saniye cinsinden. Değişiklik ön belleği temizler.", "Directory Settings" : "Dizin Ayarları", "User Display Name Field" : "Görüntülenecek Kullanıcı Adı Alanı", - "The LDAP attribute to use to generate the user's display name." : "Görüntülenecek kullanıcı adını oluşturmak için kullanılacak LDAP özniteliği.", + "The LDAP attribute to use to generate the user's display name." : "Görüntülenecek kullanıcı adını üretmek için kullanılacak LDAP özniteliği.", "2nd User Display Name Field" : "2. Görüntülenecek Kullanıcı Adı Alanı", "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "İsteğe bağlı. Görüntülenecek ada parantez içinde eklenecek LDAP özniteliği. Örnek sonuç: »John Doe (john.doe@example.org)«.", "Base User Tree" : "Temel Kullanıcı Ağacı", "One User Base DN per line" : "Her Satıra Bir Kullanıcı Base DN", - "User Search Attributes" : "Kullanıcı Arama Öznitelikleri", + "User Search Attributes" : "Kullanıcı arama öznitelikleri", "Optional; one attribute per line" : "İsteğe bağlı; her satıra bir öznitelik", + "Disable users missing from LDAP" : "LDAP üzerinde bulunmayan kullanıcılar kullanımdan kaldırılsın", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Açıldığında, LDAP üzerinden içe aktarılmış ancak daha sonra kaybolmuş kullanıcılar kullanımdan kaldırılır", "Group Display Name Field" : "Görüntülenecek Grup Adı Alanı", - "The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını oluşturmak için kullanılacak LDAP özniteliği.", + "The LDAP attribute to use to generate the groups's display name." : "Görüntülenecek grup adını üretmek için kullanılacak LDAP özniteliği.", "Base Group Tree" : "Temel Grup Ağacı", "One Group Base DN per line" : "Her Satıra Bir Grup Base DN", "Group Search Attributes" : "Grup Arama Öznitelikleri", "Group-Member association" : "Grup-Üye İlişkisi", "Dynamic Group Member URL" : "Devingen Grup Üye Adresi", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Bu grup nesneleri üzerindeki LDAP özniteliği, grupa hangi nesnelerin ait olduğunu bulan bir LDAP arama adresi içeriyor (Seçenek boş bırakıldığında dinamik grup üyeliği özelliği devre dışı kalır).", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Bu grup nesneleri üzerindeki LDAP özniteliğinde, gruba hangi nesnelerin ait olduğunu bulan bir LDAP arama adresi bulunuyor (seçenek boş bırakıldığında dinamik grup üyeliği özelliği kapatılır).", "Nested Groups" : "İç İçe Gruplar", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Bu seçenek etkinleştirildiğinde, gruplar içinde gruplar desteklenir (Yalnız grup üyesi özniteliği DN içeriyorsa çalışır).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Açılırsa, gruplar içinde gruplar desteklenir (Yalnızca grup üyesi özniteliğinde DN bulunuyorsa çalışır).", "Paging chunksize" : "Sayfalandırma yığın boyutu", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Yığın boyutu, kullanıcı ya da grup listeleri gibi, çok sayıda sonuç verebilen sayfalandırılmış LDAP aramaları için kullanılır (0 olarak ayarlandığında bu durumlarda sayfalandırılmış LDAP aramaları devre dışı kalır).", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Yığın boyutu, kullanıcı ya da grup listeleri gibi, çok sayıda sonuç verebilen sayfalandırılmış LDAP aramaları için kullanılır (0 olarak ayarlandığında bu durumlarda sayfalandırılmış LDAP aramaları kapatılır).", "Enable LDAP password changes per user" : "Kullanıcılar LDAP parolalarını değiştirebilsin", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : " Bu seçenek etkinleştirildiğinde, LDAP kullanıcıları kendi parolalarını değiştirebilir ve Süper Yöneticiler ile Grup Yöneticileri kendi LDAP kullanıcılarının parolalarını değiştirebilir. Yalnız erişim denetimi ilkeleri LDAP sunucuya uygun olarak yapılandırılmış ise çalışır. Parolalar LDAP sunucuya düz metin biçiminde aktarıldığından, LDAP sunucu üzerinde aktarım şifrelemesi ve parola karması kullanılmalıdır.", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP kullanıcıları kendi parolalarını değiştirebilir ve Süper Yöneticiler ile Grup Yöneticileri kendi LDAP kullanıcılarının parolalarını değiştirebilir. Yalnızca erişim denetimi ilkeleri LDAP sunucusuna uygun olarak yapılandırılmış ise çalışır. Parolalar LDAP sunucusuna düz metin biçiminde aktarıldığından, LDAP sunucusu üzerinde aktarım şifrelemesi ve parola karması kullanılmalıdır.", "(New password is sent as plain text to LDAP)" : "(Yeni parola LDAP üzerine düz metin olarak gönderildi)", "Default password policy DN" : "Varsayılan parola ilkesi DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Parola süresinin sona erme işlemleri için kullanılacak varsayılan parola ilkesi için DN. Yalnız her kullanıcı için LDAP parola değişikliği etkinleştirilmiş ise çalışır ve yalnız OpenLDAP tarafından desteklenir. Parola süresi sona erme işlemlerini devre dışı bırakmak için boş bırakın.", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Parola geçerlilik süresinin sona erme işlemleri için kullanılacak varsayılan parola ilkesinin etki alanı adı (DN). Yalnızca her kullanıcı için LDAP parola değişikliği açıksa çalışır ve yalnızca OpenLDAP tarafından desteklenir. Parola süresi sona erme işlemlerini kapatmak için boş bırakın.", "Special Attributes" : "Özel Öznitelikler", "Quota Field" : "Kota Alanı", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Kullanıcının varsayılan kotasının kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "Quota Default" : "Varsayılan Kota", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Kota Alanına bir kota değeri yazılmamış olan LDAP kullanıcıları için kullanılacak varsayılan kota değerini yazın.", - "Email Field" : "E-posta Alanı", + "Email Field" : "E-posta alanı", "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Kullanıcı varsayılan e-posta adresinin kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı", "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.", "\"$home\" Placeholder Field" : "\"$home\" Yer Belirleyici Alanı", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "Bir dış depolama yapılandırmasında $home yerine belirtilen öznitelik konulur", + "User Profile Attributes" : "Kullanıcı profili öznitelikleri", + "Phone Field" : "Telefon alanı", + "User profile Phone will be set from the specified attribute" : "Kullanıcı profilindeki telefon alanının değeri belirtilen öznitelikten alınır", + "Website Field" : "Site alanı", + "User profile Website will be set from the specified attribute" : "Kullanıcı profilindeki site alanının değeri belirtilen öznitelikten alınır", + "Address Field" : "Adres alanı", + "User profile Address will be set from the specified attribute" : "Kullanıcı profilindeki adres alanının değeri belirtilen öznitelikten alınır", + "Twitter Field" : "Twitter alanı", + "User profile Twitter will be set from the specified attribute" : "Kullanıcı profilindeki Twitter alanının değeri belirtilen öznitelikten alınır", + "Fediverse Field" : "Fediverse alanı", + "User profile Fediverse will be set from the specified attribute" : "Kullanıcı profilindeki Fediverse alanının değeri belirtilen öznitelikten alınır", + "Organisation Field" : "Kuruluş alanı", + "User profile Organisation will be set from the specified attribute" : "Kullanıcı profilindeki kuruluş alanının değeri belirtilen öznitelikten alınır", + "Role Field" : "Rol alanı", + "User profile Role will be set from the specified attribute" : "Kullanıcı profilindeki rol alanının değeri belirtilen öznitelikten alınır", + "Headline Field" : "Başlık alanı", + "User profile Headline will be set from the specified attribute" : "Kullanıcı profilindeki başlık alanının değeri belirtilen öznitelikten alınır", + "Biography Field" : "Özgeçmiş alanı", + "User profile Biography will be set from the specified attribute" : "Kullanıcı profilindeki özgeçmiş alanının değeri belirtilen öznitelikten alınır", + "Birthdate Field" : "Doğum tarihi alanı", + "User profile Date of birth will be set from the specified attribute" : "Kullanıcı profilindeki doğum tarihi alanının değeri belirtilen öznitelikten alınır", + "Pronouns Field" : "Hitap alanı", + "User profile Pronouns will be set from the specified attribute" : "Kullanıcı profilindeki hitap alanının değeri belirtilen öznitelikten alınır", "Internal Username" : "İç kullanıcı adı", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışı kullanmak için boş bırakın. ", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnızca şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@-]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin DAV hizmetlerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Değişiklikler yalnızca yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler. Varsayılan davranışın kullanılması için boş bırakın.", "Internal Username Attribute:" : "İç kullanıcı adı özniteliği:", "Override UUID detection" : "UUID algılaması değiştirilsin", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Varsayılan olarak, UUID özniteliği otomatik olarak algılanır. UUID özniteliği LDAP kullanıcı ve gruplarını kesin olarak belirlemek için kullanılır. Yukarıda başka türlü belirtilmemişse, bu UUID için bir iç kullanıcı adı oluşturulur. Bu ayarı değiştirerek istenilen bir öznitelik belirtilebilir. Ancak istenilen özniteliğin eşsiz olduğundan ve hem kullanıcı hem de gruplar tarafından kullanıldığından emin olunmalıdır. Varsayılan davranış için boş bırakın. Değişiklikler yalnız yeni eşleştirilen (eklenen) LDAP kullanıcı ve gruplarını etkiler.", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Varsayılan olarak, UUID özniteliği otomatik olarak algılanır. UUID özniteliği LDAP kullanıcı ve gruplarını kesin olarak belirlemek için kullanılır. Yukarıda başka türlü belirtilmemişse, bu UUID için bir iç kullanıcı adı oluşturulur. Bu ayarı değiştirerek istenilen bir öznitelik belirtilebilir. Ancak istenilen özniteliğin eşsiz olduğundan ve hem kullanıcı hem de gruplar tarafından kullanıldığından emin olunmalıdır. Varsayılan davranış için boş bırakın. Değişiklikler yalnızca yeni eşleştirilen (eklenen) LDAP kullanıcı ve gruplarını etkiler.", "UUID Attribute for Users:" : "Kullanıcılar için UUID Özniteliği:", "UUID Attribute for Groups:" : "Gruplar için UUID Özniteliği:", "Username-LDAP User Mapping" : "Kullanıcı Adı-LDAP Kullanıcısı Eşleştirme", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Kullanıcı adları, üst veri depolaması ve ataması için kullanılır. Kullanıcıları kesin olarak belirlemek ve algılamak için, her LDAP kullanıcısına bir iç kullanıcı verilir. Bu kullanıcı adı ile LDAP kullanıcısının eşleştirilmesi gerekir. Oluşturulan kullanıcı adı LDAP kullanıcısının UUID değeri ile eşleştirilir. Bunun yanında LDAP etkileşimini azaltmak için DN ön belleğe alınır ancak bu işlem kimlik belirleme için kullanılmaz. DN üzerinde yapılan değişiklikler aktarılır. İç kullanıcı her yerde kullanıldığından, bir eşleştirmeyi kaldırmak pek çok yerde kalıntılar bırakır. Eşleştirmeleri kaldırmak yalnız yapılandırmaya bağlı değildir, tüm LDAP yapılandırmalarını etkiler! Üretim ortamında eşleştirmeleri asla kaldırmayın, yalnız sınama ya da deney aşamalarında kullanın.", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Kullanıcı adları, üst veri depolaması ve ataması için kullanılır. Kullanıcıları kesin olarak belirlemek ve algılamak için, her LDAP kullanıcısına bir iç kullanıcı verilir. Bu kullanıcı adı ile LDAP kullanıcısının eşleştirilmesi gerekir. Oluşturulan kullanıcı adı LDAP kullanıcısının UUID değeri ile eşleştirilir. Bunun yanında LDAP etkileşimini azaltmak için DN ön belleğe alınır ancak bu işlem kimlik belirleme için kullanılmaz. DN üzerinde yapılan değişiklikler aktarılır. İç kullanıcı her yerde kullanıldığından, bir eşleştirmeyi kaldırmak pek çok yerde kalıntılar bırakır. Eşleştirmeleri kaldırmak yalnızca yapılandırmaya bağlı değildir, tüm LDAP yapılandırmalarını etkiler! Üretim ortamında eşleştirmeleri asla kaldırmayın, yalnızca sınama ya da deney aşamalarında kullanın.", "Clear Username-LDAP User Mapping" : "Kullanıcı Adı-LDAP Kullanıcısı Eşleştirmesini Kaldır", "Clear Groupname-LDAP Group Mapping" : "Grup Adı-LDAP Grubu Eşleştirmesini Kaldır", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP / AD için bir bağlantı sorunu çıktı. Lütfen istemci, kapı numarası ve kimlik doğrulama bilgilerini denetleyin.", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "LDAP / AD sorgularında kullanıcı adı ile değiştirilecek \"%uid\" yer belirleyicisi eksik. ", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP / AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", - "LDAP / AD integration" : "LDAP / AD bütünleştirmesi", - "LDAP / AD Username:" : "LDAP / AD Kullanıcı Adı:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD kullanıcı adı ile oturum açılmasını sağlar. Kullanıcı adı \"uid\" ya da \"sAMAccountName\" olabilir ve algılanır.", - "LDAP / AD Email Address:" : "LDAP / AD E-posta Adresi:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler." + "Invalid configuration. Please have a look at the logs for further details." : "Yapılandırma geçersiz. Lütfen ayrıntılı bilgi almak için günlük dosyasına bakın." },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/tzm.js b/apps/user_ldap/l10n/tzm.js deleted file mode 100644 index 1d621c04a77..00000000000 --- a/apps/user_ldap/l10n/tzm.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;"); diff --git a/apps/user_ldap/l10n/tzm.json b/apps/user_ldap/l10n/tzm.json deleted file mode 100644 index 2c3a3581b99..00000000000 --- a/apps/user_ldap/l10n/tzm.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ug.js b/apps/user_ldap/l10n/ug.js index c1020b1c32b..8026cf7e3f0 100644 --- a/apps/user_ldap/l10n/ug.js +++ b/apps/user_ldap/l10n/ug.js @@ -1,14 +1,221 @@ OC.L10N.register( "user_ldap", { - "Users" : "ئىشلەتكۈچىلەر", - "Groups" : "گۇرۇپپا", + "Failed to clear the mappings." : "خەرىتىنى تازىلاش مەغلۇب بولدى.", + "Failed to delete the server configuration" : "مۇلازىمېتىر سەپلىمىسىنى ئۆچۈرەلمىدى", + "Invalid configuration: Anonymous binding is not allowed." : "ئىناۋەتسىز سەپلىمىسى: نامسىز باغلاشقا بولمايدۇ.", + "Valid configuration, connection established!" : "ئىناۋەتلىك سەپلىمە ، ئۇلىنىش قۇرۇلدى!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "ئىناۋەتلىك سەپلىمىسى ، ئەمما باغلاش مەغلۇپ بولدى. مۇلازىمېتىر تەڭشىكى ۋە كىنىشكىسىنى تەكشۈرۈپ بېقىڭ.", + "No action specified" : "ھېچقانداق ھەرىكەت بەلگىلەنمىدى", + "No configuration specified" : "سەپلىمىسى ئېنىق ئەمەس", + "No data specified" : "ھېچقانداق سانلىق مەلۇمات كۆرسىتىلمىدى", + "Invalid data specified" : "ئىناۋەتسىز سانلىق مەلۇمات", + "Action does not exist" : "ھەرىكەت مەۋجۇت ئەمەس", + "Renewing …" : "يېڭىلاش…", + "Very weak password" : "پارول بەك ئاجىز", + "Weak password" : "پارول ئاجىز", + "So-so password" : "شۇڭا مەخپىي نومۇر", + "Good password" : "ياخشى پارول", + "Strong password" : "كۈچلۈك پارول", + "The Base DN appears to be wrong" : "Base DN خاتادەك قىلىدۇ", + "Testing configuration…" : "سىناق سەپلىمىسى…", + "Configuration incorrect" : "سەپلىمىسى خاتا", + "Configuration incomplete" : "سەپلىمىسى تولۇق ئەمەس", + "Configuration OK" : "سەپلىمىسى بولىدۇ", + "Select groups" : "گۇرۇپپىلارنى تاللاڭ", + "Select object classes" : "ئوبيېكت دەرسلىرىنى تاللاڭ", + "Please check the credentials, they seem to be wrong." : "كىنىشكىنى تەكشۈرۈپ بېقىڭ ، ئۇلار خاتادەك قىلىدۇ.", + "Please specify the port, it could not be auto-detected." : "پورتنى بەلگىلىۈڭ ، ئۇنى ئاپتوماتىك بايقىغىلى بولمايدۇ.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN نى ئاپتوماتىك بايقىغىلى بولمايدۇ ، كىنىشكا ، باش ئاپپارات ۋە پورتنى تۈزىتىڭ.", + "Could not detect Base DN, please enter it manually." : "Base DN نى بايقىيالمىدى ، قولدا كىرگۈزۈڭ.", + "{nthServer}. Server" : "th nthServer}. مۇلازىمېتىر", + "No object found in the given Base DN. Please revise." : "بېرىلگەن Base DN دا ھېچقانداق نەرسە تېپىلمىدى. قايتا قاراپ بېقىڭ.", + "More than 1,000 directory entries available." : "1000 دىن ئارتۇق مۇندەرىجە تۈرى بار.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "خاتالىق كۆرۈلدى. Base DN ، شۇنداقلا ئۇلىنىش تەڭشەكلىرى ۋە كىنىشكىسىنى تەكشۈرۈپ بېقىڭ.", + "Do you really want to delete the current Server Configuration?" : "نۆۋەتتىكى مۇلازىمېتىر سەپلىمىسىنى ئۆچۈرمەكچىمۇ؟", + "Confirm Deletion" : "ئۆچۈرۈشنى جەزملەشتۈرۈڭ", + "Mappings cleared successfully!" : "خەرىتە مۇۋەپپەقىيەتلىك تازىلاندى!", + "Error while clearing the mappings." : "خەرىتىنى تازىلاش جەريانىدا خاتالىق.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "نامسىز باغلاشقا بولمايدۇ. ئىشلەتكۈچى DN ۋە پارول بىلەن تەمىنلەڭ.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP مەشغۇلات خاتالىقى. نامسىز باغلىنىشقا رۇخسەت قىلىنمايدۇ.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "تېجەش مەغلۇب بولدى. سانداننىڭ مەشغۇلات قىلىۋاتقانلىقىنى جەزملەشتۈرۈڭ. داۋاملاشتۇرۇشتىن بۇرۇن قايتا يۈكلەڭ.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "ھالەتنى ئالماشتۇرغاندا ئاپتوماتىك LDAP سوئاللىرىنى قوزغىتىدۇ. LDAP چوڭلۇقىڭىزغا ئاساسەن ئۇلار بىر ئاز ۋاقىت كېتىشى مۇمكىن. سىز يەنىلا ھالەتنى ئالماشتۇرامسىز؟", + "Mode switch" : "ھالەت ئالماشتۇرۇش", + "Select attributes" : "خاسلىقنى تاللاڭ", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "ئىشلەتكۈچى تېپىلمىدى. كىرىش خاسلىقىڭىز ۋە ئىشلەتكۈچى ئىسمىڭىزنى تەكشۈرۈپ بېقىڭ. ئۈنۈملۈك سۈزگۈچ (بۇيرۇق قۇرىنى دەلىللەش ئۈچۈن كۆچۈرۈپ چاپلاش): <br/>", + "User found and settings verified." : "ئىشلەتكۈچى تېپىلدى ۋە تەڭشەكلىرى دەلىللەندى.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ئىزدەشنى تارايتىشنى ئويلاڭ ، چۈنكى ئۇ نۇرغۇن ئىشلەتكۈچىلەرنى ئۆز ئىچىگە ئالىدۇ ، پەقەت بىرىنچىسىلا كىرەلەيدۇ.", + "An unspecified error occurred. Please check log and settings." : "ئېنىقلانمىغان خاتالىق كۆرۈلدى. خاتىرە ۋە تەڭشەكلەرنى تەكشۈرۈپ بېقىڭ.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ئىزدەش سۈزگۈچ ئىناۋەتسىز ، بەلكىم ئېچىلغان ۋە يېپىق تىرناقنىڭ تەكشى بولماسلىقى قاتارلىق گرامماتىكىلىق مەسىلىلەر سەۋەبىدىن بولۇشى مۇمكىن. قايتا قاراپ بېقىڭ.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "LDAP / AD غا ئۇلىنىش خاتالىقى كۆرۈلدى. ساھىبجامال ، پورت ۋە كىنىشكىنى تەكشۈرۈپ بېقىڭ.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"% Uid\" ئورۇن ئىگىسى يوقاپ كەتتى. ئۇ LDAP / AD نى سورىغاندا كىرىش ئىسمى بىلەن ئالماشتۇرۇلىدۇ.", + "Please provide a login name to test against" : "سىناش ئۈچۈن كىرىش ئىسمى بىلەن تەمىنلەڭ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "گۇرۇپپا قۇتىسى چەكلەنگەن ، چۈنكى LDAP / AD مۇلازىمېتىرى memberOf نى قوللىمايدۇ.", + "Please login with the new password" : "يېڭى پارول بىلەن كىرىڭ", + "LDAP User backend" : "LDAP ئىشلەتكۈچى ئارقا سۇپىسى", + "Your password will expire tomorrow." : "پارولىڭىز ئەتە توشىدۇ.", + "Your password will expire today." : "پارولىڭىز بۈگۈن توشىدۇ.", + "LDAP/AD integration" : "LDAP / AD بىرلەشتۈرۈش", + "LDAP Connection" : "LDAP ئۇلىنىشى", + "Invalid LDAP UUIDs" : "ئىناۋەتسىز LDAP UUIDs", + "None found" : "تېپىلمىدى", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP ھېساباتى ياكى گۇرۇپپىلارنىڭ ئىناۋەتسىز UUID تېپىلدى. LDAP سەپلىمىسىنىڭ مۇتەخەسسىسلەر بۆلىكىدىكى «UUID بايقاشنى قاپلاش» تەڭشەكلىرىڭىزنى تەكشۈرۈپ ، «occ ldap: update-uuid» نى ئىشلىتىپ ئۇلارنى يېڭىلاڭ.", + "> 1000 groups found" : "> 1000 گۇرۇپپا تېپىلدى", + "> 1000 users found" : "> 1000 ئىشلەتكۈچى تېپىلدى", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "ئىشلەتكۈچى كۆرسىتىش ئىسمى خاسلىقىنى بايقىيالمىدى. ئىلغار LDAP تەڭشىكىدە ئۆزىڭىز بەلگىلىۈڭ.", + "Could not find the desired feature" : "لازىملىق ئىقتىدارنى تاپالمىدى", + "Invalid Host" : "ئىناۋەتسىز", + "LDAP user and group backend" : "LDAP ئىشلەتكۈچى ۋە گۇرۇپپا ئارقا سەھنىسى", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "بۇ پروگرامما باشقۇرغۇچىنىڭ Nextcloud نى LDAP ئاساسىدىكى ئىشلەتكۈچى مۇندەرىجىسىگە ئۇلىيالايدۇ.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "بۇ پروگرامما باشقۇرغۇچىنىڭ Nextcloud نى LDAP ئاساسىدىكى ئىشلەتكۈچى مۇندەرىجىسىگە ئۇلاپ ، ئىشلەتكۈچى ، گۇرۇپپا ۋە ئىشلەتكۈچى خاسلىقى بىلەن تەمىنلەيدۇ. باشقۇرغۇچى بۇ پروگراممىنى LDAP كۆرۈنمە يۈزى ئارقىلىق بىر ياكى بىر قانچە LDAP مۇندەرىجىسىگە ياكى ئاكتىپ مۇندەرىجىگە ئۇلىيالايدۇ. ئىشلەتكۈچى نورمىسى ، ئېلېكترونلۇق خەت ، باش سۈرەت ، گۇرۇپپا ئەزالىرى ۋە باشقىلار قاتارلىق خاسلىقلارنى مۇناسىپ سوئال ۋە سۈزگۈچلەر بىلەن مۇندەرىجىدىن Nextcloud غا تارتقىلى بولىدۇ.\n\nئىشلەتكۈچى LDAP ياكى AD كىنىشكىسى بىلەن Nextcloud غا كىرىدۇ ، ھەمدە LDAP ياكى AD مۇلازىمېتىرى بىر تەرەپ قىلغان دەلىللەش تەلىپىگە ئاساسەن ئىجازەتكە ئېرىشىدۇ. Nextcloud LDAP ياكى AD مەخپىي نومۇرىنى ساقلىمايدۇ ، بەلكى بۇ كىنىشكىلار ئىشلەتكۈچىنى دەلىللەش ئۈچۈن ئىشلىتىلىدۇ ، ئاندىن Nextcloud ئىشلەتكۈچى كىملىكى ئۈچۈن بىر يىغىن ئىشلىتىدۇ. LDAP ئىشلەتكۈچى ۋە گۇرۇپپا ئارقا بەت ھۆججىتىدە تېخىمۇ كۆپ ئۇچۇرلار بار.", + "Test Configuration" : "سىناق سەپلىمىسى", "Help" : "ياردەم", + "Groups meeting these criteria are available in %s:" : "بۇ ئۆلچەمگە توشىدىغان گۇرۇپپىلار% s دا بار:", + "Only these object classes:" : "پەقەت بۇ ئوبيېكت دەرسلىرى:", + "Only from these groups:" : "پەقەت بۇ گۇرۇپپىلاردىن:", + "Search groups" : "ئىزدەش گۇرۇپپىلىرى", + "Available groups" : "ئىشلەتكىلى بولىدىغان گۇرۇپپىلار", + "Selected groups" : "تاللانغان گۇرۇپپىلار", + "Edit LDAP Query" : "LDAP سوئالنى تەھرىرلەڭ", + "LDAP Filter:" : "LDAP سۈزگۈچ:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "سۈزگۈچ قايسى LDAP گۇرۇپپىسىنىڭ% s مىسالىغا ئېرىشەلەيدىغانلىقىنى بەلگىلەيدۇ.", + "Verify settings and count the groups" : "تەڭشەكلەرنى تەكشۈرۈپ گۇرۇپپىلارنى ساناپ بېقىڭ", + "When logging in, %s will find the user based on the following attributes:" : "تىزىمغا كىرگەندە ،% s تۆۋەندىكى خاسلىقلارغا ئاساسەن ئىشلەتكۈچىنى تاپىدۇ:", + "LDAP/AD Username:" : "LDAP / AD ئىشلەتكۈچى ئىسمى:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD ئىشلەتكۈچى نامىغا كىرىشكە يول قويىدۇ ، بۇ «uid» ياكى «sAMAccountName» بولۇپ ، بايقايدۇ.", + "LDAP/AD Email Address:" : "LDAP / AD ئېلېكترونلۇق خەت ئادرېسى:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "ئېلېكترونلۇق خەت خاسلىقىغا قارشى كىرىشكە يول قويىدۇ. \"mail\" ۋە \"mailPrimaryAddress\" رۇخسەت قىلىنغان.", + "Other Attributes:" : "باشقا خاسلىقى:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "كىرىشكە ئۇرۇنغاندا سۈزگۈچنى بەلگىلەيدۇ. \"%% uid\" كىرىش ھەرىكىتىدىكى ئىشلەتكۈچى نامىنىڭ ئورنىنى ئالىدۇ. مىسال: \"uid = %% uid\"", + "Test Loginname" : "سىناق خاتىرىسى", + "Attempts to receive a DN for the given loginname and the current login filter" : "بېرىلگەن كىرىش ئىسمى ۋە نۆۋەتتىكى كىرىش سۈزگۈچ ئۈچۈن DN تاپشۇرۇۋېلىشقا ئۇرۇنۇش", + "Verify settings" : "تەڭشەكلەرنى دەلىللەڭ", + "%s. Server:" : "% s. مۇلازىمېتىر:", + "Add a new configuration" : "يېڭى سەپلىمە قوشۇڭ", + "Copy current configuration into new directory binding" : "نۆۋەتتىكى سەپلىمىنى يېڭى مۇندەرىجە باغلاشقا كۆچۈرۈڭ", + "Delete the current configuration" : "نۆۋەتتىكى سەپلىمىنى ئۆچۈرۈڭ", "Host" : "باش ئاپپارات", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "ئەگەر SSL تەلەپ قىلمىسىڭىز ، كېلىشىمنى ئەمەلدىن قالدۇرالايسىز. ئەگەر شۇنداق بولسا ، ldaps دىن باشلاڭ: //", "Port" : "ئېغىز", + "Detect Port" : "پورتنى ئېنىقلاڭ", + "User DN" : "ئىشلەتكۈچى DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "باغلىنىشلىق ئېلىپ بېرىلىدىغان خېرىدار ئىشلەتكۈچىنىڭ DN ، مەسىلەن. uid = ۋاكالەتچى ، dc = مىسال ، dc = com. نامسىز زىيارەت قىلىش ئۈچۈن DN ۋە پارولنى بوش قويۇڭ.", "Password" : "ئىم", + "For anonymous access, leave DN and Password empty." : "نامسىز زىيارەت قىلىش ئۈچۈن DN ۋە پارولنى بوش قويۇڭ.", + "Save Credentials" : "كىنىشكىنى ساقلاش", + "One Base DN per line" : "ھەر بىر قۇر DN", + "You can specify Base DN for users and groups in the Advanced tab" : "ئالىي بەتكۈچتىكى ئىشلەتكۈچى ۋە گۇرۇپپىلار ئۈچۈن Base DN نى بەلگىلىيەلەيسىز", + "Detect Base DN" : "Base DN نى ئېنىقلاڭ", + "Test Base DN" : "سىناق ئاساسى DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "ئاپتوماتىك LDAP تەلىپىدىن ساقلىنىدۇ. چوڭراق تەڭشەش ئۈچۈن ياخشى ، ئەمما بىر قىسىم LDAP بىلىملىرىنى تەلەپ قىلىدۇ.", + "Manually enter LDAP filters (recommended for large directories)" : "LDAP سۈزگۈچنى قولدا كىرگۈزۈڭ (چوڭ مۇندەرىجە تەۋسىيە قىلىنىدۇ)", + "Listing and searching for users is constrained by these criteria:" : "ئابونتلارنى تىزىش ۋە ئىزدەش بۇ ئۆلچەملەر تەرىپىدىن چەكلەنگەن:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "ئىشلەتكۈچىلەر ئۈچۈن ئەڭ كۆپ ئۇچرايدىغان ئوبيېكت سىنىپلىرى تەشكىلىي شەخس ، ئادەم ، ئىشلەتكۈچى ۋە inetOrgPerson. قايسى ئوبيېكت سىنىپىنى تاللاشنى بىلمىسىڭىز مۇندەرىجە باشقۇرغۇچىڭىز بىلەن مەسلىھەتلىشىڭ.", + "The filter specifies which LDAP users shall have access to the %s instance." : "سۈزگۈچ قايسى LDAP ئىشلەتكۈچىلەرنىڭ% s مىسالىغا ئېرىشەلەيدىغانلىقىنى بەلگىلەيدۇ.", + "Verify settings and count users" : "تەڭشەكلەرنى تەكشۈرۈپ ، ئىشلەتكۈچىنى ساناپ بېقىڭ", + "Saving" : "تېجەش", + "Back" : "قايتىش", + "Continue" : "داۋاملاشتۇر", + "Please renew your password." : "پارولىڭىزنى يېڭىلاڭ.", + "An internal error occurred." : "ئىچكى خاتالىق كۆرۈلدى.", + "Please try again or contact your administrator." : "قايتا سىناڭ ياكى باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", + "Current password" : "نۆۋەتتىكى ئىم", + "New password" : "يېڭى ئىم", + "Renew password" : "پارولنى يېڭىلاڭ", + "Wrong password." : "پارول خاتا.", + "Cancel" : "ۋاز كەچ", + "Server" : "مۇلازىمېتىر", + "Users" : "ئىشلەتكۈچىلەر", + "Login Attributes" : "كىرىش خاسلىقى", + "Groups" : "گۇرۇپپا", + "Expert" : "مۇتەخەسسىس", "Advanced" : "ئالىي", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b> ئاگاھلاندۇرۇش: </b> PHP LDAP مودۇلى ئورنىتىلمىدى ، ئارقا تەرىپى ئىشلىمەيدۇ. ئۇنى قاچىلاشنى سىستېما باشقۇرغۇچىڭىزدىن سوراڭ.", "Connection Settings" : "باغلىنىش تەڭشىكى", - "Configuration Active" : "سەپلىمە ئاكتىپ" + "Configuration Active" : "سەپلىمە ئاكتىپ", + "When unchecked, this configuration will be skipped." : "تەكشۈرۈلمىسە ، بۇ سەپلىمە ئاتلاپ كېتىدۇ.", + "Backup (Replica) Host" : "زاپاسلاش (Replica) رىياسەتچىسى", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ئىختىيارى زاپاسلاش مۇلازىمىتىرى بېرىڭ. ئۇ چوقۇم ئاساسلىق LDAP / AD مۇلازىمېتىرنىڭ كۆپەيتىلگەن نۇسخىسى بولۇشى كېرەك.", + "Backup (Replica) Port" : "زاپاسلاش (Replica) ئېغىزى", + "Disable Main Server" : "ئاساسلىق مۇلازىمېتىرنى چەكلەڭ", + "Only connect to the replica server." : "پەقەت كۆپەيتىلگەن مۇلازىمېتىرغا ئۇلاڭ.", + "Turn off SSL certificate validation." : "SSL گۇۋاھنامىسىنى دەلىللەشنى ئېتىۋېتىڭ.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "تەۋسىيە قىلىنمايدۇ ، ئۇنى پەقەت سىناق ئۈچۈن ئىشلىتىڭ! ئەگەر ئۇلىنىش پەقەت مۇشۇ تاللاش بىلەنلا ئىشلەيدىغان بولسا ،% s مۇلازىمېتىرىڭىزغا LDAP مۇلازىمېتىرنىڭ SSL گۇۋاھنامىسىنى ئەكىرىڭ.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "سېكۇنتتا. ئۆزگەرتىش غەملەكنى بوشاتتى.", + "Directory Settings" : "مۇندەرىجە تەڭشىكى", + "User Display Name Field" : "ئىشلەتكۈچى كۆرسىتىش ئىسمى", + "The LDAP attribute to use to generate the user's display name." : "LDAP خاسلىقى ئىشلەتكۈچىنىڭ كۆرسىتىش نامىنى ھاسىل قىلىشقا ئىشلىتىلىدۇ.", + "2nd User Display Name Field" : "2-ئىشلەتكۈچى كۆرسىتىش ئىسمى مەيدانى", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "ئىختىيارىي. تىرناق ئىچىدىكى كۆرسىتىش نامىغا قوشۇلىدىغان LDAP خاسلىقى. مەسىلەن: »جون دو (john.doe@example.org)«.", + "Base User Tree" : "ئاساسى ئىشلەتكۈچى دەرىخى", + "One User Base DN per line" : "ھەر بىر قۇردا بىر ئىشلەتكۈچى ئاساسى DN", + "User Search Attributes" : "ئىشلەتكۈچى ئىزدەش خاسلىقى", + "Optional; one attribute per line" : "ئىختىيارىي ھەر بىر قۇرغا بىر خاسلىق", + "Disable users missing from LDAP" : "LDAP دىن يوقاپ كەتكەن ئىشلەتكۈچىلەرنى چەكلەڭ", + "When switched on, users imported from LDAP which are then missing will be disabled" : "قوزغىتىلغاندا LDAP دىن ئىمپورت قىلىنغان ئىشلەتكۈچىلەر ئىناۋەتسىز بولىدۇ", + "Group Display Name Field" : "گۇرۇپپا كۆرسىتىش ئىسمى مەيدانى", + "The LDAP attribute to use to generate the groups's display name." : "LDAP خاسلىقى گۇرۇپپىلارنىڭ كۆرسىتىش نامىنى ھاسىل قىلىشقا ئىشلىتىلىدۇ.", + "Base Group Tree" : "ئاساسى گۇرۇپپا دەرىخى", + "One Group Base DN per line" : "ھەر بىر قۇر بىر گۇرۇپپا ئاساسى DN", + "Group Search Attributes" : "گۇرۇپپا ئىزدەش خاسلىقى", + "Group-Member association" : "گۇرۇپپا-ئەزالار جەمئىيىتى", + "Dynamic Group Member URL" : "ھەرىكەتچان گۇرۇپپا ئەزالىرىنىڭ ئادرېسى", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "گۇرۇپپا ئوبيېكتلىرىدىكى LDAP خاسلىقى LDAP ئىزدەش URL نى ئۆز ئىچىگە ئالغان بولۇپ ، قايسى ئوبيېكتلارنىڭ گۇرۇپپىغا تەۋە ئىكەنلىكىنى بەلگىلەيدۇ. (قۇرۇق تەڭشەك ھەرىكەتچان گۇرۇپپا ئەزالىق ئىقتىدارىنى چەكلەيدۇ.)", + "Nested Groups" : "توپلانغان گۇرۇپپىلار", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "ئاچقاندا گۇرۇپپىلارنى ئۆز ئىچىگە ئالغان گۇرۇپپىلارنى قوللايدۇ. (پەقەت گۇرۇپپا ئەزالىرىنىڭ خاسلىقى DNs بولغاندىلا ئىشلەيدۇ.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize تور بەت LDAP ئىزدەش ئۈچۈن ئىشلىتىلىدۇ ، بۇ ئىشلەتكۈچى ياكى گۇرۇپپا تىزىملاش قاتارلىق چوڭ نەتىجىلەرنى قايتۇرىدۇ. (ئۇنى 0 قىلىپ تەڭشەش بۇ خىل ئەھۋال ئاستىدا LDAP ئىزدەشنى چەكلەيدۇ.)", + "Enable LDAP password changes per user" : "ھەر بىر ئىشلەتكۈچىگە LDAP پارول ئۆزگەرتىشنى قوزغىتىڭ", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP ئىشلەتكۈچىلىرىنىڭ مەخپىي نومۇرىنى ئۆزگەرتىشىگە يول قويۇڭ ۋە دەرىجىدىن تاشقىرى باشقۇرغۇچى ۋە گۇرۇپپا باشقۇرغۇچىلارنىڭ LDAP ئابونتلىرىنىڭ پارولىنى ئۆزگەرتىشىگە يول قويۇڭ. زىيارەتنى كونترول قىلىش سىياسىتى LDAP مۇلازىمېتىرىغا ئاساسەن تەڭشەلگەندىلا ئىشلەيدۇ. مەخپىي نومۇر LDAP مۇلازىمېتىرىغا ئوچۇق تېكىستتە ئەۋەتىلگەنلىكتىن ، چوقۇم مەخپىيلەشتۈرۈشنى ئىشلىتىپ ، LDAP مۇلازىمېتىرىدا مەخپىي نومۇرنى تەڭشەش كېرەك.", + "(New password is sent as plain text to LDAP)" : "(يېڭى پارول LDAP غا ئاددىي تېكىست سۈپىتىدە ئەۋەتىلدى)", + "Default password policy DN" : "كۆڭۈلدىكى پارول سىياسىتى DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "پارولنىڭ مۇددىتى توشقاندا بىر تەرەپ قىلىنىدىغان كۆڭۈلدىكى پارول سىياسىتىنىڭ DN. ھەر بىر ئىشلەتكۈچىگە LDAP پارولى ئۆزگەرتىلگەندىلا ئىشلەيدۇ ، پەقەت OpenLDAP قوللايدۇ. پارولنىڭ ۋاقتى توشۇشنى بىر تەرەپ قىلىش ئۈچۈن بوش قويۇڭ.", + "Special Attributes" : "ئالاھىدە خاسلىق", + "Quota Field" : "Quota Field", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "ئىشلەتكۈچىنىڭ سۈكۈتتىكى نورمىسى ئۈچۈن بوش قويۇڭ. بولمىسا ، LDAP / AD خاسلىقىنى بەلگىلەڭ.", + "Quota Default" : "Quota Default", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "نورما ئۆلچىمىدە نورما بېكىتىلمىگەن LDAP ئىشلەتكۈچىلىرىنىڭ سۈكۈتتىكى نورمىسىنى قاپلىۋېتىڭ.", + "Email Field" : "ئېلېكترونلۇق خەت مەيدانى", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "ئىشلەتكۈچىنىڭ ئېلېكترونلۇق خەتلىرىنى LDAP خاسلىقىدىن تەڭشەڭ. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ.", + "User Home Folder Naming Rule" : "ئىشلەتكۈچى ئائىلە ھۆججەت قىسقۇچىغا ئىسىم قويۇش قائىدىسى", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "ئىشلەتكۈچى نامىغا قۇرۇق قويۇڭ (سۈكۈتتىكى). بولمىسا ، LDAP / AD خاسلىقىنى بەلگىلەڭ.", + "\"$home\" Placeholder Field" : "\"$ home\" ئورۇن ئىگىسى", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "سىرتقى ساقلاش سەپلىمىسىدىكى $ home كۆرسىتىلگەن خاسلىقنىڭ قىممىتى بىلەن ئالماشتۇرۇلىدۇ", + "User Profile Attributes" : "ئىشلەتكۈچى ئارخىپى خاسلىقى", + "Phone Field" : "تېلېفون مەيدانى", + "User profile Phone will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تېلېفون بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Website Field" : "تور بېكەت مەيدانى", + "User profile Website will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تور بېكىتى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Address Field" : "ئادرېس مەيدانى", + "User profile Address will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ئادرېسى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى Twitter كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى Fediverse كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Organisation Field" : "تەشكىلات مەيدانى", + "User profile Organisation will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تەشكىلاتى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Role Field" : "رول مەيدانى", + "User profile Role will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى رولى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Headline Field" : "ماۋزۇ مەيدانى", + "User profile Headline will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ماۋزۇ بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Biography Field" : "تەرجىمىھالى", + "User profile Biography will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تەرجىمىھالى كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Birthdate Field" : "تۇغۇلغان كۈنى", + "User profile Date of birth will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تۇغۇلغان ۋاقتى بەلگىلەنگەن خاسلىقتىن بېكىتىلىدۇ", + "Pronouns Field" : "ئالمىشىش مەيدانى", + "User profile Pronouns will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ئالماشلار بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Internal Username" : "ئىچكى ئىشلەتكۈچى ئىسمى", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "سۈكۈتتىكى ھالەتتە ئىشلەتكۈچى ئىسمى UUID خاسلىقىدىن قۇرۇلىدۇ. ئىشلەتكۈچى نامىنىڭ ئۆزگىچە ئىكەنلىكى ۋە ھەرپلەرنى ئۆزگەرتىشنىڭ ھاجىتى يوقلىقىغا كاپالەتلىك قىلىدۇ. ئىچكى ئىشلەتكۈچى نامىدا پەقەت بۇ ھەرپلەرلا رۇخسەت قىلىنغان چەكلىمە بار: [a-zA-Z0-9 _. @ -]. باشقا ھەرپلەر ئۇلارنىڭ ASCII خەت ئالاقىسى بىلەن ئالماشتۇرۇلىدۇ ياكى ئاددىيلا چىقىرىۋېتىلىدۇ. سوقۇلغاندا بىر سان قوشۇلىدۇ / كۆپەيتىلىدۇ. ئىچكى ئىشلەتكۈچى ئىسمى ئىچكى ئىشلەتكۈچىنى پەرقلەندۈرۈش ئۈچۈن ئىشلىتىلىدۇ. ئۇ يەنە ئىشلەتكۈچىنىڭ ئائىلە قىسقۇچىنىڭ سۈكۈتتىكى ئىسمى. ئۇ يىراقتىكى URL لارنىڭ بىر قىسمى ، مەسىلەن بارلىق DAV مۇلازىمىتى ئۈچۈن. بۇ تەڭشەك ئارقىلىق سۈكۈتتىكى ھەرىكەتنى بېسىپ ئۆتكىلى بولىدۇ. ئۆزگەرتىش پەقەت يېڭى سىزىلغان (قوشۇلغان) LDAP ئىشلەتكۈچىلەرگىلا تەسىر كۆرسىتىدۇ. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ.", + "Internal Username Attribute:" : "ئىچكى ئىشلەتكۈچى ئىسمى خاسلىقى:", + "Override UUID detection" : "UUID بايقاشنى قاپلىۋېتىڭ", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "سۈكۈت بويىچە ، UUID خاسلىقى ئاپتوماتىك بايقىلىدۇ. UUID خاسلىقى LDAP ئىشلەتكۈچىلىرى ۋە گۇرۇپپىلىرىنى شەكسىز پەرقلەندۈرۈش ئۈچۈن ئىشلىتىلىدۇ. ئۇندىن باشقا ، ئىچكى ئىشلەتكۈچى ئىسمى UUID ئاساسىدا قۇرۇلىدۇ ، ئەگەر يۇقىرىدا ئېنىق بەلگىلەنمىگەن بولسا. تەڭشەكنى بېسىپ ئۆتۈپ ، ئۆزىڭىز تاللىغان خاسلىقنى يەتكۈزەلەيسىز. سىز ئۆزىڭىز تاللىغان خاسلىقنىڭ ئىشلەتكۈچىلەر ۋە گۇرۇپپىلار ئۈچۈن ئېلىپ كېلىنەلەيدىغانلىقىغا كاپالەتلىك قىلىشىڭىز كېرەك. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ. ئۆزگەرتىش پەقەت يېڭى سىزىلغان (قوشۇلغان) LDAP ئىشلەتكۈچىلىرى ۋە گۇرۇپپىلىرىغىلا تەسىر كۆرسىتىدۇ.", + "UUID Attribute for Users:" : "ئىشلەتكۈچىلەر ئۈچۈن UUID خاسلىقى:", + "UUID Attribute for Groups:" : "گۇرۇپپىلارغا UUID خاسلىقى:", + "Username-LDAP User Mapping" : "ئىشلەتكۈچى ئىسمى-LDAP ئىشلەتكۈچى خەرىتىسى", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ئىشلەتكۈچى ئىسمى مېتا سانلىق مەلۇماتنى ساقلاش ۋە تەقسىملەشتە ئىشلىتىلىدۇ. ئىشلەتكۈچىلەرنى ئېنىق تونۇش ۋە تونۇش ئۈچۈن ، ھەر بىر LDAP ئىشلەتكۈچىنىڭ ئىچكى ئىشلەتكۈچى ئىسمى بولىدۇ. بۇ ئىشلەتكۈچى نامىدىن LDAP ئىشلەتكۈچىگە خەرىتە سىزىشنى تەلەپ قىلىدۇ. قۇرۇلغان ئىشلەتكۈچى ئىسمى LDAP ئىشلەتكۈچىنىڭ UUID غا سىزىلغان. بۇنىڭدىن باشقا ، DN غەملەك بىلەن LDAP ئۆز-ئارا تەسىرنى ئازايتىدۇ ، ئەمما ئۇ پەرقلەندۈرۈشكە ئىشلىتىلمەيدۇ. ئەگەر DN ئۆزگەرسە ، ئۆزگىرىشلەر تېپىلىدۇ. ئىچكى ئىشلەتكۈچى ئىسمى ھەممە يەردە ئىشلىتىلىدۇ. خەرىتىنى تازىلاش ھەممە يەردە ئېشىپ قالىدۇ. خەرىتىنى تازىلاش سەپلىمىگە سەزگۈر ئەمەس ، ئۇ بارلىق LDAP سەپلىمىسىگە تەسىر كۆرسىتىدۇ! خەرىتىنى ئىشلەپچىقىرىش مۇھىتىدا ھەرگىز تازىلىماڭ ، پەقەت سىناق ياكى تەجرىبە باسقۇچىدىلا.", + "Clear Username-LDAP User Mapping" : "ئىشلەتكۈچى ئىسمى- LDAP ئىشلەتكۈچى خەرىتىسىنى تازىلاڭ", + "Clear Groupname-LDAP Group Mapping" : "گۇرۇپپا ئىسمى- LDAP گۇرۇپپا خەرىتىسىنى تازىلاش", + "Invalid configuration. Please have a look at the logs for further details." : "سەپلىمە ئىناۋەتسىز. تېخىمۇ كۆپ تەپسىلاتلار ئۈچۈن خاتىرىلەرنى كۆرۈپ بېقىڭ." }, -"nplurals=1; plural=0;"); +"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ug.json b/apps/user_ldap/l10n/ug.json index adecc82972d..1a0ac4aa77e 100644 --- a/apps/user_ldap/l10n/ug.json +++ b/apps/user_ldap/l10n/ug.json @@ -1,12 +1,219 @@ { "translations": { - "Users" : "ئىشلەتكۈچىلەر", - "Groups" : "گۇرۇپپا", + "Failed to clear the mappings." : "خەرىتىنى تازىلاش مەغلۇب بولدى.", + "Failed to delete the server configuration" : "مۇلازىمېتىر سەپلىمىسىنى ئۆچۈرەلمىدى", + "Invalid configuration: Anonymous binding is not allowed." : "ئىناۋەتسىز سەپلىمىسى: نامسىز باغلاشقا بولمايدۇ.", + "Valid configuration, connection established!" : "ئىناۋەتلىك سەپلىمە ، ئۇلىنىش قۇرۇلدى!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "ئىناۋەتلىك سەپلىمىسى ، ئەمما باغلاش مەغلۇپ بولدى. مۇلازىمېتىر تەڭشىكى ۋە كىنىشكىسىنى تەكشۈرۈپ بېقىڭ.", + "No action specified" : "ھېچقانداق ھەرىكەت بەلگىلەنمىدى", + "No configuration specified" : "سەپلىمىسى ئېنىق ئەمەس", + "No data specified" : "ھېچقانداق سانلىق مەلۇمات كۆرسىتىلمىدى", + "Invalid data specified" : "ئىناۋەتسىز سانلىق مەلۇمات", + "Action does not exist" : "ھەرىكەت مەۋجۇت ئەمەس", + "Renewing …" : "يېڭىلاش…", + "Very weak password" : "پارول بەك ئاجىز", + "Weak password" : "پارول ئاجىز", + "So-so password" : "شۇڭا مەخپىي نومۇر", + "Good password" : "ياخشى پارول", + "Strong password" : "كۈچلۈك پارول", + "The Base DN appears to be wrong" : "Base DN خاتادەك قىلىدۇ", + "Testing configuration…" : "سىناق سەپلىمىسى…", + "Configuration incorrect" : "سەپلىمىسى خاتا", + "Configuration incomplete" : "سەپلىمىسى تولۇق ئەمەس", + "Configuration OK" : "سەپلىمىسى بولىدۇ", + "Select groups" : "گۇرۇپپىلارنى تاللاڭ", + "Select object classes" : "ئوبيېكت دەرسلىرىنى تاللاڭ", + "Please check the credentials, they seem to be wrong." : "كىنىشكىنى تەكشۈرۈپ بېقىڭ ، ئۇلار خاتادەك قىلىدۇ.", + "Please specify the port, it could not be auto-detected." : "پورتنى بەلگىلىۈڭ ، ئۇنى ئاپتوماتىك بايقىغىلى بولمايدۇ.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN نى ئاپتوماتىك بايقىغىلى بولمايدۇ ، كىنىشكا ، باش ئاپپارات ۋە پورتنى تۈزىتىڭ.", + "Could not detect Base DN, please enter it manually." : "Base DN نى بايقىيالمىدى ، قولدا كىرگۈزۈڭ.", + "{nthServer}. Server" : "th nthServer}. مۇلازىمېتىر", + "No object found in the given Base DN. Please revise." : "بېرىلگەن Base DN دا ھېچقانداق نەرسە تېپىلمىدى. قايتا قاراپ بېقىڭ.", + "More than 1,000 directory entries available." : "1000 دىن ئارتۇق مۇندەرىجە تۈرى بار.", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "خاتالىق كۆرۈلدى. Base DN ، شۇنداقلا ئۇلىنىش تەڭشەكلىرى ۋە كىنىشكىسىنى تەكشۈرۈپ بېقىڭ.", + "Do you really want to delete the current Server Configuration?" : "نۆۋەتتىكى مۇلازىمېتىر سەپلىمىسىنى ئۆچۈرمەكچىمۇ؟", + "Confirm Deletion" : "ئۆچۈرۈشنى جەزملەشتۈرۈڭ", + "Mappings cleared successfully!" : "خەرىتە مۇۋەپپەقىيەتلىك تازىلاندى!", + "Error while clearing the mappings." : "خەرىتىنى تازىلاش جەريانىدا خاتالىق.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "نامسىز باغلاشقا بولمايدۇ. ئىشلەتكۈچى DN ۋە پارول بىلەن تەمىنلەڭ.", + "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP مەشغۇلات خاتالىقى. نامسىز باغلىنىشقا رۇخسەت قىلىنمايدۇ.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "تېجەش مەغلۇب بولدى. سانداننىڭ مەشغۇلات قىلىۋاتقانلىقىنى جەزملەشتۈرۈڭ. داۋاملاشتۇرۇشتىن بۇرۇن قايتا يۈكلەڭ.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "ھالەتنى ئالماشتۇرغاندا ئاپتوماتىك LDAP سوئاللىرىنى قوزغىتىدۇ. LDAP چوڭلۇقىڭىزغا ئاساسەن ئۇلار بىر ئاز ۋاقىت كېتىشى مۇمكىن. سىز يەنىلا ھالەتنى ئالماشتۇرامسىز؟", + "Mode switch" : "ھالەت ئالماشتۇرۇش", + "Select attributes" : "خاسلىقنى تاللاڭ", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "ئىشلەتكۈچى تېپىلمىدى. كىرىش خاسلىقىڭىز ۋە ئىشلەتكۈچى ئىسمىڭىزنى تەكشۈرۈپ بېقىڭ. ئۈنۈملۈك سۈزگۈچ (بۇيرۇق قۇرىنى دەلىللەش ئۈچۈن كۆچۈرۈپ چاپلاش): <br/>", + "User found and settings verified." : "ئىشلەتكۈچى تېپىلدى ۋە تەڭشەكلىرى دەلىللەندى.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "ئىزدەشنى تارايتىشنى ئويلاڭ ، چۈنكى ئۇ نۇرغۇن ئىشلەتكۈچىلەرنى ئۆز ئىچىگە ئالىدۇ ، پەقەت بىرىنچىسىلا كىرەلەيدۇ.", + "An unspecified error occurred. Please check log and settings." : "ئېنىقلانمىغان خاتالىق كۆرۈلدى. خاتىرە ۋە تەڭشەكلەرنى تەكشۈرۈپ بېقىڭ.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "ئىزدەش سۈزگۈچ ئىناۋەتسىز ، بەلكىم ئېچىلغان ۋە يېپىق تىرناقنىڭ تەكشى بولماسلىقى قاتارلىق گرامماتىكىلىق مەسىلىلەر سەۋەبىدىن بولۇشى مۇمكىن. قايتا قاراپ بېقىڭ.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "LDAP / AD غا ئۇلىنىش خاتالىقى كۆرۈلدى. ساھىبجامال ، پورت ۋە كىنىشكىنى تەكشۈرۈپ بېقىڭ.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"% Uid\" ئورۇن ئىگىسى يوقاپ كەتتى. ئۇ LDAP / AD نى سورىغاندا كىرىش ئىسمى بىلەن ئالماشتۇرۇلىدۇ.", + "Please provide a login name to test against" : "سىناش ئۈچۈن كىرىش ئىسمى بىلەن تەمىنلەڭ", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "گۇرۇپپا قۇتىسى چەكلەنگەن ، چۈنكى LDAP / AD مۇلازىمېتىرى memberOf نى قوللىمايدۇ.", + "Please login with the new password" : "يېڭى پارول بىلەن كىرىڭ", + "LDAP User backend" : "LDAP ئىشلەتكۈچى ئارقا سۇپىسى", + "Your password will expire tomorrow." : "پارولىڭىز ئەتە توشىدۇ.", + "Your password will expire today." : "پارولىڭىز بۈگۈن توشىدۇ.", + "LDAP/AD integration" : "LDAP / AD بىرلەشتۈرۈش", + "LDAP Connection" : "LDAP ئۇلىنىشى", + "Invalid LDAP UUIDs" : "ئىناۋەتسىز LDAP UUIDs", + "None found" : "تېپىلمىدى", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP ھېساباتى ياكى گۇرۇپپىلارنىڭ ئىناۋەتسىز UUID تېپىلدى. LDAP سەپلىمىسىنىڭ مۇتەخەسسىسلەر بۆلىكىدىكى «UUID بايقاشنى قاپلاش» تەڭشەكلىرىڭىزنى تەكشۈرۈپ ، «occ ldap: update-uuid» نى ئىشلىتىپ ئۇلارنى يېڭىلاڭ.", + "> 1000 groups found" : "> 1000 گۇرۇپپا تېپىلدى", + "> 1000 users found" : "> 1000 ئىشلەتكۈچى تېپىلدى", + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "ئىشلەتكۈچى كۆرسىتىش ئىسمى خاسلىقىنى بايقىيالمىدى. ئىلغار LDAP تەڭشىكىدە ئۆزىڭىز بەلگىلىۈڭ.", + "Could not find the desired feature" : "لازىملىق ئىقتىدارنى تاپالمىدى", + "Invalid Host" : "ئىناۋەتسىز", + "LDAP user and group backend" : "LDAP ئىشلەتكۈچى ۋە گۇرۇپپا ئارقا سەھنىسى", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "بۇ پروگرامما باشقۇرغۇچىنىڭ Nextcloud نى LDAP ئاساسىدىكى ئىشلەتكۈچى مۇندەرىجىسىگە ئۇلىيالايدۇ.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "بۇ پروگرامما باشقۇرغۇچىنىڭ Nextcloud نى LDAP ئاساسىدىكى ئىشلەتكۈچى مۇندەرىجىسىگە ئۇلاپ ، ئىشلەتكۈچى ، گۇرۇپپا ۋە ئىشلەتكۈچى خاسلىقى بىلەن تەمىنلەيدۇ. باشقۇرغۇچى بۇ پروگراممىنى LDAP كۆرۈنمە يۈزى ئارقىلىق بىر ياكى بىر قانچە LDAP مۇندەرىجىسىگە ياكى ئاكتىپ مۇندەرىجىگە ئۇلىيالايدۇ. ئىشلەتكۈچى نورمىسى ، ئېلېكترونلۇق خەت ، باش سۈرەت ، گۇرۇپپا ئەزالىرى ۋە باشقىلار قاتارلىق خاسلىقلارنى مۇناسىپ سوئال ۋە سۈزگۈچلەر بىلەن مۇندەرىجىدىن Nextcloud غا تارتقىلى بولىدۇ.\n\nئىشلەتكۈچى LDAP ياكى AD كىنىشكىسى بىلەن Nextcloud غا كىرىدۇ ، ھەمدە LDAP ياكى AD مۇلازىمېتىرى بىر تەرەپ قىلغان دەلىللەش تەلىپىگە ئاساسەن ئىجازەتكە ئېرىشىدۇ. Nextcloud LDAP ياكى AD مەخپىي نومۇرىنى ساقلىمايدۇ ، بەلكى بۇ كىنىشكىلار ئىشلەتكۈچىنى دەلىللەش ئۈچۈن ئىشلىتىلىدۇ ، ئاندىن Nextcloud ئىشلەتكۈچى كىملىكى ئۈچۈن بىر يىغىن ئىشلىتىدۇ. LDAP ئىشلەتكۈچى ۋە گۇرۇپپا ئارقا بەت ھۆججىتىدە تېخىمۇ كۆپ ئۇچۇرلار بار.", + "Test Configuration" : "سىناق سەپلىمىسى", "Help" : "ياردەم", + "Groups meeting these criteria are available in %s:" : "بۇ ئۆلچەمگە توشىدىغان گۇرۇپپىلار% s دا بار:", + "Only these object classes:" : "پەقەت بۇ ئوبيېكت دەرسلىرى:", + "Only from these groups:" : "پەقەت بۇ گۇرۇپپىلاردىن:", + "Search groups" : "ئىزدەش گۇرۇپپىلىرى", + "Available groups" : "ئىشلەتكىلى بولىدىغان گۇرۇپپىلار", + "Selected groups" : "تاللانغان گۇرۇپپىلار", + "Edit LDAP Query" : "LDAP سوئالنى تەھرىرلەڭ", + "LDAP Filter:" : "LDAP سۈزگۈچ:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "سۈزگۈچ قايسى LDAP گۇرۇپپىسىنىڭ% s مىسالىغا ئېرىشەلەيدىغانلىقىنى بەلگىلەيدۇ.", + "Verify settings and count the groups" : "تەڭشەكلەرنى تەكشۈرۈپ گۇرۇپپىلارنى ساناپ بېقىڭ", + "When logging in, %s will find the user based on the following attributes:" : "تىزىمغا كىرگەندە ،% s تۆۋەندىكى خاسلىقلارغا ئاساسەن ئىشلەتكۈچىنى تاپىدۇ:", + "LDAP/AD Username:" : "LDAP / AD ئىشلەتكۈچى ئىسمى:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "LDAP / AD ئىشلەتكۈچى نامىغا كىرىشكە يول قويىدۇ ، بۇ «uid» ياكى «sAMAccountName» بولۇپ ، بايقايدۇ.", + "LDAP/AD Email Address:" : "LDAP / AD ئېلېكترونلۇق خەت ئادرېسى:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "ئېلېكترونلۇق خەت خاسلىقىغا قارشى كىرىشكە يول قويىدۇ. \"mail\" ۋە \"mailPrimaryAddress\" رۇخسەت قىلىنغان.", + "Other Attributes:" : "باشقا خاسلىقى:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "كىرىشكە ئۇرۇنغاندا سۈزگۈچنى بەلگىلەيدۇ. \"%% uid\" كىرىش ھەرىكىتىدىكى ئىشلەتكۈچى نامىنىڭ ئورنىنى ئالىدۇ. مىسال: \"uid = %% uid\"", + "Test Loginname" : "سىناق خاتىرىسى", + "Attempts to receive a DN for the given loginname and the current login filter" : "بېرىلگەن كىرىش ئىسمى ۋە نۆۋەتتىكى كىرىش سۈزگۈچ ئۈچۈن DN تاپشۇرۇۋېلىشقا ئۇرۇنۇش", + "Verify settings" : "تەڭشەكلەرنى دەلىللەڭ", + "%s. Server:" : "% s. مۇلازىمېتىر:", + "Add a new configuration" : "يېڭى سەپلىمە قوشۇڭ", + "Copy current configuration into new directory binding" : "نۆۋەتتىكى سەپلىمىنى يېڭى مۇندەرىجە باغلاشقا كۆچۈرۈڭ", + "Delete the current configuration" : "نۆۋەتتىكى سەپلىمىنى ئۆچۈرۈڭ", "Host" : "باش ئاپپارات", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "ئەگەر SSL تەلەپ قىلمىسىڭىز ، كېلىشىمنى ئەمەلدىن قالدۇرالايسىز. ئەگەر شۇنداق بولسا ، ldaps دىن باشلاڭ: //", "Port" : "ئېغىز", + "Detect Port" : "پورتنى ئېنىقلاڭ", + "User DN" : "ئىشلەتكۈچى DN", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "باغلىنىشلىق ئېلىپ بېرىلىدىغان خېرىدار ئىشلەتكۈچىنىڭ DN ، مەسىلەن. uid = ۋاكالەتچى ، dc = مىسال ، dc = com. نامسىز زىيارەت قىلىش ئۈچۈن DN ۋە پارولنى بوش قويۇڭ.", "Password" : "ئىم", + "For anonymous access, leave DN and Password empty." : "نامسىز زىيارەت قىلىش ئۈچۈن DN ۋە پارولنى بوش قويۇڭ.", + "Save Credentials" : "كىنىشكىنى ساقلاش", + "One Base DN per line" : "ھەر بىر قۇر DN", + "You can specify Base DN for users and groups in the Advanced tab" : "ئالىي بەتكۈچتىكى ئىشلەتكۈچى ۋە گۇرۇپپىلار ئۈچۈن Base DN نى بەلگىلىيەلەيسىز", + "Detect Base DN" : "Base DN نى ئېنىقلاڭ", + "Test Base DN" : "سىناق ئاساسى DN", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "ئاپتوماتىك LDAP تەلىپىدىن ساقلىنىدۇ. چوڭراق تەڭشەش ئۈچۈن ياخشى ، ئەمما بىر قىسىم LDAP بىلىملىرىنى تەلەپ قىلىدۇ.", + "Manually enter LDAP filters (recommended for large directories)" : "LDAP سۈزگۈچنى قولدا كىرگۈزۈڭ (چوڭ مۇندەرىجە تەۋسىيە قىلىنىدۇ)", + "Listing and searching for users is constrained by these criteria:" : "ئابونتلارنى تىزىش ۋە ئىزدەش بۇ ئۆلچەملەر تەرىپىدىن چەكلەنگەن:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "ئىشلەتكۈچىلەر ئۈچۈن ئەڭ كۆپ ئۇچرايدىغان ئوبيېكت سىنىپلىرى تەشكىلىي شەخس ، ئادەم ، ئىشلەتكۈچى ۋە inetOrgPerson. قايسى ئوبيېكت سىنىپىنى تاللاشنى بىلمىسىڭىز مۇندەرىجە باشقۇرغۇچىڭىز بىلەن مەسلىھەتلىشىڭ.", + "The filter specifies which LDAP users shall have access to the %s instance." : "سۈزگۈچ قايسى LDAP ئىشلەتكۈچىلەرنىڭ% s مىسالىغا ئېرىشەلەيدىغانلىقىنى بەلگىلەيدۇ.", + "Verify settings and count users" : "تەڭشەكلەرنى تەكشۈرۈپ ، ئىشلەتكۈچىنى ساناپ بېقىڭ", + "Saving" : "تېجەش", + "Back" : "قايتىش", + "Continue" : "داۋاملاشتۇر", + "Please renew your password." : "پارولىڭىزنى يېڭىلاڭ.", + "An internal error occurred." : "ئىچكى خاتالىق كۆرۈلدى.", + "Please try again or contact your administrator." : "قايتا سىناڭ ياكى باشقۇرغۇچىڭىز بىلەن ئالاقىلىشىڭ.", + "Current password" : "نۆۋەتتىكى ئىم", + "New password" : "يېڭى ئىم", + "Renew password" : "پارولنى يېڭىلاڭ", + "Wrong password." : "پارول خاتا.", + "Cancel" : "ۋاز كەچ", + "Server" : "مۇلازىمېتىر", + "Users" : "ئىشلەتكۈچىلەر", + "Login Attributes" : "كىرىش خاسلىقى", + "Groups" : "گۇرۇپپا", + "Expert" : "مۇتەخەسسىس", "Advanced" : "ئالىي", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b> ئاگاھلاندۇرۇش: </b> PHP LDAP مودۇلى ئورنىتىلمىدى ، ئارقا تەرىپى ئىشلىمەيدۇ. ئۇنى قاچىلاشنى سىستېما باشقۇرغۇچىڭىزدىن سوراڭ.", "Connection Settings" : "باغلىنىش تەڭشىكى", - "Configuration Active" : "سەپلىمە ئاكتىپ" -},"pluralForm" :"nplurals=1; plural=0;" + "Configuration Active" : "سەپلىمە ئاكتىپ", + "When unchecked, this configuration will be skipped." : "تەكشۈرۈلمىسە ، بۇ سەپلىمە ئاتلاپ كېتىدۇ.", + "Backup (Replica) Host" : "زاپاسلاش (Replica) رىياسەتچىسى", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "ئىختىيارى زاپاسلاش مۇلازىمىتىرى بېرىڭ. ئۇ چوقۇم ئاساسلىق LDAP / AD مۇلازىمېتىرنىڭ كۆپەيتىلگەن نۇسخىسى بولۇشى كېرەك.", + "Backup (Replica) Port" : "زاپاسلاش (Replica) ئېغىزى", + "Disable Main Server" : "ئاساسلىق مۇلازىمېتىرنى چەكلەڭ", + "Only connect to the replica server." : "پەقەت كۆپەيتىلگەن مۇلازىمېتىرغا ئۇلاڭ.", + "Turn off SSL certificate validation." : "SSL گۇۋاھنامىسىنى دەلىللەشنى ئېتىۋېتىڭ.", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "تەۋسىيە قىلىنمايدۇ ، ئۇنى پەقەت سىناق ئۈچۈن ئىشلىتىڭ! ئەگەر ئۇلىنىش پەقەت مۇشۇ تاللاش بىلەنلا ئىشلەيدىغان بولسا ،% s مۇلازىمېتىرىڭىزغا LDAP مۇلازىمېتىرنىڭ SSL گۇۋاھنامىسىنى ئەكىرىڭ.", + "Cache Time-To-Live" : "Cache Time-To-Live", + "in seconds. A change empties the cache." : "سېكۇنتتا. ئۆزگەرتىش غەملەكنى بوشاتتى.", + "Directory Settings" : "مۇندەرىجە تەڭشىكى", + "User Display Name Field" : "ئىشلەتكۈچى كۆرسىتىش ئىسمى", + "The LDAP attribute to use to generate the user's display name." : "LDAP خاسلىقى ئىشلەتكۈچىنىڭ كۆرسىتىش نامىنى ھاسىل قىلىشقا ئىشلىتىلىدۇ.", + "2nd User Display Name Field" : "2-ئىشلەتكۈچى كۆرسىتىش ئىسمى مەيدانى", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "ئىختىيارىي. تىرناق ئىچىدىكى كۆرسىتىش نامىغا قوشۇلىدىغان LDAP خاسلىقى. مەسىلەن: »جون دو (john.doe@example.org)«.", + "Base User Tree" : "ئاساسى ئىشلەتكۈچى دەرىخى", + "One User Base DN per line" : "ھەر بىر قۇردا بىر ئىشلەتكۈچى ئاساسى DN", + "User Search Attributes" : "ئىشلەتكۈچى ئىزدەش خاسلىقى", + "Optional; one attribute per line" : "ئىختىيارىي ھەر بىر قۇرغا بىر خاسلىق", + "Disable users missing from LDAP" : "LDAP دىن يوقاپ كەتكەن ئىشلەتكۈچىلەرنى چەكلەڭ", + "When switched on, users imported from LDAP which are then missing will be disabled" : "قوزغىتىلغاندا LDAP دىن ئىمپورت قىلىنغان ئىشلەتكۈچىلەر ئىناۋەتسىز بولىدۇ", + "Group Display Name Field" : "گۇرۇپپا كۆرسىتىش ئىسمى مەيدانى", + "The LDAP attribute to use to generate the groups's display name." : "LDAP خاسلىقى گۇرۇپپىلارنىڭ كۆرسىتىش نامىنى ھاسىل قىلىشقا ئىشلىتىلىدۇ.", + "Base Group Tree" : "ئاساسى گۇرۇپپا دەرىخى", + "One Group Base DN per line" : "ھەر بىر قۇر بىر گۇرۇپپا ئاساسى DN", + "Group Search Attributes" : "گۇرۇپپا ئىزدەش خاسلىقى", + "Group-Member association" : "گۇرۇپپا-ئەزالار جەمئىيىتى", + "Dynamic Group Member URL" : "ھەرىكەتچان گۇرۇپپا ئەزالىرىنىڭ ئادرېسى", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "گۇرۇپپا ئوبيېكتلىرىدىكى LDAP خاسلىقى LDAP ئىزدەش URL نى ئۆز ئىچىگە ئالغان بولۇپ ، قايسى ئوبيېكتلارنىڭ گۇرۇپپىغا تەۋە ئىكەنلىكىنى بەلگىلەيدۇ. (قۇرۇق تەڭشەك ھەرىكەتچان گۇرۇپپا ئەزالىق ئىقتىدارىنى چەكلەيدۇ.)", + "Nested Groups" : "توپلانغان گۇرۇپپىلار", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "ئاچقاندا گۇرۇپپىلارنى ئۆز ئىچىگە ئالغان گۇرۇپپىلارنى قوللايدۇ. (پەقەت گۇرۇپپا ئەزالىرىنىڭ خاسلىقى DNs بولغاندىلا ئىشلەيدۇ.)", + "Paging chunksize" : "Paging chunksize", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Chunksize تور بەت LDAP ئىزدەش ئۈچۈن ئىشلىتىلىدۇ ، بۇ ئىشلەتكۈچى ياكى گۇرۇپپا تىزىملاش قاتارلىق چوڭ نەتىجىلەرنى قايتۇرىدۇ. (ئۇنى 0 قىلىپ تەڭشەش بۇ خىل ئەھۋال ئاستىدا LDAP ئىزدەشنى چەكلەيدۇ.)", + "Enable LDAP password changes per user" : "ھەر بىر ئىشلەتكۈچىگە LDAP پارول ئۆزگەرتىشنى قوزغىتىڭ", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP ئىشلەتكۈچىلىرىنىڭ مەخپىي نومۇرىنى ئۆزگەرتىشىگە يول قويۇڭ ۋە دەرىجىدىن تاشقىرى باشقۇرغۇچى ۋە گۇرۇپپا باشقۇرغۇچىلارنىڭ LDAP ئابونتلىرىنىڭ پارولىنى ئۆزگەرتىشىگە يول قويۇڭ. زىيارەتنى كونترول قىلىش سىياسىتى LDAP مۇلازىمېتىرىغا ئاساسەن تەڭشەلگەندىلا ئىشلەيدۇ. مەخپىي نومۇر LDAP مۇلازىمېتىرىغا ئوچۇق تېكىستتە ئەۋەتىلگەنلىكتىن ، چوقۇم مەخپىيلەشتۈرۈشنى ئىشلىتىپ ، LDAP مۇلازىمېتىرىدا مەخپىي نومۇرنى تەڭشەش كېرەك.", + "(New password is sent as plain text to LDAP)" : "(يېڭى پارول LDAP غا ئاددىي تېكىست سۈپىتىدە ئەۋەتىلدى)", + "Default password policy DN" : "كۆڭۈلدىكى پارول سىياسىتى DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "پارولنىڭ مۇددىتى توشقاندا بىر تەرەپ قىلىنىدىغان كۆڭۈلدىكى پارول سىياسىتىنىڭ DN. ھەر بىر ئىشلەتكۈچىگە LDAP پارولى ئۆزگەرتىلگەندىلا ئىشلەيدۇ ، پەقەت OpenLDAP قوللايدۇ. پارولنىڭ ۋاقتى توشۇشنى بىر تەرەپ قىلىش ئۈچۈن بوش قويۇڭ.", + "Special Attributes" : "ئالاھىدە خاسلىق", + "Quota Field" : "Quota Field", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "ئىشلەتكۈچىنىڭ سۈكۈتتىكى نورمىسى ئۈچۈن بوش قويۇڭ. بولمىسا ، LDAP / AD خاسلىقىنى بەلگىلەڭ.", + "Quota Default" : "Quota Default", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "نورما ئۆلچىمىدە نورما بېكىتىلمىگەن LDAP ئىشلەتكۈچىلىرىنىڭ سۈكۈتتىكى نورمىسىنى قاپلىۋېتىڭ.", + "Email Field" : "ئېلېكترونلۇق خەت مەيدانى", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "ئىشلەتكۈچىنىڭ ئېلېكترونلۇق خەتلىرىنى LDAP خاسلىقىدىن تەڭشەڭ. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ.", + "User Home Folder Naming Rule" : "ئىشلەتكۈچى ئائىلە ھۆججەت قىسقۇچىغا ئىسىم قويۇش قائىدىسى", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "ئىشلەتكۈچى نامىغا قۇرۇق قويۇڭ (سۈكۈتتىكى). بولمىسا ، LDAP / AD خاسلىقىنى بەلگىلەڭ.", + "\"$home\" Placeholder Field" : "\"$ home\" ئورۇن ئىگىسى", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "سىرتقى ساقلاش سەپلىمىسىدىكى $ home كۆرسىتىلگەن خاسلىقنىڭ قىممىتى بىلەن ئالماشتۇرۇلىدۇ", + "User Profile Attributes" : "ئىشلەتكۈچى ئارخىپى خاسلىقى", + "Phone Field" : "تېلېفون مەيدانى", + "User profile Phone will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تېلېفون بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Website Field" : "تور بېكەت مەيدانى", + "User profile Website will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تور بېكىتى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Address Field" : "ئادرېس مەيدانى", + "User profile Address will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ئادرېسى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Twitter Field" : "Twitter Field", + "User profile Twitter will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى Twitter كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Fediverse Field" : "Fediverse Field", + "User profile Fediverse will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى Fediverse كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Organisation Field" : "تەشكىلات مەيدانى", + "User profile Organisation will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تەشكىلاتى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Role Field" : "رول مەيدانى", + "User profile Role will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى رولى بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Headline Field" : "ماۋزۇ مەيدانى", + "User profile Headline will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ماۋزۇ بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Biography Field" : "تەرجىمىھالى", + "User profile Biography will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تەرجىمىھالى كۆرسىتىلگەن خاسلىقتىن تەڭشىلىدۇ", + "Birthdate Field" : "تۇغۇلغان كۈنى", + "User profile Date of birth will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى تۇغۇلغان ۋاقتى بەلگىلەنگەن خاسلىقتىن بېكىتىلىدۇ", + "Pronouns Field" : "ئالمىشىش مەيدانى", + "User profile Pronouns will be set from the specified attribute" : "ئىشلەتكۈچى ئارخىپى ئالماشلار بەلگىلەنگەن خاسلىقتىن تەڭشىلىدۇ", + "Internal Username" : "ئىچكى ئىشلەتكۈچى ئىسمى", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "سۈكۈتتىكى ھالەتتە ئىشلەتكۈچى ئىسمى UUID خاسلىقىدىن قۇرۇلىدۇ. ئىشلەتكۈچى نامىنىڭ ئۆزگىچە ئىكەنلىكى ۋە ھەرپلەرنى ئۆزگەرتىشنىڭ ھاجىتى يوقلىقىغا كاپالەتلىك قىلىدۇ. ئىچكى ئىشلەتكۈچى نامىدا پەقەت بۇ ھەرپلەرلا رۇخسەت قىلىنغان چەكلىمە بار: [a-zA-Z0-9 _. @ -]. باشقا ھەرپلەر ئۇلارنىڭ ASCII خەت ئالاقىسى بىلەن ئالماشتۇرۇلىدۇ ياكى ئاددىيلا چىقىرىۋېتىلىدۇ. سوقۇلغاندا بىر سان قوشۇلىدۇ / كۆپەيتىلىدۇ. ئىچكى ئىشلەتكۈچى ئىسمى ئىچكى ئىشلەتكۈچىنى پەرقلەندۈرۈش ئۈچۈن ئىشلىتىلىدۇ. ئۇ يەنە ئىشلەتكۈچىنىڭ ئائىلە قىسقۇچىنىڭ سۈكۈتتىكى ئىسمى. ئۇ يىراقتىكى URL لارنىڭ بىر قىسمى ، مەسىلەن بارلىق DAV مۇلازىمىتى ئۈچۈن. بۇ تەڭشەك ئارقىلىق سۈكۈتتىكى ھەرىكەتنى بېسىپ ئۆتكىلى بولىدۇ. ئۆزگەرتىش پەقەت يېڭى سىزىلغان (قوشۇلغان) LDAP ئىشلەتكۈچىلەرگىلا تەسىر كۆرسىتىدۇ. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ.", + "Internal Username Attribute:" : "ئىچكى ئىشلەتكۈچى ئىسمى خاسلىقى:", + "Override UUID detection" : "UUID بايقاشنى قاپلىۋېتىڭ", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "سۈكۈت بويىچە ، UUID خاسلىقى ئاپتوماتىك بايقىلىدۇ. UUID خاسلىقى LDAP ئىشلەتكۈچىلىرى ۋە گۇرۇپپىلىرىنى شەكسىز پەرقلەندۈرۈش ئۈچۈن ئىشلىتىلىدۇ. ئۇندىن باشقا ، ئىچكى ئىشلەتكۈچى ئىسمى UUID ئاساسىدا قۇرۇلىدۇ ، ئەگەر يۇقىرىدا ئېنىق بەلگىلەنمىگەن بولسا. تەڭشەكنى بېسىپ ئۆتۈپ ، ئۆزىڭىز تاللىغان خاسلىقنى يەتكۈزەلەيسىز. سىز ئۆزىڭىز تاللىغان خاسلىقنىڭ ئىشلەتكۈچىلەر ۋە گۇرۇپپىلار ئۈچۈن ئېلىپ كېلىنەلەيدىغانلىقىغا كاپالەتلىك قىلىشىڭىز كېرەك. سۈكۈتتىكى ھەرىكەت ئۈچۈن ئۇنى بوش قويۇڭ. ئۆزگەرتىش پەقەت يېڭى سىزىلغان (قوشۇلغان) LDAP ئىشلەتكۈچىلىرى ۋە گۇرۇپپىلىرىغىلا تەسىر كۆرسىتىدۇ.", + "UUID Attribute for Users:" : "ئىشلەتكۈچىلەر ئۈچۈن UUID خاسلىقى:", + "UUID Attribute for Groups:" : "گۇرۇپپىلارغا UUID خاسلىقى:", + "Username-LDAP User Mapping" : "ئىشلەتكۈچى ئىسمى-LDAP ئىشلەتكۈچى خەرىتىسى", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ئىشلەتكۈچى ئىسمى مېتا سانلىق مەلۇماتنى ساقلاش ۋە تەقسىملەشتە ئىشلىتىلىدۇ. ئىشلەتكۈچىلەرنى ئېنىق تونۇش ۋە تونۇش ئۈچۈن ، ھەر بىر LDAP ئىشلەتكۈچىنىڭ ئىچكى ئىشلەتكۈچى ئىسمى بولىدۇ. بۇ ئىشلەتكۈچى نامىدىن LDAP ئىشلەتكۈچىگە خەرىتە سىزىشنى تەلەپ قىلىدۇ. قۇرۇلغان ئىشلەتكۈچى ئىسمى LDAP ئىشلەتكۈچىنىڭ UUID غا سىزىلغان. بۇنىڭدىن باشقا ، DN غەملەك بىلەن LDAP ئۆز-ئارا تەسىرنى ئازايتىدۇ ، ئەمما ئۇ پەرقلەندۈرۈشكە ئىشلىتىلمەيدۇ. ئەگەر DN ئۆزگەرسە ، ئۆزگىرىشلەر تېپىلىدۇ. ئىچكى ئىشلەتكۈچى ئىسمى ھەممە يەردە ئىشلىتىلىدۇ. خەرىتىنى تازىلاش ھەممە يەردە ئېشىپ قالىدۇ. خەرىتىنى تازىلاش سەپلىمىگە سەزگۈر ئەمەس ، ئۇ بارلىق LDAP سەپلىمىسىگە تەسىر كۆرسىتىدۇ! خەرىتىنى ئىشلەپچىقىرىش مۇھىتىدا ھەرگىز تازىلىماڭ ، پەقەت سىناق ياكى تەجرىبە باسقۇچىدىلا.", + "Clear Username-LDAP User Mapping" : "ئىشلەتكۈچى ئىسمى- LDAP ئىشلەتكۈچى خەرىتىسىنى تازىلاڭ", + "Clear Groupname-LDAP Group Mapping" : "گۇرۇپپا ئىسمى- LDAP گۇرۇپپا خەرىتىسىنى تازىلاش", + "Invalid configuration. Please have a look at the logs for further details." : "سەپلىمە ئىناۋەتسىز. تېخىمۇ كۆپ تەپسىلاتلار ئۈچۈن خاتىرىلەرنى كۆرۈپ بېقىڭ." +},"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/uk.js b/apps/user_ldap/l10n/uk.js index 4b2e9c4bfcf..21992698f59 100644 --- a/apps/user_ldap/l10n/uk.js +++ b/apps/user_ldap/l10n/uk.js @@ -1,16 +1,17 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "Не вдалося очистити відображення.", + "Failed to clear the mappings." : "Не вдалося очистити мапування.", "Failed to delete the server configuration" : "Не вдалося вилучити конфігурацію сервера", "Invalid configuration: Anonymous binding is not allowed." : "Неправильна конфігурація. Анонімне приєднання не дозволено.", "Valid configuration, connection established!" : "Правильна конфігурація, з'єднання встановлено!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Правильна конфігурація, але приєднання не вдалося. Будь ласка, перевірте налаштування сервера та дані авторизації.", - "Invalid configuration. Please have a look at the logs for further details." : "Неправильна конфігурація. Перевірте журнал для докладної інформації.", + "Invalid configuration: %s" : "Неправильна конфігурація: %s", "No action specified" : "Ніяких дій не вказано", "No configuration specified" : "Немає конфігурації", "No data specified" : "Немає даних", - " Could not set configuration %s" : "Не вдалося встановити конфігурацію %s", + "Invalid data specified" : "Вказано неправильні дані", + "Could not set configuration %1$s to %2$s" : "Не вдалося встановити конфігурацію %1$s на %2$s", "Action does not exist" : "Дія не існує", "Renewing …" : "Оновлення...", "Very weak password" : "Дуже слабкий пароль", @@ -27,38 +28,92 @@ OC.L10N.register( "Select object classes" : "Виберіть класи об'єктів", "Please check the credentials, they seem to be wrong." : "Перевірте дані авторизації, можливо, що вони неправильні.", "Please specify the port, it could not be auto-detected." : "Будь ласка, вкажіть порт, він не може бути визначений автоматично.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Неможливо автоматично визначити базове DN, перегляньте облікові дані, хост і порт.", + "Could not detect Base DN, please enter it manually." : "Не вдалося визначити базовий DN, введіть його вручну.", "{nthServer}. Server" : "{nthServer}. Сервер", + "No object found in the given Base DN. Please revise." : "Не знайдено жодного об’єкта в даному базовому DN. Будь ласка, перегляньте.", + "More than 1,000 directory entries available." : "Доступно понад 1000 записів каталогу.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Запис {objectsFound} доступний у межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Сталась помилка. Будь ласка, перевірте базове DN, а також налаштування підключення та облікові дані.", "Do you really want to delete the current Server Configuration?" : "Дійсно вилучити поточну конфігурацію сервера ?", "Confirm Deletion" : "Підтвердіть вилучення", - "Mappings cleared successfully!" : "Відображення успішно очищенні!", + "Mappings cleared successfully!" : "Мапування успішно очищено!", "Error while clearing the mappings." : "Помилка при очищенні відображень.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Анонімне прив'язування не допускається. Укажіть DN користувача та пароль.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Помилка операцій LDAP. Анонімне прив’язування може бути заборонено.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Не вдалося зберегти. Переконайтеся, що база даних працює. Перезавантажте, перш ніж продовжити.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Перемикання режиму активує автоматичні запити LDAP. Залежно від розміру LDAP, це може зайняти деякий час. Ви все ще хочете змінити режим?", + "Mode switch" : "Перемикач режимів", "Select attributes" : "Виберіть атрибути", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Користувача не знайдено. Перевірте свої атрибути входу та ім’я користувача. Ефективний фільтр (для копіювання та вставлення для перевірки командного рядка): <br/>", "User found and settings verified." : "Користувача знайдено і налаштування перевірені.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Розгляньте можливість звузити пошук, оскільки він охоплює багато користувачів, лише перший з яких зможе ввійти.", + "An unspecified error occurred. Please check log and settings." : "Сталася невизначена помилка. Перевірте журнал і налаштування.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Фільтр пошуку недійсний, ймовірно, через синтаксичні проблеми, наприклад нерівну кількість відкритих і закритих дужок. Будь ласка, перегляньте.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Сталася помилка підключення до LDAP/AD. Перевірте хост, порт і облікові дані.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заповнювач \"%uid\" відсутній. Його буде замінено ім’ям для входу під час запиту LDAP/AD.", + "Please provide a login name to test against" : "Будь ласка, введіть ім’я для входу для перевірки", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Поле групи було вимкнено, оскільки сервер LDAP/AD не підтримує memberOf.", + "Password change rejected. Hint: %s" : "Зміну пароля відхилено. Підказка: %s", + "Mandatory field \"%s\" left empty" : "Обов'язкове поле \"%s\" залишено порожнім", + "A password is given, but not an LDAP agent" : "Надається пароль, але не агент LDAP", + "No password is given for the user agent" : "Для користувача-агента пароль не задається", + "No LDAP base DN was given" : "Базовий DN LDAP не вказано", + "User base DN is not a subnode of global base DN" : "Базовий DN користувача не є підвузлом глобального базового DN", + "Group base DN is not a subnode of global base DN" : "Груповий базовий DN не є підвузлом глобального базового DN", + "Login filter does not contain %s placeholder." : "Фільтр логінів не містить заповнювача %s.", + "Please login with the new password" : "Будь ласка, увійдіть з новим паролем", "LDAP User backend" : "Інтерфейс керування користувачами LDAP", "Your password will expire tomorrow." : "Дія вашого пароля завершується завтра.", "Your password will expire today." : "Дія вашого пароля завершується сьогодні.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Дія вашого пароля завершується через %n день.","Дія вашого пароля завершується через %n дні.","Дія вашого пароля завершується через %n днів.","Дія вашого пароля завершується через %n днів."], - "_%s group found_::_%s groups found_" : [" %s група знайдена "," %s груп знайдено ","%s груп знайдено ","%s груп знайдено "], - "_%s user found_::_%s users found_" : ["%s користувача знайдено","%s користувачів знайдено","%s користувачів знайдено","%s користувачів знайдено"], + "LDAP/AD integration" : "Інтеграція LDAP/AD", + "LDAP Connection" : "Підключення LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Зв'язування не вдалося для цієї конфігурації LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Не вдалося виконати пошук для цієї конфігурації LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Існує неактивна конфігурація LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Прив'язка та пошук працює на налаштованому LDAP-з'єднанні (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)"], + "Invalid LDAP UUIDs" : "Недійсні LDAP UUID", + "None found" : "Нічого не знайдено", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Знайдено недійсні ідентифікатори UUID користувачів або груп LDAP. Перевірте налаштування \"Пропускати визначення UUID\" у розділі \"Для експертів\" налаштувань LDAP або виконайте команду \"occ ldap:update-uuid\" для їхнього оновлення.", + "_%n group found_::_%n groups found_" : ["знайдена група %n","знайдено груп %n","знайдено груп %n","знайдено груп %n "], + "> 1000 groups found" : "> 1000 груп знайдено", + "> 1000 users found" : "> 1000 користувачів знайдено", + "_%n user found_::_%n users found_" : ["знайдено користувач %n","знайдено користувачів %n","знайдено користувачів %n","знайдено користувачів %n"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не вдалося виявити атрибут відображуваного імені користувача. Будь ласка, вкажіть це самостійно в розширених налаштуваннях LDAP.", "Could not find the desired feature" : "Не вдалося знайти потрібну функцію", "Invalid Host" : "Невірний Host", "LDAP user and group backend" : "Інтерфейс керування користувачами та групами LDAP", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Цей застосунок дозволяє адміністраторам підключати Nextcloud до каталогу користувачів LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Цей застосунок дозволяє адміністраторам підключати Nextcloud до каталогу користувачів на основі LDAP для авторизації та ініціалізації користувачів, груп і атрибутів користувачів. Адміністратори можуть налаштувати цей застосунок для підключення до одного або кількох каталогів LDAP або Active Directory через інтерфейс LDAP. Такі атрибути, як квота користувача, електронна пошта, зображення аватара, членство в групах тощо, можна отримати в Nextcloud із каталогу з відповідними запитами та фільтрами. \n\nКористувач входить у Nextcloud за допомогою своїх облікових даних LDAP або AD і отримує доступ на основі запиту авторизації, який обробляється сервером LDAP або AD. Nextcloud не зберігає паролі LDAP або AD, натомість ці облікові дані використовуються для авторизації користувача, а потім Nextcloud використовує сеанс для ідентифікатора користувача. Більше інформації доступно в документації користувача та групи LDAP Backend.", "Test Configuration" : "Тестове налаштування", "Help" : "Допомога", "Groups meeting these criteria are available in %s:" : "Групи, що відповідають цим критеріям доступні в %s:", + "Only these object classes:" : "Тільки ці класи об'єктів:", "Only from these groups:" : "Лише з цих груп:", "Search groups" : "Пошук груп", "Available groups" : "Доступні групи", "Selected groups" : "Обрані групи", + "Edit LDAP Query" : "Редагувати запит LDAP", "LDAP Filter:" : "LDAP фільтр:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Фільтр визначає, які LDAP групи повинні мати доступ до %s примірника.", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Фільтр визначає, які LDAP групи повинні мати доступ до %s сервера.", "Verify settings and count the groups" : "Перевірити налаштування та порахувати групи", + "When logging in, %s will find the user based on the following attributes:" : "Під час входу в систему %s знайде користувача за такими атрибутами:", + "LDAP/AD Username:" : "Ім'я користувача LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Дозволяє ввійти за допомогою імені користувача LDAP/AD, яке є \"uid\" або \"sAMAccountName\" і буде виявлено.", + "LDAP/AD Email Address:" : "Адреса електронної пошти LDAP/AD:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Дозволяє входити за допомогою атрибута електронної пошти. дозволено \"mail\" і \"mailPrimaryAddress\".", "Other Attributes:" : "Інші Атрибути:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Визначає фільтр, який застосовуватиметься під час спроби входу. \"%%uid\" замінює ім'я користувача в дії входу. Приклад: \"uid=%%uid\"", "Test Loginname" : "Тестове ім'я при вході", + "Attempts to receive a DN for the given loginname and the current login filter" : "Спроби отримати DN для заданого логіну та поточного фільтру для входу", "Verify settings" : "Перевірити налаштування", "%s. Server:" : "%s. Сервер:", "Add a new configuration" : "Додати нову конфігурацію", + "Copy current configuration into new directory binding" : "Скопіюйте поточну конфігурацію в новий каталог", + "Delete the current configuration" : "Вилучити поточну конфігурацію", "Host" : "Хост", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Ви можете не вказувати протокол, якщо вам не потрібен SSL. Якщо так, починайте з ldaps://", "Port" : "Порт", "Detect Port" : "Визначити Порт", "User DN" : "DN Користувача", @@ -72,7 +127,9 @@ OC.L10N.register( "Test Base DN" : "Тест основного DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Уникати автоматичні запити LDAP. Краще для великих установок, але вимагає деякого LDAP знання.", "Manually enter LDAP filters (recommended for large directories)" : "Вручну введіть фільтри LDAP (рекомендується для великих каталогів)", - "The filter specifies which LDAP users shall have access to the %s instance." : "Фільтр визначає, які користувачі LDAP повинні мати доступ до примірника %s.", + "Listing and searching for users is constrained by these criteria:" : "Перелік і пошук користувачів обмежені такими критеріями:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Найпоширенішими класами об’єктів для користувачів є organizationalPerson, person, user і inetOrgPerson. Якщо ви не впевнені, який клас об’єктів вибрати, зверніться до свого адміністратора каталогу.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Фільтр визначає, які користувачі LDAP повинні мати доступ до сервера %s.", "Verify settings and count users" : "Перевірити налаштування та порахувати користувачів", "Saving" : "Збереження", "Back" : "Назад", @@ -87,19 +144,19 @@ OC.L10N.register( "Cancel" : "Скасувати", "Server" : "Сервер", "Users" : "Користувачі", - "Login Attributes" : "Атрибуту входу", + "Login Attributes" : "Атрибути входу", "Groups" : "Групи", "Expert" : "Експерт", "Advanced" : "Додатково", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Увага:</ b> Потрібний модуль PHP LDAP не встановлено, базова програма працювати не буде. Будь ласка, зверніться до системного адміністратора, щоб встановити його.", "Connection Settings" : "Налаштування З'єднання", - "Configuration Active" : "Налаштування Активне", + "Configuration Active" : "Налаштування активне", "When unchecked, this configuration will be skipped." : "Якщо \"галочка\" знята, ця конфігурація буде пропущена.", "Backup (Replica) Host" : "Сервер для резервних копій", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Вкажіть додатковий резервний сервер. Він повинен бути копією головного LDAP/AD сервера.", "Backup (Replica) Port" : "Порт сервера для резервних копій", "Disable Main Server" : "Вимкнути Головний Сервер", - "Only connect to the replica server." : "Підключити тільки до сервера реплік.", + "Only connect to the replica server." : "З'єднатися тільки із сервером реплік.", "Turn off SSL certificate validation." : "Вимкнути перевірку SSL сертифіката.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендується, використовувати його тільки для тестування!\nЯкщо з'єднання працює лише з цією опцією, імпортуйте SSL сертифікат LDAP сервера у ваший %s сервер.", "Cache Time-To-Live" : "Час актуальності Кеша", @@ -107,35 +164,76 @@ OC.L10N.register( "Directory Settings" : "Налаштування каталогу", "User Display Name Field" : "Поле, яке відображає Ім'я Користувача", "The LDAP attribute to use to generate the user's display name." : "Атрибут LDAP, який використовується для генерації імен користувачів.", + "2nd User Display Name Field" : "2-е поле відображуваного імені користувача", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Додатково. Атрибут LDAP, який потрібно додати до відображуваного імені в дужках. Результати, напр. \"Джон Доу (john.doe@example.org)\".", "Base User Tree" : "Основне Дерево Користувачів", "One User Base DN per line" : "Один Користувач Base DN на рядок", - "User Search Attributes" : "Пошукові Атрибути Користувача", + "User Search Attributes" : "Пошукові атрибутів користувача", "Optional; one attribute per line" : "Додатково; один атрибут на рядок", + "Disable users missing from LDAP" : "Вимкнути користувачів, відсутніх у LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Якщо увімкнено, імпортовані з LDAP користувачі, які виявляться відсутніми, будуть вимкнені", "Group Display Name Field" : "Поле, яке відображає Ім'я Групи", "The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, який використовується для генерації імен груп.", "Base Group Tree" : "Основне Дерево Груп", "One Group Base DN per line" : "Одна Група Base DN на рядок", - "Group Search Attributes" : "Пошукові Атрибути Групи", - "Group-Member association" : "Асоціація Група-Член", + "Group Search Attributes" : "Пошукові атрибути групи", + "Group-Member association" : "Асоціація \"група-учасник\"", + "Dynamic Group Member URL" : "URL-адреса учасника динамічної групи", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Атрибут LDAP, який об’єктів групи містить URL-адресу пошуку LDAP, яка визначає, які об’єкти належать до групи. (Пусте налаштування вимикає функцію динамічного членства в групі.)", "Nested Groups" : "Вкладені Групи", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "При включенні, групи, які містять групи підтримуються. (Працює тільки якщо атрибут члена групи містить DNS.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "При включенні, групи, які містять групи підтримуються. (Працює тільки якщо атрибут учасника групи містить DN.)", "Paging chunksize" : "Розмір підкачки", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Підкачка використовується для сторінкових пошуків LDAP, які можуть повертати громіздкі результати кількісті користувачів або груп. (Установка його 0 відключає вивантаженя пошуку LDAP в таких ситуаціях.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Підкачка використовується для сторінкових пошуків LDAP, які можуть повертати громіздкі результати кількісті користувачів або груп. (Установка його 0 відключає пошук LDAP в таких ситуаціях.)", + "Enable LDAP password changes per user" : "Дозволити зміну паролів LDAP для кожного користувача", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Дозволити користувачам LDAP змінювати свій пароль і дозволити супер (прихованим) адміністраторам і адміністраторам груп змінювати пароль своїх користувачів LDAP. Працює тільки тоді, коли політики контролю доступу налаштовані відповідним чином на LDAP сервері. Оскільки паролі відправляються на LDAP-сервер у відкритому вигляді, необхідно використовувати транспортне шифрування і налаштувати хешування паролів на LDAP-сервері. ", + "(New password is sent as plain text to LDAP)" : "(Новий пароль надсилається як звичайний текст до LDAP)", + "Default password policy DN" : "DN політики паролів за замовчуванням", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN типової політики паролів, що використовуватиметься для обробки терміну дії пароля. Працює лише тоді, коли ввімкнено зміну пароля LDAP для кожного користувача та підтримується лише OpenLDAP. Залиште пустим, щоб вимкнути обробку терміну дії пароля.", "Special Attributes" : "Спеціальні Атрибути", "Quota Field" : "Поле Квоти", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Залиште порожнім, щоби визначити типову квоту користувача. В іншому випадку зазначте атрибут LDAP/AD.", "Quota Default" : "Квота за замовчанням", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Перевизначити квоту за замовчуванням для користувачів LDAP, які не мають квоти, встановленої в полі квоти.", "Email Field" : "Поле E-mail", - "User Home Folder Naming Rule" : "Правило іменування домашньої теки користувача", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Установіть електронну пошту користувача з його атрибута LDAP. Залиште поле порожнім для застосування типового значення.", + "User Home Folder Naming Rule" : "Правило іменування домашнього каталогу користувача", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Залиште порожнім для імені користувача (за замовчуванням). В іншому випадку вкажіть атрибут LDAP/AD.", + "\"$home\" Placeholder Field" : "Поле заповнювача \"$home\".", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home в конфігурації зовнішнього сховища буде замінено на значення вказаного атрибута", + "User Profile Attributes" : "Атрибути профілю користувача", + "Phone Field" : "Поле Телефон", + "User profile Phone will be set from the specified attribute" : "Телефон в профілі користувача буде встановлено на основі вказаного атрибута", + "Website Field" : "Поле Вебсайт", + "User profile Website will be set from the specified attribute" : "Вебсайт в профілі користувача буде встановлено на основі вказаного атрибута", + "Address Field" : "Поле Адреса", + "User profile Address will be set from the specified attribute" : "Адреса в профілі користувача буде встановлена на основі вказаного атрибута", + "Twitter Field" : "Поле Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter в профілі користувача буде встановлено на основі вказаного атрибута", + "Fediverse Field" : "Поле Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse в профілі користувача буде встановлено на основі вказаного атрибута", + "Organisation Field" : "Поле Організація", + "User profile Organisation will be set from the specified attribute" : "Організація в профілі користувача буде встановлена на основі вказаного атрибута", + "Role Field" : "Поле Роль", + "User profile Role will be set from the specified attribute" : "Роль в профілі користувача буде встановлено на основі вказаного атрибута", + "Headline Field" : "Поле Заголовок", + "User profile Headline will be set from the specified attribute" : "Заголовок в профілі користувача буде встановлено на основі вказаного атрибута", + "Biography Field" : "Поле Біографія", + "User profile Biography will be set from the specified attribute" : "Біографія в профілі користувача буде встановлена на основі вказаного атрибута", + "Birthdate Field" : "Поле Дата народження", + "User profile Date of birth will be set from the specified attribute" : "Профіль користувача Дата народження буде встановлена з вказаного атрибуту", + "Pronouns Field" : "Поле займенників", + "User profile Pronouns will be set from the specified attribute" : "Профіль користувача Займенники будуть встановлені з вказаного атрибуту", "Internal Username" : "Внутрішня Ім'я користувача", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "За замовчуванням внутрішнє ім’я користувача буде створено з атрибута UUID. Це гарантує, що ім’я користувача є унікальним і символи не потрібно конвертувати. Внутрішнє ім’я користувача має обмеження щодо дозволених лише таких символів: [a-zA-Z0-9_.@-]. Інші символи замінюються відповідністю ASCII або просто пропускаються. При зіткненнях число буде додано/збільшено. Внутрішнє ім’я користувача використовується для внутрішньої ідентифікації користувача. Це також назва за замовчуванням для домашнього каталогу користувача. Це також частина віддалених URL-адрес, наприклад, для всіх служб DAV. За допомогою цього параметра поведінку за замовчуванням можна змінити. Зміни діятимуть лише для нещодавно зіставлених (доданих) користувачів LDAP. Залиште поле порожнім для поведінки за замовчуванням.", "Internal Username Attribute:" : "Внутрішня Ім'я користувача, Атрибут:", "Override UUID detection" : "Перекрити вивід UUID ", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "За замовчуванням ownCloud визначає атрибут UUID автоматично. Цей атрибут використовується для того, щоб достовірно ідентифікувати користувачів і групи LDAP. Також на підставі атрибута UUID створюється внутрішнє ім'я користувача, якщо вище не вказано інакше. Ви можете перевизначити це налаштування та вказати свій атрибут за вибором. Ви повинні упевнитися, що обраний вами атрибут може бути вибраний для користувачів і груп, а також те, що він унікальний. Залиште поле порожнім для поведінки за замовчуванням. Зміни вступлять в силу тільки для нових підключених (доданих) користувачів і груп LDAP.", "UUID Attribute for Users:" : "UUID Атрибут для користувачів:", "UUID Attribute for Groups:" : "UUID Атрибут для груп:", "Username-LDAP User Mapping" : "Картографія Імен користувачів-LDAP ", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Імена користувачів використовуються для зберігання та призначення метаданих. Для точної ідентифікації та розпізнавання користувачів кожен користувач LDAP матиме внутрішнє ім’я користувача. Для цього потрібне зіставлення імені користувача з користувачем LDAP. Створене ім’я користувача зіставляється з UUID користувача LDAP. Крім того, DN також кешується, щоб зменшити взаємодію LDAP, але він не використовується для ідентифікації. Якщо DN змінюється, зміни будуть знайдені. Внутрішнє ім'я користувача використовується всюди. Очищення зіставлення залишить залишки всюди. Очищення зіставлення не залежить від конфігурації, воно впливає на всі конфігурації LDAP! Ніколи не очищайте зіставлення у продуктовому середовищі, лише на стадії тестування чи експерименту.", "Clear Username-LDAP User Mapping" : "Очистити картографію Імен користувачів-LDAP", "Clear Groupname-LDAP Group Mapping" : "Очистити картографію Імен груп-LDAP", - "LDAP / AD Username:" : "ім'я користувача LDAP/AD:", - "LDAP / AD Email Address:" : "LDAP / AD Email адреса:" + "Invalid configuration. Please have a look at the logs for further details." : "Неправильна конфігурація. Перевірте журнал для докладної інформації." }, "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/user_ldap/l10n/uk.json b/apps/user_ldap/l10n/uk.json index 96eaa246385..b1837d05eca 100644 --- a/apps/user_ldap/l10n/uk.json +++ b/apps/user_ldap/l10n/uk.json @@ -1,14 +1,15 @@ { "translations": { - "Failed to clear the mappings." : "Не вдалося очистити відображення.", + "Failed to clear the mappings." : "Не вдалося очистити мапування.", "Failed to delete the server configuration" : "Не вдалося вилучити конфігурацію сервера", "Invalid configuration: Anonymous binding is not allowed." : "Неправильна конфігурація. Анонімне приєднання не дозволено.", "Valid configuration, connection established!" : "Правильна конфігурація, з'єднання встановлено!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "Правильна конфігурація, але приєднання не вдалося. Будь ласка, перевірте налаштування сервера та дані авторизації.", - "Invalid configuration. Please have a look at the logs for further details." : "Неправильна конфігурація. Перевірте журнал для докладної інформації.", + "Invalid configuration: %s" : "Неправильна конфігурація: %s", "No action specified" : "Ніяких дій не вказано", "No configuration specified" : "Немає конфігурації", "No data specified" : "Немає даних", - " Could not set configuration %s" : "Не вдалося встановити конфігурацію %s", + "Invalid data specified" : "Вказано неправильні дані", + "Could not set configuration %1$s to %2$s" : "Не вдалося встановити конфігурацію %1$s на %2$s", "Action does not exist" : "Дія не існує", "Renewing …" : "Оновлення...", "Very weak password" : "Дуже слабкий пароль", @@ -25,38 +26,92 @@ "Select object classes" : "Виберіть класи об'єктів", "Please check the credentials, they seem to be wrong." : "Перевірте дані авторизації, можливо, що вони неправильні.", "Please specify the port, it could not be auto-detected." : "Будь ласка, вкажіть порт, він не може бути визначений автоматично.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Неможливо автоматично визначити базове DN, перегляньте облікові дані, хост і порт.", + "Could not detect Base DN, please enter it manually." : "Не вдалося визначити базовий DN, введіть його вручну.", "{nthServer}. Server" : "{nthServer}. Сервер", + "No object found in the given Base DN. Please revise." : "Не знайдено жодного об’єкта в даному базовому DN. Будь ласка, перегляньте.", + "More than 1,000 directory entries available." : "Доступно понад 1000 записів каталогу.", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["Запис {objectsFound} доступний у межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN","{objectsFound} записи доступні в межах наданого базового DN"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Сталась помилка. Будь ласка, перевірте базове DN, а також налаштування підключення та облікові дані.", "Do you really want to delete the current Server Configuration?" : "Дійсно вилучити поточну конфігурацію сервера ?", "Confirm Deletion" : "Підтвердіть вилучення", - "Mappings cleared successfully!" : "Відображення успішно очищенні!", + "Mappings cleared successfully!" : "Мапування успішно очищено!", "Error while clearing the mappings." : "Помилка при очищенні відображень.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Анонімне прив'язування не допускається. Укажіть DN користувача та пароль.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Помилка операцій LDAP. Анонімне прив’язування може бути заборонено.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Не вдалося зберегти. Переконайтеся, що база даних працює. Перезавантажте, перш ніж продовжити.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Перемикання режиму активує автоматичні запити LDAP. Залежно від розміру LDAP, це може зайняти деякий час. Ви все ще хочете змінити режим?", + "Mode switch" : "Перемикач режимів", "Select attributes" : "Виберіть атрибути", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "Користувача не знайдено. Перевірте свої атрибути входу та ім’я користувача. Ефективний фільтр (для копіювання та вставлення для перевірки командного рядка): <br/>", "User found and settings verified." : "Користувача знайдено і налаштування перевірені.", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Розгляньте можливість звузити пошук, оскільки він охоплює багато користувачів, лише перший з яких зможе ввійти.", + "An unspecified error occurred. Please check log and settings." : "Сталася невизначена помилка. Перевірте журнал і налаштування.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Фільтр пошуку недійсний, ймовірно, через синтаксичні проблеми, наприклад нерівну кількість відкритих і закритих дужок. Будь ласка, перегляньте.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Сталася помилка підключення до LDAP/AD. Перевірте хост, порт і облікові дані.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Заповнювач \"%uid\" відсутній. Його буде замінено ім’ям для входу під час запиту LDAP/AD.", + "Please provide a login name to test against" : "Будь ласка, введіть ім’я для входу для перевірки", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "Поле групи було вимкнено, оскільки сервер LDAP/AD не підтримує memberOf.", + "Password change rejected. Hint: %s" : "Зміну пароля відхилено. Підказка: %s", + "Mandatory field \"%s\" left empty" : "Обов'язкове поле \"%s\" залишено порожнім", + "A password is given, but not an LDAP agent" : "Надається пароль, але не агент LDAP", + "No password is given for the user agent" : "Для користувача-агента пароль не задається", + "No LDAP base DN was given" : "Базовий DN LDAP не вказано", + "User base DN is not a subnode of global base DN" : "Базовий DN користувача не є підвузлом глобального базового DN", + "Group base DN is not a subnode of global base DN" : "Груповий базовий DN не є підвузлом глобального базового DN", + "Login filter does not contain %s placeholder." : "Фільтр логінів не містить заповнювача %s.", + "Please login with the new password" : "Будь ласка, увійдіть з новим паролем", "LDAP User backend" : "Інтерфейс керування користувачами LDAP", "Your password will expire tomorrow." : "Дія вашого пароля завершується завтра.", "Your password will expire today." : "Дія вашого пароля завершується сьогодні.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Дія вашого пароля завершується через %n день.","Дія вашого пароля завершується через %n дні.","Дія вашого пароля завершується через %n днів.","Дія вашого пароля завершується через %n днів."], - "_%s group found_::_%s groups found_" : [" %s група знайдена "," %s груп знайдено ","%s груп знайдено ","%s груп знайдено "], - "_%s user found_::_%s users found_" : ["%s користувача знайдено","%s користувачів знайдено","%s користувачів знайдено","%s користувачів знайдено"], + "LDAP/AD integration" : "Інтеграція LDAP/AD", + "LDAP Connection" : "Підключення LDAP", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["Зв'язування не вдалося для цієї конфігурації LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s","Зв'язування не вдалося для %n конфігурацій LDAP: %s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["Не вдалося виконати пошук для цієї конфігурації LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s","Не вдалося виконати пошук для %n конфігурацій LDAP: %s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["Існує неактивна конфігурація LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s","Існує %n неактивних конфігурацій LDAP: %s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["Прив'язка та пошук працює на налаштованому LDAP-з'єднанні (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)","Прив'язка та пошук працює на всіх %n налаштованих LDAP-з'єднаннях (%s)"], + "Invalid LDAP UUIDs" : "Недійсні LDAP UUID", + "None found" : "Нічого не знайдено", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "Знайдено недійсні ідентифікатори UUID користувачів або груп LDAP. Перевірте налаштування \"Пропускати визначення UUID\" у розділі \"Для експертів\" налаштувань LDAP або виконайте команду \"occ ldap:update-uuid\" для їхнього оновлення.", + "_%n group found_::_%n groups found_" : ["знайдена група %n","знайдено груп %n","знайдено груп %n","знайдено груп %n "], + "> 1000 groups found" : "> 1000 груп знайдено", + "> 1000 users found" : "> 1000 користувачів знайдено", + "_%n user found_::_%n users found_" : ["знайдено користувач %n","знайдено користувачів %n","знайдено користувачів %n","знайдено користувачів %n"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Не вдалося виявити атрибут відображуваного імені користувача. Будь ласка, вкажіть це самостійно в розширених налаштуваннях LDAP.", "Could not find the desired feature" : "Не вдалося знайти потрібну функцію", "Invalid Host" : "Невірний Host", "LDAP user and group backend" : "Інтерфейс керування користувачами та групами LDAP", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Цей застосунок дозволяє адміністраторам підключати Nextcloud до каталогу користувачів LDAP.", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Цей застосунок дозволяє адміністраторам підключати Nextcloud до каталогу користувачів на основі LDAP для авторизації та ініціалізації користувачів, груп і атрибутів користувачів. Адміністратори можуть налаштувати цей застосунок для підключення до одного або кількох каталогів LDAP або Active Directory через інтерфейс LDAP. Такі атрибути, як квота користувача, електронна пошта, зображення аватара, членство в групах тощо, можна отримати в Nextcloud із каталогу з відповідними запитами та фільтрами. \n\nКористувач входить у Nextcloud за допомогою своїх облікових даних LDAP або AD і отримує доступ на основі запиту авторизації, який обробляється сервером LDAP або AD. Nextcloud не зберігає паролі LDAP або AD, натомість ці облікові дані використовуються для авторизації користувача, а потім Nextcloud використовує сеанс для ідентифікатора користувача. Більше інформації доступно в документації користувача та групи LDAP Backend.", "Test Configuration" : "Тестове налаштування", "Help" : "Допомога", "Groups meeting these criteria are available in %s:" : "Групи, що відповідають цим критеріям доступні в %s:", + "Only these object classes:" : "Тільки ці класи об'єктів:", "Only from these groups:" : "Лише з цих груп:", "Search groups" : "Пошук груп", "Available groups" : "Доступні групи", "Selected groups" : "Обрані групи", + "Edit LDAP Query" : "Редагувати запит LDAP", "LDAP Filter:" : "LDAP фільтр:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "Фільтр визначає, які LDAP групи повинні мати доступ до %s примірника.", + "The filter specifies which LDAP groups shall have access to the %s instance." : "Фільтр визначає, які LDAP групи повинні мати доступ до %s сервера.", "Verify settings and count the groups" : "Перевірити налаштування та порахувати групи", + "When logging in, %s will find the user based on the following attributes:" : "Під час входу в систему %s знайде користувача за такими атрибутами:", + "LDAP/AD Username:" : "Ім'я користувача LDAP/AD:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Дозволяє ввійти за допомогою імені користувача LDAP/AD, яке є \"uid\" або \"sAMAccountName\" і буде виявлено.", + "LDAP/AD Email Address:" : "Адреса електронної пошти LDAP/AD:", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Дозволяє входити за допомогою атрибута електронної пошти. дозволено \"mail\" і \"mailPrimaryAddress\".", "Other Attributes:" : "Інші Атрибути:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Визначає фільтр, який застосовуватиметься під час спроби входу. \"%%uid\" замінює ім'я користувача в дії входу. Приклад: \"uid=%%uid\"", "Test Loginname" : "Тестове ім'я при вході", + "Attempts to receive a DN for the given loginname and the current login filter" : "Спроби отримати DN для заданого логіну та поточного фільтру для входу", "Verify settings" : "Перевірити налаштування", "%s. Server:" : "%s. Сервер:", "Add a new configuration" : "Додати нову конфігурацію", + "Copy current configuration into new directory binding" : "Скопіюйте поточну конфігурацію в новий каталог", + "Delete the current configuration" : "Вилучити поточну конфігурацію", "Host" : "Хост", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Ви можете не вказувати протокол, якщо вам не потрібен SSL. Якщо так, починайте з ldaps://", "Port" : "Порт", "Detect Port" : "Визначити Порт", "User DN" : "DN Користувача", @@ -70,7 +125,9 @@ "Test Base DN" : "Тест основного DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Уникати автоматичні запити LDAP. Краще для великих установок, але вимагає деякого LDAP знання.", "Manually enter LDAP filters (recommended for large directories)" : "Вручну введіть фільтри LDAP (рекомендується для великих каталогів)", - "The filter specifies which LDAP users shall have access to the %s instance." : "Фільтр визначає, які користувачі LDAP повинні мати доступ до примірника %s.", + "Listing and searching for users is constrained by these criteria:" : "Перелік і пошук користувачів обмежені такими критеріями:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Найпоширенішими класами об’єктів для користувачів є organizationalPerson, person, user і inetOrgPerson. Якщо ви не впевнені, який клас об’єктів вибрати, зверніться до свого адміністратора каталогу.", + "The filter specifies which LDAP users shall have access to the %s instance." : "Фільтр визначає, які користувачі LDAP повинні мати доступ до сервера %s.", "Verify settings and count users" : "Перевірити налаштування та порахувати користувачів", "Saving" : "Збереження", "Back" : "Назад", @@ -85,19 +142,19 @@ "Cancel" : "Скасувати", "Server" : "Сервер", "Users" : "Користувачі", - "Login Attributes" : "Атрибуту входу", + "Login Attributes" : "Атрибути входу", "Groups" : "Групи", "Expert" : "Експерт", "Advanced" : "Додатково", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Увага:</ b> Потрібний модуль PHP LDAP не встановлено, базова програма працювати не буде. Будь ласка, зверніться до системного адміністратора, щоб встановити його.", "Connection Settings" : "Налаштування З'єднання", - "Configuration Active" : "Налаштування Активне", + "Configuration Active" : "Налаштування активне", "When unchecked, this configuration will be skipped." : "Якщо \"галочка\" знята, ця конфігурація буде пропущена.", "Backup (Replica) Host" : "Сервер для резервних копій", "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Вкажіть додатковий резервний сервер. Він повинен бути копією головного LDAP/AD сервера.", "Backup (Replica) Port" : "Порт сервера для резервних копій", "Disable Main Server" : "Вимкнути Головний Сервер", - "Only connect to the replica server." : "Підключити тільки до сервера реплік.", + "Only connect to the replica server." : "З'єднатися тільки із сервером реплік.", "Turn off SSL certificate validation." : "Вимкнути перевірку SSL сертифіката.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Не рекомендується, використовувати його тільки для тестування!\nЯкщо з'єднання працює лише з цією опцією, імпортуйте SSL сертифікат LDAP сервера у ваший %s сервер.", "Cache Time-To-Live" : "Час актуальності Кеша", @@ -105,35 +162,76 @@ "Directory Settings" : "Налаштування каталогу", "User Display Name Field" : "Поле, яке відображає Ім'я Користувача", "The LDAP attribute to use to generate the user's display name." : "Атрибут LDAP, який використовується для генерації імен користувачів.", + "2nd User Display Name Field" : "2-е поле відображуваного імені користувача", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Додатково. Атрибут LDAP, який потрібно додати до відображуваного імені в дужках. Результати, напр. \"Джон Доу (john.doe@example.org)\".", "Base User Tree" : "Основне Дерево Користувачів", "One User Base DN per line" : "Один Користувач Base DN на рядок", - "User Search Attributes" : "Пошукові Атрибути Користувача", + "User Search Attributes" : "Пошукові атрибутів користувача", "Optional; one attribute per line" : "Додатково; один атрибут на рядок", + "Disable users missing from LDAP" : "Вимкнути користувачів, відсутніх у LDAP", + "When switched on, users imported from LDAP which are then missing will be disabled" : "Якщо увімкнено, імпортовані з LDAP користувачі, які виявляться відсутніми, будуть вимкнені", "Group Display Name Field" : "Поле, яке відображає Ім'я Групи", "The LDAP attribute to use to generate the groups's display name." : "Атрибут LDAP, який використовується для генерації імен груп.", "Base Group Tree" : "Основне Дерево Груп", "One Group Base DN per line" : "Одна Група Base DN на рядок", - "Group Search Attributes" : "Пошукові Атрибути Групи", - "Group-Member association" : "Асоціація Група-Член", + "Group Search Attributes" : "Пошукові атрибути групи", + "Group-Member association" : "Асоціація \"група-учасник\"", + "Dynamic Group Member URL" : "URL-адреса учасника динамічної групи", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "Атрибут LDAP, який об’єктів групи містить URL-адресу пошуку LDAP, яка визначає, які об’єкти належать до групи. (Пусте налаштування вимикає функцію динамічного членства в групі.)", "Nested Groups" : "Вкладені Групи", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "При включенні, групи, які містять групи підтримуються. (Працює тільки якщо атрибут члена групи містить DNS.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "При включенні, групи, які містять групи підтримуються. (Працює тільки якщо атрибут учасника групи містить DN.)", "Paging chunksize" : "Розмір підкачки", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Підкачка використовується для сторінкових пошуків LDAP, які можуть повертати громіздкі результати кількісті користувачів або груп. (Установка його 0 відключає вивантаженя пошуку LDAP в таких ситуаціях.)", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Підкачка використовується для сторінкових пошуків LDAP, які можуть повертати громіздкі результати кількісті користувачів або груп. (Установка його 0 відключає пошук LDAP в таких ситуаціях.)", + "Enable LDAP password changes per user" : "Дозволити зміну паролів LDAP для кожного користувача", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Дозволити користувачам LDAP змінювати свій пароль і дозволити супер (прихованим) адміністраторам і адміністраторам груп змінювати пароль своїх користувачів LDAP. Працює тільки тоді, коли політики контролю доступу налаштовані відповідним чином на LDAP сервері. Оскільки паролі відправляються на LDAP-сервер у відкритому вигляді, необхідно використовувати транспортне шифрування і налаштувати хешування паролів на LDAP-сервері. ", + "(New password is sent as plain text to LDAP)" : "(Новий пароль надсилається як звичайний текст до LDAP)", + "Default password policy DN" : "DN політики паролів за замовчуванням", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN типової політики паролів, що використовуватиметься для обробки терміну дії пароля. Працює лише тоді, коли ввімкнено зміну пароля LDAP для кожного користувача та підтримується лише OpenLDAP. Залиште пустим, щоб вимкнути обробку терміну дії пароля.", "Special Attributes" : "Спеціальні Атрибути", "Quota Field" : "Поле Квоти", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Залиште порожнім, щоби визначити типову квоту користувача. В іншому випадку зазначте атрибут LDAP/AD.", "Quota Default" : "Квота за замовчанням", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Перевизначити квоту за замовчуванням для користувачів LDAP, які не мають квоти, встановленої в полі квоти.", "Email Field" : "Поле E-mail", - "User Home Folder Naming Rule" : "Правило іменування домашньої теки користувача", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Установіть електронну пошту користувача з його атрибута LDAP. Залиште поле порожнім для застосування типового значення.", + "User Home Folder Naming Rule" : "Правило іменування домашнього каталогу користувача", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "Залиште порожнім для імені користувача (за замовчуванням). В іншому випадку вкажіть атрибут LDAP/AD.", + "\"$home\" Placeholder Field" : "Поле заповнювача \"$home\".", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "$home в конфігурації зовнішнього сховища буде замінено на значення вказаного атрибута", + "User Profile Attributes" : "Атрибути профілю користувача", + "Phone Field" : "Поле Телефон", + "User profile Phone will be set from the specified attribute" : "Телефон в профілі користувача буде встановлено на основі вказаного атрибута", + "Website Field" : "Поле Вебсайт", + "User profile Website will be set from the specified attribute" : "Вебсайт в профілі користувача буде встановлено на основі вказаного атрибута", + "Address Field" : "Поле Адреса", + "User profile Address will be set from the specified attribute" : "Адреса в профілі користувача буде встановлена на основі вказаного атрибута", + "Twitter Field" : "Поле Twitter", + "User profile Twitter will be set from the specified attribute" : "Twitter в профілі користувача буде встановлено на основі вказаного атрибута", + "Fediverse Field" : "Поле Fediverse", + "User profile Fediverse will be set from the specified attribute" : "Fediverse в профілі користувача буде встановлено на основі вказаного атрибута", + "Organisation Field" : "Поле Організація", + "User profile Organisation will be set from the specified attribute" : "Організація в профілі користувача буде встановлена на основі вказаного атрибута", + "Role Field" : "Поле Роль", + "User profile Role will be set from the specified attribute" : "Роль в профілі користувача буде встановлено на основі вказаного атрибута", + "Headline Field" : "Поле Заголовок", + "User profile Headline will be set from the specified attribute" : "Заголовок в профілі користувача буде встановлено на основі вказаного атрибута", + "Biography Field" : "Поле Біографія", + "User profile Biography will be set from the specified attribute" : "Біографія в профілі користувача буде встановлена на основі вказаного атрибута", + "Birthdate Field" : "Поле Дата народження", + "User profile Date of birth will be set from the specified attribute" : "Профіль користувача Дата народження буде встановлена з вказаного атрибуту", + "Pronouns Field" : "Поле займенників", + "User profile Pronouns will be set from the specified attribute" : "Профіль користувача Займенники будуть встановлені з вказаного атрибуту", "Internal Username" : "Внутрішня Ім'я користувача", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "За замовчуванням внутрішнє ім’я користувача буде створено з атрибута UUID. Це гарантує, що ім’я користувача є унікальним і символи не потрібно конвертувати. Внутрішнє ім’я користувача має обмеження щодо дозволених лише таких символів: [a-zA-Z0-9_.@-]. Інші символи замінюються відповідністю ASCII або просто пропускаються. При зіткненнях число буде додано/збільшено. Внутрішнє ім’я користувача використовується для внутрішньої ідентифікації користувача. Це також назва за замовчуванням для домашнього каталогу користувача. Це також частина віддалених URL-адрес, наприклад, для всіх служб DAV. За допомогою цього параметра поведінку за замовчуванням можна змінити. Зміни діятимуть лише для нещодавно зіставлених (доданих) користувачів LDAP. Залиште поле порожнім для поведінки за замовчуванням.", "Internal Username Attribute:" : "Внутрішня Ім'я користувача, Атрибут:", "Override UUID detection" : "Перекрити вивід UUID ", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "За замовчуванням ownCloud визначає атрибут UUID автоматично. Цей атрибут використовується для того, щоб достовірно ідентифікувати користувачів і групи LDAP. Також на підставі атрибута UUID створюється внутрішнє ім'я користувача, якщо вище не вказано інакше. Ви можете перевизначити це налаштування та вказати свій атрибут за вибором. Ви повинні упевнитися, що обраний вами атрибут може бути вибраний для користувачів і груп, а також те, що він унікальний. Залиште поле порожнім для поведінки за замовчуванням. Зміни вступлять в силу тільки для нових підключених (доданих) користувачів і груп LDAP.", "UUID Attribute for Users:" : "UUID Атрибут для користувачів:", "UUID Attribute for Groups:" : "UUID Атрибут для груп:", "Username-LDAP User Mapping" : "Картографія Імен користувачів-LDAP ", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Імена користувачів використовуються для зберігання та призначення метаданих. Для точної ідентифікації та розпізнавання користувачів кожен користувач LDAP матиме внутрішнє ім’я користувача. Для цього потрібне зіставлення імені користувача з користувачем LDAP. Створене ім’я користувача зіставляється з UUID користувача LDAP. Крім того, DN також кешується, щоб зменшити взаємодію LDAP, але він не використовується для ідентифікації. Якщо DN змінюється, зміни будуть знайдені. Внутрішнє ім'я користувача використовується всюди. Очищення зіставлення залишить залишки всюди. Очищення зіставлення не залежить від конфігурації, воно впливає на всі конфігурації LDAP! Ніколи не очищайте зіставлення у продуктовому середовищі, лише на стадії тестування чи експерименту.", "Clear Username-LDAP User Mapping" : "Очистити картографію Імен користувачів-LDAP", "Clear Groupname-LDAP Group Mapping" : "Очистити картографію Імен груп-LDAP", - "LDAP / AD Username:" : "ім'я користувача LDAP/AD:", - "LDAP / AD Email Address:" : "LDAP / AD Email адреса:" + "Invalid configuration. Please have a look at the logs for further details." : "Неправильна конфігурація. Перевірте журнал для докладної інформації." },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/ur_PK.js b/apps/user_ldap/l10n/ur_PK.js deleted file mode 100644 index 693a42b0543..00000000000 --- a/apps/user_ldap/l10n/ur_PK.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Users" : "صارفین", - "Help" : "مدد", - "Password" : "پاسورڈ", - "Advanced" : "ایڈوانسڈ" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ur_PK.json b/apps/user_ldap/l10n/ur_PK.json deleted file mode 100644 index 26ff4cf5671..00000000000 --- a/apps/user_ldap/l10n/ur_PK.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Users" : "صارفین", - "Help" : "مدد", - "Password" : "پاسورڈ", - "Advanced" : "ایڈوانسڈ" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/vi.js b/apps/user_ldap/l10n/vi.js deleted file mode 100644 index e20feb8abba..00000000000 --- a/apps/user_ldap/l10n/vi.js +++ /dev/null @@ -1,45 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Lỗi khi xóa ánh xạ.", - "Failed to delete the server configuration" : "Lỗi khi xóa cấu hình máy chủ", - "Select groups" : "Chọn nhóm", - "Invalid Host" : "Host không hợp lệ", - "Server" : "Máy chủ", - "Users" : "Người dùng", - "Groups" : "Nhóm", - "Test Configuration" : "Kiểm tra cấu hình", - "Help" : "Giúp đỡ", - "Other Attributes:" : "Thuộc tính khác", - "1. Server" : "1. Máy chủ", - "%s. Server:" : "%s. Máy chủ:", - "Host" : "Máy chủ", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Bạn có thể bỏ qua các giao thức, ngoại trừ SSL. Sau đó bắt đầu với ldaps://", - "Port" : "Cổng", - "User DN" : "Người dùng DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Các DN của người sử dụng đã được thực hiện, ví dụ như uid =agent , dc = example, dc = com. Để truy cập nặc danh ,DN và mật khẩu trống.", - "Password" : "Mật khẩu", - "For anonymous access, leave DN and Password empty." : "Cho phép truy cập nặc danh , DN và mật khẩu trống.", - "You can specify Base DN for users and groups in the Advanced tab" : "Bạn có thể chỉ định DN cơ bản cho người dùng và các nhóm trong tab Advanced", - "Back" : "Trở lại", - "Continue" : "Tiếp tục", - "Advanced" : "Nâng cao", - "Connection Settings" : "Connection Settings", - "Backup (Replica) Port" : "Cổng sao lưu (Replica)", - "Disable Main Server" : "Tắt máy chủ chính", - "Turn off SSL certificate validation." : "Tắt xác thực chứng nhận SSL", - "in seconds. A change empties the cache." : "trong vài giây. Một sự thay đổi bộ nhớ cache.", - "Directory Settings" : "Directory Settings", - "User Display Name Field" : "Hiển thị tên người sử dụng", - "Base User Tree" : "Cây người dùng cơ bản", - "User Search Attributes" : "User Search Attributes", - "Optional; one attribute per line" : "Optional; one attribute per line", - "Group Display Name Field" : "Hiển thị tên nhóm", - "Base Group Tree" : "Cây nhóm cơ bản", - "Group Search Attributes" : "Group Search Attributes", - "Group-Member association" : "Nhóm thành viên Cộng đồng", - "Special Attributes" : "Special Attributes", - "in bytes" : "Theo Byte", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Để trống tên người dùng (mặc định). Nếu không chỉ định thuộc tính LDAP/AD" -}, -"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/vi.json b/apps/user_ldap/l10n/vi.json deleted file mode 100644 index ffbeff90189..00000000000 --- a/apps/user_ldap/l10n/vi.json +++ /dev/null @@ -1,43 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Lỗi khi xóa ánh xạ.", - "Failed to delete the server configuration" : "Lỗi khi xóa cấu hình máy chủ", - "Select groups" : "Chọn nhóm", - "Invalid Host" : "Host không hợp lệ", - "Server" : "Máy chủ", - "Users" : "Người dùng", - "Groups" : "Nhóm", - "Test Configuration" : "Kiểm tra cấu hình", - "Help" : "Giúp đỡ", - "Other Attributes:" : "Thuộc tính khác", - "1. Server" : "1. Máy chủ", - "%s. Server:" : "%s. Máy chủ:", - "Host" : "Máy chủ", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Bạn có thể bỏ qua các giao thức, ngoại trừ SSL. Sau đó bắt đầu với ldaps://", - "Port" : "Cổng", - "User DN" : "Người dùng DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Các DN của người sử dụng đã được thực hiện, ví dụ như uid =agent , dc = example, dc = com. Để truy cập nặc danh ,DN và mật khẩu trống.", - "Password" : "Mật khẩu", - "For anonymous access, leave DN and Password empty." : "Cho phép truy cập nặc danh , DN và mật khẩu trống.", - "You can specify Base DN for users and groups in the Advanced tab" : "Bạn có thể chỉ định DN cơ bản cho người dùng và các nhóm trong tab Advanced", - "Back" : "Trở lại", - "Continue" : "Tiếp tục", - "Advanced" : "Nâng cao", - "Connection Settings" : "Connection Settings", - "Backup (Replica) Port" : "Cổng sao lưu (Replica)", - "Disable Main Server" : "Tắt máy chủ chính", - "Turn off SSL certificate validation." : "Tắt xác thực chứng nhận SSL", - "in seconds. A change empties the cache." : "trong vài giây. Một sự thay đổi bộ nhớ cache.", - "Directory Settings" : "Directory Settings", - "User Display Name Field" : "Hiển thị tên người sử dụng", - "Base User Tree" : "Cây người dùng cơ bản", - "User Search Attributes" : "User Search Attributes", - "Optional; one attribute per line" : "Optional; one attribute per line", - "Group Display Name Field" : "Hiển thị tên nhóm", - "Base Group Tree" : "Cây nhóm cơ bản", - "Group Search Attributes" : "Group Search Attributes", - "Group-Member association" : "Nhóm thành viên Cộng đồng", - "Special Attributes" : "Special Attributes", - "in bytes" : "Theo Byte", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Để trống tên người dùng (mặc định). Nếu không chỉ định thuộc tính LDAP/AD" -},"pluralForm" :"nplurals=1; plural=0;" -}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/zh_CN.js b/apps/user_ldap/l10n/zh_CN.js index f756c038ecf..ca609c816a0 100644 --- a/apps/user_ldap/l10n/zh_CN.js +++ b/apps/user_ldap/l10n/zh_CN.js @@ -1,18 +1,19 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "无法清除映射。", - "Failed to delete the server configuration" : "未能删除服务器配置", + "Failed to clear the mappings." : "清除映射失败。", + "Failed to delete the server configuration" : "删除服务器配置失败", "Invalid configuration: Anonymous binding is not allowed." : "配置无效:不允许匿名绑定。", - "Valid configuration, connection established!" : "配置有效,连接成功!", + "Valid configuration, connection established!" : "配置有效,连接已建立!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。", - "Invalid configuration. Please have a look at the logs for further details." : "配置无效。更多细节请查看日志。", + "Invalid configuration: %s" : "配置无效:%s", "No action specified" : "未指定操作", "No configuration specified" : "未指定配置文件", "No data specified" : "未指定数据", - " Could not set configuration %s" : " 无法设定配置文件 %s", + "Invalid data specified" : "指定了无效的数据", + "Could not set configuration %1$s to %2$s" : "无法将配置 %1$s 设置为 %2$s", "Action does not exist" : "操作不存在", - "Renewing …" : "正在更新…", + "Renewing …" : "正在更新……", "Very weak password" : "非常弱的密码", "Weak password" : "弱密码", "So-so password" : "一般的密码", @@ -53,15 +54,32 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u id\" 占位符缺失。查询LDAP/AD时,它将被替换为登录名。", "Please provide a login name to test against" : "请提供登录名以测试", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "群组框被禁用,因为 LDAP/AD 服务器不支持 memberOf", - "Password change rejected. Hint: " : "密码更改出错。提示:", + "Password change rejected. Hint: %s" : "密码更改被拒绝。提示:%s", + "Mandatory field \"%s\" left empty" : "必填字段“%s”留空", + "A password is given, but not an LDAP agent" : "已提供密码,但未提供 LDAP 代理", + "No password is given for the user agent" : "没有为用户代理提供密码", + "No LDAP base DN was given" : "未提供 LDAP 基本 DN", + "User base DN is not a subnode of global base DN" : "用户基本 DN 不是全局基本 DN 的子节点", + "Group base DN is not a subnode of global base DN" : "群组基本 DN 不是全局基本 DN 的子节点", + "Login filter does not contain %s placeholder." : "登录筛选器不包含 %s 占位符。", "Please login with the new password" : "请使用新密码登录", "LDAP User backend" : "LDAP 用户后端", "Your password will expire tomorrow." : "您的密码将在明天过期", "Your password will expire today." : "您的明码将在今天过期", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密码会在%n天后过期"], "LDAP/AD integration" : "LDAP/AD 集成", - "_%s group found_::_%s groups found_" : ["发现 %s 个群组"], - "_%s user found_::_%s users found_" : ["发现 %s 个用户"], + "LDAP Connection" : "LDAP 连接", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n LDAP 配置绑定失败:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n LDAP 配置搜索失败:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 个非活动 LDAP 配置:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["绑定和搜索适用于所有 %n 配置的 LDAP 连接 (%s)"], + "Invalid LDAP UUIDs" : "LDAP UUID 无效", + "None found" : "未找到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "发现 LDAP 账号或组的 UUID 无效。请检查 LDAP 配置的专家部分中的“覆盖 UUID 检测”设置,并使用“occ ldap:update-uuid”进行更新。", + "_%n group found_::_%n groups found_" : ["已找到%n个组"], + "> 1000 groups found" : "已找到>1000个组", + "> 1000 users found" : "已找到>1000个用户", + "_%n user found_::_%n users found_" : ["已找到%n个用户"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "无法检测到用户的显示名称属性。请在高级 LDAP 设置中指定。", "Could not find the desired feature" : "无法找到所需的功能", "Invalid Host" : "无效的主机", @@ -88,6 +106,7 @@ OC.L10N.register( "Other Attributes:" : "其他属性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定义登录时采用的过滤规则。登录时用 \"%%uid\" 替换用户名。例如:\"uid=%%uid\"", "Test Loginname" : "测试登录名", + "Attempts to receive a DN for the given loginname and the current login filter" : "尝试通过给定用户名和当前登录筛选器获取DN", "Verify settings" : "验证设置", "%s. Server:" : "%s。服务器:", "Add a new configuration" : "增加一个新的配置", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "每行一个用户基准判别名", "User Search Attributes" : "用户搜索属性", "Optional; one attribute per line" : "可选;每行一个属性", + "Disable users missing from LDAP" : "禁用在LDAP中无法找到的用户", + "When switched on, users imported from LDAP which are then missing will be disabled" : "开启时,从LDAP中导入但后来无法找到的用户将被禁用。", "Group Display Name Field" : "组显示名称字段", "The LDAP attribute to use to generate the groups's display name." : "用来生成组的显示名称的 LDAP 属性。", "Base Group Tree" : "基础组树", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "用户名留空(默认)。 否则请指定 LDAP / AD 属性。", "\"$home\" Placeholder Field" : "\"$home\" 占位字段", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "位于外部存储配置的 $home 将被指定属性替换", + "User Profile Attributes" : "用户个人资料属性", + "Phone Field" : "手机号码栏", + "User profile Phone will be set from the specified attribute" : "用户个人资料中的手机号码将按照指定属性设置", + "Website Field" : "网站栏", + "User profile Website will be set from the specified attribute" : "用户个人资料中的网站将按照指定属性设置", + "Address Field" : "地址栏", + "User profile Address will be set from the specified attribute" : "用户个人资料中的地址将按照指定属性设置", + "Twitter Field" : "Twitter 栏", + "User profile Twitter will be set from the specified attribute" : "用户个人资料中的Twitter将按照指定属性设置", + "Fediverse Field" : "联邦宇宙字段", + "User profile Fediverse will be set from the specified attribute" : "用户个人资料的联邦宇宙将从指定的属性设定", + "Organisation Field" : "组织栏", + "User profile Organisation will be set from the specified attribute" : "用户个人资料中的组织将按照指定属性设置", + "Role Field" : "职称栏", + "User profile Role will be set from the specified attribute" : "用户个人资料中的职称将按照指定属性设置", + "Headline Field" : "标题栏", + "User profile Headline will be set from the specified attribute" : "用户个人资料中的标题栏将按照指定属性设置", + "Biography Field" : "自述栏", + "User profile Biography will be set from the specified attribute" : "用户个人资料中的自述将按照指定属性设置", + "Birthdate Field" : "生日栏", + "User profile Date of birth will be set from the specified attribute" : "用户个人资料的出生日期将从指定的属性中设置", + "Pronouns Field" : "代词栏", + "User profile Pronouns will be set from the specified attribute" : "用户个人资料中的代词将从指定属性设置", "Internal Username" : "内部用户名", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默认情况下,内部用户名将从UUID属性创建。它确保用户名是唯一的,并且不需要转换字符。内部用户名只允许下列字符:[a-zA-Z0-9_.@-]。其他字符被替换为它们的ASCII对应或简单地省略。在冲突时会增加/增大一个数字。内部用户名用于内部识别用户。它也是用户主文件夹的默认名称。它也是远程 URL 的一部分,例如所有*DAV服务。使用此设置,可以覆盖默认行为。更改仅对新映射(添加)的LDAP用户有效。留空代表使用默认行为。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默认情况下,内部用户名将按照UUID属性创建。这确保用户名独一无二,且无需转换字符。内部用户名拥有限制,只允许下列字符:[a-zA-Z0-9_.@-]。其它字符将被替换成对应的ASCII码或被直接删除。如有冲突,将会添加/递增一个数字。内部用户名被用来在内部确认用户身份。其也是用户主目录文件夹的默认名称。其也是远程URL的一部分,例如所有DAV服务。在此设置下,默认行为将会被覆盖。修改仅对新映射(添加)的LDAP用户生效。置空则采取默认行为。", "Internal Username Attribute:" : "内部用户名属性:", "Override UUID detection" : "覆盖 UUID 检测", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "ownCloud 默认会自动检测 UUID 属性。UUID 属性用来无误地识别 LDAP 用户和组。同时,如果上面没有特别设置,内部用户名也基于 UUID 创建。也可以覆盖设置,直接指定一个属性。但一定要确保指定的属性取得的用户和组是唯一的。留空,则执行默认操作。更改只影响新映射(或增加)的 LDAP 用户和组。", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "用户名用于存储和分配元数据。为了精确的区分和识别用户,每个 LDAP 用户都会有一个内部的用户名。这要求建立一个用户名到 LDAP 用户的映射。创建的用户名会被映射到 LDAP 用户的 UUID。另外为了节省 LDAP 连接开销,DN 会被缓存,但不会用于识别。如果 DN 变了,这些变化会被识别到。在 Nextcloud 各个页面会使用内部用户名。清空映射会造成系统里面有大量的残留信息。清空映射会影响所有的 LDAP 配置,而不仅仅是当前配置。不要在生产环境里面应用清空映射,请仅用于测试环境或者早期验证步骤。", "Clear Username-LDAP User Mapping" : "清除用户-LDAP用户映射", "Clear Groupname-LDAP Group Mapping" : "清除组用户-LDAP级映射", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 连接错误,请检查主机,端口和凭证。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "该%uid占位符缺失。它将在 LDAP/AD 登录名查询时进行替换。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "该组框被禁用,因为 LDAP/AD 服务器不支持 memberOf。", - "LDAP / AD integration" : "LDAP/AD 整合", - "LDAP / AD Username:" : "LDAP/AD 用户名:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允许使用 LDAP / AD 用户名登录,该用户名可以是 “uid” 或 “sAMAccountName” 并将被检测到。", - "LDAP / AD Email Address:" : "LDAP/AD 邮箱地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "默认情况下将从 UUID 属性创建内部用户名。将确保用户名是唯一的字符,并且不需要转换。内部用户名,只允许使用这些字符:[a-zA-Z0-9 _。@ - ]。其他字符被替换为它们的 ASCII 对应或简单地被忽略。如果出现重复,将添加或增加一个数字。内部用户名用于在内部标识用户。它是用户主文件夹的默认名称。它也是远程URL的一部分,例如对于所有 *DAV 服务。使用此设置,可以覆盖默认行为。默认行为为空,则更改只会对新映射(已添加)的LDAP用户有效。" + "Invalid configuration. Please have a look at the logs for further details." : "配置无效。更多细节请查看日志。" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/zh_CN.json b/apps/user_ldap/l10n/zh_CN.json index e1c000ca67b..b4c2ba4aa26 100644 --- a/apps/user_ldap/l10n/zh_CN.json +++ b/apps/user_ldap/l10n/zh_CN.json @@ -1,16 +1,17 @@ { "translations": { - "Failed to clear the mappings." : "无法清除映射。", - "Failed to delete the server configuration" : "未能删除服务器配置", + "Failed to clear the mappings." : "清除映射失败。", + "Failed to delete the server configuration" : "删除服务器配置失败", "Invalid configuration: Anonymous binding is not allowed." : "配置无效:不允许匿名绑定。", - "Valid configuration, connection established!" : "配置有效,连接成功!", + "Valid configuration, connection established!" : "配置有效,连接已建立!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "配置有效但绑定失败。请检查服务器设置和认证信息。", - "Invalid configuration. Please have a look at the logs for further details." : "配置无效。更多细节请查看日志。", + "Invalid configuration: %s" : "配置无效:%s", "No action specified" : "未指定操作", "No configuration specified" : "未指定配置文件", "No data specified" : "未指定数据", - " Could not set configuration %s" : " 无法设定配置文件 %s", + "Invalid data specified" : "指定了无效的数据", + "Could not set configuration %1$s to %2$s" : "无法将配置 %1$s 设置为 %2$s", "Action does not exist" : "操作不存在", - "Renewing …" : "正在更新…", + "Renewing …" : "正在更新……", "Very weak password" : "非常弱的密码", "Weak password" : "弱密码", "So-so password" : "一般的密码", @@ -51,15 +52,32 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "\"%u id\" 占位符缺失。查询LDAP/AD时,它将被替换为登录名。", "Please provide a login name to test against" : "请提供登录名以测试", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "群组框被禁用,因为 LDAP/AD 服务器不支持 memberOf", - "Password change rejected. Hint: " : "密码更改出错。提示:", + "Password change rejected. Hint: %s" : "密码更改被拒绝。提示:%s", + "Mandatory field \"%s\" left empty" : "必填字段“%s”留空", + "A password is given, but not an LDAP agent" : "已提供密码,但未提供 LDAP 代理", + "No password is given for the user agent" : "没有为用户代理提供密码", + "No LDAP base DN was given" : "未提供 LDAP 基本 DN", + "User base DN is not a subnode of global base DN" : "用户基本 DN 不是全局基本 DN 的子节点", + "Group base DN is not a subnode of global base DN" : "群组基本 DN 不是全局基本 DN 的子节点", + "Login filter does not contain %s placeholder." : "登录筛选器不包含 %s 占位符。", "Please login with the new password" : "请使用新密码登录", "LDAP User backend" : "LDAP 用户后端", "Your password will expire tomorrow." : "您的密码将在明天过期", "Your password will expire today." : "您的明码将在今天过期", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密码会在%n天后过期"], "LDAP/AD integration" : "LDAP/AD 集成", - "_%s group found_::_%s groups found_" : ["发现 %s 个群组"], - "_%s user found_::_%s users found_" : ["发现 %s 个用户"], + "LDAP Connection" : "LDAP 连接", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n LDAP 配置绑定失败:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n LDAP 配置搜索失败:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 个非活动 LDAP 配置:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["绑定和搜索适用于所有 %n 配置的 LDAP 连接 (%s)"], + "Invalid LDAP UUIDs" : "LDAP UUID 无效", + "None found" : "未找到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "发现 LDAP 账号或组的 UUID 无效。请检查 LDAP 配置的专家部分中的“覆盖 UUID 检测”设置,并使用“occ ldap:update-uuid”进行更新。", + "_%n group found_::_%n groups found_" : ["已找到%n个组"], + "> 1000 groups found" : "已找到>1000个组", + "> 1000 users found" : "已找到>1000个用户", + "_%n user found_::_%n users found_" : ["已找到%n个用户"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "无法检测到用户的显示名称属性。请在高级 LDAP 设置中指定。", "Could not find the desired feature" : "无法找到所需的功能", "Invalid Host" : "无效的主机", @@ -86,6 +104,7 @@ "Other Attributes:" : "其他属性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定义登录时采用的过滤规则。登录时用 \"%%uid\" 替换用户名。例如:\"uid=%%uid\"", "Test Loginname" : "测试登录名", + "Attempts to receive a DN for the given loginname and the current login filter" : "尝试通过给定用户名和当前登录筛选器获取DN", "Verify settings" : "验证设置", "%s. Server:" : "%s。服务器:", "Add a new configuration" : "增加一个新的配置", @@ -149,6 +168,8 @@ "One User Base DN per line" : "每行一个用户基准判别名", "User Search Attributes" : "用户搜索属性", "Optional; one attribute per line" : "可选;每行一个属性", + "Disable users missing from LDAP" : "禁用在LDAP中无法找到的用户", + "When switched on, users imported from LDAP which are then missing will be disabled" : "开启时,从LDAP中导入但后来无法找到的用户将被禁用。", "Group Display Name Field" : "组显示名称字段", "The LDAP attribute to use to generate the groups's display name." : "用来生成组的显示名称的 LDAP 属性。", "Base Group Tree" : "基础组树", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "用户名留空(默认)。 否则请指定 LDAP / AD 属性。", "\"$home\" Placeholder Field" : "\"$home\" 占位字段", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "位于外部存储配置的 $home 将被指定属性替换", + "User Profile Attributes" : "用户个人资料属性", + "Phone Field" : "手机号码栏", + "User profile Phone will be set from the specified attribute" : "用户个人资料中的手机号码将按照指定属性设置", + "Website Field" : "网站栏", + "User profile Website will be set from the specified attribute" : "用户个人资料中的网站将按照指定属性设置", + "Address Field" : "地址栏", + "User profile Address will be set from the specified attribute" : "用户个人资料中的地址将按照指定属性设置", + "Twitter Field" : "Twitter 栏", + "User profile Twitter will be set from the specified attribute" : "用户个人资料中的Twitter将按照指定属性设置", + "Fediverse Field" : "联邦宇宙字段", + "User profile Fediverse will be set from the specified attribute" : "用户个人资料的联邦宇宙将从指定的属性设定", + "Organisation Field" : "组织栏", + "User profile Organisation will be set from the specified attribute" : "用户个人资料中的组织将按照指定属性设置", + "Role Field" : "职称栏", + "User profile Role will be set from the specified attribute" : "用户个人资料中的职称将按照指定属性设置", + "Headline Field" : "标题栏", + "User profile Headline will be set from the specified attribute" : "用户个人资料中的标题栏将按照指定属性设置", + "Biography Field" : "自述栏", + "User profile Biography will be set from the specified attribute" : "用户个人资料中的自述将按照指定属性设置", + "Birthdate Field" : "生日栏", + "User profile Date of birth will be set from the specified attribute" : "用户个人资料的出生日期将从指定的属性中设置", + "Pronouns Field" : "代词栏", + "User profile Pronouns will be set from the specified attribute" : "用户个人资料中的代词将从指定属性设置", "Internal Username" : "内部用户名", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默认情况下,内部用户名将从UUID属性创建。它确保用户名是唯一的,并且不需要转换字符。内部用户名只允许下列字符:[a-zA-Z0-9_.@-]。其他字符被替换为它们的ASCII对应或简单地省略。在冲突时会增加/增大一个数字。内部用户名用于内部识别用户。它也是用户主文件夹的默认名称。它也是远程 URL 的一部分,例如所有*DAV服务。使用此设置,可以覆盖默认行为。更改仅对新映射(添加)的LDAP用户有效。留空代表使用默认行为。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默认情况下,内部用户名将按照UUID属性创建。这确保用户名独一无二,且无需转换字符。内部用户名拥有限制,只允许下列字符:[a-zA-Z0-9_.@-]。其它字符将被替换成对应的ASCII码或被直接删除。如有冲突,将会添加/递增一个数字。内部用户名被用来在内部确认用户身份。其也是用户主目录文件夹的默认名称。其也是远程URL的一部分,例如所有DAV服务。在此设置下,默认行为将会被覆盖。修改仅对新映射(添加)的LDAP用户生效。置空则采取默认行为。", "Internal Username Attribute:" : "内部用户名属性:", "Override UUID detection" : "覆盖 UUID 检测", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "ownCloud 默认会自动检测 UUID 属性。UUID 属性用来无误地识别 LDAP 用户和组。同时,如果上面没有特别设置,内部用户名也基于 UUID 创建。也可以覆盖设置,直接指定一个属性。但一定要确保指定的属性取得的用户和组是唯一的。留空,则执行默认操作。更改只影响新映射(或增加)的 LDAP 用户和组。", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "用户名用于存储和分配元数据。为了精确的区分和识别用户,每个 LDAP 用户都会有一个内部的用户名。这要求建立一个用户名到 LDAP 用户的映射。创建的用户名会被映射到 LDAP 用户的 UUID。另外为了节省 LDAP 连接开销,DN 会被缓存,但不会用于识别。如果 DN 变了,这些变化会被识别到。在 Nextcloud 各个页面会使用内部用户名。清空映射会造成系统里面有大量的残留信息。清空映射会影响所有的 LDAP 配置,而不仅仅是当前配置。不要在生产环境里面应用清空映射,请仅用于测试环境或者早期验证步骤。", "Clear Username-LDAP User Mapping" : "清除用户-LDAP用户映射", "Clear Groupname-LDAP Group Mapping" : "清除组用户-LDAP级映射", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 连接错误,请检查主机,端口和凭证。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "该%uid占位符缺失。它将在 LDAP/AD 登录名查询时进行替换。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "该组框被禁用,因为 LDAP/AD 服务器不支持 memberOf。", - "LDAP / AD integration" : "LDAP/AD 整合", - "LDAP / AD Username:" : "LDAP/AD 用户名:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允许使用 LDAP / AD 用户名登录,该用户名可以是 “uid” 或 “sAMAccountName” 并将被检测到。", - "LDAP / AD Email Address:" : "LDAP/AD 邮箱地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "默认情况下将从 UUID 属性创建内部用户名。将确保用户名是唯一的字符,并且不需要转换。内部用户名,只允许使用这些字符:[a-zA-Z0-9 _。@ - ]。其他字符被替换为它们的 ASCII 对应或简单地被忽略。如果出现重复,将添加或增加一个数字。内部用户名用于在内部标识用户。它是用户主文件夹的默认名称。它也是远程URL的一部分,例如对于所有 *DAV 服务。使用此设置,可以覆盖默认行为。默认行为为空,则更改只会对新映射(已添加)的LDAP用户有效。" + "Invalid configuration. Please have a look at the logs for further details." : "配置无效。更多细节请查看日志。" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/zh_HK.js b/apps/user_ldap/l10n/zh_HK.js index d6163b7c5a4..0409ced3b34 100644 --- a/apps/user_ldap/l10n/zh_HK.js +++ b/apps/user_ldap/l10n/zh_HK.js @@ -6,11 +6,12 @@ OC.L10N.register( "Invalid configuration: Anonymous binding is not allowed." : "無效的配置:不允許匿名綁定。", "Valid configuration, connection established!" : "有效的配置,連接成功!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的配置,但是綁定失敗。請檢查伺服器設定和證書。", - "Invalid configuration. Please have a look at the logs for further details." : "無效的配置。請查看日誌以獲取更多詳細訊息。", + "Invalid configuration: %s" : "無效配置:%s", "No action specified" : "沒有指定操作", "No configuration specified" : "沒有指定配置", "No data specified" : "沒有指定資料", - " Could not set configuration %s" : "無法為 %s 設定配置值", + "Invalid data specified" : "指定的數據無效", + "Could not set configuration %1$s to %2$s" : "無法將 %1$s 配置設定為 %2$s", "Action does not exist" : "操作不存在", "Renewing …" : "更新中...", "Very weak password" : "密碼安全性極弱", @@ -53,21 +54,38 @@ OC.L10N.register( "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "“%uid”佔位符丟失。查詢 LDAP/AD 時,它將替換為登入名稱。", "Please provide a login name to test against" : "請提供登入姓名以便再次測試", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "群組盒已經停用,LDAP/AD 伺服器並不支援", - "Password change rejected. Hint: " : "密碼更改被拒絕。提示:", + "Password change rejected. Hint: %s" : "密碼更改被拒絕。提示:%s", + "Mandatory field \"%s\" left empty" : "必填欄位「%s」為空", + "A password is given, but not an LDAP agent" : "已提供密碼,但並未提供 LDAP 代理程式", + "No password is given for the user agent" : "未提供使用者代理程式的密碼", + "No LDAP base DN was given" : "未提供 LDAP 基礎 DN", + "User base DN is not a subnode of global base DN" : "用戶基礎 DN 不是全域基礎 DN 的子節點", + "Group base DN is not a subnode of global base DN" : "群組基礎 DN 不是全域基礎 DN 的子節點", + "Login filter does not contain %s placeholder." : "登入過濾條件不包含 %s 佔位字串。", "Please login with the new password" : "請登入並使用新的密碼", "LDAP User backend" : "LDAP 用戶後端系統", "Your password will expire tomorrow." : "您的密碼將於明日過期", "Your password will expire today." : "您的密碼將於今日過期", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後過期"], "LDAP/AD integration" : "LDAP /AD 整合", - "_%s group found_::_%s groups found_" : ["找到 %s 群組"], - "_%s user found_::_%s users found_" : ["找到 %s 位用戶"], + "LDAP Connection" : "LDAP 連線", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["LDAP 配置綁紮失敗:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["搜尋 %n LDAP 配置失敗:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 個非活動 LDAP 配置:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["綁定和搜尋適用於所有 %n 已設定的 LDAP 連線 (%s)"], + "Invalid LDAP UUIDs" : "無效的 LDAP UUID", + "None found" : "未找到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP 帳戶或群組的 UUID 無效。請查看 LDAP 配置專家部分中的“覆蓋 UUID 檢測”設置,並使用“occ ldap:update-uuid”更新它們。", + "_%n group found_::_%n groups found_" : ["找到 %n 個群組"], + "> 1000 groups found" : "找到 > 1000 個群組", + "> 1000 users found" : "找到 > 1000 位用戶", + "_%n user found_::_%n users found_" : ["找到 %n 位用戶"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "無法檢測到用戶顯示名稱屬性。請在高級LDAP設置中自行指定。", "Could not find the desired feature" : "無法找到所需的功能", "Invalid Host" : "無效的 Host", "LDAP user and group backend" : "LDAP 用戶和群組後端系統", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "該應用程序使管理員可以將Nextcloud連接到基於LDAP的用戶目錄。", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "本應用啟用功能使管理員可將 Nextcloud 與基於 LDAP 的用戶目錄連接,進行身分驗證以及提供用戶、群組和用戶屬性。管理員可配置此程序通過 LDAP 接口連接至一個或多個 LDAP 或 Active Directory 目錄。通過適當的查詢和篩選,可將以下屬性從目錄導入 Nextcloud:用戶磁盤配額、電子郵箱、頭像、所屬群組以及更多。用戶可以用其LDAP或AD中的身分登入 Nextcloud, 並根據 LDAP 或 AD 服務的身分驗證獲得訪問權限。Nextcloud 僅使用身分驗證隨後為用戶身分使用會話,但不會儲存LDAP或AD的密碼。您可從 LDAP 用戶及群組後台文檔中獲取更多信息。", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的用戶目錄來進行驗證與提供用戶、群組與用戶屬性。管理員可以設定此應用程式來連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面的 Active Directories。如用戶配額、電子郵件、虛擬化身圖片、群組成員資格等屬性可以透過有適當查詢與過濾條件的目錄從 Nextcloud 拉取。\n\n用戶以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份驗證請求來授予存取權限。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對用戶進行身份驗證,然後 Nextcloud 會使用工作階段作為用戶 ID。更多資訊在 LDAP 用戶與群組後端文件中提供。", "Test Configuration" : "測試此配置", "Help" : "支援", "Groups meeting these criteria are available in %s:" : "符合這些條件的群組可在 %s 找到:", @@ -75,7 +93,7 @@ OC.L10N.register( "Only from these groups:" : "僅從這些群組:", "Search groups" : "搜尋群組", "Available groups" : "可用的群組", - "Selected groups" : "已選擇的群組", + "Selected groups" : "已選群組", "Edit LDAP Query" : "編輯LDAP Query", "LDAP Filter:" : "LDAP 過慮器:", "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾器指定哪些 LDAP 群組將有權存取 %s。", @@ -88,11 +106,12 @@ OC.L10N.register( "Other Attributes:" : "其他屬性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義嘗試登入時要應用的過濾器。“%%uid” 取代登入時輸入的用戶名。示例:“uid = %%uid”", "Test Loginname" : "測試登入姓名", + "Attempts to receive a DN for the given loginname and the current login filter" : "嘗試接收給定登錄名和目前登錄過濾器的 DN", "Verify settings" : "驗證設定", "%s. Server:" : "%s。伺服器:", - "Add a new configuration" : "建立一個新的配置", - "Copy current configuration into new directory binding" : "複製目前的設定檔到新目錄", - "Delete the current configuration" : "刪除目前的設定檔", + "Add a new configuration" : "添加一個新的配置", + "Copy current configuration into new directory binding" : "複製目前的配置到新目錄綁定", + "Delete the current configuration" : "刪除目前的配置", "Host" : "主機", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非需要 SSL,否則可以省略該協議。如果需要 SSL,請以 ldaps:// 開頭", "Port" : "連接埠", @@ -151,6 +170,8 @@ OC.L10N.register( "One User Base DN per line" : "一行一個用戶 Base DN", "User Search Attributes" : "用戶搜尋屬性", "Optional; one attribute per line" : "非必要,一行一項屬性", + "Disable users missing from LDAP" : "停用 LDAP 中找不到的的用戶", + "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後找不到的的用戶將被停用", "Group Display Name Field" : "群組顯示名稱欄位", "The LDAP attribute to use to generate the groups's display name." : "LDAP設定值,用於產生用戶群組的顯示名稱", "Base Group Tree" : "基本群組樹", @@ -179,8 +200,31 @@ OC.L10N.register( "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "用戶名留空(默認)。否則,請指定 LDAP/AD 屬性。", "\"$home\" Placeholder Field" : "\"$home\" 佔位符字段", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部存儲配置中的 $home 將替換為指定屬性的值", + "User Profile Attributes" : "用戶個人資料屬性", + "Phone Field" : "電話號碼欄位", + "User profile Phone will be set from the specified attribute" : "用戶個人資料電話號碼將從指定的屬性設置", + "Website Field" : "網址欄位", + "User profile Website will be set from the specified attribute" : "用戶個人資料網址將從指定的屬性設置", + "Address Field" : "地址欄位", + "User profile Address will be set from the specified attribute" : "用戶個人資料地址將從指定的屬性設置", + "Twitter Field" : "Twitter 欄位", + "User profile Twitter will be set from the specified attribute" : "用戶個人資料 Twitter 將從指定的屬性設置", + "Fediverse Field" : "Fediverse 欄位", + "User profile Fediverse will be set from the specified attribute" : "用戶個人資料 Fediverse 將從指定的屬性設置", + "Organisation Field" : "工作機構欄位", + "User profile Organisation will be set from the specified attribute" : "用戶個人資料工作機構將從指定的屬性設置", + "Role Field" : "職銜欄位", + "User profile Role will be set from the specified attribute" : "用戶個人資料職銜將從指定的屬性設置", + "Headline Field" : "標題欄位", + "User profile Headline will be set from the specified attribute" : "用戶個人資料標題將從指定的屬性設置", + "Biography Field" : "小傳欄位", + "User profile Biography will be set from the specified attribute" : "用戶個人資料小傳將從指定的屬性設置", + "Birthdate Field" : "出生日期欄位", + "User profile Date of birth will be set from the specified attribute" : "使用者個人資料的出生日期將從指定的屬性中設定", + "Pronouns Field" : "代名詞欄位", + "User profile Pronouns will be set from the specified attribute" : "用戶個人資料代名詞將從指定的屬性設置", "Internal Username" : "內部用戶名稱", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默認情況下,內部用戶名將從UUID屬性創建。這樣可以確保用戶名是唯一的,並且不需要轉換任何字符。內部用戶名的限制是只能使用以下字符:[a-zA-Z0-9_.@-]。其他字符被替換為它們的ASCII對應或被略去。發生相抵觸時,將加入數字。內部用戶名用於在內部識別用戶。其也是用戶主資料夾的默認名稱。也是遠端URL的一部分,舉例來說,會用於所有 *DAV 服務。使用此設置,默認的行為可以被覆寫。更改僅對新映射(添加)的LDAP用戶有效。將其留空會使用默認行為。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默認情況下,內部用戶名稱將從 UUID 屬性建立。其確保了用戶名稱是唯一且不需要轉換字元。內部用戶名稱的限制是只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部用戶名稱用於內部識別用戶。其也是用戶家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。變更僅對新映射(新增)的 LDAP 用戶有效。將其留空會使用預設行為。", "Internal Username Attribute:" : "內部用戶名稱屬性:", "Override UUID detection" : "偵測覆寫UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 屬性會自動偵測。UUID 屬性用來準確識別 LDAP 用戶及群組。此外,如果未在上方指定,內部用戶名稱會基於 UUID 建立。您能覆蓋設定並直接指定屬性,但一定要確保指定的屬性能被用戶及群組取得且唯一。留空則執行默認行為。變更只會對新映射(加入)的 LDAP 用戶及群組生效。", @@ -190,13 +234,6 @@ OC.L10N.register( "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "用戶名用於存儲和分配元數據。為了精確地區分和識別用戶,每個LDAP用戶都會有一個內部的用戶名。這要求建立一個用戶名到LDAP用戶的映射。創建的用戶名會被映射到 LDAP用戶的UUID。另外為了節省LDAP連接開銷,DN會被緩存,但不會使用識別。如果DN變了,這些變化會被識別到。在Nextcloud各個頁面會使用內部用戶名。清除映射會造成 系統裡面有大量的殘留信息。清除映射會影響所有的LDAP配置,同時進行雙向配置。不要在生產環境裡面應用可變映射,請僅用於測試環境或早期驗證步驟。", "Clear Username-LDAP User Mapping" : "清除 用戶名-LDAP 用戶 Mapping", "Clear Groupname-LDAP Group Mapping" : "清除 群組名稱-LDAP 群組 Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "連線到 LDAP/AD出現錯誤,請檢查主機,連接阜和驗證資訊", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "“%uid”佔位符丟失。查詢LDAP/AD時,它將替換為登入名稱。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "群組盒已經停用,LDAP/AD 伺服器並不支援", - "LDAP / AD integration" : "LDAP /AD 整合", - "LDAP / AD Username:" : "LDAP / AD 用戶名稱:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用LDAP / AD用戶名登入,該用戶名可以是“ uid”或“ sAMAccountName”。", - "LDAP / AD Email Address:" : "LDAP / AD 電郵地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "默認情況下,內部用戶名將從UUID屬性創建。這樣可以確保用戶名是唯一的,並且不需要轉換任何字符。內部用戶名的限制是只能使用以下字符:[ a-zA-Z0-9_.@- ]。其他字符被替換為它們的ASCII對應或被略去。發生相抵觸時,將添加或增量數字。內部用戶名用於在內部標識用戶。它也是用戶主資料夾的默認名稱。它也是遠端URL的一部分,例如,用於所有 *DAV 服務。使用此設置,可以覆蓋默認行為。將其保留為空以保留默認行為。更改僅對新映射(添加)的LDAP用戶有效。" + "Invalid configuration. Please have a look at the logs for further details." : "無效的配置。請查看日誌以獲取更多詳細訊息。" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/zh_HK.json b/apps/user_ldap/l10n/zh_HK.json index 6d6e4db6aac..ecebd433141 100644 --- a/apps/user_ldap/l10n/zh_HK.json +++ b/apps/user_ldap/l10n/zh_HK.json @@ -4,11 +4,12 @@ "Invalid configuration: Anonymous binding is not allowed." : "無效的配置:不允許匿名綁定。", "Valid configuration, connection established!" : "有效的配置,連接成功!", "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的配置,但是綁定失敗。請檢查伺服器設定和證書。", - "Invalid configuration. Please have a look at the logs for further details." : "無效的配置。請查看日誌以獲取更多詳細訊息。", + "Invalid configuration: %s" : "無效配置:%s", "No action specified" : "沒有指定操作", "No configuration specified" : "沒有指定配置", "No data specified" : "沒有指定資料", - " Could not set configuration %s" : "無法為 %s 設定配置值", + "Invalid data specified" : "指定的數據無效", + "Could not set configuration %1$s to %2$s" : "無法將 %1$s 配置設定為 %2$s", "Action does not exist" : "操作不存在", "Renewing …" : "更新中...", "Very weak password" : "密碼安全性極弱", @@ -51,21 +52,38 @@ "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "“%uid”佔位符丟失。查詢 LDAP/AD 時,它將替換為登入名稱。", "Please provide a login name to test against" : "請提供登入姓名以便再次測試", "The group box was disabled, because the LDAP/AD server does not support memberOf." : "群組盒已經停用,LDAP/AD 伺服器並不支援", - "Password change rejected. Hint: " : "密碼更改被拒絕。提示:", + "Password change rejected. Hint: %s" : "密碼更改被拒絕。提示:%s", + "Mandatory field \"%s\" left empty" : "必填欄位「%s」為空", + "A password is given, but not an LDAP agent" : "已提供密碼,但並未提供 LDAP 代理程式", + "No password is given for the user agent" : "未提供使用者代理程式的密碼", + "No LDAP base DN was given" : "未提供 LDAP 基礎 DN", + "User base DN is not a subnode of global base DN" : "用戶基礎 DN 不是全域基礎 DN 的子節點", + "Group base DN is not a subnode of global base DN" : "群組基礎 DN 不是全域基礎 DN 的子節點", + "Login filter does not contain %s placeholder." : "登入過濾條件不包含 %s 佔位字串。", "Please login with the new password" : "請登入並使用新的密碼", "LDAP User backend" : "LDAP 用戶後端系統", "Your password will expire tomorrow." : "您的密碼將於明日過期", "Your password will expire today." : "您的密碼將於今日過期", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後過期"], "LDAP/AD integration" : "LDAP /AD 整合", - "_%s group found_::_%s groups found_" : ["找到 %s 群組"], - "_%s user found_::_%s users found_" : ["找到 %s 位用戶"], + "LDAP Connection" : "LDAP 連線", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["LDAP 配置綁紮失敗:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["搜尋 %n LDAP 配置失敗:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 個非活動 LDAP 配置:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["綁定和搜尋適用於所有 %n 已設定的 LDAP 連線 (%s)"], + "Invalid LDAP UUIDs" : "無效的 LDAP UUID", + "None found" : "未找到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "LDAP 帳戶或群組的 UUID 無效。請查看 LDAP 配置專家部分中的“覆蓋 UUID 檢測”設置,並使用“occ ldap:update-uuid”更新它們。", + "_%n group found_::_%n groups found_" : ["找到 %n 個群組"], + "> 1000 groups found" : "找到 > 1000 個群組", + "> 1000 users found" : "找到 > 1000 位用戶", + "_%n user found_::_%n users found_" : ["找到 %n 位用戶"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "無法檢測到用戶顯示名稱屬性。請在高級LDAP設置中自行指定。", "Could not find the desired feature" : "無法找到所需的功能", "Invalid Host" : "無效的 Host", "LDAP user and group backend" : "LDAP 用戶和群組後端系統", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "該應用程序使管理員可以將Nextcloud連接到基於LDAP的用戶目錄。", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "本應用啟用功能使管理員可將 Nextcloud 與基於 LDAP 的用戶目錄連接,進行身分驗證以及提供用戶、群組和用戶屬性。管理員可配置此程序通過 LDAP 接口連接至一個或多個 LDAP 或 Active Directory 目錄。通過適當的查詢和篩選,可將以下屬性從目錄導入 Nextcloud:用戶磁盤配額、電子郵箱、頭像、所屬群組以及更多。用戶可以用其LDAP或AD中的身分登入 Nextcloud, 並根據 LDAP 或 AD 服務的身分驗證獲得訪問權限。Nextcloud 僅使用身分驗證隨後為用戶身分使用會話,但不會儲存LDAP或AD的密碼。您可從 LDAP 用戶及群組後台文檔中獲取更多信息。", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的用戶目錄來進行驗證與提供用戶、群組與用戶屬性。管理員可以設定此應用程式來連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面的 Active Directories。如用戶配額、電子郵件、虛擬化身圖片、群組成員資格等屬性可以透過有適當查詢與過濾條件的目錄從 Nextcloud 拉取。\n\n用戶以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份驗證請求來授予存取權限。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對用戶進行身份驗證,然後 Nextcloud 會使用工作階段作為用戶 ID。更多資訊在 LDAP 用戶與群組後端文件中提供。", "Test Configuration" : "測試此配置", "Help" : "支援", "Groups meeting these criteria are available in %s:" : "符合這些條件的群組可在 %s 找到:", @@ -73,7 +91,7 @@ "Only from these groups:" : "僅從這些群組:", "Search groups" : "搜尋群組", "Available groups" : "可用的群組", - "Selected groups" : "已選擇的群組", + "Selected groups" : "已選群組", "Edit LDAP Query" : "編輯LDAP Query", "LDAP Filter:" : "LDAP 過慮器:", "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾器指定哪些 LDAP 群組將有權存取 %s。", @@ -86,11 +104,12 @@ "Other Attributes:" : "其他屬性:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義嘗試登入時要應用的過濾器。“%%uid” 取代登入時輸入的用戶名。示例:“uid = %%uid”", "Test Loginname" : "測試登入姓名", + "Attempts to receive a DN for the given loginname and the current login filter" : "嘗試接收給定登錄名和目前登錄過濾器的 DN", "Verify settings" : "驗證設定", "%s. Server:" : "%s。伺服器:", - "Add a new configuration" : "建立一個新的配置", - "Copy current configuration into new directory binding" : "複製目前的設定檔到新目錄", - "Delete the current configuration" : "刪除目前的設定檔", + "Add a new configuration" : "添加一個新的配置", + "Copy current configuration into new directory binding" : "複製目前的配置到新目錄綁定", + "Delete the current configuration" : "刪除目前的配置", "Host" : "主機", "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非需要 SSL,否則可以省略該協議。如果需要 SSL,請以 ldaps:// 開頭", "Port" : "連接埠", @@ -149,6 +168,8 @@ "One User Base DN per line" : "一行一個用戶 Base DN", "User Search Attributes" : "用戶搜尋屬性", "Optional; one attribute per line" : "非必要,一行一項屬性", + "Disable users missing from LDAP" : "停用 LDAP 中找不到的的用戶", + "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後找不到的的用戶將被停用", "Group Display Name Field" : "群組顯示名稱欄位", "The LDAP attribute to use to generate the groups's display name." : "LDAP設定值,用於產生用戶群組的顯示名稱", "Base Group Tree" : "基本群組樹", @@ -177,8 +198,31 @@ "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "用戶名留空(默認)。否則,請指定 LDAP/AD 屬性。", "\"$home\" Placeholder Field" : "\"$home\" 佔位符字段", "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部存儲配置中的 $home 將替換為指定屬性的值", + "User Profile Attributes" : "用戶個人資料屬性", + "Phone Field" : "電話號碼欄位", + "User profile Phone will be set from the specified attribute" : "用戶個人資料電話號碼將從指定的屬性設置", + "Website Field" : "網址欄位", + "User profile Website will be set from the specified attribute" : "用戶個人資料網址將從指定的屬性設置", + "Address Field" : "地址欄位", + "User profile Address will be set from the specified attribute" : "用戶個人資料地址將從指定的屬性設置", + "Twitter Field" : "Twitter 欄位", + "User profile Twitter will be set from the specified attribute" : "用戶個人資料 Twitter 將從指定的屬性設置", + "Fediverse Field" : "Fediverse 欄位", + "User profile Fediverse will be set from the specified attribute" : "用戶個人資料 Fediverse 將從指定的屬性設置", + "Organisation Field" : "工作機構欄位", + "User profile Organisation will be set from the specified attribute" : "用戶個人資料工作機構將從指定的屬性設置", + "Role Field" : "職銜欄位", + "User profile Role will be set from the specified attribute" : "用戶個人資料職銜將從指定的屬性設置", + "Headline Field" : "標題欄位", + "User profile Headline will be set from the specified attribute" : "用戶個人資料標題將從指定的屬性設置", + "Biography Field" : "小傳欄位", + "User profile Biography will be set from the specified attribute" : "用戶個人資料小傳將從指定的屬性設置", + "Birthdate Field" : "出生日期欄位", + "User profile Date of birth will be set from the specified attribute" : "使用者個人資料的出生日期將從指定的屬性中設定", + "Pronouns Field" : "代名詞欄位", + "User profile Pronouns will be set from the specified attribute" : "用戶個人資料代名詞將從指定的屬性設置", "Internal Username" : "內部用戶名稱", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默認情況下,內部用戶名將從UUID屬性創建。這樣可以確保用戶名是唯一的,並且不需要轉換任何字符。內部用戶名的限制是只能使用以下字符:[a-zA-Z0-9_.@-]。其他字符被替換為它們的ASCII對應或被略去。發生相抵觸時,將加入數字。內部用戶名用於在內部識別用戶。其也是用戶主資料夾的默認名稱。也是遠端URL的一部分,舉例來說,會用於所有 *DAV 服務。使用此設置,默認的行為可以被覆寫。更改僅對新映射(添加)的LDAP用戶有效。將其留空會使用默認行為。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "默認情況下,內部用戶名稱將從 UUID 屬性建立。其確保了用戶名稱是唯一且不需要轉換字元。內部用戶名稱的限制是只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部用戶名稱用於內部識別用戶。其也是用戶家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。變更僅對新映射(新增)的 LDAP 用戶有效。將其留空會使用預設行為。", "Internal Username Attribute:" : "內部用戶名稱屬性:", "Override UUID detection" : "偵測覆寫UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 屬性會自動偵測。UUID 屬性用來準確識別 LDAP 用戶及群組。此外,如果未在上方指定,內部用戶名稱會基於 UUID 建立。您能覆蓋設定並直接指定屬性,但一定要確保指定的屬性能被用戶及群組取得且唯一。留空則執行默認行為。變更只會對新映射(加入)的 LDAP 用戶及群組生效。", @@ -188,13 +232,6 @@ "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "用戶名用於存儲和分配元數據。為了精確地區分和識別用戶,每個LDAP用戶都會有一個內部的用戶名。這要求建立一個用戶名到LDAP用戶的映射。創建的用戶名會被映射到 LDAP用戶的UUID。另外為了節省LDAP連接開銷,DN會被緩存,但不會使用識別。如果DN變了,這些變化會被識別到。在Nextcloud各個頁面會使用內部用戶名。清除映射會造成 系統裡面有大量的殘留信息。清除映射會影響所有的LDAP配置,同時進行雙向配置。不要在生產環境裡面應用可變映射,請僅用於測試環境或早期驗證步驟。", "Clear Username-LDAP User Mapping" : "清除 用戶名-LDAP 用戶 Mapping", "Clear Groupname-LDAP Group Mapping" : "清除 群組名稱-LDAP 群組 Mapping", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "連線到 LDAP/AD出現錯誤,請檢查主機,連接阜和驗證資訊", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "“%uid”佔位符丟失。查詢LDAP/AD時,它將替換為登入名稱。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "群組盒已經停用,LDAP/AD 伺服器並不支援", - "LDAP / AD integration" : "LDAP /AD 整合", - "LDAP / AD Username:" : "LDAP / AD 用戶名稱:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用LDAP / AD用戶名登入,該用戶名可以是“ uid”或“ sAMAccountName”。", - "LDAP / AD Email Address:" : "LDAP / AD 電郵地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "默認情況下,內部用戶名將從UUID屬性創建。這樣可以確保用戶名是唯一的,並且不需要轉換任何字符。內部用戶名的限制是只能使用以下字符:[ a-zA-Z0-9_.@- ]。其他字符被替換為它們的ASCII對應或被略去。發生相抵觸時,將添加或增量數字。內部用戶名用於在內部標識用戶。它也是用戶主資料夾的默認名稱。它也是遠端URL的一部分,例如,用於所有 *DAV 服務。使用此設置,可以覆蓋默認行為。將其保留為空以保留默認行為。更改僅對新映射(添加)的LDAP用戶有效。" + "Invalid configuration. Please have a look at the logs for further details." : "無效的配置。請查看日誌以獲取更多詳細訊息。" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/zh_TW.js b/apps/user_ldap/l10n/zh_TW.js index 3c1f9320b87..d7fa6d00327 100644 --- a/apps/user_ldap/l10n/zh_TW.js +++ b/apps/user_ldap/l10n/zh_TW.js @@ -1,40 +1,41 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "清除映射失敗。", - "Failed to delete the server configuration" : "刪除伺服器設定失敗", - "Invalid configuration: Anonymous binding is not allowed." : "無效的設定:不允許匿名綁定。", - "Valid configuration, connection established!" : "有效的設定,連線已建立!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的設定,但是綁定失敗。請檢查伺服器設定和證書。", - "Invalid configuration. Please have a look at the logs for further details." : "無效的設定。請檢查紀錄檔以取得更多詳細資訊。", + "Failed to clear the mappings." : "無法清除映射。", + "Failed to delete the server configuration" : "無法刪除伺服器組態設定", + "Invalid configuration: Anonymous binding is not allowed." : "無效的組態設定:不允許匿名綁定。", + "Valid configuration, connection established!" : "有效的組態設定,連線已建立!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的組態設定,但是綁定失敗。請檢查伺服器設定與憑證。", + "Invalid configuration: %s" : "無效組態:%s", "No action specified" : "未指定動作", - "No configuration specified" : "未指定設定", + "No configuration specified" : "未指定組態設定", "No data specified" : "未指定資料", - " Could not set configuration %s" : "無法設定 %s", + "Invalid data specified" : "指定了無效的資料", + "Could not set configuration %1$s to %2$s" : "無法將組態 %1$s 設定為 %2$s", "Action does not exist" : "動作不存在", - "Renewing …" : "正在更新……", + "Renewing …" : "正在更新…", "Very weak password" : "密碼安全性極弱", "Weak password" : "密碼安全性弱", "So-so password" : "密碼安全性普通", "Good password" : "密碼安全性佳", "Strong password" : "密碼安全性極佳", "The Base DN appears to be wrong" : "Base DN 出現問題", - "Testing configuration…" : "正在測試設定……", - "Configuration incorrect" : "設定不正確", - "Configuration incomplete" : "設定未完成", - "Configuration OK" : "設定完成", - "Select groups" : "選擇群組", - "Select object classes" : "選擇物件", - "Please check the credentials, they seem to be wrong." : "請檢查您的憑證,它們似乎是錯的。", - "Please specify the port, it could not be auto-detected." : "請指定連接埠,其無法自動偵測。", - "Base DN could not be auto-detected, please revise credentials, host and port." : "無法自動偵測 Base DN,請修改憑證、主機與連接埠。", + "Testing configuration…" : "正在測試組態設定…", + "Configuration incorrect" : "組態設定不正確", + "Configuration incomplete" : "組態設定未完成", + "Configuration OK" : "組態設定完成", + "Select groups" : "選取群組", + "Select object classes" : "選取物件類別", + "Please check the credentials, they seem to be wrong." : "請檢查您的憑證,它們似乎有錯。", + "Please specify the port, it could not be auto-detected." : "請指定連接埠,它無法自動偵測。", + "Base DN could not be auto-detected, please revise credentials, host and port." : "無法自動偵測 Base DN,請修改憑證、主機、連接埠等。", "Could not detect Base DN, please enter it manually." : "偵測不到 Base DN,請手動輸入。", "{nthServer}. Server" : "{nthServer}. 伺服器", - "No object found in the given Base DN. Please revise." : "在 Base DN 中找不到物件。請修改", - "More than 1,000 directory entries available." : "超過 1,000 個目錄項目可用。", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["提供的 Base DN 中有 {objectsFound} 個項目"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "遇到錯誤。請檢查 Base DN、連線設定與憑證。", - "Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器設定嗎?", + "No object found in the given Base DN. Please revise." : "在 Base DN 中找不到物件。請修正。", + "More than 1,000 directory entries available." : "有超過 1,000 個目錄條目可用。", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["提供的 Base DN 中有 {objectsFound} 個條目可用"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "遭遇錯誤。請檢查 Base DN、連線設定、憑證等。", + "Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器組態設定嗎?", "Confirm Deletion" : "確認刪除", "Mappings cleared successfully!" : "映射清除成功!", "Error while clearing the mappings." : "清除映射時發生錯誤。", @@ -43,160 +44,196 @@ OC.L10N.register( "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "儲存失敗。請確保資料庫可以運作。繼續前請重新載入。", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "切換模式將會啟用自動 LDAP 查詢。取決於您的 LDAP 大小,可能需要一些時間。您仍然想要切換模式嗎?", "Mode switch" : "模式切換", - "Select attributes" : "選擇屬性", + "Select attributes" : "選取特性", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "找不到使用者。請檢查您的登入資料與使用者名稱。有效的過濾條件(複製貼上以進行命令列驗證):<br/>", "User found and settings verified." : "使用者存在,設定值正確。", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "考慮縮小範圍,因為其涵蓋了許多使用者,但只有第一個才能登入。", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "請考慮縮小搜尋範圍,目前涵蓋了許多使用者,但只有第一個才能登入。", "An unspecified error occurred. Please check log and settings." : "發生不明錯誤。請檢查紀錄檔與設定。", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "搜尋過濾條件無效,可能是語法問題引起的,如括號不對稱等。請修改。", - "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "發生 LDAP/AD 的連線錯誤。請檢查主機、連接埠與憑證。", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "搜尋過濾條件無效,可能是語法問題引起,如括號不對稱等。請修正。", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "遭遇 LDAP/AD 的連線錯誤。請檢查主機、連接埠、憑證等。", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "「%uid」佔位字串遺失。查詢 LDAP/AD 時將會使用登入名稱取代。", "Please provide a login name to test against" : "請提供登入名稱以便再次測試", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "因為 LDAP/AD 伺服器不支援 memberOf,所以停用群組盒。", - "Password change rejected. Hint: " : "密碼變更被拒絕。提示:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "由於 LDAP/AD 伺服器不支援 memberOf,群組盒已停用。", + "Password change rejected. Hint: %s" : "密碼變更被拒絕。提示:%s", + "Mandatory field \"%s\" left empty" : "必填欄位「%s」為空", + "A password is given, but not an LDAP agent" : "已提供密碼,但並未提供 LDAP 代理程式", + "No password is given for the user agent" : "未提供使用者代理程式的密碼", + "No LDAP base DN was given" : "未提供 LDAP 基礎 DN", + "User base DN is not a subnode of global base DN" : "使用者基礎 DN 不是全域基礎 DN 的子節點", + "Group base DN is not a subnode of global base DN" : "群組基礎 DN 不是全域基礎 DN 的子節點", + "Login filter does not contain %s placeholder." : "登入過濾條件不包含 %s 佔位字串。", "Please login with the new password" : "請以新密碼登入", "LDAP User backend" : "LDAP 使用者後端", "Your password will expire tomorrow." : "您的密碼將於明天到期。", "Your password will expire today." : "您的密碼將於今天到期。", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後到期。"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於 %n 天內到期。"], "LDAP/AD integration" : "LDAP/AD 整合", - "_%s group found_::_%s groups found_" : ["找到 %s 群組"], - "_%s user found_::_%s users found_" : ["找到 %s 使用者"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "偵測不到使用者顯示名稱屬性。請在進階 LDAP 設定中自行指定。", + "LDAP Connection" : "LDAP 連線", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n LDAP 設定綁紮失敗:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n LDAP 設定搜尋失敗:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 個不活躍的 LDAP 設定:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["綁紮與搜尋適用於全部 %n 個已設定的 LDAP 連線 (%s)"], + "Invalid LDAP UUIDs" : "無效的 LDAP UUID", + "None found" : "找不到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "找到無效的 LDAP 帳號或群組 UUID。請審閱您在 LDAP 專家設定中的「覆寫 UUID 偵測」設定,並使用「occ ldap:update-uuid」來更新它們。", + "_%n group found_::_%n groups found_" : ["找到 %n 個群組"], + "> 1000 groups found" : "找到 > 1000 個群組", + "> 1000 users found" : "找到 > 1000 個使用者", + "_%n user found_::_%n users found_" : ["找到 %n 個使用者"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "偵測不到使用者顯示名稱特性。請在進階 LDAP 設定中自行指定。", "Could not find the desired feature" : "找不到所需的功能", "Invalid Host" : "無效的主機", "LDAP user and group backend" : "LDAP 使用者與群組後端", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄。", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄來進行驗證與提供使用者、群組與使用者屬性。管理員可以設定此應用程式來連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面的 Active Directories。如使用者配額、電子郵件、大頭照圖片、群組成員資格等屬性可以透過有適當查詢與過濾條件的目錄從 Nextcloud 拉取。\n\n使用者以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份驗證請求來授予存取權限。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對使用者進行身份驗證,然後 Nextcloud 會使用工作階段作為使用者 ID。更多資訊在 LDAP 使用者與群組後端文件中提供。", - "Test Configuration" : "測試設定", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄,來認證與供應使用者、群組與使用者特性。管理員可以設定此應用程式連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面連線到 Active Directory。像是使用者容量限制、電子郵件、頭像圖片、群組成員資格等特性,可以透過適當查詢與過濾條件後的目錄從 Nextcloud 拉取。\n\n使用者以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份認證請求來授予存取權。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對使用者進行身份認證,接著 Nextcloud 會使用工作階段作為使用者 ID。更多資訊請參閱 LDAP 使用者與群組後端文件。", + "Test Configuration" : "測試組態設定", "Help" : "說明", - "Groups meeting these criteria are available in %s:" : "符合這些條件的群組可在 %s 找到:", - "Only these object classes:" : "只有這些物件類別:", - "Only from these groups:" : "僅從這些群組:", + "Groups meeting these criteria are available in %s:" : "在 %s 中符合這些條件可用群組:", + "Only these object classes:" : "僅限這些物件類別:", + "Only from these groups:" : "僅限這些群組:", "Search groups" : "搜尋群組", "Available groups" : "可用的群組", - "Selected groups" : "已選擇的群組", + "Selected groups" : "已選取的群組", "Edit LDAP Query" : "編輯 LDAP 查詢", "LDAP Filter:" : "LDAP 過濾條件:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾條件指定哪些 LDAP 群組有存取 %s 的權限。", + "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾條件指定哪些 LDAP 群組應該具備 %s 站台的存取權。", "Verify settings and count the groups" : "驗證設定並計算群組", - "When logging in, %s will find the user based on the following attributes:" : "登入時,%s 將會根據以下屬性尋找使用者:", + "When logging in, %s will find the user based on the following attributes:" : "登入時,%s 將會根據以下特性尋找使用者:", "LDAP/AD Username:" : "LDAP/AD 使用者名稱:", - "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP/AD 使用者名稱登入,可以是 \"uid\" 或 \"sAMAccountName\"。", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP/AD 使用者名稱登入,可以是「uid」或「sAMAccountName」,會自動偵測。", "LDAP/AD Email Address:" : "LDAP/AD 電子郵件地址:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "允許使用電子郵件屬性登入。允許使用 “mail” 與 “mailPrimaryAddress”。", - "Other Attributes:" : "其他屬性:", - "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義要套用的過濾條件,試圖登入時。\"%%uid\" 會在登入動作時取代使用者名稱。範例:\"uid=%%uid\"", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "允許以電子郵件特性登入。允許使用「mail」與「mailPrimaryAddress」。", + "Other Attributes:" : "其他特性:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義試圖登入時所要套用的過濾條件。「%%uid」會在登入動作時取代使用者名稱。範例:「uid=%%uid」", "Test Loginname" : "測試登入名稱", + "Attempts to receive a DN for the given loginname and the current login filter" : "嘗試接收給定登入名稱與目前登入過濾條件的 DN", "Verify settings" : "驗證設定", "%s. Server:" : "%s. 伺服器:", - "Add a new configuration" : "建立一個新的設定", - "Copy current configuration into new directory binding" : "複製目前的設定檔到新目錄綁定", - "Delete the current configuration" : "刪除目前的設定檔", + "Add a new configuration" : "建立新的組態設定", + "Copy current configuration into new directory binding" : "複製目前的組態設定檔到新目錄綁定", + "Delete the current configuration" : "刪除目前的組態設定", "Host" : "主機", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非您需要 SSL,否則您可以忽略通訊協定,反之則請以 ldaps:// 開頭", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非您需要 SSL,否則您可以忽略通訊協定。如果需要,請以 ldaps:// 開頭", "Port" : "連接埠", - "Detect Port" : "偵測連接阜", + "Detect Port" : "偵測連接埠", "User DN" : "使用者 DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "客戶端使用者的 DN 與特定字詞的連結需要完善,例如:uid=agent,dc=example,dc=com。若是匿名存取,則將 DN 與密碼欄位留空。", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "客戶端使用者的 DN 綁定需要完成,例如:uid=agent,dc=example,dc=com。若是匿名存取,則請將 DN 與密碼欄位留空。", "Password" : "密碼", - "For anonymous access, leave DN and Password empty." : "匿名存取時請將 DN 與密碼欄位留空。", + "For anonymous access, leave DN and Password empty." : "匿名存取時,請將 DN 與密碼欄位留空。", "Save Credentials" : "儲存憑證", "One Base DN per line" : "一行一個 Base DN", "You can specify Base DN for users and groups in the Advanced tab" : "您可以在「進階」分頁中為使用者與群組指定 Base DN", "Detect Base DN" : "偵測 Base DN", "Test Base DN" : "測試 Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "避免自動 LDAP 請求。適合較大規模的安裝,但需要一些 LDAP 知識。", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "避免自動 LDAP 請求。適合較大規模的安裝設置,但需要具備一些 LDAP 知識。", "Manually enter LDAP filters (recommended for large directories)" : "手動輸入 LDAP 過濾條件(建議用於大型目錄)", - "Listing and searching for users is constrained by these criteria:" : "列出和搜索用戶受到以下條件的約束:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "使用者最常見的物件類別是 organizationalPerson、person、user 與 inetOrgPerson。如果不確定要選取哪個物件類別,請諮詢您的目錄管理員。", - "The filter specifies which LDAP users shall have access to the %s instance." : "過濾條件指定哪些 LDAP 使用者有存取 %s 的權限。", - "Verify settings and count users" : "驗證設定並計算使用者數", + "Listing and searching for users is constrained by these criteria:" : "列出和搜尋以下條件限定的使用者:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "使用者最常見的物件類別是 organizationalPerson、person、user、inetOrgPerson 等。如果不確定要選取哪個物件類別,則請諮詢您的目錄管理員。", + "The filter specifies which LDAP users shall have access to the %s instance." : "過濾條件指定哪些 LDAP 使用者應具備 %s 站台的存取權。", + "Verify settings and count users" : "驗證設定並計算使用者", "Saving" : "儲存", "Back" : "返回", "Continue" : "繼續", - "Please renew your password." : "請更新您的密碼", + "Please renew your password." : "請更新您的密碼。", "An internal error occurred." : "發生內部錯誤。", - "Please try again or contact your administrator." : "請重試或聯絡您的系統管理員。", + "Please try again or contact your administrator." : "請重試,或聯絡您的系統管理員。", "Current password" : "目前密碼", "New password" : "新密碼", "Renew password" : "更新密碼", - "Wrong password." : "密碼錯誤", + "Wrong password." : "密碼錯誤。", "Cancel" : "取消", "Server" : "伺服器", "Users" : "使用者", - "Login Attributes" : "登入屬性", + "Login Attributes" : "登入特性", "Groups" : "群組", "Expert" : "專家", "Advanced" : "進階", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>警告:</b>未安裝 PHP LDAP 模組,後端系統將無法運作。請要求您的系統管理員安裝它。", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>警告:</b>未安裝 PHP LDAP 模組,後端系統將無法運作。請要求您的系統管理員安裝。", "Connection Settings" : "連線設定", - "Configuration Active" : "設定作用中", - "When unchecked, this configuration will be skipped." : "沒有被勾選時,此設定會被略過。", - "Backup (Replica) Host" : "備用(複本)主機", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "提供可選的備用主機。其必須為主要 LDAP/AD 伺服器的複本。", - "Backup (Replica) Port" : "備用(複本)連接埠", + "Configuration Active" : "組態設定作用中", + "When unchecked, this configuration will be skipped." : "沒有勾選時,此組態設定會被略過。", + "Backup (Replica) Host" : "備援(複本)主機", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "提供可選的備援主機。這必須是主要 LDAP/AD 伺服器的複本。", + "Backup (Replica) Port" : "備援(複本)連接埠", "Disable Main Server" : "停用主伺服器", "Only connect to the replica server." : "僅連線至複本伺服器。", - "Turn off SSL certificate validation." : "關閉 SSL 憑證檢查。", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "不建議,請僅在測試時使用!如果連線只能在此設定下運作,請匯入 LDAP 伺服器的 SSL 憑證到您的伺服器 %s 上。", + "Turn off SSL certificate validation." : "關閉 SSL 憑證驗證。", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "不建議,請僅在測試時使用!如果連線只能在此選項下運作,請匯入 LDAP 伺服器的 SSL 憑證到您的 %s 伺服器上。", "Cache Time-To-Live" : "快取的存活時間", "in seconds. A change empties the cache." : "以秒為單位。變更後會清空快取。", "Directory Settings" : "目錄設定", "User Display Name Field" : "使用者顯示名稱欄位", - "The LDAP attribute to use to generate the user's display name." : "用於生成使用者顯示名稱的 LDAP 屬性。", + "The LDAP attribute to use to generate the user's display name." : "用於生成使用者顯示名稱的 LDAP 特性。", "2nd User Display Name Field" : "第二個使用者顯示名稱欄位", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "選填。要加進顯示名稱中括號的 LDAP 屬性。例如 »John Doe (john.doe@example.org)«。", - "Base User Tree" : "Base User Tree", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "選填。要加進顯示名稱括號中的 LDAP 特性。例如 »John Doe (john.doe@example.org)«。", + "Base User Tree" : "基本使用者樹", "One User Base DN per line" : "一行一個使用者 Base DN", - "User Search Attributes" : "User Search Attributes", - "Optional; one attribute per line" : "非必要,一行一項屬性", + "User Search Attributes" : "使用者搜尋特性", + "Optional; one attribute per line" : "選填;一行一項特性", + "Disable users missing from LDAP" : "停用 LDAP 中沒有的使用者", + "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後消失的使用者將被停用", "Group Display Name Field" : "群組顯示名稱欄位", - "The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 屬性。", - "Base Group Tree" : "Base Group Tree", - "One Group Base DN per line" : "一行一個 Group Base DN", - "Group Search Attributes" : "Group Search Attributes", - "Group-Member association" : "Group-Member association", - "Dynamic Group Member URL" : "Dynamic Group Member URL", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "群組物件上的 LDAP 屬性包含了一個 LDAP 搜尋 URL,該 URL 決定了哪些物件屬於群組。(空白設定將會停用動態群組成員資格功能。)", - "Nested Groups" : "Nested Groups", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "啟用後,將會支援包含群組的群組。(僅在群組成員屬性包含 DN 時可正常運作。)", + "The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 特性。", + "Base Group Tree" : "Base 群組樹", + "One Group Base DN per line" : "一行一個群組 Base DN", + "Group Search Attributes" : "群組搜尋特性", + "Group-Member association" : "群組與成員關聯", + "Dynamic Group Member URL" : "動態群組成員 URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "群組物件上的 LDAP 特性包含了 LDAP 搜尋 URL,該 URL 決定了哪些物件屬於該群組。(空白設定將會停用動態群組成員資格功能。)", + "Nested Groups" : "巢狀群組", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "啟用後,將會支援包含群組的群組。(僅在群組成員特性包含 DN 時可正常運作。)", "Paging chunksize" : "分頁區塊大小", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁 LDAP 搜尋使用的區塊大小可能會回傳大量結果,如使用者或群組列舉。(在這種情況下,將其設定為 0 將會停用分頁 LDAP 搜尋。)", - "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊。", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁式 LDAP 搜尋所使用的區塊大小,可能會回傳大量結果,例如使用者或群組列舉。(在這種情況下,設定為 0 會停用分頁式 LDAP 搜尋。)", + "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼變更", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會生效。由於密碼會以明文形式傳送給 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊處理。", "(New password is sent as plain text to LDAP)" : "(新密碼會以明文傳送給 LDAP)", "Default password policy DN" : "預設密碼策略 DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,其將用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更且 OpenLDAP 支援時才能正常運作。保留為空將停用密碼過期處理。", - "Special Attributes" : "特殊屬性", - "Quota Field" : "配額欄位", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "留空將以使用者的預設配額為準。否則請指定 LDAP/AD 屬性。", - "Quota Default" : "預設配額", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "覆寫沒有在配額欄位中設定配額的 LDAP 使用者的預設配額。", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更時才能正常運作,僅 OpenLDAP 有支援。保留空白將停用密碼過期處理。", + "Special Attributes" : "特殊特性", + "Quota Field" : "容量限制欄位", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "留空將以使用者的預設容量限制為準。否則,請指定 LDAP/AD 特性。", + "Quota Default" : "容量限制預設", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "凌駕在容量限制欄位中沒有設定配額容量的 LDAP 使用者的預設配額。", "Email Field" : "電子郵件欄位", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "從 LDAP 屬性設定使用者的電子郵件。將其留空為預設行為。", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "根據 LDAP 特性設定使用者的電子郵件。留空將採預設行為。", "User Home Folder Naming Rule" : "使用者家目錄的命名規則", - "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "使用者名稱留空(預設值)。否則請指定 LDAP/AD 屬性。", - "\"$home\" Placeholder Field" : "\"$home\" 佔位字串欄位", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部儲存空間設定中的 $home 將會以指定屬性的值取代", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "留空將採用使用者名稱(預設值)。否則,請指定 LDAP/AD 特性。", + "\"$home\" Placeholder Field" : "「$home」佔位字串欄位", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部儲存空間組態設定中的 $home 將會以指定特性的值取代", + "User Profile Attributes" : "使用者個人檔案特性", + "Phone Field" : "電話號碼欄位", + "User profile Phone will be set from the specified attribute" : "使用者個人檔案電話號碼將根據指定的特性設定", + "Website Field" : "網站欄位", + "User profile Website will be set from the specified attribute" : "使用者個人檔案網站將根據指定的特性設定", + "Address Field" : "地址欄位", + "User profile Address will be set from the specified attribute" : "使用者個人檔案地址將根據指定的特性設定", + "Twitter Field" : "Twitter 欄位", + "User profile Twitter will be set from the specified attribute" : "使用者個人檔案 Twitter 將根據指定的特性設定", + "Fediverse Field" : "聯邦宇宙欄位", + "User profile Fediverse will be set from the specified attribute" : "使用者個人檔案聯邦宇宙將根據指定的特性設定", + "Organisation Field" : "組織單位欄位", + "User profile Organisation will be set from the specified attribute" : "使用者個人檔案組織單位將根據指定的特性設定", + "Role Field" : "職位欄位", + "User profile Role will be set from the specified attribute" : "使用者個人檔案職位將根據指定的特性設定", + "Headline Field" : "重要經歷欄位", + "User profile Headline will be set from the specified attribute" : "使用者個人檔案重要經歷將根據指定的特性設定", + "Biography Field" : "自傳欄位", + "User profile Biography will be set from the specified attribute" : "使用者個人檔案自傳將根據指定的特性設定", + "Birthdate Field" : "出生日期欄位", + "User profile Date of birth will be set from the specified attribute" : "使用者個人資料的出生日期將從指定的屬性中設定", + "Pronouns Field" : "代名詞欄位", + "User profile Pronouns will be set from the specified attribute" : "使用者個人資料代名詞將從指定的屬性設定", "Internal Username" : "內部使用者名稱", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "預設情況下,內部使用者名稱將從 UUID 屬性建立。其確保了使用者名稱是唯一且不需要轉換字元。內部使用者名稱的限制是只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部使用者名稱用於內部識別使用者。其也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。變更僅對新映射(新增)的 LDAP 使用者有效。將其留空會使用預設行為。", - "Internal Username Attribute:" : "內部使用者名稱屬性:", - "Override UUID detection" : "偵測覆寫 UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 屬性會自動偵測。UUID 屬性用來準確識別 LDAP 使用者及群組。此外,如果未在上方指定,內部使用者名稱會以 UUID 為基礎建立。您能覆寫設定並直接指定屬性,但一定要確保指定的屬性能被使用者及群組取得且唯一。留空則執行預設行為。變更只會對新映射(新增)的 LDAP 使用者及群組生效。", - "UUID Attribute for Users:" : "使用者的 UUID 屬性:", - "UUID Attribute for Groups:" : "群組的 UUID 屬性:", - "Username-LDAP User Mapping" : "使用者-LDAP 使用者映射", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "使用者名稱用於儲存並指派詮釋資料。為了精確識別並認出使用者,每個 LDAP 使用者都將會有內部使用者名稱。這需要從使用者名稱到 LDAP 使用者的映射。已建立的使用者名稱會映射到 LDAP 使用者的 UUID。另外,DN 會被快取以減少 LDAP 互動,但不會用於識別。若 DN 變更,將會找到變更。內部使用者名稱將會全面使用。清除映射將會讓到處都是未連結的項目。清除映射對設定並不敏感,其會影響到所有 LDAP 設定!不要在生產環境中清除映射,僅將其用於測試或實驗階段。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "預設情況下,內部使用者名稱將根據 UUID 特性建立。這能確保使用者名稱是唯一,且不需要轉換字元。內部使用者名稱的限制是,只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映取代,或是直接忽略。發生名稱碰撞時,將會加入或加大數字。內部使用者名稱用於內部識別使用者。這也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,例如,會用在所有 DAV 服務上。啟用此設定後,預設的行為會被凌駕。變更僅對新映射(新增)的 LDAP 使用者有效。將其留空會使用預設行為。", + "Internal Username Attribute:" : "內部使用者名稱特性:", + "Override UUID detection" : "凌駕 UUID 偵測", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 特性會自動偵測。UUID 特性用來準確識別 LDAP 使用者及群組。此外,如果未在上方指定,則內部使用者名稱會以 UUID 為基礎建立。您可以覆寫原設定,並且根據您的想法直接指定特性,但一定要確保所指定的特性能取得使用者及群組並是唯一的。留空將採取預設行為。變更只會對新映射(新增)的 LDAP 使用者及群組生效。", + "UUID Attribute for Users:" : "使用者的 UUID 特性:", + "UUID Attribute for Groups:" : "群組的 UUID 特性:", + "Username-LDAP User Mapping" : "使用者名稱-LDAP 使用者映射", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "使用者名稱用於儲存並指派中介資料。為了精確識別並認知使用者,每個 LDAP 使用者都會有其內部使用者名稱。這需要從使用者名稱作映射到 LDAP 使用者。建立的使用者名稱會映射到 LDAP 使用者的 UUID。另外,DN 會被快取以減少 LDAP 互動,但快取不用於識別身份。若 DN 變更時,系統會發現變動。內部使用者名稱在系統中全面使用,所以一旦清除映射,會讓到處都是未連結的殘留項目。清除映射的行為並不會區分組態設定,而是會影響所有 LDAP 組態設定!請永遠不要在正式環境中清除映射,僅在測試或實驗階段使用。", "Clear Username-LDAP User Mapping" : "清除使用者名稱-LDAP 使用者映射", "Clear Groupname-LDAP Group Mapping" : "清除群組名稱-LDAP 群組映射", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "發生 LDAP / AD 的連線錯誤,請檢查主機、連接埠與憑證。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "「%uid」佔位字串遺失。查詢 LDAP / AD 時將會使用登入名稱取代。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "因為 LDAP / AD 伺服器不支援 memberOf,所以停用群組盒。", - "LDAP / AD integration" : "LDAP / AD 整合", - "LDAP / AD Username:" : "LDAP / AD 使用者名稱:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP / AD 使用者名稱登入,可以是 \"uid\" 或 \"sAMAccountName\"。", - "LDAP / AD Email Address:" : "LDAP / AD 電子郵件地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "預設情況下,內部使用者名稱將從 UUID 屬性建立。其確保了使用者名稱是唯一且不需要轉換字元。內部使用者名稱的限制是只能使用下列字元:[ a-zA-Z0-9_.@- ]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部使用者名稱用於內部識別使用者。其也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。將其留空會使用預設行為。變更僅對新映射(新增)的 LDAP 使用者有效。" + "Invalid configuration. Please have a look at the logs for further details." : "無效的組態設定。請檢查紀錄檔以取得更多詳細資訊。" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/zh_TW.json b/apps/user_ldap/l10n/zh_TW.json index ec8e1840fc3..d78cd7f2642 100644 --- a/apps/user_ldap/l10n/zh_TW.json +++ b/apps/user_ldap/l10n/zh_TW.json @@ -1,38 +1,39 @@ { "translations": { - "Failed to clear the mappings." : "清除映射失敗。", - "Failed to delete the server configuration" : "刪除伺服器設定失敗", - "Invalid configuration: Anonymous binding is not allowed." : "無效的設定:不允許匿名綁定。", - "Valid configuration, connection established!" : "有效的設定,連線已建立!", - "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的設定,但是綁定失敗。請檢查伺服器設定和證書。", - "Invalid configuration. Please have a look at the logs for further details." : "無效的設定。請檢查紀錄檔以取得更多詳細資訊。", + "Failed to clear the mappings." : "無法清除映射。", + "Failed to delete the server configuration" : "無法刪除伺服器組態設定", + "Invalid configuration: Anonymous binding is not allowed." : "無效的組態設定:不允許匿名綁定。", + "Valid configuration, connection established!" : "有效的組態設定,連線已建立!", + "Valid configuration, but binding failed. Please check the server settings and credentials." : "有效的組態設定,但是綁定失敗。請檢查伺服器設定與憑證。", + "Invalid configuration: %s" : "無效組態:%s", "No action specified" : "未指定動作", - "No configuration specified" : "未指定設定", + "No configuration specified" : "未指定組態設定", "No data specified" : "未指定資料", - " Could not set configuration %s" : "無法設定 %s", + "Invalid data specified" : "指定了無效的資料", + "Could not set configuration %1$s to %2$s" : "無法將組態 %1$s 設定為 %2$s", "Action does not exist" : "動作不存在", - "Renewing …" : "正在更新……", + "Renewing …" : "正在更新…", "Very weak password" : "密碼安全性極弱", "Weak password" : "密碼安全性弱", "So-so password" : "密碼安全性普通", "Good password" : "密碼安全性佳", "Strong password" : "密碼安全性極佳", "The Base DN appears to be wrong" : "Base DN 出現問題", - "Testing configuration…" : "正在測試設定……", - "Configuration incorrect" : "設定不正確", - "Configuration incomplete" : "設定未完成", - "Configuration OK" : "設定完成", - "Select groups" : "選擇群組", - "Select object classes" : "選擇物件", - "Please check the credentials, they seem to be wrong." : "請檢查您的憑證,它們似乎是錯的。", - "Please specify the port, it could not be auto-detected." : "請指定連接埠,其無法自動偵測。", - "Base DN could not be auto-detected, please revise credentials, host and port." : "無法自動偵測 Base DN,請修改憑證、主機與連接埠。", + "Testing configuration…" : "正在測試組態設定…", + "Configuration incorrect" : "組態設定不正確", + "Configuration incomplete" : "組態設定未完成", + "Configuration OK" : "組態設定完成", + "Select groups" : "選取群組", + "Select object classes" : "選取物件類別", + "Please check the credentials, they seem to be wrong." : "請檢查您的憑證,它們似乎有錯。", + "Please specify the port, it could not be auto-detected." : "請指定連接埠,它無法自動偵測。", + "Base DN could not be auto-detected, please revise credentials, host and port." : "無法自動偵測 Base DN,請修改憑證、主機、連接埠等。", "Could not detect Base DN, please enter it manually." : "偵測不到 Base DN,請手動輸入。", "{nthServer}. Server" : "{nthServer}. 伺服器", - "No object found in the given Base DN. Please revise." : "在 Base DN 中找不到物件。請修改", - "More than 1,000 directory entries available." : "超過 1,000 個目錄項目可用。", - "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["提供的 Base DN 中有 {objectsFound} 個項目"], - "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "遇到錯誤。請檢查 Base DN、連線設定與憑證。", - "Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器設定嗎?", + "No object found in the given Base DN. Please revise." : "在 Base DN 中找不到物件。請修正。", + "More than 1,000 directory entries available." : "有超過 1,000 個目錄條目可用。", + "_{objectsFound} entry available within the provided Base DN_::_{objectsFound} entries available within the provided Base DN_" : ["提供的 Base DN 中有 {objectsFound} 個條目可用"], + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "遭遇錯誤。請檢查 Base DN、連線設定、憑證等。", + "Do you really want to delete the current Server Configuration?" : "您真的要刪除現在的伺服器組態設定嗎?", "Confirm Deletion" : "確認刪除", "Mappings cleared successfully!" : "映射清除成功!", "Error while clearing the mappings." : "清除映射時發生錯誤。", @@ -41,160 +42,196 @@ "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "儲存失敗。請確保資料庫可以運作。繼續前請重新載入。", "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "切換模式將會啟用自動 LDAP 查詢。取決於您的 LDAP 大小,可能需要一些時間。您仍然想要切換模式嗎?", "Mode switch" : "模式切換", - "Select attributes" : "選擇屬性", + "Select attributes" : "選取特性", "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): <br/>" : "找不到使用者。請檢查您的登入資料與使用者名稱。有效的過濾條件(複製貼上以進行命令列驗證):<br/>", "User found and settings verified." : "使用者存在,設定值正確。", - "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "考慮縮小範圍,因為其涵蓋了許多使用者,但只有第一個才能登入。", + "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "請考慮縮小搜尋範圍,目前涵蓋了許多使用者,但只有第一個才能登入。", "An unspecified error occurred. Please check log and settings." : "發生不明錯誤。請檢查紀錄檔與設定。", - "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "搜尋過濾條件無效,可能是語法問題引起的,如括號不對稱等。請修改。", - "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "發生 LDAP/AD 的連線錯誤。請檢查主機、連接埠與憑證。", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "搜尋過濾條件無效,可能是語法問題引起,如括號不對稱等。請修正。", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "遭遇 LDAP/AD 的連線錯誤。請檢查主機、連接埠、憑證等。", "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "「%uid」佔位字串遺失。查詢 LDAP/AD 時將會使用登入名稱取代。", "Please provide a login name to test against" : "請提供登入名稱以便再次測試", - "The group box was disabled, because the LDAP/AD server does not support memberOf." : "因為 LDAP/AD 伺服器不支援 memberOf,所以停用群組盒。", - "Password change rejected. Hint: " : "密碼變更被拒絕。提示:", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "由於 LDAP/AD 伺服器不支援 memberOf,群組盒已停用。", + "Password change rejected. Hint: %s" : "密碼變更被拒絕。提示:%s", + "Mandatory field \"%s\" left empty" : "必填欄位「%s」為空", + "A password is given, but not an LDAP agent" : "已提供密碼,但並未提供 LDAP 代理程式", + "No password is given for the user agent" : "未提供使用者代理程式的密碼", + "No LDAP base DN was given" : "未提供 LDAP 基礎 DN", + "User base DN is not a subnode of global base DN" : "使用者基礎 DN 不是全域基礎 DN 的子節點", + "Group base DN is not a subnode of global base DN" : "群組基礎 DN 不是全域基礎 DN 的子節點", + "Login filter does not contain %s placeholder." : "登入過濾條件不包含 %s 佔位字串。", "Please login with the new password" : "請以新密碼登入", "LDAP User backend" : "LDAP 使用者後端", "Your password will expire tomorrow." : "您的密碼將於明天到期。", "Your password will expire today." : "您的密碼將於今天到期。", - "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於%n天後到期。"], + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["您的密碼將於 %n 天內到期。"], "LDAP/AD integration" : "LDAP/AD 整合", - "_%s group found_::_%s groups found_" : ["找到 %s 群組"], - "_%s user found_::_%s users found_" : ["找到 %s 使用者"], - "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "偵測不到使用者顯示名稱屬性。請在進階 LDAP 設定中自行指定。", + "LDAP Connection" : "LDAP 連線", + "_Binding failed for this LDAP configuration: %s_::_Binding failed for %n LDAP configurations: %s_" : ["%n LDAP 設定綁紮失敗:%s"], + "_Searching failed for this LDAP configuration: %s_::_Searching failed for %n LDAP configurations: %s_" : ["%n LDAP 設定搜尋失敗:%s"], + "_There is an inactive LDAP configuration: %s_::_There are %n inactive LDAP configurations: %s_" : ["有 %n 個不活躍的 LDAP 設定:%s"], + "_Binding and searching works on the configured LDAP connection (%s)_::_Binding and searching works on all of the %n configured LDAP connections (%s)_" : ["綁紮與搜尋適用於全部 %n 個已設定的 LDAP 連線 (%s)"], + "Invalid LDAP UUIDs" : "無效的 LDAP UUID", + "None found" : "找不到", + "Invalid UUIDs of LDAP accounts or groups have been found. Please review your \"Override UUID detection\" settings in the Expert part of the LDAP configuration and use \"occ ldap:update-uuid\" to update them." : "找到無效的 LDAP 帳號或群組 UUID。請審閱您在 LDAP 專家設定中的「覆寫 UUID 偵測」設定,並使用「occ ldap:update-uuid」來更新它們。", + "_%n group found_::_%n groups found_" : ["找到 %n 個群組"], + "> 1000 groups found" : "找到 > 1000 個群組", + "> 1000 users found" : "找到 > 1000 個使用者", + "_%n user found_::_%n users found_" : ["找到 %n 個使用者"], + "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "偵測不到使用者顯示名稱特性。請在進階 LDAP 設定中自行指定。", "Could not find the desired feature" : "找不到所需的功能", "Invalid Host" : "無效的主機", "LDAP user and group backend" : "LDAP 使用者與群組後端", "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄。", - "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄來進行驗證與提供使用者、群組與使用者屬性。管理員可以設定此應用程式來連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面的 Active Directories。如使用者配額、電子郵件、大頭照圖片、群組成員資格等屬性可以透過有適當查詢與過濾條件的目錄從 Nextcloud 拉取。\n\n使用者以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份驗證請求來授予存取權限。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對使用者進行身份驗證,然後 Nextcloud 會使用工作階段作為使用者 ID。更多資訊在 LDAP 使用者與群組後端文件中提供。", - "Test Configuration" : "測試設定", + "This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "此應用程式讓管理員可以將 Nextcloud 連線到以 LDAP 為基礎的使用者目錄,來認證與供應使用者、群組與使用者特性。管理員可以設定此應用程式連線到一個或更多個 LDAP 目錄,或是透過 LDAP 介面連線到 Active Directory。像是使用者容量限制、電子郵件、頭像圖片、群組成員資格等特性,可以透過適當查詢與過濾條件後的目錄從 Nextcloud 拉取。\n\n使用者以其 LDAP 或 AD 憑證登入 Nextcloud,並根據 LDAP 或 AD 伺服器處理的身份認證請求來授予存取權。Nextcloud 並不儲存 LDAP 或 AD 的密碼,而是使用這些憑證來對使用者進行身份認證,接著 Nextcloud 會使用工作階段作為使用者 ID。更多資訊請參閱 LDAP 使用者與群組後端文件。", + "Test Configuration" : "測試組態設定", "Help" : "說明", - "Groups meeting these criteria are available in %s:" : "符合這些條件的群組可在 %s 找到:", - "Only these object classes:" : "只有這些物件類別:", - "Only from these groups:" : "僅從這些群組:", + "Groups meeting these criteria are available in %s:" : "在 %s 中符合這些條件可用群組:", + "Only these object classes:" : "僅限這些物件類別:", + "Only from these groups:" : "僅限這些群組:", "Search groups" : "搜尋群組", "Available groups" : "可用的群組", - "Selected groups" : "已選擇的群組", + "Selected groups" : "已選取的群組", "Edit LDAP Query" : "編輯 LDAP 查詢", "LDAP Filter:" : "LDAP 過濾條件:", - "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾條件指定哪些 LDAP 群組有存取 %s 的權限。", + "The filter specifies which LDAP groups shall have access to the %s instance." : "過濾條件指定哪些 LDAP 群組應該具備 %s 站台的存取權。", "Verify settings and count the groups" : "驗證設定並計算群組", - "When logging in, %s will find the user based on the following attributes:" : "登入時,%s 將會根據以下屬性尋找使用者:", + "When logging in, %s will find the user based on the following attributes:" : "登入時,%s 將會根據以下特性尋找使用者:", "LDAP/AD Username:" : "LDAP/AD 使用者名稱:", - "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP/AD 使用者名稱登入,可以是 \"uid\" 或 \"sAMAccountName\"。", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP/AD 使用者名稱登入,可以是「uid」或「sAMAccountName」,會自動偵測。", "LDAP/AD Email Address:" : "LDAP/AD 電子郵件地址:", - "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "允許使用電子郵件屬性登入。允許使用 “mail” 與 “mailPrimaryAddress”。", - "Other Attributes:" : "其他屬性:", - "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義要套用的過濾條件,試圖登入時。\"%%uid\" 會在登入動作時取代使用者名稱。範例:\"uid=%%uid\"", + "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "允許以電子郵件特性登入。允許使用「mail」與「mailPrimaryAddress」。", + "Other Attributes:" : "其他特性:", + "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "定義試圖登入時所要套用的過濾條件。「%%uid」會在登入動作時取代使用者名稱。範例:「uid=%%uid」", "Test Loginname" : "測試登入名稱", + "Attempts to receive a DN for the given loginname and the current login filter" : "嘗試接收給定登入名稱與目前登入過濾條件的 DN", "Verify settings" : "驗證設定", "%s. Server:" : "%s. 伺服器:", - "Add a new configuration" : "建立一個新的設定", - "Copy current configuration into new directory binding" : "複製目前的設定檔到新目錄綁定", - "Delete the current configuration" : "刪除目前的設定檔", + "Add a new configuration" : "建立新的組態設定", + "Copy current configuration into new directory binding" : "複製目前的組態設定檔到新目錄綁定", + "Delete the current configuration" : "刪除目前的組態設定", "Host" : "主機", - "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非您需要 SSL,否則您可以忽略通訊協定,反之則請以 ldaps:// 開頭", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "除非您需要 SSL,否則您可以忽略通訊協定。如果需要,請以 ldaps:// 開頭", "Port" : "連接埠", - "Detect Port" : "偵測連接阜", + "Detect Port" : "偵測連接埠", "User DN" : "使用者 DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "客戶端使用者的 DN 與特定字詞的連結需要完善,例如:uid=agent,dc=example,dc=com。若是匿名存取,則將 DN 與密碼欄位留空。", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "客戶端使用者的 DN 綁定需要完成,例如:uid=agent,dc=example,dc=com。若是匿名存取,則請將 DN 與密碼欄位留空。", "Password" : "密碼", - "For anonymous access, leave DN and Password empty." : "匿名存取時請將 DN 與密碼欄位留空。", + "For anonymous access, leave DN and Password empty." : "匿名存取時,請將 DN 與密碼欄位留空。", "Save Credentials" : "儲存憑證", "One Base DN per line" : "一行一個 Base DN", "You can specify Base DN for users and groups in the Advanced tab" : "您可以在「進階」分頁中為使用者與群組指定 Base DN", "Detect Base DN" : "偵測 Base DN", "Test Base DN" : "測試 Base DN", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "避免自動 LDAP 請求。適合較大規模的安裝,但需要一些 LDAP 知識。", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "避免自動 LDAP 請求。適合較大規模的安裝設置,但需要具備一些 LDAP 知識。", "Manually enter LDAP filters (recommended for large directories)" : "手動輸入 LDAP 過濾條件(建議用於大型目錄)", - "Listing and searching for users is constrained by these criteria:" : "列出和搜索用戶受到以下條件的約束:", - "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "使用者最常見的物件類別是 organizationalPerson、person、user 與 inetOrgPerson。如果不確定要選取哪個物件類別,請諮詢您的目錄管理員。", - "The filter specifies which LDAP users shall have access to the %s instance." : "過濾條件指定哪些 LDAP 使用者有存取 %s 的權限。", - "Verify settings and count users" : "驗證設定並計算使用者數", + "Listing and searching for users is constrained by these criteria:" : "列出和搜尋以下條件限定的使用者:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "使用者最常見的物件類別是 organizationalPerson、person、user、inetOrgPerson 等。如果不確定要選取哪個物件類別,則請諮詢您的目錄管理員。", + "The filter specifies which LDAP users shall have access to the %s instance." : "過濾條件指定哪些 LDAP 使用者應具備 %s 站台的存取權。", + "Verify settings and count users" : "驗證設定並計算使用者", "Saving" : "儲存", "Back" : "返回", "Continue" : "繼續", - "Please renew your password." : "請更新您的密碼", + "Please renew your password." : "請更新您的密碼。", "An internal error occurred." : "發生內部錯誤。", - "Please try again or contact your administrator." : "請重試或聯絡您的系統管理員。", + "Please try again or contact your administrator." : "請重試,或聯絡您的系統管理員。", "Current password" : "目前密碼", "New password" : "新密碼", "Renew password" : "更新密碼", - "Wrong password." : "密碼錯誤", + "Wrong password." : "密碼錯誤。", "Cancel" : "取消", "Server" : "伺服器", "Users" : "使用者", - "Login Attributes" : "登入屬性", + "Login Attributes" : "登入特性", "Groups" : "群組", "Expert" : "專家", "Advanced" : "進階", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>警告:</b>未安裝 PHP LDAP 模組,後端系統將無法運作。請要求您的系統管理員安裝它。", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>警告:</b>未安裝 PHP LDAP 模組,後端系統將無法運作。請要求您的系統管理員安裝。", "Connection Settings" : "連線設定", - "Configuration Active" : "設定作用中", - "When unchecked, this configuration will be skipped." : "沒有被勾選時,此設定會被略過。", - "Backup (Replica) Host" : "備用(複本)主機", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "提供可選的備用主機。其必須為主要 LDAP/AD 伺服器的複本。", - "Backup (Replica) Port" : "備用(複本)連接埠", + "Configuration Active" : "組態設定作用中", + "When unchecked, this configuration will be skipped." : "沒有勾選時,此組態設定會被略過。", + "Backup (Replica) Host" : "備援(複本)主機", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "提供可選的備援主機。這必須是主要 LDAP/AD 伺服器的複本。", + "Backup (Replica) Port" : "備援(複本)連接埠", "Disable Main Server" : "停用主伺服器", "Only connect to the replica server." : "僅連線至複本伺服器。", - "Turn off SSL certificate validation." : "關閉 SSL 憑證檢查。", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "不建議,請僅在測試時使用!如果連線只能在此設定下運作,請匯入 LDAP 伺服器的 SSL 憑證到您的伺服器 %s 上。", + "Turn off SSL certificate validation." : "關閉 SSL 憑證驗證。", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "不建議,請僅在測試時使用!如果連線只能在此選項下運作,請匯入 LDAP 伺服器的 SSL 憑證到您的 %s 伺服器上。", "Cache Time-To-Live" : "快取的存活時間", "in seconds. A change empties the cache." : "以秒為單位。變更後會清空快取。", "Directory Settings" : "目錄設定", "User Display Name Field" : "使用者顯示名稱欄位", - "The LDAP attribute to use to generate the user's display name." : "用於生成使用者顯示名稱的 LDAP 屬性。", + "The LDAP attribute to use to generate the user's display name." : "用於生成使用者顯示名稱的 LDAP 特性。", "2nd User Display Name Field" : "第二個使用者顯示名稱欄位", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "選填。要加進顯示名稱中括號的 LDAP 屬性。例如 »John Doe (john.doe@example.org)«。", - "Base User Tree" : "Base User Tree", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "選填。要加進顯示名稱括號中的 LDAP 特性。例如 »John Doe (john.doe@example.org)«。", + "Base User Tree" : "基本使用者樹", "One User Base DN per line" : "一行一個使用者 Base DN", - "User Search Attributes" : "User Search Attributes", - "Optional; one attribute per line" : "非必要,一行一項屬性", + "User Search Attributes" : "使用者搜尋特性", + "Optional; one attribute per line" : "選填;一行一項特性", + "Disable users missing from LDAP" : "停用 LDAP 中沒有的使用者", + "When switched on, users imported from LDAP which are then missing will be disabled" : "開啟後,從 LDAP 匯入但隨後消失的使用者將被停用", "Group Display Name Field" : "群組顯示名稱欄位", - "The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 屬性。", - "Base Group Tree" : "Base Group Tree", - "One Group Base DN per line" : "一行一個 Group Base DN", - "Group Search Attributes" : "Group Search Attributes", - "Group-Member association" : "Group-Member association", - "Dynamic Group Member URL" : "Dynamic Group Member URL", - "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "群組物件上的 LDAP 屬性包含了一個 LDAP 搜尋 URL,該 URL 決定了哪些物件屬於群組。(空白設定將會停用動態群組成員資格功能。)", - "Nested Groups" : "Nested Groups", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "啟用後,將會支援包含群組的群組。(僅在群組成員屬性包含 DN 時可正常運作。)", + "The LDAP attribute to use to generate the groups's display name." : "用於生成群組顯示名稱的 LDAP 特性。", + "Base Group Tree" : "Base 群組樹", + "One Group Base DN per line" : "一行一個群組 Base DN", + "Group Search Attributes" : "群組搜尋特性", + "Group-Member association" : "群組與成員關聯", + "Dynamic Group Member URL" : "動態群組成員 URL", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "群組物件上的 LDAP 特性包含了 LDAP 搜尋 URL,該 URL 決定了哪些物件屬於該群組。(空白設定將會停用動態群組成員資格功能。)", + "Nested Groups" : "巢狀群組", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "啟用後,將會支援包含群組的群組。(僅在群組成員特性包含 DN 時可正常運作。)", "Paging chunksize" : "分頁區塊大小", - "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁 LDAP 搜尋使用的區塊大小可能會回傳大量結果,如使用者或群組列舉。(在這種情況下,將其設定為 0 將會停用分頁 LDAP 搜尋。)", - "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼", - "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會有效。因為密碼以明文形式傳送到 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊。", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "分頁式 LDAP 搜尋所使用的區塊大小,可能會回傳大量結果,例如使用者或群組列舉。(在這種情況下,設定為 0 會停用分頁式 LDAP 搜尋。)", + "Enable LDAP password changes per user" : "啟用每個使用者的 LDAP 密碼變更", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "允許 LDAP 使用者變更他們的密碼,並允許超級管理員與群組管理員變更其 LDAP 使用者的密碼。僅當在 LDAP 伺服器上設定了對應的存取控制策略時,此選項才會生效。由於密碼會以明文形式傳送給 LDAP 伺服器,因此必須使用傳輸加密,且必須在 LDAP 伺服器上設定密碼雜湊處理。", "(New password is sent as plain text to LDAP)" : "(新密碼會以明文傳送給 LDAP)", "Default password policy DN" : "預設密碼策略 DN", - "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,其將用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更且 OpenLDAP 支援時才能正常運作。保留為空將停用密碼過期處理。", - "Special Attributes" : "特殊屬性", - "Quota Field" : "配額欄位", - "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "留空將以使用者的預設配額為準。否則請指定 LDAP/AD 屬性。", - "Quota Default" : "預設配額", - "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "覆寫沒有在配額欄位中設定配額的 LDAP 使用者的預設配額。", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "預設密碼策略的 DN,用於密碼過期處理。僅當啟用了每個使用者的 LDAP 密碼變更時才能正常運作,僅 OpenLDAP 有支援。保留空白將停用密碼過期處理。", + "Special Attributes" : "特殊特性", + "Quota Field" : "容量限制欄位", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "留空將以使用者的預設容量限制為準。否則,請指定 LDAP/AD 特性。", + "Quota Default" : "容量限制預設", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "凌駕在容量限制欄位中沒有設定配額容量的 LDAP 使用者的預設配額。", "Email Field" : "電子郵件欄位", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "從 LDAP 屬性設定使用者的電子郵件。將其留空為預設行為。", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "根據 LDAP 特性設定使用者的電子郵件。留空將採預設行為。", "User Home Folder Naming Rule" : "使用者家目錄的命名規則", - "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "使用者名稱留空(預設值)。否則請指定 LDAP/AD 屬性。", - "\"$home\" Placeholder Field" : "\"$home\" 佔位字串欄位", - "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部儲存空間設定中的 $home 將會以指定屬性的值取代", + "Leave empty for username (default). Otherwise, specify an LDAP/AD attribute." : "留空將採用使用者名稱(預設值)。否則,請指定 LDAP/AD 特性。", + "\"$home\" Placeholder Field" : "「$home」佔位字串欄位", + "$home in an external storage configuration will be replaced with the value of the specified attribute" : "外部儲存空間組態設定中的 $home 將會以指定特性的值取代", + "User Profile Attributes" : "使用者個人檔案特性", + "Phone Field" : "電話號碼欄位", + "User profile Phone will be set from the specified attribute" : "使用者個人檔案電話號碼將根據指定的特性設定", + "Website Field" : "網站欄位", + "User profile Website will be set from the specified attribute" : "使用者個人檔案網站將根據指定的特性設定", + "Address Field" : "地址欄位", + "User profile Address will be set from the specified attribute" : "使用者個人檔案地址將根據指定的特性設定", + "Twitter Field" : "Twitter 欄位", + "User profile Twitter will be set from the specified attribute" : "使用者個人檔案 Twitter 將根據指定的特性設定", + "Fediverse Field" : "聯邦宇宙欄位", + "User profile Fediverse will be set from the specified attribute" : "使用者個人檔案聯邦宇宙將根據指定的特性設定", + "Organisation Field" : "組織單位欄位", + "User profile Organisation will be set from the specified attribute" : "使用者個人檔案組織單位將根據指定的特性設定", + "Role Field" : "職位欄位", + "User profile Role will be set from the specified attribute" : "使用者個人檔案職位將根據指定的特性設定", + "Headline Field" : "重要經歷欄位", + "User profile Headline will be set from the specified attribute" : "使用者個人檔案重要經歷將根據指定的特性設定", + "Biography Field" : "自傳欄位", + "User profile Biography will be set from the specified attribute" : "使用者個人檔案自傳將根據指定的特性設定", + "Birthdate Field" : "出生日期欄位", + "User profile Date of birth will be set from the specified attribute" : "使用者個人資料的出生日期將從指定的屬性中設定", + "Pronouns Field" : "代名詞欄位", + "User profile Pronouns will be set from the specified attribute" : "使用者個人資料代名詞將從指定的屬性設定", "Internal Username" : "內部使用者名稱", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "預設情況下,內部使用者名稱將從 UUID 屬性建立。其確保了使用者名稱是唯一且不需要轉換字元。內部使用者名稱的限制是只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部使用者名稱用於內部識別使用者。其也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。變更僅對新映射(新增)的 LDAP 使用者有效。將其留空會使用預設行為。", - "Internal Username Attribute:" : "內部使用者名稱屬性:", - "Override UUID detection" : "偵測覆寫 UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 屬性會自動偵測。UUID 屬性用來準確識別 LDAP 使用者及群組。此外,如果未在上方指定,內部使用者名稱會以 UUID 為基礎建立。您能覆寫設定並直接指定屬性,但一定要確保指定的屬性能被使用者及群組取得且唯一。留空則執行預設行為。變更只會對新映射(新增)的 LDAP 使用者及群組生效。", - "UUID Attribute for Users:" : "使用者的 UUID 屬性:", - "UUID Attribute for Groups:" : "群組的 UUID 屬性:", - "Username-LDAP User Mapping" : "使用者-LDAP 使用者映射", - "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "使用者名稱用於儲存並指派詮釋資料。為了精確識別並認出使用者,每個 LDAP 使用者都將會有內部使用者名稱。這需要從使用者名稱到 LDAP 使用者的映射。已建立的使用者名稱會映射到 LDAP 使用者的 UUID。另外,DN 會被快取以減少 LDAP 互動,但不會用於識別。若 DN 變更,將會找到變更。內部使用者名稱將會全面使用。清除映射將會讓到處都是未連結的項目。清除映射對設定並不敏感,其會影響到所有 LDAP 設定!不要在生產環境中清除映射,僅將其用於測試或實驗階段。", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior." : "預設情況下,內部使用者名稱將根據 UUID 特性建立。這能確保使用者名稱是唯一,且不需要轉換字元。內部使用者名稱的限制是,只能使用下列字元:[a-zA-Z0-9_.@-]。其他字元會使用其 ASCII 對映取代,或是直接忽略。發生名稱碰撞時,將會加入或加大數字。內部使用者名稱用於內部識別使用者。這也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,例如,會用在所有 DAV 服務上。啟用此設定後,預設的行為會被凌駕。變更僅對新映射(新增)的 LDAP 使用者有效。將其留空會使用預設行為。", + "Internal Username Attribute:" : "內部使用者名稱特性:", + "Override UUID detection" : "凌駕 UUID 偵測", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "預設情況下,UUID 特性會自動偵測。UUID 特性用來準確識別 LDAP 使用者及群組。此外,如果未在上方指定,則內部使用者名稱會以 UUID 為基礎建立。您可以覆寫原設定,並且根據您的想法直接指定特性,但一定要確保所指定的特性能取得使用者及群組並是唯一的。留空將採取預設行為。變更只會對新映射(新增)的 LDAP 使用者及群組生效。", + "UUID Attribute for Users:" : "使用者的 UUID 特性:", + "UUID Attribute for Groups:" : "群組的 UUID 特性:", + "Username-LDAP User Mapping" : "使用者名稱-LDAP 使用者映射", + "Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "使用者名稱用於儲存並指派中介資料。為了精確識別並認知使用者,每個 LDAP 使用者都會有其內部使用者名稱。這需要從使用者名稱作映射到 LDAP 使用者。建立的使用者名稱會映射到 LDAP 使用者的 UUID。另外,DN 會被快取以減少 LDAP 互動,但快取不用於識別身份。若 DN 變更時,系統會發現變動。內部使用者名稱在系統中全面使用,所以一旦清除映射,會讓到處都是未連結的殘留項目。清除映射的行為並不會區分組態設定,而是會影響所有 LDAP 組態設定!請永遠不要在正式環境中清除映射,僅在測試或實驗階段使用。", "Clear Username-LDAP User Mapping" : "清除使用者名稱-LDAP 使用者映射", "Clear Groupname-LDAP Group Mapping" : "清除群組名稱-LDAP 群組映射", - "A connection error to LDAP / AD occurred, please check host, port and credentials." : "發生 LDAP / AD 的連線錯誤,請檢查主機、連接埠與憑證。", - "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "「%uid」佔位字串遺失。查詢 LDAP / AD 時將會使用登入名稱取代。", - "The group box was disabled, because the LDAP / AD server does not support memberOf." : "因為 LDAP / AD 伺服器不支援 memberOf,所以停用群組盒。", - "LDAP / AD integration" : "LDAP / AD 整合", - "LDAP / AD Username:" : "LDAP / AD 使用者名稱:", - "Allows login against the LDAP / AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "允許使用 LDAP / AD 使用者名稱登入,可以是 \"uid\" 或 \"sAMAccountName\"。", - "LDAP / AD Email Address:" : "LDAP / AD 電子郵件地址:", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "預設情況下,內部使用者名稱將從 UUID 屬性建立。其確保了使用者名稱是唯一且不需要轉換字元。內部使用者名稱的限制是只能使用下列字元:[ a-zA-Z0-9_.@- ]。其他字元會使用其 ASCII 對映或被忽略。發生碰撞時,將會加入數字。內部使用者名稱用於內部識別使用者。其也是使用者家資料夾的預設名稱。也是遠端 URL 的一部分,舉例來說,會用於所有 *DAV 服務。使用此設定,預設的行為將會被覆寫。將其留空會使用預設行為。變更僅對新映射(新增)的 LDAP 使用者有效。" + "Invalid configuration. Please have a look at the logs for further details." : "無效的組態設定。請檢查紀錄檔以取得更多詳細資訊。" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php index 29d60817c02..9fe0aa64268 100644 --- a/apps/user_ldap/lib/Access.php +++ b/apps/user_ldap/lib/Access.php @@ -1,48 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Aaron Wood <aaronjwood@gmail.com> - * @author Andreas Fischer <bantu@owncloud.com> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Benjamin Diele <benjamin@diele.be> - * @author bline <scottbeck@gmail.com> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Daniel Kesselberg <mail@danielkesselberg.de> - * @author J0WI <J0WI@users.noreply.github.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Mario Kolling <mario.kolling@serpro.gov.br> - * @author Max Kovalenko <mxss1998@yandex.ru> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Nicolas Grekas <nicolas.grekas@gmail.com> - * @author Peter Kubica <peter@kubica.ch> - * @author Ralph Krimmel <rkrimme1@gwdg.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Roland Tapken <roland@bitarbeiter.net> - * @author root <root@localhost.localdomain> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; @@ -54,9 +15,15 @@ use OCA\User_LDAP\Exceptions\NoMoreResults; use OCA\User_LDAP\Mapping\AbstractMapping; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\OfflineUser; +use OCP\EventDispatcher\IEventDispatcher; use OCP\HintException; +use OCP\IAppConfig; use OCP\IConfig; +use OCP\IGroupManager; use OCP\IUserManager; +use OCP\Server; +use OCP\User\Events\UserIdAssignedEvent; +use OCP\Util; use Psr\Log\LoggerInterface; use function strlen; use function substr; @@ -69,10 +36,6 @@ use function substr; class Access extends LDAPUtility { public const UUID_ATTRIBUTES = ['entryuuid', 'nsuniqueid', 'objectguid', 'guid', 'ipauniqueid']; - /** @var \OCA\User_LDAP\Connection */ - public $connection; - /** @var Manager */ - public $userManager; /** * never ever check this var directly, always use getPagedSearchResultState * @var ?bool @@ -85,36 +48,21 @@ class Access extends LDAPUtility { /** @var ?AbstractMapping */ protected $groupMapper; - /** - * @var \OCA\User_LDAP\Helper - */ - private $helper; - /** @var IConfig */ - private $config; - /** @var IUserManager */ - private $ncUserManager; - /** @var LoggerInterface */ - private $logger; - /** @var string */ - private $lastCookie = ''; + private string $lastCookie = ''; public function __construct( - Connection $connection, ILDAPWrapper $ldap, - Manager $userManager, - Helper $helper, - IConfig $config, - IUserManager $ncUserManager, - LoggerInterface $logger + public Connection $connection, + public Manager $userManager, + private Helper $helper, + private IConfig $config, + private IUserManager $ncUserManager, + private LoggerInterface $logger, + private IAppConfig $appConfig, + private IEventDispatcher $dispatcher, ) { parent::__construct($ldap); - $this->connection = $connection; - $this->userManager = $userManager; $this->userManager->setLdapAccess($this); - $this->helper = $helper; - $this->config = $config; - $this->ncUserManager = $ncUserManager; - $this->logger = $logger; } /** @@ -170,14 +118,64 @@ class Access extends LDAPUtility { } /** + * Reads several attributes for an LDAP record identified by a DN and a filter + * No support for ranged attributes. + * + * @param string $dn the record in question + * @param array $attrs the attributes that shall be retrieved + * if empty, just check the record's existence + * @param string $filter + * @return array|false an array of values on success or an empty + * array if $attr is empty, false otherwise + * @throws ServerNotAvailableException + */ + public function readAttributes(string $dn, array $attrs, string $filter = 'objectClass=*'): array|false { + if (!$this->checkConnection()) { + $this->logger->warning( + 'No LDAP Connector assigned, access impossible for readAttribute.', + ['app' => 'user_ldap'] + ); + return false; + } + $cr = $this->connection->getConnectionResource(); + $attrs = array_map( + fn (string $attr): string => mb_strtolower($attr, 'UTF-8'), + $attrs, + ); + + $values = []; + $record = $this->executeRead($dn, $attrs, $filter); + if (is_bool($record)) { + // when an exists request was run and it was successful, an empty + // array must be returned + return $record ? [] : false; + } + + $result = []; + foreach ($attrs as $attr) { + $values = $this->extractAttributeValuesFromResult($record, $attr); + if (!empty($values)) { + $result[$attr] = $values; + } + } + + if (!empty($result)) { + return $result; + } + + $this->logger->debug('Requested attributes {attrs} not found for ' . $dn, ['app' => 'user_ldap', 'attrs' => $attrs]); + return false; + } + + /** * reads a given attribute for an LDAP record identified by a DN * * @param string $dn the record in question * @param string $attr the attribute that shall be retrieved - * if empty, just check the record's existence + * if empty, just check the record's existence * @param string $filter * @return array|false an array of values on success or an empty - * array if $attr is empty, false otherwise + * array if $attr is empty, false otherwise * @throws ServerNotAvailableException */ public function readAttribute(string $dn, string $attr, string $filter = 'objectClass=*') { @@ -189,20 +187,6 @@ class Access extends LDAPUtility { return false; } $cr = $this->connection->getConnectionResource(); - if (!$this->ldap->isResource($cr)) { - //LDAP not available - $this->logger->debug('LDAP resource not available.', ['app' => 'user_ldap']); - return false; - } - //Cancel possibly running Paged Results operation, otherwise we run in - //LDAP protocol errors - $this->abandonPagedSearch(); - // openLDAP requires that we init a new Paged Search. Not needed by AD, - // but does not hurt either. - $pagingSize = (int)$this->connection->ldapPagingSize; - // 0 won't result in replies, small numbers may leave out groups - // (cf. #12306), 500 is default for paging and should work everywhere. - $maxResults = $pagingSize > 20 ? $pagingSize : 500; $attr = mb_strtolower($attr, 'UTF-8'); // the actual read attribute later may contain parameters on a ranged // request, e.g. member;range=99-199. Depends on server reply. @@ -211,7 +195,7 @@ class Access extends LDAPUtility { $values = []; $isRangeRequest = false; do { - $result = $this->executeRead($dn, $attrToRead, $filter, $maxResults); + $result = $this->executeRead($dn, $attrToRead, $filter); if (is_bool($result)) { // when an exists request was run and it was successful, an empty // array must be returned @@ -258,17 +242,9 @@ class Access extends LDAPUtility { * returned data on a successful usual operation * @throws ServerNotAvailableException */ - public function executeRead(string $dn, string $attribute, string $filter, int $maxResults) { - try { - $this->initPagedSearch($filter, $dn, [$attribute], $maxResults, 0); - } catch (NoMoreResults $e) { - // does not happen, no pagination here since offset is 0, but the - // previous call is needed for a potential reset of the state. - // Tools would still point out a possible NoMoreResults exception. - return false; - } + public function executeRead(string $dn, string|array $attribute, string $filter) { $dn = $this->helper->DNasBaseParameter($dn); - $rr = @$this->invokeLDAPMethod('read', $dn, $filter, [$attribute]); + $rr = @$this->invokeLDAPMethod('read', $dn, $filter, (is_string($attribute) ? [$attribute] : $attribute)); if (!$this->ldap->isResource($rr)) { if ($attribute !== '') { //do not throw this message on userExists check, irritates @@ -287,7 +263,7 @@ class Access extends LDAPUtility { return false; } //LDAP attributes are not case sensitive - $result = \OCP\Util::mb_array_change_key_case( + $result = Util::mb_array_change_key_case( $this->invokeLDAPMethod('getAttributes', $er), MB_CASE_LOWER, 'UTF-8'); return $result; @@ -297,6 +273,8 @@ class Access extends LDAPUtility { * Normalizes a result grom getAttributes(), i.e. handles DNs and binary * data if present. * + * DN values are escaped as per RFC 2253 + * * @param array $result from ILDAPWrapper::getAttributes() * @param string $attribute the attribute name that was read * @return string[] @@ -328,20 +306,19 @@ class Access extends LDAPUtility { * @return array If a range was detected with keys 'values', 'attributeName', * 'attributeFull' and 'rangeHigh', otherwise empty. */ - public function extractRangeData($result, $attribute) { + public function extractRangeData(array $result, string $attribute): array { $keys = array_keys($result); foreach ($keys as $key) { - if ($key !== $attribute && strpos((string)$key, $attribute) === 0) { + if ($key !== $attribute && str_starts_with((string)$key, $attribute)) { $queryData = explode(';', (string)$key); - if (strpos($queryData[1], 'range=') === 0) { + if (isset($queryData[1]) && str_starts_with($queryData[1], 'range=')) { $high = substr($queryData[1], 1 + strpos($queryData[1], '-')); - $data = [ + return [ 'values' => $result[$key], 'attributeName' => $queryData[0], 'attributeFull' => $key, 'rangeHigh' => $high, ]; - return $data; } } } @@ -362,17 +339,12 @@ class Access extends LDAPUtility { throw new \Exception('LDAP password changes are disabled.'); } $cr = $this->connection->getConnectionResource(); - if (!$this->ldap->isResource($cr)) { - //LDAP not available - $this->logger->debug('LDAP resource not available.', ['app' => 'user_ldap']); - return false; - } try { // try PASSWD extended operation first - return @$this->invokeLDAPMethod('exopPasswd', $userDN, '', $password) || - @$this->invokeLDAPMethod('modReplace', $userDN, $password); + return @$this->invokeLDAPMethod('exopPasswd', $userDN, '', $password) + || @$this->invokeLDAPMethod('modReplace', $userDN, $password); } catch (ConstraintViolationException $e) { - throw new HintException('Password change rejected.', \OC::$server->getL10N('user_ldap')->t('Password change rejected. Hint: ') . $e->getMessage(), (int)$e->getCode()); + throw new HintException('Password change rejected.', Util::getL10N('user_ldap')->t('Password change rejected. Hint: %s', $e->getMessage()), (int)$e->getCode()); } } @@ -423,7 +395,7 @@ class Access extends LDAPUtility { $domainParts = []; $dcFound = false; foreach ($allParts as $part) { - if (!$dcFound && strpos($part, 'dc=') === 0) { + if (!$dcFound && str_starts_with($part, 'dc=')) { $dcFound = true; } if ($dcFound) { @@ -466,10 +438,11 @@ class Access extends LDAPUtility { * * @param string $fdn the dn of the group object * @param string $ldapName optional, the display name of the object + * @param bool $autoMapping Should the group be mapped if not yet mapped * @return string|false with the name to use in Nextcloud, false on DN outside of search DN * @throws \Exception */ - public function dn2groupname($fdn, $ldapName = null) { + public function dn2groupname($fdn, $ldapName = null, bool $autoMapping = true) { //To avoid bypassing the base DN settings under certain circumstances //with the group support, check whether the provided DN matches one of //the given Bases @@ -477,7 +450,7 @@ class Access extends LDAPUtility { return false; } - return $this->dn2ocname($fdn, $ldapName, false); + return $this->dn2ocname($fdn, $ldapName, false, autoMapping:$autoMapping); } /** @@ -488,7 +461,7 @@ class Access extends LDAPUtility { * @return string|false with with the name to use in Nextcloud * @throws \Exception */ - public function dn2username($fdn, $ldapName = null) { + public function dn2username($fdn) { //To avoid bypassing the base DN settings under certain circumstances //with the group support, check whether the provided DN matches one of //the given Bases @@ -496,7 +469,7 @@ class Access extends LDAPUtility { return false; } - return $this->dn2ocname($fdn, $ldapName, true); + return $this->dn2ocname($fdn, null, true); } /** @@ -507,19 +480,21 @@ class Access extends LDAPUtility { * @param bool $isUser optional, whether it is a user object (otherwise group assumed) * @param bool|null $newlyMapped * @param array|null $record + * @param bool $autoMapping Should the group be mapped if not yet mapped * @return false|string with with the name to use in Nextcloud * @throws \Exception */ - public function dn2ocname($fdn, $ldapName = null, $isUser = true, &$newlyMapped = null, array $record = null) { + public function dn2ocname($fdn, $ldapName = null, $isUser = true, &$newlyMapped = null, ?array $record = null, bool $autoMapping = true) { + static $intermediates = []; + if (isset($intermediates[($isUser ? 'user-' : 'group-') . $fdn])) { + return false; // is a known intermediate + } + $newlyMapped = false; if ($isUser) { $mapper = $this->getUserMapper(); - $nameAttribute = $this->connection->ldapUserDisplayName; - $filter = $this->connection->ldapUserFilter; } else { $mapper = $this->getGroupMapper(); - $nameAttribute = $this->connection->ldapGroupDisplayName; - $filter = $this->connection->ldapGroupFilter; } //let's try to retrieve the Nextcloud name from the mappings table @@ -528,6 +503,41 @@ class Access extends LDAPUtility { return $ncName; } + if (!$autoMapping) { + /* If no auto mapping, stop there */ + return false; + } + + if ($isUser) { + $nameAttribute = strtolower($this->connection->ldapUserDisplayName); + $filter = $this->connection->ldapUserFilter; + $uuidAttr = 'ldapUuidUserAttribute'; + $uuidOverride = $this->connection->ldapExpertUUIDUserAttr; + $usernameAttribute = strtolower($this->connection->ldapExpertUsernameAttr); + $attributesToRead = [$nameAttribute,$usernameAttribute]; + // TODO fetch also display name attributes and cache them if the user is mapped + } else { + $nameAttribute = strtolower($this->connection->ldapGroupDisplayName); + $filter = $this->connection->ldapGroupFilter; + $uuidAttr = 'ldapUuidGroupAttribute'; + $uuidOverride = $this->connection->ldapExpertUUIDGroupAttr; + $attributesToRead = [$nameAttribute]; + } + + if ($this->detectUuidAttribute($fdn, $isUser, false, $record)) { + $attributesToRead[] = $this->connection->$uuidAttr; + } + + if ($record === null) { + /* No record was passed, fetch it */ + $record = $this->readAttributes($fdn, $attributesToRead, $filter); + if ($record === false) { + $this->logger->debug('Cannot read attributes for ' . $fdn . '. Skipping.', ['filter' => $filter]); + $intermediates[($isUser ? 'user-' : 'group-') . $fdn] = true; + return false; + } + } + //second try: get the UUID and check if it is known. Then, update the DN and return the name. $uuid = $this->getUUID($fdn, $isUser, $record); if (is_string($uuid)) { @@ -542,19 +552,9 @@ class Access extends LDAPUtility { return false; } - if (is_null($ldapName)) { - $ldapName = $this->readAttribute($fdn, $nameAttribute, $filter); - if (!isset($ldapName[0]) || empty($ldapName[0])) { - $this->logger->debug('No or empty name for ' . $fdn . ' with filter ' . $filter . '.', ['app' => 'user_ldap']); - return false; - } - $ldapName = $ldapName[0]; - } - if ($isUser) { - $usernameAttribute = (string)$this->connection->ldapExpertUsernameAttr; if ($usernameAttribute !== '') { - $username = $this->readAttribute($fdn, $usernameAttribute); + $username = $record[$usernameAttribute]; if (!isset($username[0]) || empty($username[0])) { $this->logger->debug('No or empty username (' . $usernameAttribute . ') for ' . $fdn . '.', ['app' => 'user_ldap']); return false; @@ -576,6 +576,15 @@ class Access extends LDAPUtility { return false; } } else { + if (is_null($ldapName)) { + $ldapName = $record[$nameAttribute]; + if (!isset($ldapName[0]) || empty($ldapName[0])) { + $this->logger->debug('No or empty name for ' . $fdn . ' with filter ' . $filter . '.', ['app' => 'user_ldap']); + $intermediates['group-' . $fdn] = true; + return false; + } + $ldapName = $ldapName[0]; + } $intName = $this->sanitizeGroupIDCandidate($ldapName); } @@ -587,12 +596,13 @@ class Access extends LDAPUtility { $this->connection->setConfiguration(['ldapCacheTTL' => 0]); if ($intName !== '' && (($isUser && !$this->ncUserManager->userExists($intName)) - || (!$isUser && !\OC::$server->getGroupManager()->groupExists($intName)) + || (!$isUser && !Server::get(IGroupManager::class)->groupExists($intName)) ) ) { $this->connection->setConfiguration(['ldapCacheTTL' => $originalTTL]); $newlyMapped = $this->mapAndAnnounceIfApplicable($mapper, $fdn, $intName, $uuid, $isUser); if ($newlyMapped) { + $this->logger->debug('Mapped {fdn} as {name}', ['fdn' => $fdn,'name' => $intName]); return $intName; } } @@ -601,6 +611,14 @@ class Access extends LDAPUtility { $altName = $this->createAltInternalOwnCloudName($intName, $isUser); if (is_string($altName)) { if ($this->mapAndAnnounceIfApplicable($mapper, $fdn, $altName, $uuid, $isUser)) { + $this->logger->warning( + 'Mapped {fdn} as {altName} because of a name collision on {intName}.', + [ + 'fdn' => $fdn, + 'altName' => $altName, + 'intName' => $intName, + ] + ); $newlyMapped = true; return $altName; } @@ -616,13 +634,16 @@ class Access extends LDAPUtility { string $fdn, string $name, string $uuid, - bool $isUser + bool $isUser, ): bool { if ($mapper->map($fdn, $name, $uuid)) { - if ($this->ncUserManager instanceof PublicEmitter && $isUser) { + if ($isUser) { $this->cacheUserExists($name); - $this->ncUserManager->emit('\OC\User', 'assignedUserId', [$name]); - } elseif (!$isUser) { + $this->dispatcher->dispatchTyped(new UserIdAssignedEvent($name)); + if ($this->ncUserManager instanceof PublicEmitter) { + $this->ncUserManager->emit('\OC\User', 'assignedUserId', [$name]); + } + } else { $this->cacheGroupExists($name); } return true; @@ -634,7 +655,7 @@ class Access extends LDAPUtility { * gives back the user names as they are used ownClod internally * * @param array $ldapUsers as returned by fetchList() - * @return array an array with the user names to use in Nextcloud + * @return array<int,string> an array with the user names to use in Nextcloud * * gives back the user names as they are used ownClod internally * @throws \Exception @@ -647,7 +668,7 @@ class Access extends LDAPUtility { * gives back the group names as they are used ownClod internally * * @param array $ldapGroups as returned by fetchList() - * @return array an array with the group names to use in Nextcloud + * @return array<int,string> an array with the group names to use in Nextcloud * * gives back the group names as they are used ownClod internally * @throws \Exception @@ -658,6 +679,7 @@ class Access extends LDAPUtility { /** * @param array[] $ldapObjects as returned by fetchList() + * @return array<int,string> * @throws \Exception */ private function ldap2NextcloudNames(array $ldapObjects, bool $isUsers): array { @@ -722,6 +744,7 @@ class Access extends LDAPUtility { */ public function cacheUserExists(string $ocName): void { $this->connection->writeToCache('userExists' . $ocName, true); + $this->connection->writeToCache('userExistsOnLDAP' . $ocName, true); } /** @@ -791,7 +814,7 @@ class Access extends LDAPUtility { * "Developers" */ private function _createAltInternalOwnCloudNameForGroups(string $name) { - $usedNames = $this->getGroupMapper()->getNamesBySearch($name, "", '_%'); + $usedNames = $this->getGroupMapper()->getNamesBySearch($name, '', '_%'); if (count($usedNames) === 0) { $lastNo = 1; //will become name_2 } else { @@ -807,7 +830,7 @@ class Access extends LDAPUtility { // Check to be really sure it is unique // while loop is just a precaution. If a name is not generated within // 20 attempts, something else is very wrong. Avoids infinite loop. - if (!\OC::$server->getGroupManager()->groupExists($altName)) { + if (!Server::get(IGroupManager::class)->groupExists($altName)) { return $altName; } $altName = $name . '_' . ($lastNo + $attempts); @@ -867,12 +890,11 @@ class Access extends LDAPUtility { /** * @throws \Exception */ - public function fetchListOfUsers(string $filter, array $attr, int $limit = null, int $offset = null, bool $forceApplyAttributes = false): array { + public function fetchListOfUsers(string $filter, array $attr, ?int $limit = null, ?int $offset = null, bool $forceApplyAttributes = false): array { $ldapRecords = $this->searchUsers($filter, $attr, $limit, $offset); $recordsToUpdate = $ldapRecords; if (!$forceApplyAttributes) { - $isBackgroundJobModeAjax = $this->config - ->getAppValue('core', 'backgroundjobs_mode', 'ajax') === 'ajax'; + $isBackgroundJobModeAjax = $this->appConfig->getValueString('core', 'backgroundjobs_mode', 'ajax') === 'ajax'; $listOfDNs = array_reduce($ldapRecords, function ($listOfDNs, $entry) { $listOfDNs[] = $entry['dn'][0]; return $listOfDNs; @@ -928,26 +950,17 @@ class Access extends LDAPUtility { /** * @return array[] */ - public function fetchListOfGroups(string $filter, array $attr, int $limit = null, int $offset = null): array { + public function fetchListOfGroups(string $filter, array $attr, ?int $limit = null, ?int $offset = null): array { + $cacheKey = 'fetchListOfGroups_' . $filter . '_' . implode('-', $attr) . '_' . (string)$limit . '_' . (string)$offset; + $listOfGroups = $this->connection->getFromCache($cacheKey); + if (!is_null($listOfGroups)) { + return $listOfGroups; + } $groupRecords = $this->searchGroups($filter, $attr, $limit, $offset); - $listOfDNs = array_reduce($groupRecords, function ($listOfDNs, $entry) { - $listOfDNs[] = $entry['dn'][0]; - return $listOfDNs; - }, []); - $idsByDn = $this->getGroupMapper()->getListOfIdsByDn($listOfDNs); - - array_walk($groupRecords, function (array $record) use ($idsByDn) { - $newlyMapped = false; - $gid = $idsByDn[$record['dn'][0]] ?? null; - if ($gid === null) { - $gid = $this->dn2ocname($record['dn'][0], null, false, $newlyMapped, $record); - } - if (!$newlyMapped && is_string($gid)) { - $this->cacheGroupExists($gid); - } - }); - return $this->fetchList($groupRecords, $this->manyAttributes($attr)); + $listOfGroups = $this->fetchList($groupRecords, $this->manyAttributes($attr)); + $this->connection->writeToCache($cacheKey, $listOfGroups); + return $listOfGroups; } private function fetchList(array $list, bool $manyAttributes): array { @@ -966,7 +979,7 @@ class Access extends LDAPUtility { /** * @throws ServerNotAvailableException */ - public function searchUsers(string $filter, array $attr = null, int $limit = null, int $offset = null): array { + public function searchUsers(string $filter, ?array $attr = null, ?int $limit = null, ?int $offset = null): array { $result = []; foreach ($this->connection->ldapBaseUsers as $base) { $result = array_merge($result, $this->search($filter, $base, $attr, $limit, $offset)); @@ -979,7 +992,7 @@ class Access extends LDAPUtility { * @return false|int * @throws ServerNotAvailableException */ - public function countUsers(string $filter, array $attr = ['dn'], int $limit = null, int $offset = null) { + public function countUsers(string $filter, array $attr = ['dn'], ?int $limit = null, ?int $offset = null) { $result = false; foreach ($this->connection->ldapBaseUsers as $base) { $count = $this->count($filter, [$base], $attr, $limit ?? 0, $offset ?? 0); @@ -996,7 +1009,7 @@ class Access extends LDAPUtility { * Executes an LDAP search * @throws ServerNotAvailableException */ - public function searchGroups(string $filter, array $attr = null, int $limit = null, int $offset = null): array { + public function searchGroups(string $filter, ?array $attr = null, ?int $limit = null, ?int $offset = null): array { $result = []; foreach ($this->connection->ldapBaseGroups as $base) { $result = array_merge($result, $this->search($filter, $base, $attr, $limit, $offset)); @@ -1010,7 +1023,7 @@ class Access extends LDAPUtility { * @return int|bool * @throws ServerNotAvailableException */ - public function countGroups(string $filter, array $attr = ['dn'], int $limit = null, int $offset = null) { + public function countGroups(string $filter, array $attr = ['dn'], ?int $limit = null, ?int $offset = null) { $result = false; foreach ($this->connection->ldapBaseGroups as $base) { $count = $this->count($filter, [$base], $attr, $limit ?? 0, $offset ?? 0); @@ -1025,7 +1038,7 @@ class Access extends LDAPUtility { * @return int|bool * @throws ServerNotAvailableException */ - public function countObjects(int $limit = null, int $offset = null) { + public function countObjects(?int $limit = null, ?int $offset = null) { $result = false; foreach ($this->connection->ldapBase as $base) { $count = $this->count('objectclass=*', [$base], ['dn'], $limit ?? 0, $offset ?? 0); @@ -1091,34 +1104,28 @@ class Access extends LDAPUtility { * @param int|null $limit optional, maximum results to be counted * @param int|null $offset optional, a starting point * @return array|false array with the search result as first value and pagedSearchOK as - * second | false if not successful + * second | false if not successful * @throws ServerNotAvailableException */ private function executeSearch( string $filter, string $base, ?array &$attr, - ?int $limit, - ?int $offset + ?int $pageSize, + ?int $offset, ) { // See if we have a resource, in case not cancel with message $cr = $this->connection->getConnectionResource(); - if (!$this->ldap->isResource($cr)) { - // Seems like we didn't find any resource. - // Return an empty array just like before. - $this->logger->debug('Could not search, because resource is missing.', ['app' => 'user_ldap']); - return false; - } //check whether paged search should be attempted try { - $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, (int)$limit, (int)$offset); + [$pagedSearchOK, $pageSize, $cookie] = $this->initPagedSearch($filter, $base, $attr, (int)$pageSize, (int)$offset); } catch (NoMoreResults $e) { // beyond last results page return false; } - $sr = $this->invokeLDAPMethod('search', $base, $filter, $attr); + $sr = $this->invokeLDAPMethod('search', $base, $filter, $attr, 0, 0, $pageSize, $cookie); $error = $this->ldap->errno($this->connection->getConnectionResource()); if (!$this->ldap->isResource($sr) || $error !== 0) { $this->logger->error('Attempt for Paging? ' . print_r($pagedSearchOK, true), ['app' => 'user_ldap']); @@ -1131,12 +1138,12 @@ class Access extends LDAPUtility { /** * processes an LDAP paged search operation * - * @param resource|\LDAP\Result|resource[]|\LDAP\Result[] $sr the array containing the LDAP search resources + * @param \LDAP\Result|\LDAP\Result[] $sr the array containing the LDAP search resources * @param int $foundItems number of results in the single search operation * @param int $limit maximum results to be counted * @param bool $pagedSearchOK whether a paged search has been executed * @param bool $skipHandling required for paged search when cookies to - * prior results need to be gained + * prior results need to be gained * @return bool cookie validity, true if we have more pages, false otherwise. * @throws ServerNotAvailableException */ @@ -1145,7 +1152,7 @@ class Access extends LDAPUtility { int $foundItems, int $limit, bool $pagedSearchOK, - bool $skipHandling + bool $skipHandling, ): bool { $cookie = ''; if ($pagedSearchOK) { @@ -1159,7 +1166,7 @@ class Access extends LDAPUtility { return false; } // if count is bigger, then the server does not support - // paged search. Instead, he did a normal search. We set a + // paged search. Instead, they did a normal search. We set a // flag here, so the callee knows how to deal with it. if ($foundItems <= $limit) { $this->pagedSearchedSuccessful = true; @@ -1186,21 +1193,21 @@ class Access extends LDAPUtility { * @param string $filter the LDAP filter for the search * @param array $bases an array containing the LDAP subtree(s) that shall be searched * @param ?string[] $attr optional, array, one or more attributes that shall be - * retrieved. Results will according to the order in the array. + * retrieved. Results will according to the order in the array. * @param int $limit maximum results to be counted, 0 means no limit * @param int $offset a starting point, defaults to 0 * @param bool $skipHandling indicates whether the pages search operation is - * completed + * completed * @return int|false Integer or false if the search could not be initialized * @throws ServerNotAvailableException */ private function count( string $filter, array $bases, - array $attr = null, + ?array $attr = null, int $limit = 0, int $offset = 0, - bool $skipHandling = false + bool $skipHandling = false, ) { $this->logger->debug('Count filter: {filter}', [ 'app' => 'user_ldap', @@ -1244,7 +1251,7 @@ class Access extends LDAPUtility { } /** - * @param resource|\LDAP\Result|resource[]|\LDAP\Result[] $sr + * @param \LDAP\Result|\LDAP\Result[] $sr * @return int * @throws ServerNotAvailableException */ @@ -1255,6 +1262,8 @@ class Access extends LDAPUtility { /** * Executes an LDAP search * + * DN values in the result set are escaped as per RFC 2253 + * * @throws ServerNotAvailableException */ public function search( @@ -1263,7 +1272,7 @@ class Access extends LDAPUtility { ?array $attr = null, ?int $limit = null, ?int $offset = null, - bool $skipHandling = false + bool $skipHandling = false, ): array { $limitPerPage = (int)$this->connection->ldapPagingSize; if (!is_null($limit) && $limit < $limitPerPage && $limit > 0) { @@ -1314,7 +1323,7 @@ class Access extends LDAPUtility { if (!is_array($item)) { continue; } - $item = \OCP\Util::mb_array_change_key_case($item, MB_CASE_LOWER, 'UTF-8'); + $item = Util::mb_array_change_key_case($item, MB_CASE_LOWER, 'UTF-8'); foreach ($attr as $key) { if (isset($item[$key])) { if (is_array($item[$key]) && isset($item[$key]['count'])) { @@ -1381,7 +1390,7 @@ class Access extends LDAPUtility { $name = preg_replace('/[^a-zA-Z0-9_.@-]/u', '', $name); if (strlen($name) > 64) { - $name = (string)hash('sha256', $name, false); + $name = hash('sha256', $name, false); } if ($name === '') { @@ -1394,7 +1403,7 @@ class Access extends LDAPUtility { public function sanitizeGroupIDCandidate(string $candidate): string { $candidate = trim($candidate); if (strlen($candidate) > 64) { - $candidate = (string)hash('sha256', $candidate, false); + $candidate = hash('sha256', $candidate, false); } if ($candidate === '') { throw new \InvalidArgumentException('provided name template for username does not contain any allowed characters'); @@ -1416,9 +1425,7 @@ class Access extends LDAPUtility { $asterisk = '*'; $input = mb_substr($input, 1, null, 'UTF-8'); } - $search = ['*', '\\', '(', ')']; - $replace = ['\\*', '\\\\', '\\(', '\\)']; - return $asterisk . str_replace($search, $replace, $input); + return $asterisk . ldap_escape($input, '', LDAP_ESCAPE_FILTER); } /** @@ -1436,7 +1443,7 @@ class Access extends LDAPUtility { * * @param string[] $filters the filters to connect * @return string the combined filter - * Combines Filter arguments with OR + * Combines Filter arguments with OR */ public function combineFilterWithOr($filters) { return $this->combineFilter($filters, '|'); @@ -1491,7 +1498,7 @@ class Access extends LDAPUtility { * * @param string $search the search term * @param string[]|null|'' $searchAttributes needs to have at least two attributes, - * otherwise it does not make sense :) + * otherwise it does not make sense :) * @return string the final filter part to use in LDAP searches * @throws DomainException */ @@ -1519,13 +1526,13 @@ class Access extends LDAPUtility { * @param string $search the search term * @param string[]|null|'' $searchAttributes * @param string $fallbackAttribute a fallback attribute in case the user - * did not define search attributes. Typically the display name attribute. + * did not define search attributes. Typically the display name attribute. * @return string the final filter part to use in LDAP searches */ private function getFilterPartForSearch(string $search, $searchAttributes, string $fallbackAttribute): string { $filter = []; $haveMultiSearchAttributes = (is_array($searchAttributes) && count($searchAttributes) > 0); - if ($haveMultiSearchAttributes && strpos(trim($search), ' ') !== false) { + if ($haveMultiSearchAttributes && str_contains(trim($search), ' ')) { try { return $this->getAdvancedFilterPartForSearch($search, $searchAttributes); } catch (DomainException $e) { @@ -1533,14 +1540,23 @@ class Access extends LDAPUtility { } } + $originalSearch = $search; $search = $this->prepareSearchTerm($search); if (!is_array($searchAttributes) || count($searchAttributes) === 0) { if ($fallbackAttribute === '') { return ''; } + // wildcards don't work with some attributes + if ($originalSearch !== '') { + $filter[] = $fallbackAttribute . '=' . $originalSearch; + } $filter[] = $fallbackAttribute . '=' . $search; } else { foreach ($searchAttributes as $attribute) { + // wildcards don't work with some attributes + if ($originalSearch !== '') { + $filter[] = $attribute . '=' . $originalSearch; + } $filter[] = $attribute . '=' . $search; } } @@ -1556,7 +1572,7 @@ class Access extends LDAPUtility { * a * */ private function prepareSearchTerm(string $term): string { - $config = \OC::$server->getConfig(); + $config = Server::get(IConfig::class); $allowEnum = $config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes'); @@ -1581,17 +1597,15 @@ class Access extends LDAPUtility { return $filter; } - /** - * @param string $name - * @param string $password - * @return bool - */ - public function areCredentialsValid($name, $password) { + public function areCredentialsValid(string $name, string $password): bool { + if ($name === '' || $password === '') { + return false; + } $name = $this->helper->DNasBaseParameter($name); $testConnection = clone $this->connection; $credentials = [ 'ldapAgentName' => $name, - 'ldapAgentPassword' => $password + 'ldapAgentPassword' => $password, ]; if (!$testConnection->setConfiguration($credentials)) { return false; @@ -1720,7 +1734,7 @@ class Access extends LDAPUtility { * @return false|string * @throws ServerNotAvailableException */ - public function getUUID(string $dn, bool $isUser = true, array $ldapRecord = null) { + public function getUUID(string $dn, bool $isUser = true, ?array $ldapRecord = null) { if ($isUser) { $uuidAttr = 'ldapUuidUserAttribute'; $uuidOverride = $this->connection->ldapExpertUUIDUserAttr; @@ -1732,7 +1746,7 @@ class Access extends LDAPUtility { $uuid = false; if ($this->detectUuidAttribute($dn, $isUser, false, $ldapRecord)) { $attr = $this->connection->$uuidAttr; - $uuid = isset($ldapRecord[$attr]) ? $ldapRecord[$attr] : $this->readAttribute($dn, $attr); + $uuid = $ldapRecord[$attr] ?? $this->readAttribute($dn, $attr); if (!is_array($uuid) && $uuidOverride !== '' && $this->detectUuidAttribute($dn, $isUser, true, $ldapRecord)) { @@ -1751,7 +1765,7 @@ class Access extends LDAPUtility { /** * converts a binary ObjectGUID into a string representation * - * @param string $oguid the ObjectGUID in it's binary form as retrieved from AD + * @param string $oguid the ObjectGUID in its binary form as retrieved from AD * @link https://www.php.net/manual/en/function.ldap-get-values-len.php#73198 */ private function convertObjectGUID2Str(string $oguid): string { @@ -1777,8 +1791,8 @@ class Access extends LDAPUtility { /** * the first three blocks of the string-converted GUID happen to be in * reverse order. In order to use it in a filter, this needs to be - * corrected. Furthermore the dashes need to be replaced and \\ preprended - * to every two hax figures. + * corrected. Furthermore the dashes need to be replaced and \\ prepended + * to every two hex figures. * * If an invalid string is passed, it will be returned without change. */ @@ -1797,8 +1811,8 @@ class Access extends LDAPUtility { * user. Instead we write a log message. */ $this->logger->info( - 'Passed string does not resemble a valid GUID. Known UUID ' . - '({uuid}) probably does not match UUID configuration.', + 'Passed string does not resemble a valid GUID. Known UUID ' + . '({uuid}) probably does not match UUID configuration.', ['app' => 'user_ldap', 'uuid' => $guid] ); return $guid; @@ -1910,7 +1924,6 @@ class Access extends LDAPUtility { if ($this->lastCookie === '') { return; } - $this->invokeLDAPMethod('controlPagedResult', 0, false); $this->getPagedSearchResultState(); $this->lastCookie = ''; } @@ -1927,7 +1940,7 @@ class Access extends LDAPUtility { * @return bool */ public function hasMoreResults() { - if (empty($this->lastCookie) && $this->lastCookie !== '0') { + if ($this->lastCookie === '') { // as in RFC 2696, when all results are returned, the cookie will // be empty. return false; @@ -1951,11 +1964,11 @@ class Access extends LDAPUtility { * Prepares a paged search, if possible * * @param string $filter the LDAP filter for the search - * @param string[] $bases an array containing the LDAP subtree(s) that shall be searched + * @param string $base the LDAP subtree that shall be searched * @param string[] $attr optional, when a certain attribute shall be filtered outside * @param int $limit * @param int $offset - * @return bool|true + * @return array{bool, int, string} * @throws ServerNotAvailableException * @throws NoMoreResults */ @@ -1963,29 +1976,36 @@ class Access extends LDAPUtility { string $filter, string $base, ?array $attr, - int $limit, - int $offset - ): bool { + int $pageSize, + int $offset, + ): array { $pagedSearchOK = false; - if ($limit !== 0) { + if ($pageSize !== 0) { $this->logger->debug( - 'initializing paged search for filter {filter}, base {base}, attr {attr}, limit {limit}, offset {offset}', + 'initializing paged search for filter {filter}, base {base}, attr {attr}, pageSize {pageSize}, offset {offset}', [ 'app' => 'user_ldap', 'filter' => $filter, 'base' => $base, 'attr' => $attr, - 'limit' => $limit, + 'pageSize' => $pageSize, 'offset' => $offset ] ); - //get the cookie from the search for the previous search, required by LDAP - if (empty($this->lastCookie) && $this->lastCookie !== "0" && ($offset > 0)) { + // Get the cookie from the search for the previous search, required by LDAP + if (($this->lastCookie === '') && ($offset > 0)) { // no cookie known from a potential previous search. We need // to start from 0 to come to the desired page. cookie value // of '0' is valid, because 389ds - $reOffset = ($offset - $limit) < 0 ? 0 : $offset - $limit; - $this->search($filter, $base, $attr, $limit, $reOffset, true); + $defaultPageSize = (int)$this->connection->ldapPagingSize; + if ($offset < $defaultPageSize) { + /* Make a search with offset as page size and dismiss the result, to init the cookie */ + $this->search($filter, $base, $attr, $offset, 0, true); + } else { + /* Make a search for previous page and dismiss the result, to init the cookie */ + $reOffset = $offset - $defaultPageSize; + $this->search($filter, $base, $attr, $defaultPageSize, $reOffset, true); + } if (!$this->hasMoreResults()) { // when the cookie is reset with != 0 offset, there are no further // results, so stop. @@ -1996,19 +2016,15 @@ class Access extends LDAPUtility { //since offset = 0, this is a new search. We abandon other searches that might be ongoing. $this->abandonPagedSearch(); } - $pagedSearchOK = true === $this->invokeLDAPMethod( - 'controlPagedResult', $limit, false - ); - if ($pagedSearchOK) { - $this->logger->debug('Ready for a paged search', ['app' => 'user_ldap']); - } + $this->logger->debug('Ready for a paged search', ['app' => 'user_ldap']); + return [true, $pageSize, $this->lastCookie]; /* ++ Fixing RHDS searches with pages with zero results ++ - * We coudn't get paged searches working with our RHDS for login ($limit = 0), + * We couldn't get paged searches working with our RHDS for login ($limit = 0), * due to pages with zero results. * So we added "&& !empty($this->lastCookie)" to this test to ignore pagination * if we don't have a previous paged search. */ - } elseif (!empty($this->lastCookie)) { + } elseif ($this->lastCookie !== '') { // a search without limit was requested. However, if we do use // Paged Search once, we always must do it. This requires us to // initialize it with the configured page size. @@ -2016,11 +2032,10 @@ class Access extends LDAPUtility { // in case someone set it to 0 … use 500, otherwise no results will // be returned. $pageSize = (int)$this->connection->ldapPagingSize > 0 ? (int)$this->connection->ldapPagingSize : 500; - $pagedSearchOK = $this->invokeLDAPMethod('controlPagedResult', - $pageSize, false); + return [true, $pageSize, $this->lastCookie]; } - return $pagedSearchOK; + return [false, $pageSize, '']; } /** diff --git a/apps/user_ldap/lib/AccessFactory.php b/apps/user_ldap/lib/AccessFactory.php index 71867bbb9a4..da114c467a7 100644 --- a/apps/user_ldap/lib/AccessFactory.php +++ b/apps/user_ldap/lib/AccessFactory.php @@ -1,71 +1,44 @@ <?php + /** - * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; use OCA\User_LDAP\User\Manager; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\IAppConfig; use OCP\IConfig; use OCP\IUserManager; +use OCP\Server; use Psr\Log\LoggerInterface; class AccessFactory { - /** @var ILDAPWrapper */ - protected $ldap; - /** @var Manager */ - protected $userManager; - /** @var Helper */ - protected $helper; - /** @var IConfig */ - protected $config; - /** @var IUserManager */ - private $ncUserManager; - /** @var LoggerInterface */ - private $logger; public function __construct( - ILDAPWrapper $ldap, - Manager $userManager, - Helper $helper, - IConfig $config, - IUserManager $ncUserManager, - LoggerInterface $logger) { - $this->ldap = $ldap; - $this->userManager = $userManager; - $this->helper = $helper; - $this->config = $config; - $this->ncUserManager = $ncUserManager; - $this->logger = $logger; + private ILDAPWrapper $ldap, + private Helper $helper, + private IConfig $config, + private IAppConfig $appConfig, + private IUserManager $ncUserManager, + private LoggerInterface $logger, + private IEventDispatcher $dispatcher, + ) { } - public function get(Connection $connection) { + public function get(Connection $connection): Access { + /* Each Access instance gets its own Manager instance, see OCA\User_LDAP\AppInfo\Application::register() */ return new Access( - $connection, $this->ldap, - $this->userManager, + $connection, + Server::get(Manager::class), $this->helper, $this->config, $this->ncUserManager, - $this->logger + $this->logger, + $this->appConfig, + $this->dispatcher, ); } } diff --git a/apps/user_ldap/lib/AppInfo/Application.php b/apps/user_ldap/lib/AppInfo/Application.php index 79998a580e5..70b7920f7ab 100644 --- a/apps/user_ldap/lib/AppInfo/Application.php +++ b/apps/user_ldap/lib/AppInfo/Application.php @@ -1,28 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 Roger Szabo <roger.szabo@web.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\AppInfo; @@ -37,7 +17,11 @@ use OCA\User_LDAP\Handler\ExtStorageConfigHandler; use OCA\User_LDAP\Helper; use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\LDAP; +use OCA\User_LDAP\LoginListener; use OCA\User_LDAP\Notification\Notifier; +use OCA\User_LDAP\SetupChecks\LdapConnection; +use OCA\User_LDAP\SetupChecks\LdapInvalidUuids; +use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User_Proxy; use OCA\User_LDAP\UserPluginManager; use OCP\AppFramework\App; @@ -46,11 +30,19 @@ use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\AppFramework\IAppContainer; use OCP\EventDispatcher\IEventDispatcher; +use OCP\IAvatarManager; +use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; +use OCP\Image; use OCP\IServerContainer; +use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use OCP\Share\IManager as IShareManager; +use OCP\User\Events\PostLoginEvent; +use OCP\Util; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; class Application extends App implements IBootstrap { public function __construct() { @@ -87,29 +79,49 @@ class Application extends App implements IBootstrap { public function register(IRegistrationContext $context): void { $context->registerNotifierService(Notifier::class); + + $context->registerService( + Manager::class, + function (ContainerInterface $c) { + return new Manager( + $c->get(IConfig::class), + $c->get(LoggerInterface::class), + $c->get(IAvatarManager::class), + $c->get(Image::class), + $c->get(IUserManager::class), + $c->get(INotificationManager::class), + $c->get(IShareManager::class), + ); + }, + // the instance is specific to a lazy bound Access instance, thus cannot be shared. + false + ); + $context->registerEventListener(PostLoginEvent::class, LoginListener::class); + $context->registerSetupCheck(LdapInvalidUuids::class); + $context->registerSetupCheck(LdapConnection::class); } public function boot(IBootContext $context): void { $context->injectFn(function ( INotificationManager $notificationManager, IAppContainer $appContainer, - EventDispatcherInterface $legacyDispatcher, IEventDispatcher $dispatcher, + IUserManager $userManager, IGroupManager $groupManager, User_Proxy $userBackend, Group_Proxy $groupBackend, - Helper $helper - ) { + Helper $helper, + ): void { $configPrefixes = $helper->getServerConfigurationPrefixes(true); if (count($configPrefixes) > 0) { $userPluginManager = $appContainer->get(UserPluginManager::class); $groupPluginManager = $appContainer->get(GroupPluginManager::class); - \OC_User::useBackend($userBackend); + $userManager->registerBackend($userBackend); $groupManager->addBackend($groupBackend); $userBackendRegisteredEvent = new UserBackendRegistered($userBackend, $userPluginManager); - $legacyDispatcher->dispatch('OCA\\User_LDAP\\User\\User::postLDAPBackendAdded', $userBackendRegisteredEvent); + $dispatcher->dispatch('OCA\\User_LDAP\\User\\User::postLDAPBackendAdded', $userBackendRegisteredEvent); $dispatcher->dispatchTyped($userBackendRegisteredEvent); $groupBackendRegisteredEvent = new GroupBackendRegistered($groupBackend, $groupPluginManager); $dispatcher->dispatchTyped($groupBackendRegisteredEvent); @@ -118,7 +130,7 @@ class Application extends App implements IBootstrap { $context->injectFn(Closure::fromCallable([$this, 'registerBackendDependents'])); - \OCP\Util::connectHook( + Util::connectHook( '\OCA\Files_Sharing\API\Server2Server', 'preLoginNameUsedAsUserName', '\OCA\User_LDAP\Helper', @@ -126,10 +138,10 @@ class Application extends App implements IBootstrap { ); } - private function registerBackendDependents(IAppContainer $appContainer, EventDispatcherInterface $dispatcher) { + private function registerBackendDependents(IAppContainer $appContainer, IEventDispatcher $dispatcher): void { $dispatcher->addListener( 'OCA\\Files_External::loadAdditionalBackends', - function () use ($appContainer) { + function () use ($appContainer): void { $storagesBackendService = $appContainer->get(BackendService::class); $storagesBackendService->registerConfigHandler('home', function () use ($appContainer) { return $appContainer->get(ExtStorageConfigHandler::class); diff --git a/apps/user_ldap/lib/BackendUtility.php b/apps/user_ldap/lib/BackendUtility.php index 4afcb6799d8..88d7311cde0 100644 --- a/apps/user_ldap/lib/BackendUtility.php +++ b/apps/user_ldap/lib/BackendUtility.php @@ -1,37 +1,19 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; abstract class BackendUtility { - protected $access; - /** * constructor, make sure the subclasses call this one! * @param Access $access an instance of Access for LDAP interaction */ - public function __construct(Access $access) { - $this->access = $access; + public function __construct( + protected Access $access, + ) { } } diff --git a/apps/user_ldap/lib/Command/CheckGroup.php b/apps/user_ldap/lib/Command/CheckGroup.php new file mode 100644 index 00000000000..9c7ccb9d3b3 --- /dev/null +++ b/apps/user_ldap/lib/Command/CheckGroup.php @@ -0,0 +1,162 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Command; + +use OCA\User_LDAP\Group_Proxy; +use OCA\User_LDAP\Helper; +use OCA\User_LDAP\Mapping\GroupMapping; +use OCA\User_LDAP\Service\UpdateGroupsService; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\GroupCreatedEvent; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +class CheckGroup extends Command { + public function __construct( + private UpdateGroupsService $service, + protected Group_Proxy $backend, + protected Helper $helper, + protected GroupMapping $mapping, + protected IEventDispatcher $dispatcher, + ) { + parent::__construct(); + } + + protected function configure(): void { + $this + ->setName('ldap:check-group') + ->setDescription('checks whether a group exists on LDAP.') + ->addArgument( + 'ocName', + InputArgument::REQUIRED, + 'the group name as used in Nextcloud, or the LDAP DN' + ) + ->addOption( + 'force', + null, + InputOption::VALUE_NONE, + 'ignores disabled LDAP configuration' + ) + ->addOption( + 'update', + null, + InputOption::VALUE_NONE, + 'syncs values from LDAP' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + $this->dispatcher->addListener(GroupCreatedEvent::class, fn ($event) => $this->onGroupCreatedEvent($event, $output)); + $this->dispatcher->addListener(UserAddedEvent::class, fn ($event) => $this->onUserAddedEvent($event, $output)); + $this->dispatcher->addListener(UserRemovedEvent::class, fn ($event) => $this->onUserRemovedEvent($event, $output)); + try { + $this->assertAllowed($input->getOption('force')); + $gid = $input->getArgument('ocName'); + $wasMapped = $this->groupWasMapped($gid); + if ($this->backend->getLDAPAccess($gid)->stringResemblesDN($gid)) { + $groupname = $this->backend->dn2GroupName($gid); + if ($groupname !== false) { + $gid = $groupname; + } + } + /* Search to trigger mapping for new groups */ + $this->backend->getGroups($gid); + $exists = $this->backend->groupExistsOnLDAP($gid, true); + if ($exists === true) { + $output->writeln('The group is still available on LDAP.'); + if ($input->getOption('update')) { + $this->backend->getLDAPAccess($gid)->connection->clearCache(); + if ($wasMapped) { + $this->service->handleKnownGroups([$gid]); + } else { + $this->service->handleCreatedGroups([$gid]); + } + } + return self::SUCCESS; + } + + if ($wasMapped) { + $output->writeln('The group does not exist on LDAP anymore.'); + if ($input->getOption('update')) { + $this->backend->getLDAPAccess($gid)->connection->clearCache(); + $this->service->handleRemovedGroups([$gid]); + } + return self::SUCCESS; + } + + throw new \Exception('The given group is not a recognized LDAP group.'); + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + return self::FAILURE; + } + } + + public function onGroupCreatedEvent(GroupCreatedEvent $event, OutputInterface $output): void { + $output->writeln('<info>The group ' . $event->getGroup()->getGID() . ' was added to Nextcloud with ' . $event->getGroup()->count() . ' users</info>'); + } + + public function onUserAddedEvent(UserAddedEvent $event, OutputInterface $output): void { + $user = $event->getUser(); + $group = $event->getGroup(); + $output->writeln('<info>The user ' . $user->getUID() . ' was added to group ' . $group->getGID() . '</info>'); + } + + public function onUserRemovedEvent(UserRemovedEvent $event, OutputInterface $output): void { + $user = $event->getUser(); + $group = $event->getGroup(); + $output->writeln('<info>The user ' . $user->getUID() . ' was removed from group ' . $group->getGID() . '</info>'); + } + + /** + * checks whether a group is actually mapped + * @param string $gid the groupname as passed to the command + */ + protected function groupWasMapped(string $gid): bool { + $dn = $this->mapping->getDNByName($gid); + if ($dn !== false) { + return true; + } + $name = $this->mapping->getNameByDN($gid); + return $name !== false; + } + + /** + * checks whether the setup allows reliable checking of LDAP group existence + * @throws \Exception + */ + protected function assertAllowed(bool $force): void { + if ($this->helper->haveDisabledConfigurations() && !$force) { + throw new \Exception('Cannot check group existence, because ' + . 'disabled LDAP configurations are present.'); + } + + // we don't check ldapUserCleanupInterval from config.php because this + // action is triggered manually, while the setting only controls the + // background job. + } + + private function updateGroup(string $gid, OutputInterface $output, bool $wasMapped): void { + try { + if ($wasMapped) { + $this->service->handleKnownGroups([$gid]); + } else { + $this->service->handleCreatedGroups([$gid]); + } + } catch (\Exception $e) { + $output->writeln('<error>Error while trying to lookup and update attributes from LDAP</error>'); + } + } +} diff --git a/apps/user_ldap/lib/Command/CheckUser.php b/apps/user_ldap/lib/Command/CheckUser.php index 6ccfc9c19ea..8bb26ce3d0e 100644 --- a/apps/user_ldap/lib/Command/CheckUser.php +++ b/apps/user_ldap/lib/Command/CheckUser.php @@ -1,28 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -37,23 +18,12 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class CheckUser extends Command { - /** @var User_Proxy */ - protected $backend; - - /** @var Helper */ - protected $helper; - - /** @var DeletedUsersIndex */ - protected $dui; - - /** @var UserMapping */ - protected $mapping; - - public function __construct(User_Proxy $uBackend, Helper $helper, DeletedUsersIndex $dui, UserMapping $mapping) { - $this->backend = $uBackend; - $this->helper = $helper; - $this->dui = $dui; - $this->mapping = $mapping; + public function __construct( + protected User_Proxy $backend, + protected Helper $helper, + protected DeletedUsersIndex $dui, + protected UserMapping $mapping, + ) { parent::__construct(); } @@ -62,16 +32,16 @@ class CheckUser extends Command { ->setName('ldap:check-user') ->setDescription('checks whether a user exists on LDAP.') ->addArgument( - 'ocName', - InputArgument::REQUIRED, - 'the user name as used in Nextcloud, or the LDAP DN' - ) + 'ocName', + InputArgument::REQUIRED, + 'the user name as used in Nextcloud, or the LDAP DN' + ) ->addOption( - 'force', - null, - InputOption::VALUE_NONE, - 'ignores disabled LDAP configuration' - ) + 'force', + null, + InputOption::VALUE_NONE, + 'ignores disabled LDAP configuration' + ) ->addOption( 'update', null, @@ -98,19 +68,21 @@ class CheckUser extends Command { if ($input->getOption('update')) { $this->updateUser($uid, $output); } - return 0; - } elseif ($wasMapped) { + return self::SUCCESS; + } + + if ($wasMapped) { $this->dui->markUser($uid); $output->writeln('The user does not exists on LDAP anymore.'); $output->writeln('Clean up the user\'s remnants by: ./occ user:delete "' . $uid . '"'); - return 0; - } else { - throw new \Exception('The given user is not a recognized LDAP user.'); + return self::SUCCESS; } + + throw new \Exception('The given user is not a recognized LDAP user.'); } catch (\Exception $e) { - $output->writeln('<error>' . $e->getMessage(). '</error>'); - return 1; + $output->writeln('<error>' . $e->getMessage() . '</error>'); + return self::FAILURE; } } @@ -144,7 +116,8 @@ class CheckUser extends Command { $attrs = $access->userManager->getAttributes(); $user = $access->userManager->get($uid); $avatarAttributes = $access->getConnection()->resolveRule('avatar'); - $result = $access->search('objectclass=*', $user->getDN(), $attrs, 1, 0); + $baseDn = $this->helper->DNasBaseParameter($user->getDN()); + $result = $access->search('objectclass=*', $baseDn, $attrs, 1, 0); foreach ($result[0] as $attribute => $valueSet) { $output->writeln(' ' . $attribute . ': '); foreach ($valueSet as $value) { diff --git a/apps/user_ldap/lib/Command/CreateEmptyConfig.php b/apps/user_ldap/lib/Command/CreateEmptyConfig.php index f7f04e28e60..7c381cf431f 100644 --- a/apps/user_ldap/lib/Command/CreateEmptyConfig.php +++ b/apps/user_ldap/lib/Command/CreateEmptyConfig.php @@ -1,26 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Martin Konrad <konrad@frib.msu.edu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -32,18 +15,13 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class CreateEmptyConfig extends Command { - /** @var \OCA\User_LDAP\Helper */ - protected $helper; - - /** - * @param Helper $helper - */ - public function __construct(Helper $helper) { - $this->helper = $helper; + public function __construct( + protected Helper $helper, + ) { parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:create-empty-config') ->setDescription('creates an empty LDAP configuration') @@ -67,6 +45,6 @@ class CreateEmptyConfig extends Command { $prose = 'Created new configuration with configID '; } $output->writeln($prose . "{$configPrefix}"); - return 0; + return self::SUCCESS; } } diff --git a/apps/user_ldap/lib/Command/DeleteConfig.php b/apps/user_ldap/lib/Command/DeleteConfig.php index 707fd455611..7604e229bed 100644 --- a/apps/user_ldap/lib/Command/DeleteConfig.php +++ b/apps/user_ldap/lib/Command/DeleteConfig.php @@ -1,26 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Martin Konrad <info@martin-konrad.net> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -31,41 +14,35 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class DeleteConfig extends Command { - /** @var \OCA\User_LDAP\Helper */ - protected $helper; - - /** - * @param Helper $helper - */ - public function __construct(Helper $helper) { - $this->helper = $helper; + public function __construct( + protected Helper $helper, + ) { parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:delete-config') ->setDescription('deletes an existing LDAP configuration') ->addArgument( - 'configID', - InputArgument::REQUIRED, - 'the configuration ID' - ) + 'configID', + InputArgument::REQUIRED, + 'the configuration ID' + ) ; } - protected function execute(InputInterface $input, OutputInterface $output): int { $configPrefix = $input->getArgument('configID'); $success = $this->helper->deleteServerConfiguration($configPrefix); - if ($success) { - $output->writeln("Deleted configuration with configID '{$configPrefix}'"); - return 0; - } else { + if (!$success) { $output->writeln("Cannot delete configuration with configID '{$configPrefix}'"); - return 1; + return self::FAILURE; } + + $output->writeln("Deleted configuration with configID '{$configPrefix}'"); + return self::SUCCESS; } } diff --git a/apps/user_ldap/lib/Command/PromoteGroup.php b/apps/user_ldap/lib/Command/PromoteGroup.php new file mode 100644 index 00000000000..b203a910b14 --- /dev/null +++ b/apps/user_ldap/lib/Command/PromoteGroup.php @@ -0,0 +1,111 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\User_LDAP\Command; + +use OCA\User_LDAP\Group_Proxy; +use OCP\IGroup; +use OCP\IGroupManager; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\Question; + +class PromoteGroup extends Command { + + public function __construct( + private IGroupManager $groupManager, + private Group_Proxy $backend, + ) { + parent::__construct(); + } + + protected function configure(): void { + $this + ->setName('ldap:promote-group') + ->setDescription('declares the specified group as admin group (only one is possible per LDAP configuration)') + ->addArgument( + 'group', + InputArgument::REQUIRED, + 'the group ID in Nextcloud or a group name' + ) + ->addOption( + 'yes', + 'y', + InputOption::VALUE_NONE, + 'do not ask for confirmation' + ); + } + + protected function formatGroupName(IGroup $group): string { + $idLabel = ''; + if ($group->getGID() !== $group->getDisplayName()) { + $idLabel = sprintf(' (Group ID: %s)', $group->getGID()); + } + return sprintf('%s%s', $group->getDisplayName(), $idLabel); + } + + protected function promoteGroup(IGroup $group, InputInterface $input, OutputInterface $output): void { + $access = $this->backend->getLDAPAccess($group->getGID()); + $currentlyPromotedGroupId = $access->connection->ldapAdminGroup; + if ($currentlyPromotedGroupId === $group->getGID()) { + $output->writeln('<info>The specified group is already promoted</info>'); + return; + } + + if ($input->getOption('yes') === false) { + $currentlyPromotedGroup = $this->groupManager->get($currentlyPromotedGroupId); + $demoteLabel = ''; + if ($currentlyPromotedGroup instanceof IGroup && $this->backend->groupExists($currentlyPromotedGroup->getGID())) { + $groupNameLabel = $this->formatGroupName($currentlyPromotedGroup); + $demoteLabel = sprintf('and demote %s ', $groupNameLabel); + } + + /** @var QuestionHelper $helper */ + $helper = $this->getHelper('question'); + $q = new Question(sprintf('Promote %s to the admin group %s(y|N)? ', $this->formatGroupName($group), $demoteLabel)); + $input->setOption('yes', $helper->ask($input, $output, $q) === 'y'); + } + if ($input->getOption('yes') === true) { + $access->connection->setConfiguration(['ldapAdminGroup' => $group->getGID()]); + $access->connection->saveConfiguration(); + $output->writeln(sprintf('<info>Group %s was promoted</info>', $group->getDisplayName())); + } else { + $output->writeln('<comment>Group promotion cancelled</comment>'); + } + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + $groupInput = (string)$input->getArgument('group'); + $group = $this->groupManager->get($groupInput); + + if ($group instanceof IGroup && $this->backend->groupExists($group->getGID())) { + $this->promoteGroup($group, $input, $output); + return 0; + } + + $groupCandidates = $this->backend->getGroups($groupInput, 20); + foreach ($groupCandidates as $gidCandidate) { + $group = $this->groupManager->get($gidCandidate); + if ($group !== null + && $this->backend->groupExists($group->getGID()) // ensure it is an LDAP group + && ($group->getGID() === $groupInput + || $group->getDisplayName() === $groupInput) + ) { + $this->promoteGroup($group, $input, $output); + return 0; + } + } + + $output->writeln('<error>No matching group found</error>'); + return 1; + } + +} diff --git a/apps/user_ldap/lib/Command/ResetGroup.php b/apps/user_ldap/lib/Command/ResetGroup.php index f3c3019f919..5833ca980f2 100644 --- a/apps/user_ldap/lib/Command/ResetGroup.php +++ b/apps/user_ldap/lib/Command/ResetGroup.php @@ -1,25 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2021 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Command; @@ -36,18 +19,11 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; class ResetGroup extends Command { - private IGroupManager $groupManager; - private GroupPluginManager $pluginManager; - private Group_Proxy $backend; - public function __construct( - IGroupManager $groupManager, - GroupPluginManager $pluginManager, - Group_Proxy $backend + private IGroupManager $groupManager, + private GroupPluginManager $pluginManager, + private Group_Proxy $backend, ) { - $this->groupManager = $groupManager; - $this->pluginManager = $pluginManager; - $this->backend = $backend; parent::__construct(); } @@ -96,16 +72,16 @@ class ResetGroup extends Command { echo "calling delete $gid\n"; if ($group->delete()) { $this->pluginManager->setSuppressDeletion($pluginManagerSuppressed); - return 0; + return self::SUCCESS; } } catch (\Throwable $e) { if (isset($pluginManagerSuppressed)) { $this->pluginManager->setSuppressDeletion($pluginManagerSuppressed); } $output->writeln('<error>' . $e->getMessage() . '</error>'); - return 1; + return self::FAILURE; } $output->writeln('<error>Error while resetting group</error>'); - return 2; + return self::INVALID; } } diff --git a/apps/user_ldap/lib/Command/ResetUser.php b/apps/user_ldap/lib/Command/ResetUser.php index 854481fc0d1..1409806e4ac 100644 --- a/apps/user_ldap/lib/Command/ResetUser.php +++ b/apps/user_ldap/lib/Command/ResetUser.php @@ -1,24 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2021 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Command; @@ -36,25 +20,15 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; class ResetUser extends Command { - /** @var DeletedUsersIndex */ - protected $dui; - /** @var IUserManager */ - private $userManager; - /** @var UserPluginManager */ - private $pluginManager; - public function __construct( - DeletedUsersIndex $dui, - IUserManager $userManager, - UserPluginManager $pluginManager + protected DeletedUsersIndex $dui, + private IUserManager $userManager, + private UserPluginManager $pluginManager, ) { - $this->dui = $dui; - $this->userManager = $userManager; - $this->pluginManager = $pluginManager; parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:reset-user') ->setDescription('deletes an LDAP user independent of the user state') @@ -96,16 +70,16 @@ class ResetUser extends Command { $pluginManagerSuppressed = $this->pluginManager->setSuppressDeletion(true); if ($user->delete()) { $this->pluginManager->setSuppressDeletion($pluginManagerSuppressed); - return 0; + return self::SUCCESS; } } catch (\Throwable $e) { if (isset($pluginManagerSuppressed)) { $this->pluginManager->setSuppressDeletion($pluginManagerSuppressed); } $output->writeln('<error>' . $e->getMessage() . '</error>'); - return 1; + return self::FAILURE; } $output->writeln('<error>Error while resetting user</error>'); - return 2; + return self::INVALID; } } diff --git a/apps/user_ldap/lib/Command/Search.php b/apps/user_ldap/lib/Command/Search.php index 96c4df4b2bf..85906b20e9a 100644 --- a/apps/user_ldap/lib/Command/Search.php +++ b/apps/user_ldap/lib/Command/Search.php @@ -1,28 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -31,6 +12,7 @@ use OCA\User_LDAP\Helper; use OCA\User_LDAP\LDAP; use OCA\User_LDAP\User_Proxy; use OCP\IConfig; +use OCP\Server; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; @@ -39,59 +21,52 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class Search extends Command { - /** @var \OCP\IConfig */ - protected $ocConfig; - /** @var User_Proxy */ - private $userProxy; - /** @var Group_Proxy */ - private $groupProxy; - - public function __construct(IConfig $ocConfig, User_Proxy $userProxy, Group_Proxy $groupProxy) { + public function __construct( + protected IConfig $ocConfig, + private User_Proxy $userProxy, + private Group_Proxy $groupProxy, + ) { parent::__construct(); - $this->ocConfig = $ocConfig; - $this->userProxy = $userProxy; - $this->groupProxy = $groupProxy; } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:search') ->setDescription('executes a user or group search') ->addArgument( - 'search', - InputArgument::REQUIRED, - 'the search string (can be empty)' - ) + 'search', + InputArgument::REQUIRED, + 'the search string (can be empty)' + ) ->addOption( - 'group', - null, - InputOption::VALUE_NONE, - 'searches groups instead of users' - ) + 'group', + null, + InputOption::VALUE_NONE, + 'searches groups instead of users' + ) ->addOption( - 'offset', - null, - InputOption::VALUE_REQUIRED, - 'The offset of the result set. Needs to be a multiple of limit. defaults to 0.', - '0' - ) + 'offset', + null, + InputOption::VALUE_REQUIRED, + 'The offset of the result set. Needs to be a multiple of limit. defaults to 0.', + '0' + ) ->addOption( - 'limit', - null, - InputOption::VALUE_REQUIRED, - 'limit the results. 0 means no limit, defaults to 15', - '15' - ) + 'limit', + null, + InputOption::VALUE_REQUIRED, + 'limit the results. 0 means no limit, defaults to 15', + '15' + ) ; } /** * Tests whether the offset and limit options are valid - * @param int $offset - * @param int $limit + * * @throws \InvalidArgumentException */ - protected function validateOffsetAndLimit($offset, $limit) { + protected function validateOffsetAndLimit(int $offset, int $limit): void { if ($limit < 0) { throw new \InvalidArgumentException('limit must be 0 or greater'); } @@ -107,7 +82,7 @@ class Search extends Command { } protected function execute(InputInterface $input, OutputInterface $output): int { - $helper = new Helper($this->ocConfig, \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $configPrefixes = $helper->getServerConfigurationPrefixes(true); $ldapWrapper = new LDAP(); @@ -132,9 +107,9 @@ class Search extends Command { $result = $proxy->$getMethod($input->getArgument('search'), $limit, $offset); foreach ($result as $id => $name) { - $line = $name . ($printID ? ' ('.$id.')' : ''); + $line = $name . ($printID ? ' (' . $id . ')' : ''); $output->writeln($line); } - return 0; + return self::SUCCESS; } } diff --git a/apps/user_ldap/lib/Command/SetConfig.php b/apps/user_ldap/lib/Command/SetConfig.php index 2b487787c8a..7e9efcf34d0 100644 --- a/apps/user_ldap/lib/Command/SetConfig.php +++ b/apps/user_ldap/lib/Command/SetConfig.php @@ -1,27 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -29,41 +11,42 @@ use OCA\User_LDAP\Configuration; use OCA\User_LDAP\ConnectionFactory; use OCA\User_LDAP\Helper; use OCA\User_LDAP\LDAP; +use OCP\Server; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class SetConfig extends Command { - protected function configure() { + protected function configure(): void { $this ->setName('ldap:set-config') ->setDescription('modifies an LDAP configuration') ->addArgument( - 'configID', - InputArgument::REQUIRED, - 'the configuration ID' - ) + 'configID', + InputArgument::REQUIRED, + 'the configuration ID' + ) ->addArgument( - 'configKey', - InputArgument::REQUIRED, - 'the configuration key' - ) + 'configKey', + InputArgument::REQUIRED, + 'the configuration key' + ) ->addArgument( - 'configValue', - InputArgument::REQUIRED, - 'the new configuration value' - ) + 'configValue', + InputArgument::REQUIRED, + 'the new configuration value' + ) ; } protected function execute(InputInterface $input, OutputInterface $output): int { - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $availableConfigs = $helper->getServerConfigurationPrefixes(); $configID = $input->getArgument('configID'); if (!in_array($configID, $availableConfigs)) { - $output->writeln("Invalid configID"); - return 1; + $output->writeln('Invalid configID'); + return self::FAILURE; } $this->setValue( @@ -71,16 +54,13 @@ class SetConfig extends Command { $input->getArgument('configKey'), $input->getArgument('configValue') ); - return 0; + return self::SUCCESS; } /** * save the configuration value as provided - * @param string $configID - * @param string $configKey - * @param string $configValue */ - protected function setValue($configID, $key, $value) { + protected function setValue(string $configID, string $key, string $value): void { $configHolder = new Configuration($configID); $configHolder->$key = $value; $configHolder->saveConfiguration(); diff --git a/apps/user_ldap/lib/Command/ShowConfig.php b/apps/user_ldap/lib/Command/ShowConfig.php index 4997d9737a5..fa021192ac4 100644 --- a/apps/user_ldap/lib/Command/ShowConfig.php +++ b/apps/user_ldap/lib/Command/ShowConfig.php @@ -1,28 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Johannes Leuker <j.leuker@hosting.de> - * @author Laurens Post <Crote@users.noreply.github.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -36,39 +17,34 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class ShowConfig extends Base { - /** @var \OCA\User_LDAP\Helper */ - protected $helper; - - /** - * @param Helper $helper - */ - public function __construct(Helper $helper) { - $this->helper = $helper; + public function __construct( + protected Helper $helper, + ) { parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:show-config') ->setDescription('shows the LDAP configuration') ->addArgument( - 'configID', - InputArgument::OPTIONAL, - 'will show the configuration of the specified id' - ) + 'configID', + InputArgument::OPTIONAL, + 'will show the configuration of the specified id' + ) ->addOption( - 'show-password', - null, - InputOption::VALUE_NONE, - 'show ldap bind password' - ) + 'show-password', + null, + InputOption::VALUE_NONE, + 'show ldap bind password' + ) ->addOption( - 'output', - null, - InputOption::VALUE_OPTIONAL, - 'Output format (table, plain, json or json_pretty, default is table)', - 'table' - ) + 'output', + null, + InputOption::VALUE_OPTIONAL, + 'Output format (table, plain, json or json_pretty, default is table)', + 'table' + ) ; } @@ -78,24 +54,27 @@ class ShowConfig extends Base { if (!is_null($configID)) { $configIDs[] = $configID; if (!in_array($configIDs[0], $availableConfigs)) { - $output->writeln("Invalid configID"); - return 1; + $output->writeln('Invalid configID'); + return self::FAILURE; } } else { $configIDs = $availableConfigs; } $this->renderConfigs($configIDs, $input, $output); - return 0; + return self::SUCCESS; } /** * prints the LDAP configuration(s) - * @param string[] configID(s) - * @param InputInterface $input - * @param OutputInterface $output + * + * @param string[] $configIDs */ - protected function renderConfigs($configIDs, $input, $output) { + protected function renderConfigs( + array $configIDs, + InputInterface $input, + OutputInterface $output, + ): void { $renderTable = $input->getOption('output') === 'table' or $input->getOption('output') === null; $showPassword = $input->getOption('show-password'); @@ -121,16 +100,17 @@ class ShowConfig extends Base { $table->setHeaders(['Configuration', $id]); $table->setRows($rows); $table->render(); - } else { - foreach ($configuration as $key => $value) { - if ($key === 'ldapAgentPassword' && !$showPassword) { - $rows[$key] = '***'; - } else { - $rows[$key] = $value; - } + continue; + } + + foreach ($configuration as $key => $value) { + if ($key === 'ldapAgentPassword' && !$showPassword) { + $rows[$key] = '***'; + } else { + $rows[$key] = $value; } - $configs[$id] = $rows; } + $configs[$id] = $rows; } if (!$renderTable) { $this->writeArrayInOutputFormat($input, $output, $configs); diff --git a/apps/user_ldap/lib/Command/ShowRemnants.php b/apps/user_ldap/lib/Command/ShowRemnants.php index 55d930dead4..d255aac1368 100644 --- a/apps/user_ldap/lib/Command/ShowRemnants.php +++ b/apps/user_ldap/lib/Command/ShowRemnants.php @@ -1,28 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Daniel Kesselberg <mail@danielkesselberg.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author scolebrook <scolebrook@mac.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; @@ -36,23 +17,14 @@ use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class ShowRemnants extends Command { - /** @var \OCA\User_LDAP\User\DeletedUsersIndex */ - protected $dui; - - /** @var \OCP\IDateTimeFormatter */ - protected $dateFormatter; - - /** - * @param DeletedUsersIndex $dui - * @param IDateTimeFormatter $dateFormatter - */ - public function __construct(DeletedUsersIndex $dui, IDateTimeFormatter $dateFormatter) { - $this->dui = $dui; - $this->dateFormatter = $dateFormatter; + public function __construct( + protected DeletedUsersIndex $dui, + protected IDateTimeFormatter $dateFormatter, + ) { parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:show-remnants') ->setDescription('shows which users are not available on LDAP anymore, but have remnants in Nextcloud.') @@ -60,7 +32,7 @@ class ShowRemnants extends Command { ->addOption('short-date', null, InputOption::VALUE_NONE, 'show dates in Y-m-d format'); } - protected function formatDate(int $timestamp, string $default, bool $showShortDate) { + protected function formatDate(int $timestamp, string $default, bool $showShortDate): string { if (!($timestamp > 0)) { return $default; } @@ -103,6 +75,6 @@ class ShowRemnants extends Command { $table->setRows($rows); $table->render(); } - return 0; + return self::SUCCESS; } } diff --git a/apps/user_ldap/lib/Command/TestConfig.php b/apps/user_ldap/lib/Command/TestConfig.php index a1a4f14a232..77eaac91d85 100644 --- a/apps/user_ldap/lib/Command/TestConfig.php +++ b/apps/user_ldap/lib/Command/TestConfig.php @@ -1,34 +1,16 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Command; use OCA\User_LDAP\AccessFactory; use OCA\User_LDAP\Connection; use OCA\User_LDAP\Helper; +use OCA\User_LDAP\ILDAPWrapper; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -40,62 +22,56 @@ class TestConfig extends Command { protected const BINDFAILURE = 2; protected const SEARCHFAILURE = 3; - /** @var AccessFactory */ - protected $accessFactory; - - public function __construct(AccessFactory $accessFactory) { - $this->accessFactory = $accessFactory; + public function __construct( + protected AccessFactory $accessFactory, + protected Helper $helper, + protected ILDAPWrapper $ldap, + ) { parent::__construct(); } - protected function configure() { + protected function configure(): void { $this ->setName('ldap:test-config') ->setDescription('tests an LDAP configuration') ->addArgument( - 'configID', - InputArgument::REQUIRED, - 'the configuration ID' - ) + 'configID', + InputArgument::REQUIRED, + 'the configuration ID' + ) ; } protected function execute(InputInterface $input, OutputInterface $output): int { - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); - $availableConfigs = $helper->getServerConfigurationPrefixes(); + $availableConfigs = $this->helper->getServerConfigurationPrefixes(); $configID = $input->getArgument('configID'); if (!in_array($configID, $availableConfigs)) { $output->writeln('Invalid configID'); - return 1; + return self::FAILURE; } $result = $this->testConfig($configID); - switch ($result) { - case static::ESTABLISHED: - $output->writeln('The configuration is valid and the connection could be established!'); - return 0; - case static::CONF_INVALID: - $output->writeln('The configuration is invalid. Please have a look at the logs for further details.'); - break; - case static::BINDFAILURE: - $output->writeln('The configuration is valid, but the bind failed. Please check the server settings and credentials.'); - break; - case static::SEARCHFAILURE: - $output->writeln('The configuration is valid and the bind passed, but a simple search on the base fails. Please check the server base setting.'); - break; - default: - $output->writeln('Your LDAP server was kidnapped by aliens.'); - break; - } - return 1; + + $message = match ($result) { + static::ESTABLISHED => 'The configuration is valid and the connection could be established!', + static::CONF_INVALID => 'The configuration is invalid. Please have a look at the logs for further details.', + static::BINDFAILURE => 'The configuration is valid, but the bind failed. Please check the server settings and credentials.', + static::SEARCHFAILURE => 'The configuration is valid and the bind passed, but a simple search on the base fails. Please check the server base setting.', + default => 'Your LDAP server was kidnapped by aliens.', + }; + + $output->writeln($message); + + return $result === static::ESTABLISHED + ? self::SUCCESS + : self::FAILURE; } /** * Tests the specified connection */ protected function testConfig(string $configID): int { - $lw = new \OCA\User_LDAP\LDAP(); - $connection = new Connection($lw, $configID); + $connection = new Connection($this->ldap, $configID); // Ensure validation is run before we attempt the bind $connection->getConfiguration(); diff --git a/apps/user_ldap/lib/Command/TestUserSettings.php b/apps/user_ldap/lib/Command/TestUserSettings.php new file mode 100644 index 00000000000..12690158f98 --- /dev/null +++ b/apps/user_ldap/lib/Command/TestUserSettings.php @@ -0,0 +1,248 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +namespace OCA\User_LDAP\Command; + +use OCA\User_LDAP\Group_Proxy; +use OCA\User_LDAP\Helper; +use OCA\User_LDAP\Mapping\GroupMapping; +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\User\DeletedUsersIndex; +use OCA\User_LDAP\User_Proxy; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +class TestUserSettings extends Command { + public function __construct( + protected User_Proxy $backend, + protected Group_Proxy $groupBackend, + protected Helper $helper, + protected DeletedUsersIndex $dui, + protected UserMapping $mapping, + protected GroupMapping $groupMapping, + ) { + parent::__construct(); + } + + protected function configure(): void { + $this + ->setName('ldap:test-user-settings') + ->setDescription('Runs tests and show information about user related LDAP settings') + ->addArgument( + 'user', + InputArgument::REQUIRED, + 'the user name as used in Nextcloud, or the LDAP DN' + ) + ->addOption( + 'group', + 'g', + InputOption::VALUE_REQUIRED, + 'A group DN to check if the user is a member or not' + ) + ->addOption( + 'clearcache', + null, + InputOption::VALUE_NONE, + 'Clear the cache of the LDAP connection before the beginning of tests' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int { + try { + $uid = $input->getArgument('user'); + $access = $this->backend->getLDAPAccess($uid); + $connection = $access->getConnection(); + if ($input->getOption('clearcache')) { + $connection->clearCache(); + } + $configPrefix = $connection->getConfigPrefix(); + $knownDn = ''; + if ($access->stringResemblesDN($uid)) { + $knownDn = $uid; + $username = $access->dn2username($uid); + if ($username !== false) { + $uid = $username; + } + } + + $dn = $this->mapping->getDNByName($uid); + if ($dn !== false) { + $output->writeln("User <info>$dn</info> is mapped with account name <info>$uid</info>."); + $uuid = $this->mapping->getUUIDByDN($dn); + $output->writeln("Known UUID is <info>$uuid</info>."); + if ($knownDn === '') { + $knownDn = $dn; + } + } else { + $output->writeln("User <info>$uid</info> is not mapped."); + } + + if ($knownDn === '') { + return self::SUCCESS; + } + + if (!$access->isDNPartOfBase($knownDn, $access->getConnection()->ldapBaseUsers)) { + $output->writeln( + "User <info>$knownDn</info> is not in one of the configured user bases: <info>" + . implode(',', $access->getConnection()->ldapBaseUsers) + . '</info>.' + ); + } + + $output->writeln("Configuration prefix is <info>$configPrefix</info>"); + $output->writeln(''); + + $attributeNames = [ + 'ldapBase', + 'ldapBaseUsers', + 'ldapExpertUsernameAttr', + 'ldapUuidUserAttribute', + 'ldapExpertUUIDUserAttr', + 'ldapQuotaAttribute', + 'ldapEmailAttribute', + 'ldapUserDisplayName', + 'ldapUserDisplayName2', + 'ldapExtStorageHomeAttribute', + 'ldapAttributePhone', + 'ldapAttributeWebsite', + 'ldapAttributeAddress', + 'ldapAttributeTwitter', + 'ldapAttributeFediverse', + 'ldapAttributeOrganisation', + 'ldapAttributeRole', + 'ldapAttributeHeadline', + 'ldapAttributeBiography', + 'ldapAttributeBirthDate', + 'ldapAttributePronouns', + 'ldapGidNumber', + 'hasGidNumber', + ]; + $output->writeln('Attributes set in configuration:'); + foreach ($attributeNames as $attributeName) { + if (($connection->$attributeName !== '') && ($connection->$attributeName !== [])) { + if (\is_string($connection->$attributeName)) { + $output->writeln("- $attributeName: <info>" . $connection->$attributeName . '</info>'); + } else { + $output->writeln("- $attributeName: <info>" . \json_encode($connection->$attributeName) . '</info>'); + } + } + } + + $filter = $connection->ldapUserFilter; + $attrs = $access->userManager->getAttributes(true); + $attrs[] = strtolower($connection->ldapExpertUsernameAttr); + if ($connection->ldapUuidUserAttribute !== 'auto') { + $attrs[] = strtolower($connection->ldapUuidUserAttribute); + } + if ($connection->hasGidNumber) { + $attrs[] = strtolower($connection->ldapGidNumber); + } + $attrs[] = 'memberof'; + $attrs = array_values(array_unique($attrs)); + $attributes = $access->readAttributes($knownDn, $attrs, $filter); + + if ($attributes === false) { + $output->writeln( + "LDAP read on <info>$knownDn</info> with filter <info>$filter</info> failed." + ); + return self::FAILURE; + } + + $output->writeln("Attributes fetched from LDAP using filter <info>$filter</info>:"); + foreach ($attributes as $attribute => $value) { + $output->writeln( + "- $attribute: <info>" . json_encode($value) . '</info>' + ); + } + + $uuid = $access->getUUID($knownDn); + if ($connection->ldapUuidUserAttribute === 'auto') { + $output->writeln('<error>Failed to detect UUID attribute</error>'); + } else { + $output->writeln('Detected UUID attribute: <info>' . $connection->ldapUuidUserAttribute . '</info>'); + } + if ($uuid === false) { + $output->writeln("<error>Failed to find UUID for $knownDn</error>"); + } else { + $output->writeln("UUID for <info>$knownDn</info>: <info>$uuid</info>"); + } + + $groupLdapInstance = $this->groupBackend->getBackend($configPrefix); + + $output->writeln(''); + $output->writeln('Group information:'); + + $attributeNames = [ + 'ldapBaseGroups', + 'ldapDynamicGroupMemberURL', + 'ldapGroupFilter', + 'ldapGroupMemberAssocAttr', + ]; + $output->writeln('Configuration:'); + foreach ($attributeNames as $attributeName) { + if ($connection->$attributeName !== '') { + $output->writeln("- $attributeName: <info>" . $connection->$attributeName . '</info>'); + } + } + + $primaryGroup = $groupLdapInstance->getUserPrimaryGroup($knownDn); + $output->writeln('Primary group: <info>' . ($primaryGroup !== false? $primaryGroup:'') . '</info>'); + + $groupByGid = $groupLdapInstance->getUserGroupByGid($knownDn); + $output->writeln('Group from gidNumber: <info>' . ($groupByGid !== false? $groupByGid:'') . '</info>'); + + $groups = $groupLdapInstance->getUserGroups($uid); + $output->writeln('All known groups: <info>' . json_encode($groups) . '</info>'); + + $memberOfUsed = ((int)$access->connection->hasMemberOfFilterSupport === 1 + && (int)$access->connection->useMemberOfToDetectMembership === 1); + + $output->writeln('MemberOf usage: <info>' . ($memberOfUsed ? 'on' : 'off') . '</info> (' . $access->connection->hasMemberOfFilterSupport . ',' . $access->connection->useMemberOfToDetectMembership . ')'); + + $gid = (string)$input->getOption('group'); + if ($gid === '') { + return self::SUCCESS; + } + + $output->writeln(''); + $output->writeln("Group $gid:"); + $knownGroupDn = ''; + if ($access->stringResemblesDN($gid)) { + $knownGroupDn = $gid; + $groupname = $access->dn2groupname($gid); + if ($groupname !== false) { + $gid = $groupname; + } + } + + $groupDn = $this->groupMapping->getDNByName($gid); + if ($groupDn !== false) { + $output->writeln("Group <info>$groupDn</info> is mapped with name <info>$gid</info>."); + $groupUuid = $this->groupMapping->getUUIDByDN($groupDn); + $output->writeln("Known UUID is <info>$groupUuid</info>."); + if ($knownGroupDn === '') { + $knownGroupDn = $groupDn; + } + } else { + $output->writeln("Group <info>$gid</info> is not mapped."); + } + + $members = $groupLdapInstance->usersInGroup($gid); + $output->writeln('Members: <info>' . json_encode($members) . '</info>'); + + return self::SUCCESS; + + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage() . '</error>'); + return self::FAILURE; + } + } +} diff --git a/apps/user_ldap/lib/Command/UpdateUUID.php b/apps/user_ldap/lib/Command/UpdateUUID.php index 716bc2d0563..93dcc37bada 100644 --- a/apps/user_ldap/lib/Command/UpdateUUID.php +++ b/apps/user_ldap/lib/Command/UpdateUUID.php @@ -3,26 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2021 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Command; @@ -42,52 +24,36 @@ use Symfony\Component\Console\Output\OutputInterface; use function sprintf; class UuidUpdateReport { - const UNCHANGED = 0; - const UNKNOWN = 1; - const UNREADABLE = 2; - const UPDATED = 3; - const UNWRITABLE = 4; - const UNMAPPED = 5; + public const UNCHANGED = 0; + public const UNKNOWN = 1; + public const UNREADABLE = 2; + public const UPDATED = 3; + public const UNWRITABLE = 4; + public const UNMAPPED = 5; - public $id = ''; - public $dn = ''; - public $isUser = true; - public $state = self::UNCHANGED; - public $oldUuid = ''; - public $newUuid = ''; - - public function __construct(string $id, string $dn, bool $isUser, int $state, string $oldUuid = '', string $newUuid = '') { - $this->id = $id; - $this->dn = $dn; - $this->isUser = $isUser; - $this->state = $state; - $this->oldUuid = $oldUuid; - $this->newUuid = $newUuid; + public function __construct( + public string $id, + public string $dn, + public bool $isUser, + public int $state, + public string $oldUuid = '', + public string $newUuid = '', + ) { } } class UpdateUUID extends Command { - /** @var UserMapping */ - private $userMapping; - /** @var GroupMapping */ - private $groupMapping; - /** @var User_Proxy */ - private $userProxy; - /** @var Group_Proxy */ - private $groupProxy; /** @var array<UuidUpdateReport[]> */ - protected $reports = []; - /** @var LoggerInterface */ - private $logger; - /** @var bool */ - private $dryRun = false; + protected array $reports = []; + private bool $dryRun = false; - public function __construct(UserMapping $userMapping, GroupMapping $groupMapping, User_Proxy $userProxy, Group_Proxy $groupProxy, LoggerInterface $logger) { - $this->userMapping = $userMapping; - $this->groupMapping = $groupMapping; - $this->userProxy = $userProxy; - $this->groupProxy = $groupProxy; - $this->logger = $logger; + public function __construct( + private UserMapping $userMapping, + private GroupMapping $groupMapping, + private User_Proxy $userProxy, + private Group_Proxy $groupProxy, + private LoggerInterface $logger, + ) { $this->reports = [ UuidUpdateReport::UPDATED => [], UuidUpdateReport::UNKNOWN => [], @@ -140,7 +106,7 @@ class UpdateUUID extends Command { $entriesToUpdate = $this->estimateNumberOfUpdates($input); $progress = new ProgressBar($output); $progress->start($entriesToUpdate); - foreach($this->handleUpdates($input) as $_) { + foreach ($this->handleUpdates($input) as $_) { $progress->advance(); } $progress->finish(); @@ -149,8 +115,8 @@ class UpdateUUID extends Command { return count($this->reports[UuidUpdateReport::UNMAPPED]) === 0 && count($this->reports[UuidUpdateReport::UNREADABLE]) === 0 && count($this->reports[UuidUpdateReport::UNWRITABLE]) === 0 - ? 0 - : 1; + ? self::SUCCESS + : self::FAILURE; } protected function printReport(OutputInterface $output): void { @@ -178,7 +144,7 @@ class UpdateUUID extends Command { if (!empty($report->id)) { $output->writeln(sprintf(' %s: %s', $report->isUser ? 'User' : 'Group', $report->id)); - } else if (!empty($report->dn)) { + } elseif (!empty($report->dn)) { $output->writeln(sprintf(' DN: %s', $report->dn)); } } @@ -190,7 +156,7 @@ class UpdateUUID extends Command { if ($output->isVerbose()) { /** @var UuidUpdateReport $report */ foreach ($this->reports[UuidUpdateReport::UNKNOWN] as $report) { - $output->writeln(sprintf(' %s: %s',$report->isUser ? 'User' : 'Group', $report->id)); + $output->writeln(sprintf(' %s: %s', $report->isUser ? 'User' : 'Group', $report->id)); } $output->writeln(PHP_EOL . 'Old users can be removed along with their data per occ user:delete.' . PHP_EOL); } @@ -201,7 +167,7 @@ class UpdateUUID extends Command { if ($output->isVerbose()) { /** @var UuidUpdateReport $report */ foreach ($this->reports[UuidUpdateReport::UNREADABLE] as $report) { - $output->writeln(sprintf(' %s: %s',$report->isUser ? 'User' : 'Group', $report->id)); + $output->writeln(sprintf(' %s: %s', $report->isUser ? 'User' : 'Group', $report->id)); } } } @@ -211,7 +177,7 @@ class UpdateUUID extends Command { if ($output->isVerbose()) { /** @var UuidUpdateReport $report */ foreach ($this->reports[UuidUpdateReport::UNWRITABLE] as $report) { - $output->writeln(sprintf(' %s: %s',$report->isUser ? 'User' : 'Group', $report->id)); + $output->writeln(sprintf(' %s: %s', $report->isUser ? 'User' : 'Group', $report->id)); } } } @@ -219,37 +185,37 @@ class UpdateUUID extends Command { protected function handleUpdates(InputInterface $input): \Generator { if ($input->getOption('all')) { - foreach($this->handleMappingBasedUpdates(false) as $_) { + foreach ($this->handleMappingBasedUpdates(false) as $_) { yield; } - } else if ($input->getOption('userId') + } elseif ($input->getOption('userId') || $input->getOption('groupId') || $input->getOption('dn') ) { - foreach($this->handleUpdatesByUserId($input->getOption('userId')) as $_) { + foreach ($this->handleUpdatesByUserId($input->getOption('userId')) as $_) { yield; } - foreach($this->handleUpdatesByGroupId($input->getOption('groupId')) as $_) { + foreach ($this->handleUpdatesByGroupId($input->getOption('groupId')) as $_) { yield; } - foreach($this->handleUpdatesByDN($input->getOption('dn')) as $_) { + foreach ($this->handleUpdatesByDN($input->getOption('dn')) as $_) { yield; } } else { - foreach($this->handleMappingBasedUpdates(true) as $_) { + foreach ($this->handleMappingBasedUpdates(true) as $_) { yield; } } } protected function handleUpdatesByUserId(array $userIds): \Generator { - foreach($this->handleUpdatesByEntryId($userIds, $this->userMapping) as $_) { + foreach ($this->handleUpdatesByEntryId($userIds, $this->userMapping) as $_) { yield; } } protected function handleUpdatesByGroupId(array $groupIds): \Generator { - foreach($this->handleUpdatesByEntryId($groupIds, $this->groupMapping) as $_) { + foreach ($this->handleUpdatesByEntryId($groupIds, $this->groupMapping) as $_) { yield; } } @@ -272,10 +238,10 @@ class UpdateUUID extends Command { $this->reports[UuidUpdateReport::UNMAPPED][] = new UuidUpdateReport('', $dn, true, UuidUpdateReport::UNMAPPED); yield; } - foreach($this->handleUpdatesByList($this->userMapping, $userList) as $_) { + foreach ($this->handleUpdatesByList($this->userMapping, $userList) as $_) { yield; } - foreach($this->handleUpdatesByList($this->groupMapping, $groupList) as $_) { + foreach ($this->handleUpdatesByList($this->groupMapping, $groupList) as $_) { yield; } } @@ -284,7 +250,7 @@ class UpdateUUID extends Command { $isUser = $mapping instanceof UserMapping; $list = []; while ($id = array_pop($ids)) { - if(!$dn = $mapping->getDNByName($id)) { + if (!$dn = $mapping->getDNByName($id)) { $this->reports[UuidUpdateReport::UNMAPPED][] = new UuidUpdateReport($id, '', $isUser, UuidUpdateReport::UNMAPPED); yield; continue; @@ -293,21 +259,21 @@ class UpdateUUID extends Command { $uuid = $mapping->getUUIDByDN($dn); $list[] = ['name' => $id, 'uuid' => $uuid]; } - foreach($this->handleUpdatesByList($mapping, $list) as $_) { + foreach ($this->handleUpdatesByList($mapping, $list) as $_) { yield; } } protected function handleMappingBasedUpdates(bool $invalidatedOnly): \Generator { $limit = 1000; - /** @var AbstractMapping $mapping*/ - foreach([$this->userMapping, $this->groupMapping] as $mapping) { + /** @var AbstractMapping $mapping */ + foreach ([$this->userMapping, $this->groupMapping] as $mapping) { $offset = 0; do { $list = $mapping->getList($offset, $limit, $invalidatedOnly); $offset += $limit; - foreach($this->handleUpdatesByList($mapping, $list) as $tick) { + foreach ($this->handleUpdatesByList($mapping, $list) as $tick) { yield; // null, for it only advances progress counter } } while (count($list) === $limit); @@ -326,8 +292,7 @@ class UpdateUUID extends Command { foreach ($list as $row) { $access = $backendProxy->getLDAPAccess($row['name']); if ($access instanceof Access - && $dn = $mapping->getDNByName($row['name'])) - { + && $dn = $mapping->getDNByName($row['name'])) { if ($uuid = $access->getUUID($dn, $isUser)) { if ($uuid !== $row['uuid']) { if ($this->dryRun || $mapping->setUUIDbyDN($uuid, $dn)) { @@ -359,7 +324,7 @@ class UpdateUUID extends Command { protected function estimateNumberOfUpdates(InputInterface $input): int { if ($input->getOption('all')) { return $this->userMapping->count() + $this->groupMapping->count(); - } else if ($input->getOption('userId') + } elseif ($input->getOption('userId') || $input->getOption('groupId') || $input->getOption('dn') ) { @@ -370,5 +335,4 @@ class UpdateUUID extends Command { return $this->userMapping->countInvalidated() + $this->groupMapping->countInvalidated(); } } - } diff --git a/apps/user_ldap/lib/Configuration.php b/apps/user_ldap/lib/Configuration.php index c16823d39ee..b4a5b847204 100644 --- a/apps/user_ldap/lib/Configuration.php +++ b/apps/user_ldap/lib/Configuration.php @@ -1,42 +1,89 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Alexander Bergolth <leo@strike.wu.ac.at> - * @author Alex Weirig <alex.weirig@technolink.lu> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lennart Rosam <hello@takuto.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Xuanwo <xuanwo@yunify.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; +use OCP\IConfig; +use OCP\Server; +use Psr\Log\LoggerInterface; + /** - * @property int ldapPagingSize holds an integer - * @property string ldapUserAvatarRule + * @property string $ldapHost + * @property string $ldapPort + * @property string $ldapBackupHost + * @property string $ldapBackupPort + * @property string $ldapBackgroundHost + * @property string $ldapBackgroundPort + * @property array|'' $ldapBase + * @property array|'' $ldapBaseUsers + * @property array|'' $ldapBaseGroups + * @property string $ldapAgentName + * @property string $ldapAgentPassword + * @property string $ldapTLS + * @property string $turnOffCertCheck + * @property string $ldapIgnoreNamingRules + * @property string $ldapUserDisplayName + * @property string $ldapUserDisplayName2 + * @property string $ldapUserAvatarRule + * @property string $ldapGidNumber + * @property array|'' $ldapUserFilterObjectclass + * @property array|'' $ldapUserFilterGroups + * @property string $ldapUserFilter + * @property string $ldapUserFilterMode + * @property string $ldapGroupFilter + * @property string $ldapGroupFilterMode + * @property array|'' $ldapGroupFilterObjectclass + * @property array|'' $ldapGroupFilterGroups + * @property string $ldapGroupDisplayName + * @property string $ldapGroupMemberAssocAttr + * @property string $ldapLoginFilter + * @property string $ldapLoginFilterMode + * @property string $ldapLoginFilterEmail + * @property string $ldapLoginFilterUsername + * @property array|'' $ldapLoginFilterAttributes + * @property string $ldapQuotaAttribute + * @property string $ldapQuotaDefault + * @property string $ldapEmailAttribute + * @property string $ldapCacheTTL + * @property string $ldapUuidUserAttribute + * @property string $ldapUuidGroupAttribute + * @property string $ldapOverrideMainServer + * @property string $ldapConfigurationActive + * @property array|'' $ldapAttributesForUserSearch + * @property array|'' $ldapAttributesForGroupSearch + * @property string $ldapExperiencedAdmin + * @property string $homeFolderNamingRule + * @property string $hasMemberOfFilterSupport + * @property string $useMemberOfToDetectMembership + * @property string $ldapExpertUsernameAttr + * @property string $ldapExpertUUIDUserAttr + * @property string $ldapExpertUUIDGroupAttr + * @property string $markRemnantsAsDisabled + * @property string $lastJpegPhotoLookup + * @property string $ldapNestedGroups + * @property string $ldapPagingSize + * @property string $turnOnPasswordChange + * @property string $ldapDynamicGroupMemberURL + * @property string $ldapDefaultPPolicyDN + * @property string $ldapExtStorageHomeAttribute + * @property string $ldapMatchingRuleInChainState + * @property string $ldapConnectionTimeout + * @property string $ldapAttributePhone + * @property string $ldapAttributeWebsite + * @property string $ldapAttributeAddress + * @property string $ldapAttributeTwitter + * @property string $ldapAttributeFediverse + * @property string $ldapAttributeOrganisation + * @property string $ldapAttributeRole + * @property string $ldapAttributeHeadline + * @property string $ldapAttributeBiography + * @property string $ldapAdminGroup + * @property string $ldapAttributeBirthDate + * @property string $ldapAttributePronouns */ class Configuration { public const AVATAR_PREFIX_DEFAULT = 'default'; @@ -46,11 +93,6 @@ class Configuration { public const LDAP_SERVER_FEATURE_UNKNOWN = 'unknown'; public const LDAP_SERVER_FEATURE_AVAILABLE = 'available'; public const LDAP_SERVER_FEATURE_UNAVAILABLE = 'unavailable'; - - /** - * @var string - */ - protected $configPrefix; /** * @var bool */ @@ -68,6 +110,8 @@ class Configuration { 'ldapPort' => null, 'ldapBackupHost' => null, 'ldapBackupPort' => null, + 'ldapBackgroundHost' => null, + 'ldapBackgroundPort' => null, 'ldapBase' => null, 'ldapBaseUsers' => null, 'ldapBaseGroups' => null, @@ -112,6 +156,7 @@ class Configuration { 'ldapExpertUsernameAttr' => null, 'ldapExpertUUIDUserAttr' => null, 'ldapExpertUUIDGroupAttr' => null, + 'markRemnantsAsDisabled' => false, 'lastJpegPhotoLookup' => null, 'ldapNestedGroups' => false, 'ldapPagingSize' => null, @@ -120,10 +165,26 @@ class Configuration { 'ldapDefaultPPolicyDN' => null, 'ldapExtStorageHomeAttribute' => null, 'ldapMatchingRuleInChainState' => self::LDAP_SERVER_FEATURE_UNKNOWN, + 'ldapConnectionTimeout' => 15, + 'ldapAttributePhone' => null, + 'ldapAttributeWebsite' => null, + 'ldapAttributeAddress' => null, + 'ldapAttributeTwitter' => null, + 'ldapAttributeFediverse' => null, + 'ldapAttributeOrganisation' => null, + 'ldapAttributeRole' => null, + 'ldapAttributeHeadline' => null, + 'ldapAttributeBiography' => null, + 'ldapAdminGroup' => '', + 'ldapAttributeBirthDate' => null, + 'ldapAttributeAnniversaryDate' => null, + 'ldapAttributePronouns' => null, ]; - public function __construct(string $configPrefix, bool $autoRead = true) { - $this->configPrefix = $configPrefix; + public function __construct( + protected string $configPrefix, + bool $autoRead = true, + ) { if ($autoRead) { $this->readConfiguration(); } @@ -157,13 +218,13 @@ class Configuration { * from configuration. It does not save the configuration! To do so, you * must call saveConfiguration afterwards. * @param array $config array that holds the config parameters in an associated - * array + * array * @param array &$applied optional; array where the set fields will be given to */ - public function setConfiguration(array $config, array &$applied = null): void { + public function setConfiguration(array $config, ?array &$applied = null): void { $cta = $this->getConfigTranslationArray(); foreach ($config as $inputKey => $val) { - if (strpos($inputKey, '_') !== false && array_key_exists($inputKey, $cta)) { + if (str_contains($inputKey, '_') && array_key_exists($inputKey, $cta)) { $key = $cta[$inputKey]; } elseif (array_key_exists($inputKey, $this->config)) { $key = $inputKey; @@ -178,8 +239,8 @@ class Configuration { break; case 'homeFolderNamingRule': $trimmedVal = trim($val); - if ($trimmedVal !== '' && strpos($val, 'attr:') === false) { - $val = 'attr:'.$trimmedVal; + if ($trimmedVal !== '' && !str_contains($val, 'attr:')) { + $val = 'attr:' . $trimmedVal; } break; case 'ldapBase': @@ -235,6 +296,28 @@ class Configuration { break; case 'ldapUserDisplayName2': case 'ldapGroupDisplayName': + case 'ldapGidNumber': + case 'ldapGroupMemberAssocAttr': + case 'ldapQuotaAttribute': + case 'ldapEmailAttribute': + case 'ldapUuidUserAttribute': + case 'ldapUuidGroupAttribute': + case 'ldapExpertUsernameAttr': + case 'ldapExpertUUIDUserAttr': + case 'ldapExpertUUIDGroupAttr': + case 'ldapExtStorageHomeAttribute': + case 'ldapAttributePhone': + case 'ldapAttributeWebsite': + case 'ldapAttributeAddress': + case 'ldapAttributeTwitter': + case 'ldapAttributeFediverse': + case 'ldapAttributeOrganisation': + case 'ldapAttributeRole': + case 'ldapAttributeHeadline': + case 'ldapAttributeBiography': + case 'ldapAttributeBirthDate': + case 'ldapAttributeAnniversaryDate': + case 'ldapAttributePronouns': $readMethod = 'getLcValue'; break; case 'ldapUserDisplayName': @@ -277,7 +360,7 @@ class Configuration { $value = implode("\n", $value); } break; - //following options are not stored but detected, skip them + //following options are not stored but detected, skip them case 'ldapIgnoreNamingRules': case 'ldapUuidUserAttribute': case 'ldapUuidGroupAttribute': @@ -357,7 +440,7 @@ class Configuration { protected function getSystemValue(string $varName): string { //FIXME: if another system value is added, softcode the default value - return \OC::$server->getConfig()->getSystemValue($varName, false); + return Server::get(IConfig::class)->getSystemValue($varName, false); } protected function getValue(string $varName): string { @@ -365,9 +448,9 @@ class Configuration { if (is_null($defaults)) { $defaults = $this->getDefaults(); } - return \OC::$server->getConfig()->getAppValue('user_ldap', - $this->configPrefix.$varName, - $defaults[$varName]); + return Server::get(IConfig::class)->getAppValue('user_ldap', + $this->configPrefix . $varName, + $defaults[$varName]); } /** @@ -394,9 +477,9 @@ class Configuration { } protected function saveValue(string $varName, string $value): bool { - \OC::$server->getConfig()->setAppValue( + Server::get(IConfig::class)->setAppValue( 'user_ldap', - $this->configPrefix.$varName, + $this->configPrefix . $varName, $value ); return true; @@ -404,7 +487,7 @@ class Configuration { /** * @return array an associative array with the default values. Keys are correspond - * to config-value entries in the database table + * to config-value entries in the database table */ public function getDefaults(): array { return [ @@ -412,6 +495,8 @@ class Configuration { 'ldap_port' => '', 'ldap_backup_host' => '', 'ldap_backup_port' => '', + 'ldap_background_host' => '', + 'ldap_background_port' => '', 'ldap_override_main_server' => '', 'ldap_dn' => '', 'ldap_agent_password' => '', @@ -453,6 +538,7 @@ class Configuration { 'ldap_expert_uuid_group_attr' => '', 'has_memberof_filter_support' => 0, 'use_memberof_to_detect_membership' => 1, + 'ldap_mark_remnants_as_disabled' => 0, 'last_jpegPhoto_lookup' => 0, 'ldap_nested_groups' => 0, 'ldap_paging_size' => 500, @@ -463,6 +549,20 @@ class Configuration { 'ldap_user_avatar_rule' => 'default', 'ldap_ext_storage_home_attribute' => '', 'ldap_matching_rule_in_chain_state' => self::LDAP_SERVER_FEATURE_UNKNOWN, + 'ldap_connection_timeout' => 15, + 'ldap_attr_phone' => '', + 'ldap_attr_website' => '', + 'ldap_attr_address' => '', + 'ldap_attr_twitter' => '', + 'ldap_attr_fediverse' => '', + 'ldap_attr_organisation' => '', + 'ldap_attr_role' => '', + 'ldap_attr_headline' => '', + 'ldap_attr_biography' => '', + 'ldap_admin_group' => '', + 'ldap_attr_birthdate' => '', + 'ldap_attr_anniversarydate' => '', + 'ldap_attr_pronouns' => '', ]; } @@ -476,6 +576,8 @@ class Configuration { 'ldap_port' => 'ldapPort', 'ldap_backup_host' => 'ldapBackupHost', 'ldap_backup_port' => 'ldapBackupPort', + 'ldap_background_host' => 'ldapBackgroundHost', + 'ldap_background_port' => 'ldapBackgroundPort', 'ldap_override_main_server' => 'ldapOverrideMainServer', 'ldap_dn' => 'ldapAgentName', 'ldap_agent_password' => 'ldapAgentPassword', @@ -516,6 +618,7 @@ class Configuration { 'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr', 'has_memberof_filter_support' => 'hasMemberOfFilterSupport', 'use_memberof_to_detect_membership' => 'useMemberOfToDetectMembership', + 'ldap_mark_remnants_as_disabled' => 'markRemnantsAsDisabled', 'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup', 'ldap_nested_groups' => 'ldapNestedGroups', 'ldap_paging_size' => 'ldapPagingSize', @@ -526,6 +629,20 @@ class Configuration { 'ldap_ext_storage_home_attribute' => 'ldapExtStorageHomeAttribute', 'ldap_matching_rule_in_chain_state' => 'ldapMatchingRuleInChainState', 'ldapIgnoreNamingRules' => 'ldapIgnoreNamingRules', // sysconfig + 'ldap_connection_timeout' => 'ldapConnectionTimeout', + 'ldap_attr_phone' => 'ldapAttributePhone', + 'ldap_attr_website' => 'ldapAttributeWebsite', + 'ldap_attr_address' => 'ldapAttributeAddress', + 'ldap_attr_twitter' => 'ldapAttributeTwitter', + 'ldap_attr_fediverse' => 'ldapAttributeFediverse', + 'ldap_attr_organisation' => 'ldapAttributeOrganisation', + 'ldap_attr_role' => 'ldapAttributeRole', + 'ldap_attr_headline' => 'ldapAttributeHeadline', + 'ldap_attr_biography' => 'ldapAttributeBiography', + 'ldap_admin_group' => 'ldapAdminGroup', + 'ldap_attr_birthdate' => 'ldapAttributeBirthDate', + 'ldap_attr_anniversarydate' => 'ldapAttributeAnniversaryDate', + 'ldap_attr_pronouns' => 'ldapAttributePronouns', ]; return $array; } @@ -547,7 +664,7 @@ class Configuration { if ($value === self::AVATAR_PREFIX_NONE) { return []; } - if (strpos($value, self::AVATAR_PREFIX_DATA_ATTRIBUTE) === 0) { + if (str_starts_with($value, self::AVATAR_PREFIX_DATA_ATTRIBUTE)) { $attribute = trim(substr($value, strlen(self::AVATAR_PREFIX_DATA_ATTRIBUTE))); if ($attribute === '') { return $defaultAttributes; @@ -555,8 +672,16 @@ class Configuration { return [strtolower($attribute)]; } if ($value !== self::AVATAR_PREFIX_DEFAULT) { - \OC::$server->getLogger()->warning('Invalid config value to ldapUserAvatarRule; falling back to default.'); + Server::get(LoggerInterface::class)->warning('Invalid config value to ldapUserAvatarRule; falling back to default.'); } return $defaultAttributes; } + + /** + * Returns TRUE if the ldapHost variable starts with 'ldapi://' + */ + public function usesLdapi(): bool { + $host = $this->config['ldapHost']; + return is_string($host) && (substr($host, 0, strlen('ldapi://')) === 'ldapi://'); + } } diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php index 565fb415e58..336179ac341 100644 --- a/apps/user_ldap/lib/Connection.php +++ b/apps/user_ldap/lib/Connection.php @@ -1,103 +1,106 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Jarkko Lehtoranta <devel@jlranta.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Julius Härtl <jus@bitgrid.net> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author root <root@localhost.localdomain> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Xuanwo <xuanwo@yunify.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; use OC\ServerNotAvailableException; +use OCA\User_LDAP\Exceptions\ConfigurationIssueException; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IL10N; +use OCP\Server; +use OCP\Util; use Psr\Log\LoggerInterface; /** - * magic properties (incomplete) + * magic properties * responsible for LDAP connections in context with the provided configuration * - * @property string ldapHost - * @property string ldapPort holds the port number - * @property string ldapUserFilter - * @property string ldapUserDisplayName - * @property string ldapUserDisplayName2 - * @property string ldapUserAvatarRule - * @property boolean turnOnPasswordChange - * @property string[] ldapBaseUsers - * @property int|null ldapPagingSize holds an integer - * @property bool|mixed|void ldapGroupMemberAssocAttr - * @property string ldapUuidUserAttribute - * @property string ldapUuidGroupAttribute - * @property string ldapExpertUUIDUserAttr - * @property string ldapExpertUUIDGroupAttr - * @property string ldapQuotaAttribute - * @property string ldapQuotaDefault - * @property string ldapEmailAttribute - * @property string ldapExtStorageHomeAttribute - * @property string homeFolderNamingRule - * @property bool|string ldapNestedGroups - * @property string[] ldapBaseGroups - * @property string ldapGroupFilter - * @property string ldapGroupDisplayName - * @property string ldapLoginFilter - * @property string ldapDynamicGroupMemberURL - * @property string ldapGidNumber - * @property int hasMemberOfFilterSupport - * @property int useMemberOfToDetectMembership - * @property string ldapMatchingRuleInChainState + * @property string $ldapHost + * @property string $ldapPort + * @property string $ldapBackupHost + * @property string $ldapBackupPort + * @property string $ldapBackgroundHost + * @property string $ldapBackgroundPort + * @property array|'' $ldapBase + * @property array|'' $ldapBaseUsers + * @property array|'' $ldapBaseGroups + * @property string $ldapAgentName + * @property string $ldapAgentPassword + * @property string $ldapTLS + * @property string $turnOffCertCheck + * @property string $ldapIgnoreNamingRules + * @property string $ldapUserDisplayName + * @property string $ldapUserDisplayName2 + * @property string $ldapUserAvatarRule + * @property string $ldapGidNumber + * @property array|'' $ldapUserFilterObjectclass + * @property array|'' $ldapUserFilterGroups + * @property string $ldapUserFilter + * @property string $ldapUserFilterMode + * @property string $ldapGroupFilter + * @property string $ldapGroupFilterMode + * @property array|'' $ldapGroupFilterObjectclass + * @property array|'' $ldapGroupFilterGroups + * @property string $ldapGroupDisplayName + * @property string $ldapGroupMemberAssocAttr + * @property string $ldapLoginFilter + * @property string $ldapLoginFilterMode + * @property string $ldapLoginFilterEmail + * @property string $ldapLoginFilterUsername + * @property array|'' $ldapLoginFilterAttributes + * @property string $ldapQuotaAttribute + * @property string $ldapQuotaDefault + * @property string $ldapEmailAttribute + * @property string $ldapCacheTTL + * @property string $ldapUuidUserAttribute + * @property string $ldapUuidGroupAttribute + * @property string $ldapOverrideMainServer + * @property string $ldapConfigurationActive + * @property array|'' $ldapAttributesForUserSearch + * @property array|'' $ldapAttributesForGroupSearch + * @property string $ldapExperiencedAdmin + * @property string $homeFolderNamingRule + * @property string $hasMemberOfFilterSupport + * @property string $useMemberOfToDetectMembership + * @property string $ldapExpertUsernameAttr + * @property string $ldapExpertUUIDUserAttr + * @property string $ldapExpertUUIDGroupAttr + * @property string $markRemnantsAsDisabled + * @property string $lastJpegPhotoLookup + * @property string $ldapNestedGroups + * @property string $ldapPagingSize + * @property string $turnOnPasswordChange + * @property string $ldapDynamicGroupMemberURL + * @property string $ldapDefaultPPolicyDN + * @property string $ldapExtStorageHomeAttribute + * @property string $ldapMatchingRuleInChainState + * @property string $ldapConnectionTimeout + * @property string $ldapAttributePhone + * @property string $ldapAttributeWebsite + * @property string $ldapAttributeAddress + * @property string $ldapAttributeTwitter + * @property string $ldapAttributeFediverse + * @property string $ldapAttributeOrganisation + * @property string $ldapAttributeRole + * @property string $ldapAttributeHeadline + * @property string $ldapAttributeBiography + * @property string $ldapAdminGroup + * @property string $ldapAttributeBirthDate + * @property string $ldapAttributePronouns */ class Connection extends LDAPUtility { - /** - * @var resource|\LDAP\Connection|null - */ - private $ldapConnectionRes = null; - - /** - * @var string - */ - private $configPrefix; - - /** - * @var ?string - */ - private $configID; - - /** - * @var bool - */ - private $configured = false; + private ?\LDAP\Connection $ldapConnectionRes = null; + private bool $configured = false; /** * @var bool whether connection should be kept on __destruct */ - private $dontDestruct = false; + private bool $dontDestruct = false; /** * @var bool runtime flag that indicates whether supported primary groups are available @@ -110,11 +113,11 @@ class Connection extends LDAPUtility { public $hasGidNumber = true; /** - * @var \OCP\ICache|null + * @var ICache|null */ protected $cache = null; - /** @var Configuration settings handler **/ + /** @var Configuration settings handler * */ protected $configuration; /** @@ -128,31 +131,34 @@ class Connection extends LDAPUtility { protected $ignoreValidation = false; /** - * @var array{dn?: mixed, hash?: string, result?: bool} + * @var array{sum?: string, result?: bool} */ protected $bindResult = []; - /** @var LoggerInterface */ - protected $logger; + protected LoggerInterface $logger; + private IL10N $l10n; /** * Constructor * @param string $configPrefix a string with the prefix for the configkey column (appconfig table) * @param string|null $configID a string with the value for the appid column (appconfig table) or null for on-the-fly connections */ - public function __construct(ILDAPWrapper $ldap, string $configPrefix = '', ?string $configID = 'user_ldap') { + public function __construct( + ILDAPWrapper $ldap, + private string $configPrefix = '', + private ?string $configID = 'user_ldap', + ) { parent::__construct($ldap); - $this->configPrefix = $configPrefix; - $this->configID = $configID; - $this->configuration = new Configuration($configPrefix, !is_null($configID)); - $memcache = \OC::$server->getMemCacheFactory(); + $this->configuration = new Configuration($this->configPrefix, !is_null($this->configID)); + $memcache = Server::get(ICacheFactory::class); if ($memcache->isAvailable()) { $this->cache = $memcache->createDistributed(); } - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $this->doNotValidate = !in_array($this->configPrefix, $helper->getServerConfigurationPrefixes()); - $this->logger = \OC::$server->get(LoggerInterface::class); + $this->logger = Server::get(LoggerInterface::class); + $this->l10n = Util::getL10N('user_ldap'); } public function __destruct() { @@ -167,7 +173,7 @@ class Connection extends LDAPUtility { */ public function __clone() { $this->configuration = new Configuration($this->configPrefix, - !is_null($this->configID)); + !is_null($this->configID)); if (count($this->bindResult) !== 0 && $this->bindResult['result'] === true) { $this->bindResult = []; } @@ -229,14 +235,11 @@ class Connection extends LDAPUtility { } /** - * @return resource|\LDAP\Connection The LDAP resource + * @return \LDAP\Connection The LDAP resource */ - public function getConnectionResource() { + public function getConnectionResource(): \LDAP\Connection { if (!$this->ldapConnectionRes) { $this->init(); - } elseif (!$this->ldap->isResource($this->ldapConnectionRes)) { - $this->ldapConnectionRes = null; - $this->establishConnection(); } if (is_null($this->ldapConnectionRes)) { $this->logger->error( @@ -251,7 +254,7 @@ class Connection extends LDAPUtility { /** * resets the connection resource */ - public function resetConnectionResource() { + public function resetConnectionResource(): void { if (!is_null($this->ldapConnectionRes)) { @$this->ldap->unbind($this->ldapConnectionRes); $this->ldapConnectionRes = null; @@ -261,14 +264,13 @@ class Connection extends LDAPUtility { /** * @param string|null $key - * @return string */ - private function getCacheKey($key) { - $prefix = 'LDAP-'.$this->configID.'-'.$this->configPrefix.'-'; + private function getCacheKey($key): string { + $prefix = 'LDAP-' . $this->configID . '-' . $this->configPrefix . '-'; if (is_null($key)) { return $prefix; } - return $prefix.hash('sha256', $key); + return $prefix . hash('sha256', $key); } /** @@ -287,11 +289,15 @@ class Connection extends LDAPUtility { return json_decode(base64_decode($this->cache->get($key) ?? ''), true); } + public function getConfigPrefix(): string { + return $this->configPrefix; + } + /** * @param string $key * @param mixed $value */ - public function writeToCache($key, $value): void { + public function writeToCache($key, $value, ?int $ttlOverride = null): void { if (!$this->configured) { $this->readConfiguration(); } @@ -302,7 +308,8 @@ class Connection extends LDAPUtility { } $key = $this->getCacheKey($key); $value = base64_encode(json_encode($value)); - $this->cache->set($key, $value, $this->configuration->ldapCacheTTL); + $ttl = $ttlOverride ?? $this->configuration->ldapCacheTTL; + $this->cache->set($key, $value, $ttl); } public function clearCache() { @@ -314,10 +321,9 @@ class Connection extends LDAPUtility { /** * Caches the general LDAP configuration. * @param bool $force optional. true, if the re-read should be forced. defaults - * to false. - * @return null + * to false. */ - private function readConfiguration($force = false) { + private function readConfiguration(bool $force = false): void { if ((!$this->configured || $force) && !is_null($this->configID)) { $this->configuration->readConfiguration(); $this->configured = $this->validateConfiguration(); @@ -328,16 +334,17 @@ class Connection extends LDAPUtility { * set LDAP configuration with values delivered by an array, not read from configuration * @param array $config array that holds the config parameters in an associated array * @param array &$setParameters optional; array where the set fields will be given to + * @param bool $throw if true, throw ConfigurationIssueException with details instead of returning false * @return bool true if config validates, false otherwise. Check with $setParameters for detailed success on single parameters */ - public function setConfiguration($config, &$setParameters = null): bool { + public function setConfiguration(array $config, ?array &$setParameters = null, bool $throw = false): bool { if (is_null($setParameters)) { $setParameters = []; } $this->doNotValidate = false; $this->configuration->setConfiguration($config, $setParameters); if (count($setParameters) > 0) { - $this->configured = $this->validateConfiguration(); + $this->configured = $this->validateConfiguration($throw); } @@ -366,7 +373,7 @@ class Connection extends LDAPUtility { foreach ($cta as $dbkey => $configkey) { switch ($configkey) { case 'homeFolderNamingRule': - if (strpos($config[$configkey], 'attr:') === 0) { + if (str_starts_with($config[$configkey], 'attr:')) { $result[$dbkey] = substr($config[$configkey], 5); } else { $result[$dbkey] = ''; @@ -389,7 +396,7 @@ class Connection extends LDAPUtility { return $result; } - private function doSoftValidation() { + private function doSoftValidation(): void { //if User or Group Base are not set, take over Base DN setting foreach (['ldapBaseUsers', 'ldapBaseGroups'] as $keyBase) { $val = $this->configuration->$keyBase; @@ -399,21 +406,19 @@ class Connection extends LDAPUtility { } foreach (['ldapExpertUUIDUserAttr' => 'ldapUuidUserAttribute', - 'ldapExpertUUIDGroupAttr' => 'ldapUuidGroupAttribute'] - as $expertSetting => $effectiveSetting) { + 'ldapExpertUUIDGroupAttr' => 'ldapUuidGroupAttribute'] as $expertSetting => $effectiveSetting) { $uuidOverride = $this->configuration->$expertSetting; if (!empty($uuidOverride)) { $this->configuration->$effectiveSetting = $uuidOverride; } else { $uuidAttributes = Access::UUID_ATTRIBUTES; array_unshift($uuidAttributes, 'auto'); - if (!in_array($this->configuration->$effectiveSetting, - $uuidAttributes) - && (!is_null($this->configID))) { + if (!in_array($this->configuration->$effectiveSetting, $uuidAttributes) + && !is_null($this->configID)) { $this->configuration->$effectiveSetting = 'auto'; $this->configuration->saveConfiguration(); $this->logger->info( - 'Illegal value for the '.$effectiveSetting.', reset to autodetect.', + 'Illegal value for the ' . $effectiveSetting . ', reset to autodetect.', ['app' => 'user_ldap'] ); } @@ -422,7 +427,7 @@ class Connection extends LDAPUtility { $backupPort = (int)$this->configuration->ldapBackupPort; if ($backupPort <= 0) { - $this->configuration->backupPort = $this->configuration->ldapPort; + $this->configuration->ldapBackupPort = $this->configuration->ldapPort; } //make sure empty search attributes are saved as simple, empty array @@ -437,7 +442,7 @@ class Connection extends LDAPUtility { if ((stripos((string)$this->configuration->ldapHost, 'ldaps://') === 0) && $this->configuration->ldapTLS) { - $this->configuration->ldapTLS = false; + $this->configuration->ldapTLS = (string)false; $this->logger->info( 'LDAPS (already using secure connection) and TLS do not work together. Switched off TLS.', ['app' => 'user_ldap'] @@ -446,16 +451,18 @@ class Connection extends LDAPUtility { } /** - * @return bool + * @throws ConfigurationIssueException */ - private function doCriticalValidation() { - $configurationOK = true; - $errorStr = 'Configuration Error (prefix '. - (string)$this->configPrefix .'): '; - + private function doCriticalValidation(): void { //options that shall not be empty - $options = ['ldapHost', 'ldapPort', 'ldapUserDisplayName', + $options = ['ldapHost', 'ldapUserDisplayName', 'ldapGroupDisplayName', 'ldapLoginFilter']; + + //ldapPort should not be empty either unless ldapHost is pointing to a socket + if (!$this->configuration->usesLdapi()) { + $options[] = 'ldapPort'; + } + foreach ($options as $key) { $val = $this->configuration->$key; if (empty($val)) { @@ -479,10 +486,9 @@ class Connection extends LDAPUtility { $subj = $key; break; } - $configurationOK = false; - $this->logger->warning( - $errorStr.'No '.$subj.' given!', - ['app' => 'user_ldap'] + throw new ConfigurationIssueException( + 'No ' . $subj . ' given!', + $this->l10n->t('Mandatory field "%s" left empty', $subj), ); } } @@ -490,47 +496,76 @@ class Connection extends LDAPUtility { //combinations $agent = $this->configuration->ldapAgentName; $pwd = $this->configuration->ldapAgentPassword; - if ( - ($agent === '' && $pwd !== '') - || ($agent !== '' && $pwd === '') - ) { - $this->logger->warning( - $errorStr.'either no password is given for the user ' . - 'agent or a password is given, but not an LDAP agent.', - ['app' => 'user_ldap'] + if ($agent === '' && $pwd !== '') { + throw new ConfigurationIssueException( + 'A password is given, but not an LDAP agent', + $this->l10n->t('A password is given, but not an LDAP agent'), + ); + } + if ($agent !== '' && $pwd === '') { + throw new ConfigurationIssueException( + 'No password is given for the user agent', + $this->l10n->t('No password is given for the user agent'), ); - $configurationOK = false; } $base = $this->configuration->ldapBase; $baseUsers = $this->configuration->ldapBaseUsers; $baseGroups = $this->configuration->ldapBaseGroups; - if (empty($base) && empty($baseUsers) && empty($baseGroups)) { - $this->logger->warning( - $errorStr.'Not a single Base DN given.', - ['app' => 'user_ldap'] + if (empty($base)) { + throw new ConfigurationIssueException( + 'Not a single Base DN given', + $this->l10n->t('No LDAP base DN was given'), ); - $configurationOK = false; } - if (mb_strpos((string)$this->configuration->ldapLoginFilter, '%uid', 0, 'UTF-8') - === false) { - $this->logger->warning( - $errorStr.'login filter does not contain %uid place holder.', - ['app' => 'user_ldap'] + if (!empty($baseUsers) && !$this->checkBasesAreValid($baseUsers, $base)) { + throw new ConfigurationIssueException( + 'User base is not in root base', + $this->l10n->t('User base DN is not a subnode of global base DN'), + ); + } + + if (!empty($baseGroups) && !$this->checkBasesAreValid($baseGroups, $base)) { + throw new ConfigurationIssueException( + 'Group base is not in root base', + $this->l10n->t('Group base DN is not a subnode of global base DN'), ); - $configurationOK = false; } - return $configurationOK; + if (mb_strpos((string)$this->configuration->ldapLoginFilter, '%uid', 0, 'UTF-8') === false) { + throw new ConfigurationIssueException( + 'Login filter does not contain %uid placeholder.', + $this->l10n->t('Login filter does not contain %s placeholder.', ['%uid']), + ); + } + } + + /** + * Checks that all bases are subnodes of one of the root bases + */ + private function checkBasesAreValid(array $bases, array $rootBases): bool { + foreach ($bases as $base) { + $ok = false; + foreach ($rootBases as $rootBase) { + if (str_ends_with($base, $rootBase)) { + $ok = true; + break; + } + } + if (!$ok) { + return false; + } + } + return true; } /** * Validates the user specified configuration * @return bool true if configuration seems OK, false otherwise */ - private function validateConfiguration() { + private function validateConfiguration(bool $throw = false): bool { if ($this->doNotValidate) { //don't do a validation if it is a new configuration with pure //default values. Will be allowed on changes via __set or @@ -544,7 +579,19 @@ class Connection extends LDAPUtility { //second step: critical checks. If left empty or filled wrong, mark as //not configured and give a warning. - return $this->doCriticalValidation(); + try { + $this->doCriticalValidation(); + return true; + } catch (ConfigurationIssueException $e) { + if ($throw) { + throw $e; + } + $this->logger->warning( + 'Configuration Error (prefix ' . $this->configPrefix . '): ' . $e->getMessage(), + ['exception' => $e] + ); + return false; + } } @@ -553,7 +600,7 @@ class Connection extends LDAPUtility { * * @throws ServerNotAvailableException */ - private function establishConnection() { + private function establishConnection(): ?bool { if (!$this->configuration->ldapConfigurationActive) { return null; } @@ -578,49 +625,48 @@ class Connection extends LDAPUtility { return false; } - if ($this->configuration->turnOffCertCheck) { - if (putenv('LDAPTLS_REQCERT=never')) { - $this->logger->debug( - 'Turned off SSL certificate validation successfully.', - ['app' => 'user_ldap'] - ); - } else { - $this->logger->warning( - 'Could not turn off SSL certificate validation.', - ['app' => 'user_ldap'] - ); - } - } - $isOverrideMainServer = ($this->configuration->ldapOverrideMainServer - || $this->getFromCache('overrideMainServer')); - $isBackupHost = (trim($this->configuration->ldapBackupHost) !== ""); + $hasBackupHost = (trim($this->configuration->ldapBackupHost ?? '') !== ''); + $hasBackgroundHost = (trim($this->configuration->ldapBackgroundHost ?? '') !== ''); + $useBackgroundHost = (\OC::$CLI && $hasBackgroundHost); + $overrideCacheKey = ($useBackgroundHost ? 'overrideBackgroundServer' : 'overrideMainServer'); + $forceBackupHost = ($this->configuration->ldapOverrideMainServer || $this->getFromCache($overrideCacheKey)); $bindStatus = false; - try { - if (!$isOverrideMainServer) { - $this->doConnect($this->configuration->ldapHost, - $this->configuration->ldapPort); + if (!$forceBackupHost) { + try { + $host = $this->configuration->ldapHost ?? ''; + $port = $this->configuration->ldapPort ?? ''; + if ($useBackgroundHost) { + $host = $this->configuration->ldapBackgroundHost ?? ''; + $port = $this->configuration->ldapBackgroundPort ?? ''; + } + $this->doConnect($host, $port); return $this->bind(); + } catch (ServerNotAvailableException $e) { + if (!$hasBackupHost) { + throw $e; + } } - } catch (ServerNotAvailableException $e) { - if (!$isBackupHost) { - throw $e; - } + $this->logger->warning( + 'Main LDAP not reachable, connecting to backup: {msg}', + [ + 'app' => 'user_ldap', + 'msg' => $e->getMessage(), + 'exception' => $e, + ] + ); } - //if LDAP server is not reachable, try the Backup (Replica!) Server - if ($isBackupHost || $isOverrideMainServer) { - $this->doConnect($this->configuration->ldapBackupHost, - $this->configuration->ldapBackupPort); - $this->bindResult = []; - $bindStatus = $this->bind(); - $error = $this->ldap->isResource($this->ldapConnectionRes) ? - $this->ldap->errno($this->ldapConnectionRes) : -1; - if ($bindStatus && $error === 0 && !$this->getFromCache('overrideMainServer')) { - //when bind to backup server succeeded and failed to main server, - //skip contacting him until next cache refresh - $this->writeToCache('overrideMainServer', true); - } + // if LDAP server is not reachable, try the Backup (Replica!) Server + $this->doConnect($this->configuration->ldapBackupHost ?? '', $this->configuration->ldapBackupPort ?? ''); + $this->bindResult = []; + $bindStatus = $this->bind(); + $error = $this->ldap->isResource($this->ldapConnectionRes) + ? $this->ldap->errno($this->ldapConnectionRes) : -1; + if ($bindStatus && $error === 0 && !$forceBackupHost) { + //when bind to backup server succeeded and failed to main server, + //skip contacting it for 15min + $this->writeToCache($overrideCacheKey, true, 60 * 15); } return $bindStatus; @@ -631,15 +677,18 @@ class Connection extends LDAPUtility { /** * @param string $host * @param string $port - * @return bool * @throws \OC\ServerNotAvailableException */ - private function doConnect($host, $port) { + private function doConnect($host, $port): bool { if ($host === '') { return false; } - $this->ldapConnectionRes = $this->ldap->connect($host, $port); + $this->ldapConnectionRes = $this->ldap->connect($host, $port) ?: null; + + if ($this->ldapConnectionRes === null) { + throw new ServerNotAvailableException('Connection failed'); + } if (!$this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_PROTOCOL_VERSION, 3)) { throw new ServerNotAvailableException('Could not set required LDAP Protocol version.'); @@ -649,7 +698,25 @@ class Connection extends LDAPUtility { throw new ServerNotAvailableException('Could not disable LDAP referrals.'); } + if (!$this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_NETWORK_TIMEOUT, $this->configuration->ldapConnectionTimeout)) { + throw new ServerNotAvailableException('Could not set network timeout'); + } + if ($this->configuration->ldapTLS) { + if ($this->configuration->turnOffCertCheck) { + if ($this->ldap->setOption($this->ldapConnectionRes, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER)) { + $this->logger->debug( + 'Turned off SSL certificate validation successfully.', + ['app' => 'user_ldap'] + ); + } else { + $this->logger->warning( + 'Could not turn off SSL certificate validation.', + ['app' => 'user_ldap'] + ); + } + } + if (!$this->ldap->startTls($this->ldapConnectionRes)) { throw new ServerNotAvailableException('Start TLS failed, when connecting to LDAP host ' . $host . '.'); } @@ -672,11 +739,7 @@ class Connection extends LDAPUtility { if ( count($this->bindResult) !== 0 - && $this->bindResult['dn'] === $this->configuration->ldapAgentName - && \OC::$server->getHasher()->verify( - $this->configPrefix . $this->configuration->ldapAgentPassword, - $this->bindResult['hash'] - ) + && $this->bindResult['sum'] === md5($this->configuration->ldapAgentName . $this->configPrefix . $this->configuration->ldapAgentPassword) ) { // don't attempt to bind again with the same data as before // bind might have been invoked via getConnectionResource(), @@ -685,12 +748,11 @@ class Connection extends LDAPUtility { } $ldapLogin = @$this->ldap->bind($cr, - $this->configuration->ldapAgentName, - $this->configuration->ldapAgentPassword); + $this->configuration->ldapAgentName, + $this->configuration->ldapAgentPassword); $this->bindResult = [ - 'dn' => $this->configuration->ldapAgentName, - 'hash' => \OC::$server->getHasher()->hash($this->configPrefix . $this->configuration->ldapAgentPassword), + 'sum' => md5($this->configuration->ldapAgentName . $this->configPrefix . $this->configuration->ldapAgentPassword), 'result' => $ldapLogin, ]; diff --git a/apps/user_ldap/lib/ConnectionFactory.php b/apps/user_ldap/lib/ConnectionFactory.php index cf2bacebc85..dd0ad31920a 100644 --- a/apps/user_ldap/lib/ConnectionFactory.php +++ b/apps/user_ldap/lib/ConnectionFactory.php @@ -1,33 +1,15 @@ <?php + /** - * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; class ConnectionFactory { - /** @var ILDAPWrapper */ - private $ldap; - - public function __construct(ILDAPWrapper $ldap) { - $this->ldap = $ldap; + public function __construct( + private ILDAPWrapper $ldap, + ) { } public function get($prefix) { diff --git a/apps/user_ldap/lib/Controller/ConfigAPIController.php b/apps/user_ldap/lib/Controller/ConfigAPIController.php index e408d03fcd5..d98e6d41b52 100644 --- a/apps/user_ldap/lib/Controller/ConfigAPIController.php +++ b/apps/user_ldap/lib/Controller/ConfigAPIController.php @@ -1,25 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Controller; @@ -29,36 +12,31 @@ use OC\Security\IdentityProof\Manager; use OCA\User_LDAP\Configuration; use OCA\User_LDAP\ConnectionFactory; use OCA\User_LDAP\Helper; +use OCA\User_LDAP\Settings\Admin; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSBadRequestException; use OCP\AppFramework\OCS\OCSException; use OCP\AppFramework\OCS\OCSNotFoundException; -use OCP\ILogger; use OCP\IRequest; use OCP\IUserManager; use OCP\IUserSession; +use OCP\ServerVersion; +use Psr\Log\LoggerInterface; class ConfigAPIController extends OCSController { - - /** @var Helper */ - private $ldapHelper; - - /** @var ILogger */ - private $logger; - - /** @var ConnectionFactory */ - private $connectionFactory; - public function __construct( - $appName, + string $appName, IRequest $request, CapabilitiesManager $capabilitiesManager, IUserSession $userSession, IUserManager $userManager, Manager $keyManager, - Helper $ldapHelper, - ILogger $logger, - ConnectionFactory $connectionFactory + ServerVersion $serverVersion, + private Helper $ldapHelper, + private LoggerInterface $logger, + private ConnectionFactory $connectionFactory, ) { parent::__construct( $appName, @@ -66,54 +44,20 @@ class ConfigAPIController extends OCSController { $capabilitiesManager, $userSession, $userManager, - $keyManager + $keyManager, + $serverVersion, ); - - - $this->ldapHelper = $ldapHelper; - $this->logger = $logger; - $this->connectionFactory = $connectionFactory; } /** - * Creates a new (empty) configuration and returns the resulting prefix - * - * Example: curl -X POST -H "OCS-APIREQUEST: true" -u $admin:$password \ - * https://nextcloud.server/ocs/v2.php/apps/user_ldap/api/v1/config - * - * results in: - * - * <?xml version="1.0"?> - * <ocs> - * <meta> - * <status>ok</status> - * <statuscode>200</statuscode> - * <message>OK</message> - * </meta> - * <data> - * <configID>s40</configID> - * </data> - * </ocs> - * - * Failing example: if an exception is thrown (e.g. Database connection lost) - * the detailed error will be logged. The output will then look like: - * - * <?xml version="1.0"?> - * <ocs> - * <meta> - * <status>failure</status> - * <statuscode>999</statuscode> - * <message>An issue occurred when creating the new config.</message> - * </meta> - * <data/> - * </ocs> - * - * For JSON output provide the format=json parameter + * Create a new (empty) configuration and return the resulting prefix * - * @AuthorizedAdminSetting(settings=OCA\User_LDAP\Settings\Admin) - * @return DataResponse + * @return DataResponse<Http::STATUS_OK, array{configID: string}, array{}> * @throws OCSException + * + * 200: Config created successfully */ + #[AuthorizedAdminSetting(settings: Admin::class)] public function create() { try { $configPrefix = $this->ldapHelper->getNextServerConfigurationPrefix(); @@ -121,35 +65,23 @@ class ConfigAPIController extends OCSController { $configHolder->ldapConfigurationActive = false; $configHolder->saveConfiguration(); } catch (\Exception $e) { - $this->logger->logException($e); + $this->logger->error($e->getMessage(), ['exception' => $e]); throw new OCSException('An issue occurred when creating the new config.'); } return new DataResponse(['configID' => $configPrefix]); } /** - * Deletes a LDAP configuration, if present. - * - * Example: - * curl -X DELETE -H "OCS-APIREQUEST: true" -u $admin:$password \ - * https://nextcloud.server/ocs/v2.php/apps/user_ldap/api/v1/config/s60 - * - * <?xml version="1.0"?> - * <ocs> - * <meta> - * <status>ok</status> - * <statuscode>200</statuscode> - * <message>OK</message> - * </meta> - * <data/> - * </ocs> + * Delete a LDAP configuration * - * @AuthorizedAdminSetting(settings=OCA\User_LDAP\Settings\Admin) - * @param string $configID - * @return DataResponse - * @throws OCSBadRequestException + * @param string $configID ID of the config + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException + * @throws OCSNotFoundException Config not found + * + * 200: Config deleted successfully */ + #[AuthorizedAdminSetting(settings: Admin::class)] public function delete($configID) { try { $this->ensureConfigIDExists($configID); @@ -159,7 +91,7 @@ class ConfigAPIController extends OCSController { } catch (OCSException $e) { throw $e; } catch (\Exception $e) { - $this->logger->logException($e); + $this->logger->error($e->getMessage(), ['exception' => $e]); throw new OCSException('An issue occurred when deleting the config.'); } @@ -167,29 +99,18 @@ class ConfigAPIController extends OCSController { } /** - * Modifies a configuration - * - * Example: - * curl -X PUT -d "configData[ldapHost]=ldaps://my.ldap.server&configData[ldapPort]=636" \ - * -H "OCS-APIREQUEST: true" -u $admin:$password \ - * https://nextcloud.server/ocs/v2.php/apps/user_ldap/api/v1/config/s60 + * Modify a configuration * - * <?xml version="1.0"?> - * <ocs> - * <meta> - * <status>ok</status> - * <statuscode>200</statuscode> - * <message>OK</message> - * </meta> - * <data/> - * </ocs> - * - * @AuthorizedAdminSetting(settings=OCA\User_LDAP\Settings\Admin) - * @param string $configID - * @param array $configData - * @return DataResponse + * @param string $configID ID of the config + * @param array<string, mixed> $configData New config + * @return DataResponse<Http::STATUS_OK, list<empty>, array{}> * @throws OCSException + * @throws OCSBadRequestException Modifying config is not possible + * @throws OCSNotFoundException Config not found + * + * 200: Config returned */ + #[AuthorizedAdminSetting(settings: Admin::class)] public function modify($configID, $configData) { try { $this->ensureConfigIDExists($configID); @@ -212,7 +133,7 @@ class ConfigAPIController extends OCSController { } catch (OCSException $e) { throw $e; } catch (\Exception $e) { - $this->logger->logException($e); + $this->logger->error($e->getMessage(), ['exception' => $e]); throw new OCSException('An issue occurred when modifying the config.'); } @@ -220,8 +141,9 @@ class ConfigAPIController extends OCSController { } /** - * Retrieves a configuration + * Get a configuration * + * Output can look like this: * <?xml version="1.0"?> * <ocs> * <meta> @@ -284,19 +206,22 @@ class ConfigAPIController extends OCSController { * </data> * </ocs> * - * @AuthorizedAdminSetting(settings=OCA\User_LDAP\Settings\Admin) - * @param string $configID - * @param bool|string $showPassword - * @return DataResponse + * @param string $configID ID of the config + * @param bool $showPassword Whether to show the password + * @return DataResponse<Http::STATUS_OK, array<string, mixed>, array{}> * @throws OCSException + * @throws OCSNotFoundException Config not found + * + * 200: Config returned */ + #[AuthorizedAdminSetting(settings: Admin::class)] public function show($configID, $showPassword = false) { try { $this->ensureConfigIDExists($configID); $config = new Configuration($configID); $data = $config->getConfiguration(); - if (!(int)$showPassword) { + if (!$showPassword) { $data['ldapAgentPassword'] = '***'; } foreach ($data as $key => $value) { @@ -308,7 +233,7 @@ class ConfigAPIController extends OCSController { } catch (OCSException $e) { throw $e; } catch (\Exception $e) { - $this->logger->logException($e); + $this->logger->error($e->getMessage(), ['exception' => $e]); throw new OCSException('An issue occurred when modifying the config.'); } @@ -318,11 +243,11 @@ class ConfigAPIController extends OCSController { /** * If the given config ID is not available, an exception is thrown * - * @AuthorizedAdminSetting(settings=OCA\User_LDAP\Settings\Admin) * @param string $configID * @throws OCSNotFoundException */ - private function ensureConfigIDExists($configID) { + #[AuthorizedAdminSetting(settings: Admin::class)] + private function ensureConfigIDExists($configID): void { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(); if (!in_array($configID, $prefixes, true)) { throw new OCSNotFoundException('Config ID not found'); diff --git a/apps/user_ldap/lib/Controller/RenewPasswordController.php b/apps/user_ldap/lib/Controller/RenewPasswordController.php index 66371cb3b49..8389a362b8f 100644 --- a/apps/user_ldap/lib/Controller/RenewPasswordController.php +++ b/apps/user_ldap/lib/Controller/RenewPasswordController.php @@ -1,29 +1,16 @@ <?php + /** - * @copyright Copyright (c) 2017 Roger Szabo <roger.szabo@web.de> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Controller; use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\OpenAPI; +use OCP\AppFramework\Http\Attribute\PublicPage; +use OCP\AppFramework\Http\Attribute\UseSession; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; use OCP\HintException; @@ -35,18 +22,8 @@ use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserManager; +#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)] class RenewPasswordController extends Controller { - /** @var IUserManager */ - private $userManager; - /** @var IConfig */ - private $config; - /** @var IL10N */ - protected $l10n; - /** @var ISession */ - private $session; - /** @var IURLGenerator */ - private $urlGenerator; - /** * @param string $appName * @param IRequest $request @@ -54,35 +31,35 @@ class RenewPasswordController extends Controller { * @param IConfig $config * @param IURLGenerator $urlGenerator */ - public function __construct($appName, IRequest $request, IUserManager $userManager, - IConfig $config, IL10N $l10n, ISession $session, IURLGenerator $urlGenerator) { + public function __construct( + $appName, + IRequest $request, + private IUserManager $userManager, + private IConfig $config, + protected IL10N $l10n, + private ISession $session, + private IURLGenerator $urlGenerator, + ) { parent::__construct($appName, $request); - $this->userManager = $userManager; - $this->config = $config; - $this->l10n = $l10n; - $this->session = $session; - $this->urlGenerator = $urlGenerator; } /** - * @PublicPage - * @NoCSRFRequired - * * @return RedirectResponse */ + #[PublicPage] + #[NoCSRFRequired] public function cancel() { return new RedirectResponse($this->urlGenerator->linkToRouteAbsolute('core.login.showLoginForm')); } /** - * @PublicPage - * @NoCSRFRequired - * @UseSession - * * @param string $user * * @return TemplateResponse|RedirectResponse */ + #[PublicPage] + #[NoCSRFRequired] + #[UseSession] public function showRenewPasswordForm($user) { if ($this->config->getUserValue($user, 'user_ldap', 'needsPasswordReset') !== 'true') { return new RedirectResponse($this->urlGenerator->linkToRouteAbsolute('core.login.showLoginForm')); @@ -118,15 +95,14 @@ class RenewPasswordController extends Controller { } /** - * @PublicPage - * @UseSession - * * @param string $user * @param string $oldPassword * @param string $newPassword * * @return RedirectResponse */ + #[PublicPage] + #[UseSession] public function tryRenewPassword($user, $oldPassword, $newPassword) { if ($this->config->getUserValue($user, 'user_ldap', 'needsPasswordReset') !== 'true') { return new RedirectResponse($this->urlGenerator->linkToRouteAbsolute('core.login.showLoginForm')); @@ -143,7 +119,7 @@ class RenewPasswordController extends Controller { try { if (!is_null($newPassword) && \OC_User::setPassword($user, $newPassword)) { $this->session->set('loginMessages', [ - [], [$this->l10n->t("Please login with the new password")] + [], [$this->l10n->t('Please login with the new password')] ]); $this->config->setUserValue($user, 'user_ldap', 'needsPasswordReset', 'false'); return new RedirectResponse($this->urlGenerator->linkToRoute('core.login.showLoginForm', $args)); @@ -162,12 +138,11 @@ class RenewPasswordController extends Controller { } /** - * @PublicPage - * @NoCSRFRequired - * @UseSession - * * @return RedirectResponse */ + #[PublicPage] + #[NoCSRFRequired] + #[UseSession] public function showLoginFormInvalidPassword($user) { $args = !is_null($user) ? ['user' => $user] : []; $this->session->set('loginMessages', [ diff --git a/apps/user_ldap/lib/DataCollector/LdapDataCollector.php b/apps/user_ldap/lib/DataCollector/LdapDataCollector.php index cb61de96e37..2f74a628a32 100644 --- a/apps/user_ldap/lib/DataCollector/LdapDataCollector.php +++ b/apps/user_ldap/lib/DataCollector/LdapDataCollector.php @@ -1,24 +1,9 @@ -<?php declare(strict_types = 1); +<?php + +declare(strict_types = 1); /** - * @copyright 2022 Carl Schwan <carl@carlschwan.eu> - * - * @author Carl Schwan <carl@carlschwan.eu> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\DataCollector; @@ -28,12 +13,13 @@ use OCP\AppFramework\Http\Response; use OCP\DataCollector\AbstractDataCollector; class LdapDataCollector extends AbstractDataCollector { - public function startLdapRequest(string $query, array $args): void { + public function startLdapRequest(string $query, array $args, array $backtrace): void { $this->data[] = [ 'start' => microtime(true), 'query' => $query, 'args' => $args, 'end' => microtime(true), + 'backtrace' => $backtrace, ]; } @@ -45,6 +31,6 @@ class LdapDataCollector extends AbstractDataCollector { return 'ldap'; } - public function collect(Request $request, Response $response, \Throwable $exception = null): void { + public function collect(Request $request, Response $response, ?\Throwable $exception = null): void { } } diff --git a/apps/user_ldap/lib/Db/GroupMembership.php b/apps/user_ldap/lib/Db/GroupMembership.php new file mode 100644 index 00000000000..6141f1b18c9 --- /dev/null +++ b/apps/user_ldap/lib/Db/GroupMembership.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Db; + +use OCP\AppFramework\Db\Entity; + +/** + * @method void setUserid(string $userid) + * @method string getUserid() + * @method void setGroupid(string $groupid) + * @method string getGroupid() + */ +class GroupMembership extends Entity { + /** @var string */ + protected $groupid; + + /** @var string */ + protected $userid; + + public function __construct() { + $this->addType('groupid', 'string'); + $this->addType('userid', 'string'); + } +} diff --git a/apps/user_ldap/lib/Db/GroupMembershipMapper.php b/apps/user_ldap/lib/Db/GroupMembershipMapper.php new file mode 100644 index 00000000000..b3d6c31dda6 --- /dev/null +++ b/apps/user_ldap/lib/Db/GroupMembershipMapper.php @@ -0,0 +1,72 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Db; + +use OCP\AppFramework\Db\QBMapper; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; + +/** + * @template-extends QBMapper<GroupMembership> + */ +class GroupMembershipMapper extends QBMapper { + public function __construct(IDBConnection $db) { + parent::__construct($db, 'ldap_group_membership', GroupMembership::class); + } + + /** + * @return string[] + */ + public function getKnownGroups(): array { + $query = $this->db->getQueryBuilder(); + $result = $query->selectDistinct('groupid') + ->from($this->getTableName()) + ->executeQuery(); + + $groups = array_column($result->fetchAll(), 'groupid'); + $result->closeCursor(); + return $groups; + } + + /** + * @return GroupMembership[] + */ + public function findGroupMemberships(string $groupid): array { + $qb = $this->db->getQueryBuilder(); + $select = $qb->select('*') + ->from($this->getTableName()) + ->where($qb->expr()->eq('groupid', $qb->createNamedParameter($groupid))); + + return $this->findEntities($select); + } + + /** + * @return GroupMembership[] + */ + public function findGroupMembershipsForUser(string $userid): array { + $qb = $this->db->getQueryBuilder(); + $select = $qb->select('*') + ->from($this->getTableName()) + ->where($qb->expr()->eq('userid', $qb->createNamedParameter($userid))); + + return $this->findEntities($select); + } + + public function deleteGroups(array $removedGroups): void { + $query = $this->db->getQueryBuilder(); + $query->delete($this->getTableName()) + ->where($query->expr()->in('groupid', $query->createParameter('groupids'))); + + foreach (array_chunk($removedGroups, 1000) as $removedGroupsChunk) { + $query->setParameter('groupids', $removedGroupsChunk, IQueryBuilder::PARAM_STR_ARRAY); + $query->executeStatement(); + } + } +} diff --git a/apps/user_ldap/lib/Events/GroupBackendRegistered.php b/apps/user_ldap/lib/Events/GroupBackendRegistered.php index e0302b87b1f..a94c239c1b3 100644 --- a/apps/user_ldap/lib/Events/GroupBackendRegistered.php +++ b/apps/user_ldap/lib/Events/GroupBackendRegistered.php @@ -3,26 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Events; @@ -37,14 +19,10 @@ use OCP\EventDispatcher\Event; */ class GroupBackendRegistered extends Event { - /** @var GroupPluginManager */ - private $pluginManager; - /** @var IGroupLDAP */ - private $backend; - - public function __construct(IGroupLDAP $backend, GroupPluginManager $pluginManager) { - $this->pluginManager = $pluginManager; - $this->backend = $backend; + public function __construct( + private IGroupLDAP $backend, + private GroupPluginManager $pluginManager, + ) { } public function getBackend(): IGroupLDAP { diff --git a/apps/user_ldap/lib/Events/UserBackendRegistered.php b/apps/user_ldap/lib/Events/UserBackendRegistered.php index 91743089ccf..a26e23f8f83 100644 --- a/apps/user_ldap/lib/Events/UserBackendRegistered.php +++ b/apps/user_ldap/lib/Events/UserBackendRegistered.php @@ -3,26 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Events; @@ -37,14 +19,10 @@ use OCP\EventDispatcher\Event; */ class UserBackendRegistered extends Event { - /** @var IUserLDAP */ - private $backend; - /** @var UserPluginManager */ - private $pluginManager; - - public function __construct(IUserLDAP $backend, UserPluginManager $pluginManager) { - $this->backend = $backend; - $this->pluginManager = $pluginManager; + public function __construct( + private IUserLDAP $backend, + private UserPluginManager $pluginManager, + ) { } public function getBackend(): IUserLDAP { diff --git a/apps/user_ldap/lib/Exceptions/AttributeNotSet.php b/apps/user_ldap/lib/Exceptions/AttributeNotSet.php index 63e255b85d6..4d6053eda66 100644 --- a/apps/user_ldap/lib/Exceptions/AttributeNotSet.php +++ b/apps/user_ldap/lib/Exceptions/AttributeNotSet.php @@ -1,25 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Exceptions; diff --git a/apps/user_ldap/lib/Exceptions/ConfigurationIssueException.php b/apps/user_ldap/lib/Exceptions/ConfigurationIssueException.php new file mode 100644 index 00000000000..efeb426b13d --- /dev/null +++ b/apps/user_ldap/lib/Exceptions/ConfigurationIssueException.php @@ -0,0 +1,15 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Exceptions; + +use OCP\HintException; + +class ConfigurationIssueException extends HintException { +} diff --git a/apps/user_ldap/lib/Exceptions/ConstraintViolationException.php b/apps/user_ldap/lib/Exceptions/ConstraintViolationException.php index 912d6039a60..d0d384c31de 100644 --- a/apps/user_ldap/lib/Exceptions/ConstraintViolationException.php +++ b/apps/user_ldap/lib/Exceptions/ConstraintViolationException.php @@ -1,25 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 Roger Szabo <roger.szabo@web.de> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Exceptions; diff --git a/apps/user_ldap/lib/Exceptions/NoMoreResults.php b/apps/user_ldap/lib/Exceptions/NoMoreResults.php index 26dc4a58992..b5621d86eb6 100644 --- a/apps/user_ldap/lib/Exceptions/NoMoreResults.php +++ b/apps/user_ldap/lib/Exceptions/NoMoreResults.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2021 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Exceptions; diff --git a/apps/user_ldap/lib/Exceptions/NotOnLDAP.php b/apps/user_ldap/lib/Exceptions/NotOnLDAP.php index 30a82106655..cd74e918829 100644 --- a/apps/user_ldap/lib/Exceptions/NotOnLDAP.php +++ b/apps/user_ldap/lib/Exceptions/NotOnLDAP.php @@ -1,25 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Exceptions; diff --git a/apps/user_ldap/lib/FilesystemHelper.php b/apps/user_ldap/lib/FilesystemHelper.php deleted file mode 100644 index 0596b109deb..00000000000 --- a/apps/user_ldap/lib/FilesystemHelper.php +++ /dev/null @@ -1,46 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ -namespace OCA\User_LDAP; - -/** - * @brief wraps around static Nextcloud core methods - */ -class FilesystemHelper { - - /** - * @brief states whether the filesystem was loaded - * @return bool - */ - public function isLoaded() { - return \OC\Files\Filesystem::$loaded; - } - - /** - * @brief initializes the filesystem for the given user - * @param string $uid the Nextcloud username of the user - */ - public function setup($uid) { - \OC_Util::setupFS($uid); - } -} diff --git a/apps/user_ldap/lib/GroupPluginManager.php b/apps/user_ldap/lib/GroupPluginManager.php index 5999409cdba..9e8ae6805a4 100644 --- a/apps/user_ldap/lib/GroupPluginManager.php +++ b/apps/user_ldap/lib/GroupPluginManager.php @@ -1,29 +1,14 @@ <?php + /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; use OCP\GroupInterface; +use OCP\Server; +use Psr\Log\LoggerInterface; class GroupPluginManager { private int $respondToActions = 0; @@ -58,7 +43,7 @@ class GroupPluginManager { foreach ($this->which as $action => $v) { if ((bool)($respondToActions & $action)) { $this->which[$action] = $plugin; - \OC::$server->getLogger()->debug("Registered action ".$action." to plugin ".get_class($plugin), ['app' => 'user_ldap']); + Server::get(LoggerInterface::class)->debug('Registered action ' . $action . ' to plugin ' . get_class($plugin), ['app' => 'user_ldap']); } } } @@ -164,7 +149,7 @@ class GroupPluginManager { $plugin = $this->which[GroupInterface::COUNT_USERS]; if ($plugin) { - return $plugin->countUsersInGroup($gid,$search); + return $plugin->countUsersInGroup($gid, $search); } throw new \Exception('No plugin implements countUsersInGroup in this LDAP Backend.'); } diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php index f9d9b061743..271cc96afbd 100644 --- a/apps/user_ldap/lib/Group_LDAP.php +++ b/apps/user_ldap/lib/Group_LDAP.php @@ -1,78 +1,49 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Alexander Bergolth <leo@strike.wu.ac.at> - * @author Alex Weirig <alex.weirig@technolink.lu> - * @author alexweirig <alex.weirig@technolink.lu> - * @author Andreas Fischer <bantu@owncloud.com> - * @author Andreas Pflug <dev@admin4.org> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Clement Wong <git@clement.hk> - * @author Frédéric Fortier <frederic.fortier@oronospolytechnique.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Nicolas Grekas <nicolas.grekas@gmail.com> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roland Tapken <roland@bitarbeiter.net> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Tobias Perschon <tobias@perschon.at> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * @author Xuanwo <xuanwo@yunify.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; -use Closure; use Exception; -use OC; -use OC\Cache\CappedMemoryCache; use OC\ServerNotAvailableException; -use OCP\Group\Backend\IGetDisplayNameBackend; +use OCA\User_LDAP\User\OfflineUser; +use OCP\Cache\CappedMemoryCache; +use OCP\Group\Backend\ABackend; use OCP\Group\Backend\IDeleteGroupBackend; +use OCP\Group\Backend\IGetDisplayNameBackend; +use OCP\Group\Backend\IIsAdminBackend; use OCP\GroupInterface; +use OCP\IConfig; +use OCP\IUserManager; +use OCP\Server; use Psr\Log\LoggerInterface; +use function json_decode; -class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend { - protected $enabled = false; +class Group_LDAP extends ABackend implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, IDeleteGroupBackend, IIsAdminBackend { + protected bool $enabled = false; - /** @var string[][] $cachedGroupMembers array of users with gid as key */ - protected $cachedGroupMembers; - /** @var string[] $cachedGroupsByMember array of groups with uid as key */ - protected $cachedGroupsByMember; - /** @var string[] $cachedNestedGroups array of groups with gid (DN) as key */ - protected $cachedNestedGroups; - /** @var GroupPluginManager */ - protected $groupPluginManager; - /** @var LoggerInterface */ - protected $logger; + /** @var CappedMemoryCache<string[]> $cachedGroupMembers array of user DN with gid as key */ + protected CappedMemoryCache $cachedGroupMembers; + /** @var CappedMemoryCache<array[]> $cachedGroupsByMember array of groups with user DN as key */ + protected CappedMemoryCache $cachedGroupsByMember; + /** @var CappedMemoryCache<string[]> $cachedNestedGroups array of groups with gid (DN) as key */ + protected CappedMemoryCache $cachedNestedGroups; + protected LoggerInterface $logger; /** * @var string $ldapGroupMemberAssocAttr contains the LDAP setting (in lower case) with the same name */ - protected $ldapGroupMemberAssocAttr; - - public function __construct(Access $access, GroupPluginManager $groupPluginManager) { - parent::__construct($access); + protected string $ldapGroupMemberAssocAttr; + + public function __construct( + protected Access $access, + protected GroupPluginManager $groupPluginManager, + private IConfig $config, + private IUserManager $ncUserManager, + ) { $filter = $this->access->connection->ldapGroupFilter; $gAssoc = $this->access->connection->ldapGroupMemberAssocAttr; if (!empty($filter) && !empty($gAssoc)) { @@ -82,21 +53,19 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $this->cachedGroupMembers = new CappedMemoryCache(); $this->cachedGroupsByMember = new CappedMemoryCache(); $this->cachedNestedGroups = new CappedMemoryCache(); - $this->groupPluginManager = $groupPluginManager; - $this->logger = OC::$server->get(LoggerInterface::class); + $this->logger = Server::get(LoggerInterface::class); $this->ldapGroupMemberAssocAttr = strtolower((string)$gAssoc); } /** - * is user in group? + * Check if user is in group * * @param string $uid uid of the user * @param string $gid gid of the group - * @return bool * @throws Exception * @throws ServerNotAvailableException */ - public function inGroup($uid, $gid) { + public function inGroup($uid, $gid): bool { if (!$this->enabled) { return false; } @@ -240,24 +209,17 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** + * Get group members from dn. + * @psalm-param array<string, bool> $seen List of DN that have already been processed. * @throws ServerNotAvailableException */ - private function _groupMembers(string $dnGroup, ?array &$seen = null): array { - if ($seen === null) { - $seen = []; - // the root entry has to be marked as processed to avoind infinit loops, - // but not included in the results laters on - $excludeFromResult = $dnGroup; - } - // cache only base groups, otherwise groups get additional unwarranted members - $shouldCacheResult = count($seen) === 0; - - static $rawMemberReads = []; // runtime cache for intermediate ldap read results - $allMembers = []; - - if (array_key_exists($dnGroup, $seen)) { + private function _groupMembers(string $dnGroup, array $seen = [], bool &$recursive = false): array { + if (isset($seen[$dnGroup])) { + $recursive = true; return []; } + $seen[$dnGroup] = true; + // used extensively in cron job, caching makes sense for nested groups $cacheKey = '_groupMembers' . $dnGroup; $groupMembers = $this->access->connection->getFromCache($cacheKey); @@ -271,7 +233,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I && $this->access->connection->ldapMatchingRuleInChainState !== Configuration::LDAP_SERVER_FEATURE_UNAVAILABLE ) { $attemptedLdapMatchingRuleInChain = true; - // compatibility hack with servers supporting :1.2.840.113556.1.4.1941:, and others) + // Use matching rule 1.2.840.113556.1.4.1941 if available (LDAP_MATCHING_RULE_IN_CHAIN) $filter = $this->access->combineFilterWithAnd([ $this->access->connection->ldapUserFilter, $this->access->connection->ldapUserDisplayName . '=*', @@ -286,40 +248,50 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I return $carry; }, []); if ($this->access->connection->ldapMatchingRuleInChainState === Configuration::LDAP_SERVER_FEATURE_AVAILABLE) { + $this->access->connection->writeToCache($cacheKey, $result); return $result; } elseif (!empty($memberRecords)) { $this->access->connection->ldapMatchingRuleInChainState = Configuration::LDAP_SERVER_FEATURE_AVAILABLE; $this->access->connection->saveConfiguration(); + $this->access->connection->writeToCache($cacheKey, $result); return $result; } // when feature availability is unknown, and the result is empty, continue and test with original approach } - $seen[$dnGroup] = 1; - $members = $rawMemberReads[$dnGroup] ?? null; - if ($members === null) { - $members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr); - $rawMemberReads[$dnGroup] = $members; - } + $allMembers = []; + $members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr); if (is_array($members)) { - $fetcher = function ($memberDN) use (&$seen) { - return $this->_groupMembers($memberDN, $seen); - }; - $allMembers = $this->walkNestedGroups($dnGroup, $fetcher, $members, $seen); + if ((int)$this->access->connection->ldapNestedGroups === 1) { + while ($recordDn = array_shift($members)) { + $nestedMembers = $this->_groupMembers($recordDn, $seen, $recursive); + if (!empty($nestedMembers)) { + // Group, queue its members for processing + $members = array_merge($members, $nestedMembers); + } else { + // User (or empty group, or previously seen group), add it to the member list + $allMembers[] = $recordDn; + } + } + } else { + $allMembers = $members; + } } $allMembers += $this->getDynamicGroupMembers($dnGroup); - if (isset($excludeFromResult)) { - $index = array_search($excludeFromResult, $allMembers, true); - if ($index !== false) { - unset($allMembers[$index]); - } + + $allMembers = array_unique($allMembers); + + // A group cannot be a member of itself + $index = array_search($dnGroup, $allMembers, true); + if ($index !== false) { + unset($allMembers[$index]); } - if ($shouldCacheResult) { + if (!$recursive) { $this->access->connection->writeToCache($cacheKey, $allMembers); - unset($rawMemberReads[$dnGroup]); } + if (isset($attemptedLdapMatchingRuleInChain) && $this->access->connection->ldapMatchingRuleInChainState === Configuration::LDAP_SERVER_FEATURE_UNKNOWN && !empty($allMembers) @@ -327,75 +299,47 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $this->access->connection->ldapMatchingRuleInChainState = Configuration::LDAP_SERVER_FEATURE_UNAVAILABLE; $this->access->connection->saveConfiguration(); } + return $allMembers; } /** + * @return string[] * @throws ServerNotAvailableException */ - private function _getGroupDNsFromMemberOf(string $dn): array { - $groups = $this->access->readAttribute($dn, 'memberOf'); - if (!is_array($groups)) { + private function _getGroupDNsFromMemberOf(string $dn, array &$seen = []): array { + if (isset($seen[$dn])) { return []; } + $seen[$dn] = true; - $fetcher = function ($groupDN) { - if (isset($this->cachedNestedGroups[$groupDN])) { - $nestedGroups = $this->cachedNestedGroups[$groupDN]; - } else { - $nestedGroups = $this->access->readAttribute($groupDN, 'memberOf'); - if (!is_array($nestedGroups)) { - $nestedGroups = []; - } - $this->cachedNestedGroups[$groupDN] = $nestedGroups; - } - return $nestedGroups; - }; - - $groups = $this->walkNestedGroups($dn, $fetcher, $groups); - return $this->filterValidGroups($groups); - } - - private function walkNestedGroups(string $dn, Closure $fetcher, array $list, array &$seen = []): array { - $nesting = (int)$this->access->connection->ldapNestedGroups; - // depending on the input, we either have a list of DNs or a list of LDAP records - // also, the output expects either DNs or records. Testing the first element should suffice. - $recordMode = is_array($list) && isset($list[0]) && is_array($list[0]) && isset($list[0]['dn'][0]); - - if ($nesting !== 1) { - if ($recordMode) { - // the keys are numeric, but should hold the DN - return array_reduce($list, function ($transformed, $record) use ($dn) { - if ($record['dn'][0] != $dn) { - $transformed[$record['dn'][0]] = $record; - } - return $transformed; - }, []); - } - return $list; + if (isset($this->cachedNestedGroups[$dn])) { + return $this->cachedNestedGroups[$dn]; } - while ($record = array_shift($list)) { - $recordDN = $record['dn'][0] ?? $record; - if ($recordDN === $dn || array_key_exists($recordDN, $seen)) { - // Prevent loops - continue; - } - $fetched = $fetcher($record); - $list = array_merge($list, $fetched); - if (!isset($seen[$recordDN]) || is_bool($seen[$recordDN]) && is_array($record)) { - $seen[$recordDN] = $record; + $allGroups = []; + $groups = $this->access->readAttribute($dn, 'memberOf'); + if (is_array($groups)) { + if ((int)$this->access->connection->ldapNestedGroups === 1) { + while ($recordDn = array_shift($groups)) { + $nestedParents = $this->_getGroupDNsFromMemberOf($recordDn, $seen); + $groups = array_merge($groups, $nestedParents); + $allGroups[] = $recordDn; + } + } else { + $allGroups = $groups; } } - // on record mode, filter out intermediate state - return $recordMode ? array_filter($seen, 'is_array') : array_keys($seen); + // We do not perform array_unique here at it is done in getUserGroups later + $this->cachedNestedGroups[$dn] = $allGroups; + return $this->filterValidGroups($allGroups); } /** - * translates a gidNumber into an ownCloud internal name + * Translates a gidNumber into the Nextcloud internal name. * - * @return string|bool + * @return string|false The nextcloud internal name. * @throws Exception * @throws ServerNotAvailableException */ @@ -416,6 +360,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** + * @return string|null|false The name of the group * @throws ServerNotAvailableException * @throws Exception */ @@ -438,9 +383,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * returns the entry's gidNumber - * - * @return string|bool + * @return string|bool The entry's gidNumber * @throws ServerNotAvailableException */ private function getEntryGidNumber(string $dn, string $attribute) { @@ -452,7 +395,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * @return string|bool + * @return string|bool The group's gidNumber * @throws ServerNotAvailableException */ public function getGroupGidNumber(string $dn) { @@ -460,14 +403,13 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * returns the user's gidNumber - * - * @return string|bool + * @return string|bool The user's gidNumber * @throws ServerNotAvailableException */ public function getUserGidNumber(string $dn) { $gidNumber = false; if ($this->access->connection->hasGidNumber) { + // FIXME: when $dn does not exist on LDAP anymore, this will be set wrongly to false :/ $gidNumber = $this->getEntryGidNumber($dn, $this->access->connection->ldapGidNumber); if ($gidNumber === false) { $this->access->connection->hasGidNumber = false; @@ -497,21 +439,20 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * returns a list of users that have the given group as gid number - * + * @return array<int,string> A list of users that have the given group as gid number * @throws ServerNotAvailableException */ public function getUsersInGidNumber( string $groupDN, string $search = '', ?int $limit = -1, - ?int $offset = 0 + ?int $offset = 0, ): array { try { $filter = $this->prepareFilterForUsersHasGidNumber($groupDN, $search); $users = $this->access->fetchListOfUsers( $filter, - [$this->access->connection->ldapUserDisplayName, 'dn'], + $this->access->userManager->getAttributes(true), $limit, $offset ); @@ -525,7 +466,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I /** * @throws ServerNotAvailableException - * @return bool + * @return false|string */ public function getUserGroupByGid(string $dn) { $groupID = $this->getUserGidNumber($dn); @@ -540,9 +481,9 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * translates a primary group ID into an Nextcloud internal name + * Translates a primary group ID into an Nextcloud internal name * - * @return string|bool + * @return string|false * @throws Exception * @throws ServerNotAvailableException */ @@ -567,9 +508,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * returns the entry's primary group ID - * - * @return string|bool + * @return string|false The entry's group Id * @throws ServerNotAvailableException */ private function getEntryGroupID(string $dn, string $attribute) { @@ -581,7 +520,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * @return string|bool + * @return string|false The entry's primary group Id * @throws ServerNotAvailableException */ public function getGroupPrimaryGroupID(string $dn) { @@ -589,7 +528,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * @return string|bool + * @return string|false * @throws ServerNotAvailableException */ public function getUserPrimaryGroupIDs(string $dn) { @@ -625,18 +564,19 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I /** * @throws ServerNotAvailableException + * @return array<int,string> */ public function getUsersInPrimaryGroup( string $groupDN, string $search = '', ?int $limit = -1, - ?int $offset = 0 + ?int $offset = 0, ): array { try { $filter = $this->prepareFilterForUsersInPrimaryGroup($groupDN, $search); $users = $this->access->fetchListOfUsers( $filter, - [$this->access->connection->ldapUserDisplayName, 'dn'], + $this->access->userManager->getAttributes(true), $limit, $offset ); @@ -655,7 +595,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I string $groupDN, string $search = '', int $limit = -1, - int $offset = 0 + int $offset = 0, ): int { try { $filter = $this->prepareFilterForUsersInPrimaryGroup($groupDN, $search); @@ -669,7 +609,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I } /** - * @return string|bool + * @return string|false * @throws ServerNotAvailableException */ public function getUserPrimaryGroup(string $dn) { @@ -684,6 +624,29 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I return false; } + private function isUserOnLDAP(string $uid): bool { + // forces a user exists check - but does not help if a positive result is cached, while group info is not + $ncUser = $this->ncUserManager->get($uid); + if ($ncUser === null) { + return false; + } + $backend = $ncUser->getBackend(); + if ($backend instanceof User_Proxy) { + // ignoring cache as safeguard (and we are behind the group cache check anyway) + return $backend->userExistsOnLDAP($uid, true); + } + return false; + } + + /** + * @param string $uid + * @return list<string> + */ + protected function getCachedGroupsForUserId(string $uid): array { + $groupStr = $this->config->getUserValue($uid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), '[]'); + return json_decode($groupStr, true) ?? []; + } + /** * This function fetches all groups a user belongs to. It does not check * if the user exists at all. @@ -691,19 +654,29 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I * This function includes groups based on dynamic group membership. * * @param string $uid Name of the user - * @return array with group names + * @return list<string> Group names * @throws Exception * @throws ServerNotAvailableException */ - public function getUserGroups($uid) { + public function getUserGroups($uid): array { if (!$this->enabled) { return []; } + $ncUid = $uid; + $cacheKey = 'getUserGroups' . $uid; $userGroups = $this->access->connection->getFromCache($cacheKey); if (!is_null($userGroups)) { return $userGroups; } + + $user = $this->access->userManager->get($uid); + if ($user instanceof OfflineUser) { + // We load known group memberships from configuration for remnants, + // because LDAP server does not contain them anymore + return $this->getCachedGroupsForUserId($uid); + } + $userDN = $this->access->username2dn($uid); if (!$userDN) { $this->access->connection->writeToCache($cacheKey, []); @@ -721,7 +694,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $groupsToMatch = $this->access->fetchListOfGroups( $this->access->connection->ldapGroupFilter, ['dn', $dynamicGroupMemberURL]); foreach ($groupsToMatch as $dynamicGroup) { - if (!array_key_exists($dynamicGroupMemberURL, $dynamicGroup)) { + if (!isset($dynamicGroup[$dynamicGroupMemberURL][0])) { continue; } $pos = strpos($dynamicGroup[$dynamicGroupMemberURL][0], '('); @@ -762,64 +735,48 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I && $this->ldapGroupMemberAssocAttr !== 'memberuid' && $this->ldapGroupMemberAssocAttr !== 'zimbramailforwardingaddress') { $groupDNs = $this->_getGroupDNsFromMemberOf($userDN); - if (is_array($groupDNs)) { - foreach ($groupDNs as $dn) { - $groupName = $this->access->dn2groupname($dn); - if (is_string($groupName)) { - // be sure to never return false if the dn could not be - // resolved to a name, for whatever reason. - $groups[] = $groupName; - } + foreach ($groupDNs as $dn) { + $groupName = $this->access->dn2groupname($dn); + if (is_string($groupName)) { + // be sure to never return false if the dn could not be + // resolved to a name, for whatever reason. + $groups[] = $groupName; } } + } else { + // uniqueMember takes DN, memberuid the uid, so we need to distinguish + switch ($this->ldapGroupMemberAssocAttr) { + case 'uniquemember': + case 'member': + $uid = $userDN; + break; - if ($primaryGroup !== false) { - $groups[] = $primaryGroup; - } - if ($gidGroupName !== false) { - $groups[] = $gidGroupName; - } - $this->access->connection->writeToCache($cacheKey, $groups); - return $groups; - } - - //uniqueMember takes DN, memberuid the uid, so we need to distinguish - switch ($this->ldapGroupMemberAssocAttr) { - case 'uniquemember': - case 'member': - $uid = $userDN; - break; - - case 'memberuid': - case 'zimbramailforwardingaddress': - $result = $this->access->readAttribute($userDN, 'uid'); - if ($result === false) { - $this->logger->debug('No uid attribute found for DN {dn} on {host}', - [ - 'app' => 'user_ldap', - 'dn' => $userDN, - 'host' => $this->access->connection->ldapHost, - ] - ); - $uid = false; - } else { - $uid = $result[0]; - } - break; + case 'memberuid': + case 'zimbramailforwardingaddress': + $result = $this->access->readAttribute($userDN, 'uid'); + if ($result === false) { + $this->logger->debug('No uid attribute found for DN {dn} on {host}', + [ + 'app' => 'user_ldap', + 'dn' => $userDN, + 'host' => $this->access->connection->ldapHost, + ] + ); + $uid = false; + } else { + $uid = $result[0]; + } + break; - default: - // just in case - $uid = $userDN; - break; - } + default: + // just in case + $uid = $userDN; + break; + } - if ($uid !== false) { - if (isset($this->cachedGroupsByMember[$uid])) { - $groups = array_merge($groups, $this->cachedGroupsByMember[$uid]); - } else { + if ($uid !== false) { $groupsByMember = array_values($this->getGroupsByMember($uid)); $groupsByMember = $this->access->nextcloudGroupNames($groupsByMember); - $this->cachedGroupsByMember[$uid] = $groupsByMember; $groups = array_merge($groups, $groupsByMember); } } @@ -831,25 +788,38 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $groups[] = $gidGroupName; } - $groups = array_unique($groups, SORT_LOCALE_STRING); + if (empty($groups) && !$this->isUserOnLDAP($ncUid)) { + // Groups are enabled, but you user has none? Potentially suspicious: + // it could be that the user was deleted from LDAP, but we are not + // aware of it yet. + $groups = $this->getCachedGroupsForUserId($ncUid); + $this->access->connection->writeToCache($cacheKey, $groups); + return $groups; + } + + $groups = array_values(array_unique($groups, SORT_LOCALE_STRING)); $this->access->connection->writeToCache($cacheKey, $groups); + $groupStr = \json_encode($groups); + $this->config->setUserValue($ncUid, 'user_ldap', 'cached-group-memberships-' . $this->access->connection->getConfigPrefix(), $groupStr); + return $groups; } /** + * @return array[] * @throws ServerNotAvailableException */ - private function getGroupsByMember(string $dn, array &$seen = null): array { - if ($seen === null) { - $seen = []; - } - if (array_key_exists($dn, $seen)) { - // avoid loops + private function getGroupsByMember(string $dn, array &$seen = []): array { + if (isset($seen[$dn])) { return []; } - $allGroups = []; $seen[$dn] = true; + + if (isset($this->cachedGroupsByMember[$dn])) { + return $this->cachedGroupsByMember[$dn]; + } + $filter = $this->access->connection->ldapGroupMemberAssocAttr . '=' . $dn; if ($this->ldapGroupMemberAssocAttr === 'zimbramailforwardingaddress') { @@ -862,22 +832,24 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $filter = $this->access->combineFilterWithAnd([$filter, $this->access->connection->ldapGroupFilter]); } + $allGroups = []; $groups = $this->access->fetchListOfGroups($filter, [strtolower($this->access->connection->ldapGroupMemberAssocAttr), $this->access->connection->ldapGroupDisplayName, 'dn']); - $fetcher = function ($dn) use (&$seen) { - if (is_array($dn) && isset($dn['dn'][0])) { - $dn = $dn['dn'][0]; - } - return $this->getGroupsByMember($dn, $seen); - }; - if (empty($dn)) { - $dn = ""; + if ($nesting === 1) { + while ($record = array_shift($groups)) { + // Note: this has no effect when ldapGroupMemberAssocAttr is uid based + $nestedParents = $this->getGroupsByMember($record['dn'][0], $seen); + $groups = array_merge($groups, $nestedParents); + $allGroups[] = $record; + } + } else { + $allGroups = $groups; } - $allGroups = $this->walkNestedGroups($dn, $fetcher, $groups, $seen); $visibleGroups = $this->filterValidGroups($allGroups); - return array_intersect_key($allGroups, $visibleGroups); + $this->cachedGroupsByMember[$dn] = $visibleGroups; + return $visibleGroups; } /** @@ -887,7 +859,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I * @param string $search * @param int $limit * @param int $offset - * @return array with user ids + * @return array<int,string> user ids * @throws Exception * @throws ServerNotAvailableException */ @@ -919,7 +891,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $groupDN = $this->access->groupname2dn($gid); if (!$groupDN) { - // group couldn't be found, return empty resultset + // group couldn't be found, return empty result-set $this->access->connection->writeToCache($cacheKey, []); return []; } @@ -956,7 +928,11 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I if (empty($ldap_users)) { break; } - $groupUsers[] = $this->access->dn2username($ldap_users[0]['dn'][0]); + $uid = $this->access->dn2username($ldap_users[0]['dn'][0]); + if (!$uid) { + break; + } + $groupUsers[] = $uid; break; default: //we got DNs, check if we need to filter by search or we can give back all of them @@ -1043,9 +1019,9 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I return $groupUsers; } $search = $this->access->escapeFilterPart($search, true); - $isMemberUid = - ($this->ldapGroupMemberAssocAttr === 'memberuid' || - $this->ldapGroupMemberAssocAttr === 'zimbramailforwardingaddress'); + $isMemberUid + = ($this->ldapGroupMemberAssocAttr === 'memberuid' + || $this->ldapGroupMemberAssocAttr === 'zimbramailforwardingaddress'); //we need to apply the search filter //alternatives that need to be checked: @@ -1147,35 +1123,50 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I * @throws ServerNotAvailableException */ public function groupExists($gid) { - $groupExists = $this->access->connection->getFromCache('groupExists' . $gid); - if (!is_null($groupExists)) { - return (bool)$groupExists; + return $this->groupExistsOnLDAP($gid, false); + } + + /** + * Check if a group exists + * + * @throws ServerNotAvailableException + */ + public function groupExistsOnLDAP(string $gid, bool $ignoreCache = false): bool { + $cacheKey = 'groupExists' . $gid; + if (!$ignoreCache) { + $groupExists = $this->access->connection->getFromCache($cacheKey); + if (!is_null($groupExists)) { + return (bool)$groupExists; + } } //getting dn, if false the group does not exist. If dn, it may be mapped //only, requires more checking. $dn = $this->access->groupname2dn($gid); if (!$dn) { - $this->access->connection->writeToCache('groupExists' . $gid, false); + $this->access->connection->writeToCache($cacheKey, false); return false; } if (!$this->access->isDNPartOfBase($dn, $this->access->connection->ldapBaseGroups)) { - $this->access->connection->writeToCache('groupExists' . $gid, false); + $this->access->connection->writeToCache($cacheKey, false); return false; } //if group really still exists, we will be able to read its objectClass if (!is_array($this->access->readAttribute($dn, '', $this->access->connection->ldapGroupFilter))) { - $this->access->connection->writeToCache('groupExists' . $gid, false); + $this->access->connection->writeToCache($cacheKey, false); return false; } - $this->access->connection->writeToCache('groupExists' . $gid, true); + $this->access->connection->writeToCache($cacheKey, true); return true; } /** + * @template T + * @param array<array-key, T> $listOfGroups + * @return array<array-key, T> * @throws ServerNotAvailableException * @throws Exception */ @@ -1183,7 +1174,11 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I $validGroupDNs = []; foreach ($listOfGroups as $key => $item) { $dn = is_string($item) ? $item : $item['dn'][0]; - $gid = $this->access->dn2groupname($dn); + if (is_array($item) && !isset($item[$this->access->connection->ldapGroupDisplayName][0])) { + continue; + } + $name = $item[$this->access->connection->ldapGroupDisplayName][0] ?? null; + $gid = $this->access->dn2groupname($dn, $name, false); if (!$gid) { continue; } @@ -1203,10 +1198,11 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I * Returns the supported actions as int to be * compared with GroupInterface::CREATE_GROUP etc. */ - public function implementsActions($actions) { - return (bool)((GroupInterface::COUNT_USERS | - GroupInterface::DELETE_GROUP | - $this->groupPluginManager->getImplementedActions()) & $actions); + public function implementsActions($actions): bool { + return (bool)((GroupInterface::COUNT_USERS + | GroupInterface::DELETE_GROUP + | GroupInterface::IS_ADMIN + | $this->groupPluginManager->getImplementedActions()) & $actions); } /** @@ -1258,7 +1254,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I if ($ret = $this->groupPluginManager->deleteGroup($gid)) { // Delete group in nextcloud internal db $this->access->getGroupMapper()->unmap($gid); - $this->access->connection->writeToCache("groupExists" . $gid, false); + $this->access->connection->writeToCache('groupExists' . $gid, false); } return $ret; } @@ -1266,17 +1262,17 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I // Getting dn, if false the group is not mapped $dn = $this->access->groupname2dn($gid); if (!$dn) { - throw new Exception('Could not delete unknown group '.$gid.' in LDAP backend.'); + throw new Exception('Could not delete unknown group ' . $gid . ' in LDAP backend.'); } if (!$this->groupExists($gid)) { // The group does not exist in the LDAP, remove the mapping $this->access->getGroupMapper()->unmap($gid); - $this->access->connection->writeToCache("groupExists" . $gid, false); + $this->access->connection->writeToCache('groupExists' . $gid, false); return true; } - throw new Exception('Could not delete existing group '.$gid.' in LDAP backend.'); + throw new Exception('Could not delete existing group ' . $gid . ' in LDAP backend.'); } /** @@ -1337,10 +1333,10 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I * of the current access. * * @param string $gid - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection * @throws ServerNotAvailableException */ - public function getNewLDAPConnection($gid) { + public function getNewLDAPConnection($gid): \LDAP\Connection { $connection = clone $this->access->getConnection(); return $connection->getConnectionResource(); } @@ -1364,10 +1360,63 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I if (($displayName !== false) && (count($displayName) > 0)) { $displayName = $displayName[0]; - $this->access->connection->writeToCache($cacheKey, $displayName); - return $displayName; + } else { + $displayName = ''; } - return ''; + $this->access->connection->writeToCache($cacheKey, $displayName); + return $displayName; + } + + /** + * returns the groupname for the given LDAP DN, if available + */ + public function dn2GroupName(string $dn): string|false { + return $this->access->dn2groupname($dn); + } + + public function addRelationshipToCaches(string $uid, ?string $dnUser, string $gid): void { + $dnGroup = $this->access->groupname2dn($gid); + $dnUser ??= $this->access->username2dn($uid); + if ($dnUser === false || $dnGroup === false) { + return; + } + if (isset($this->cachedGroupMembers[$gid])) { + $this->cachedGroupMembers[$gid] = array_merge($this->cachedGroupMembers[$gid], [$dnUser]); + } + unset($this->cachedGroupsByMember[$dnUser]); + unset($this->cachedNestedGroups[$gid]); + $cacheKey = 'inGroup' . $uid . ':' . $gid; + $this->access->connection->writeToCache($cacheKey, true); + $cacheKeyMembers = 'inGroup-members:' . $gid; + if (!is_null($data = $this->access->connection->getFromCache($cacheKeyMembers))) { + $this->access->connection->writeToCache($cacheKeyMembers, array_merge($data, [$dnUser])); + } + $cacheKey = '_groupMembers' . $dnGroup; + if (!is_null($data = $this->access->connection->getFromCache($cacheKey))) { + $this->access->connection->writeToCache($cacheKey, array_merge($data, [$dnUser])); + } + $cacheKey = 'getUserGroups' . $uid; + if (!is_null($data = $this->access->connection->getFromCache($cacheKey))) { + $this->access->connection->writeToCache($cacheKey, array_merge($data, [$gid])); + } + // These cache keys cannot be easily updated: + // $cacheKey = 'usersInGroup-' . $gid . '-' . $search . '-' . $limit . '-' . $offset; + // $cacheKey = 'usersInGroup-' . $gid . '-' . $search; + // $cacheKey = 'countUsersInGroup-' . $gid . '-' . $search; + } + + /** + * @throws ServerNotAvailableException + */ + public function isAdmin(string $uid): bool { + if (!$this->enabled) { + return false; + } + $ldapAdminGroup = $this->access->connection->ldapAdminGroup; + if ($ldapAdminGroup === '') { + return false; + } + return $this->inGroup($uid, $ldapAdminGroup); } } diff --git a/apps/user_ldap/lib/Group_Proxy.php b/apps/user_ldap/lib/Group_Proxy.php index ea2fcce679c..f0cdc7a465d 100644 --- a/apps/user_ldap/lib/Group_Proxy.php +++ b/apps/user_ldap/lib/Group_Proxy.php @@ -1,51 +1,41 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Johannes Leuker <j.leuker@hosting.de> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; +use OC\ServerNotAvailableException; +use OCP\Group\Backend\IBatchMethodsBackend; use OCP\Group\Backend\IDeleteGroupBackend; use OCP\Group\Backend\IGetDisplayNameBackend; +use OCP\Group\Backend\IGroupDetailsBackend; +use OCP\Group\Backend\IIsAdminBackend; use OCP\Group\Backend\INamedBackend; +use OCP\GroupInterface; +use OCP\IConfig; +use OCP\IUserManager; -class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGetDisplayNameBackend, INamedBackend, IDeleteGroupBackend { - private $backends = []; - private $refBackend = null; - - public function __construct(Helper $helper, ILDAPWrapper $ldap, GroupPluginManager $groupPluginManager) { - parent::__construct($ldap); - $serverConfigPrefixes = $helper->getServerConfigurationPrefixes(true); - foreach ($serverConfigPrefixes as $configPrefix) { - $this->backends[$configPrefix] = - new \OCA\User_LDAP\Group_LDAP($this->getAccess($configPrefix), $groupPluginManager); - if (is_null($this->refBackend)) { - $this->refBackend = &$this->backends[$configPrefix]; - } - } +/** + * @template-extends Proxy<Group_LDAP> + */ +class Group_Proxy extends Proxy implements GroupInterface, IGroupLDAP, IGetDisplayNameBackend, INamedBackend, IDeleteGroupBackend, IBatchMethodsBackend, IIsAdminBackend { + public function __construct( + private Helper $helper, + ILDAPWrapper $ldap, + AccessFactory $accessFactory, + private GroupPluginManager $groupPluginManager, + private IConfig $config, + private IUserManager $ncUserManager, + ) { + parent::__construct($helper, $ldap, $accessFactory); + } + + + protected function newInstance(string $configPrefix): Group_LDAP { + return new Group_LDAP($this->getAccess($configPrefix), $this->groupPluginManager, $this->config, $this->ncUserManager); } /** @@ -57,6 +47,8 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * @return mixed the result of the method or false */ protected function walkBackends($id, $method, $parameters) { + $this->setup(); + $gid = $id; $cacheKey = $this->getGroupCacheKey($gid); foreach ($this->backends as $configPrefix => $backend) { @@ -80,6 +72,8 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * @return mixed the result of the method or false */ protected function callOnLastSeenOn($id, $method, $parameters, $passOnWhen) { + $this->setup(); + $gid = $id; $cacheKey = $this->getGroupCacheKey($gid); $prefix = $this->getFromCache($cacheKey); @@ -105,6 +99,7 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet } protected function activeBackends(): int { + $this->setup(); return count($this->backends); } @@ -125,32 +120,32 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * Get all groups a user belongs to * * @param string $uid Name of the user - * @return string[] with group names + * @return list<string> with group names * * This function fetches all groups a user belongs to. It does not check * if the user exists at all. */ public function getUserGroups($uid) { - $groups = []; + $this->setup(); + $groups = []; foreach ($this->backends as $backend) { $backendGroups = $backend->getUserGroups($uid); - if (is_array($backendGroups)) { - $groups = array_merge($groups, $backendGroups); - } + $groups = array_merge($groups, $backendGroups); } - return $groups; + return array_values(array_unique($groups)); } /** * get a list of all users in a group * - * @return string[] with user ids + * @return array<int,string> user ids */ public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { - $users = []; + $this->setup(); + $users = []; foreach ($this->backends as $backend) { $backendUsers = $backend->usersInGroup($gid, $search, $limit, $offset); if (is_array($backendUsers)) { @@ -230,6 +225,21 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet } /** + * {@inheritdoc} + */ + public function getGroupsDetails(array $gids): array { + if (!($this instanceof IGroupDetailsBackend || $this->implementsActions(GroupInterface::GROUP_DETAILS))) { + throw new \Exception('Should not have been called'); + } + + $groupData = []; + foreach ($gids as $gid) { + $groupData[$gid] = $this->handleRequest($gid, 'getGroupDetails', [$gid]); + } + return $groupData; + } + + /** * get a list of all groups * * @return string[] with group names @@ -237,8 +247,9 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * Returns a list with all groups */ public function getGroups($search = '', $limit = -1, $offset = 0) { - $groups = []; + $this->setup(); + $groups = []; foreach ($this->backends as $backend) { $backendGroups = $backend->getGroups($search, $limit, $offset); if (is_array($backendGroups)) { @@ -260,6 +271,33 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet } /** + * Check if a group exists + * + * @throws ServerNotAvailableException + */ + public function groupExistsOnLDAP(string $gid, bool $ignoreCache = false): bool { + return $this->handleRequest($gid, 'groupExistsOnLDAP', [$gid, $ignoreCache]); + } + + /** + * returns the groupname for the given LDAP DN, if available + */ + public function dn2GroupName(string $dn): string|false { + $id = 'DN,' . $dn; + return $this->handleRequest($id, 'dn2GroupName', [$dn]); + } + + /** + * {@inheritdoc} + */ + public function groupsExists(array $gids): array { + return array_values(array_filter( + $gids, + fn (string $gid): bool => $this->handleRequest($gid, 'groupExists', [$gid]), + )); + } + + /** * Check if backend implements actions * * @param int $actions bitwise-or'ed actions @@ -269,6 +307,7 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * compared with \OCP\GroupInterface::CREATE_GROUP etc. */ public function implementsActions($actions) { + $this->setup(); //it's the same across all our user backends obviously return $this->refBackend->implementsActions($actions); } @@ -288,9 +327,9 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet * The connection needs to be closed manually. * * @param string $gid - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection */ - public function getNewLDAPConnection($gid) { + public function getNewLDAPConnection($gid): \LDAP\Connection { return $this->handleRequest($gid, 'getNewLDAPConnection', [$gid]); } @@ -306,4 +345,16 @@ class Group_Proxy extends Proxy implements \OCP\GroupInterface, IGroupLDAP, IGet public function getBackendName(): string { return 'LDAP'; } + + public function searchInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array { + return $this->handleRequest($gid, 'searchInGroup', [$gid, $search, $limit, $offset]); + } + + public function addRelationshipToCaches(string $uid, ?string $dnUser, string $gid): void { + $this->handleRequest($gid, 'addRelationshipToCaches', [$uid, $dnUser, $gid]); + } + + public function isAdmin(string $uid): bool { + return $this->handleRequest($uid, 'isAdmin', [$uid]); + } } diff --git a/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php b/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php index 0d3c5b8f3f3..8b63d54aa66 100644 --- a/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php +++ b/apps/user_ldap/lib/Handler/ExtStorageConfigHandler.php @@ -1,26 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2019 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Handler; @@ -62,7 +44,7 @@ class ExtStorageConfigHandler extends UserContext implements IConfigHandler { } $ldapUser = $access->userManager->get($user->getUID()); - $extHome = $ldapUser->getExtStorageHome(); + $extHome = $ldapUser !== null ? $ldapUser->getExtStorageHome() : ''; return $this->processInput($optionValue, $extHome); } diff --git a/apps/user_ldap/lib/Helper.php b/apps/user_ldap/lib/Helper.php index 437fab6b6a8..d3abf04fd1e 100644 --- a/apps/user_ldap/lib/Helper.php +++ b/apps/user_ldap/lib/Helper.php @@ -1,54 +1,26 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author root <root@localhost.localdomain> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; -use OC\Cache\CappedMemoryCache; +use OCP\Cache\CappedMemoryCache; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IConfig; +use OCP\IAppConfig; use OCP\IDBConnection; +use OCP\Server; class Helper { + /** @var CappedMemoryCache<string> */ + protected CappedMemoryCache $sanitizeDnCache; - /** @var IConfig */ - private $config; - - /** @var IDBConnection */ - private $connection; - - /** @var CappedMemoryCache */ - protected $sanitizeDnCache; - - public function __construct(IConfig $config, - IDBConnection $connection) { - $this->config = $config; - $this->connection = $connection; + public function __construct( + private IAppConfig $appConfig, + private IDBConnection $connection, + ) { $this->sanitizeDnCache = new CappedMemoryCache(10000); } @@ -56,7 +28,7 @@ class Helper { * returns prefixes for each saved LDAP/AD server configuration. * * @param bool $activeConfigurations optional, whether only active configuration shall be - * retrieved, defaults to false + * retrieved, defaults to false * @return array with a list of the available prefixes * * Configuration prefixes are used to set up configurations for n LDAP or @@ -73,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; } @@ -96,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) { @@ -153,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; } @@ -172,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; } @@ -180,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; } /** @@ -211,6 +207,21 @@ class Helper { /** * sanitizes a DN received from the LDAP server * + * This is used and done to have a stable format of DNs that can be compared + * and identified again. The input DN value is modified as following: + * + * 1) whitespaces after commas are removed + * 2) the DN is turned to lower-case + * 3) the DN is escaped according to RFC 2253 + * + * When a future DN is supposed to be used as a base parameter, it has to be + * run through DNasBaseParameter() first, to recode \5c into a backslash + * again, otherwise the search or read operation will fail with LDAP error + * 32, NO_SUCH_OBJECT. Regular usage in LDAP filters requires the backslash + * being escaped, however. + * + * Internally, DNs are stored in their sanitized form. + * * @param array|string $dn the DN in question * @return array|string the sanitized DN */ @@ -283,7 +294,7 @@ class Helper { throw new \Exception('key uid is expected to be set in $param'); } - $userBackend = \OC::$server->get(User_Proxy::class); + $userBackend = Server::get(User_Proxy::class); $uid = $userBackend->loginName2UserName($param['uid']); if ($uid !== false) { $param['uid'] = $uid; diff --git a/apps/user_ldap/lib/IGroupLDAP.php b/apps/user_ldap/lib/IGroupLDAP.php index 2face1aa907..667eb421004 100644 --- a/apps/user_ldap/lib/IGroupLDAP.php +++ b/apps/user_ldap/lib/IGroupLDAP.php @@ -1,24 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017, EITA Cooperative (eita.org.br) - * - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; @@ -36,7 +20,7 @@ interface IGroupLDAP { /** * Return a new LDAP connection for the specified group. * @param string $gid - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection */ public function getNewLDAPConnection($gid); } diff --git a/apps/user_ldap/lib/ILDAPGroupPlugin.php b/apps/user_ldap/lib/ILDAPGroupPlugin.php index 20cff50e801..261b9383dc1 100644 --- a/apps/user_ldap/lib/ILDAPGroupPlugin.php +++ b/apps/user_ldap/lib/ILDAPGroupPlugin.php @@ -1,24 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; diff --git a/apps/user_ldap/lib/ILDAPUserPlugin.php b/apps/user_ldap/lib/ILDAPUserPlugin.php index 28754a7eaaf..80437bef452 100644 --- a/apps/user_ldap/lib/ILDAPUserPlugin.php +++ b/apps/user_ldap/lib/ILDAPUserPlugin.php @@ -1,30 +1,12 @@ <?php + /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; interface ILDAPUserPlugin { - /** * Check if plugin implements actions * @return int @@ -77,7 +59,7 @@ interface ILDAPUserPlugin { public function setDisplayName($uid, $displayName); /** - * checks whether the user is allowed to change his avatar in Nextcloud + * checks whether the user is allowed to change their avatar in Nextcloud * @param string $uid the Nextcloud user name * @return boolean either the user can or cannot */ @@ -85,7 +67,7 @@ interface ILDAPUserPlugin { /** * Count the number of users - * @return int|bool + * @return int|false */ public function countUsers(); } diff --git a/apps/user_ldap/lib/ILDAPWrapper.php b/apps/user_ldap/lib/ILDAPWrapper.php index e72d85ac2b9..de2b9c50241 100644 --- a/apps/user_ldap/lib/ILDAPWrapper.php +++ b/apps/user_ldap/lib/ILDAPWrapper.php @@ -1,41 +1,18 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author J0WI <J0WI@users.noreply.github.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roger Szabo <roger.szabo@web.de> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; interface ILDAPWrapper { - //LDAP functions in use /** * Bind to LDAP directory - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @param string $dn an RDN to log in with * @param string $password the password * @return bool true on success, false otherwise @@ -48,24 +25,14 @@ interface ILDAPWrapper { * connect to an LDAP server * @param string $host The host to connect to * @param string $port The port to connect to - * @return mixed a link resource on success, otherwise false + * @return \LDAP\Connection|false a link resource on success, otherwise false */ public function connect($host, $port); /** - * Send LDAP pagination control - * @param resource|\LDAP\Connection $link LDAP link resource - * @param int $pageSize number of results per page - * @param bool $isCritical Indicates whether the pagination is critical of not. - * @param string $cookie structure sent by LDAP server - * @return bool true on success, false otherwise - */ - public function controlPagedResult($link, $pageSize, $isCritical); - - /** * Retrieve the LDAP pagination cookie - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\Result $result LDAP result resource + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\Result $result LDAP result resource * @param string &$cookie structure sent by LDAP server * @return bool true on success, false otherwise * @@ -75,22 +42,22 @@ interface ILDAPWrapper { /** * Count the number of entries in a search - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\Result $result LDAP result resource + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\Result $result LDAP result resource * @return int|false number of results on success, false otherwise */ public function countEntries($link, $result); /** * Return the LDAP error number of the last LDAP command - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @return int error code */ public function errno($link); /** * Return the LDAP error message of the last LDAP command - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @return string error message */ public function error($link); @@ -106,69 +73,69 @@ interface ILDAPWrapper { /** * Return first result id - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\Result $result LDAP result resource - * @return resource|\LDAP\ResultEntry an LDAP entry resource + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\Result $result LDAP result resource + * @return \LDAP\ResultEntry an LDAP entry resource * */ public function firstEntry($link, $result); /** * Get attributes from a search result entry - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\ResultEntry $result LDAP result resource - * @return array containing the results, false on error + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\ResultEntry $result LDAP result resource + * @return array|false containing the results, false on error * */ public function getAttributes($link, $result); /** * Get the DN of a result entry - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\ResultEntry $result LDAP result resource - * @return string containing the DN, false on error + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\ResultEntry $result LDAP result resource + * @return string|false containing the DN, false on error */ public function getDN($link, $result); /** * Get all result entries - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\Result $result LDAP result resource - * @return array containing the results, false on error + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\Result $result LDAP result resource + * @return array|false containing the results, false on error */ public function getEntries($link, $result); /** * Return next result id - * @param resource|\LDAP\Connection $link LDAP link resource - * @param resource|\LDAP\ResultEntry $result LDAP result resource - * @return resource|\LDAP\ResultEntry an LDAP entry resource + * @param \LDAP\Connection $link LDAP link resource + * @param \LDAP\ResultEntry $result LDAP result resource + * @return \LDAP\ResultEntry an LDAP entry resource * */ public function nextEntry($link, $result); /** * Read an entry - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @param string $baseDN The DN of the entry to read from * @param string $filter An LDAP filter * @param array $attr array of the attributes to read - * @return resource|\LDAP\Result an LDAP search result resource + * @return \LDAP\Result an LDAP search result resource */ public function read($link, $baseDN, $filter, $attr); /** * Search LDAP tree - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @param string $baseDN The DN of the entry to read from * @param string $filter An LDAP filter * @param array $attr array of the attributes to read * @param int $attrsOnly optional, 1 if only attribute types shall be returned * @param int $limit optional, limits the result entries - * @return resource|\LDAP\Result|false an LDAP search result resource, false on error + * @return \LDAP\Result|false an LDAP search result resource, false on error */ - public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0); + public function search($link, string $baseDN, string $filter, array $attr, int $attrsOnly = 0, int $limit = 0, int $pageSize = 0, string $cookie = ''); /** * Replace the value of a userPassword by $password - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @param string $userDN the DN of the user whose password is to be replaced * @param string $password the new value for the userPassword * @return bool true on success, false otherwise @@ -176,8 +143,15 @@ interface ILDAPWrapper { public function modReplace($link, $userDN, $password); /** + * Performs a PASSWD extended operation. + * @param \LDAP\Connection $link LDAP link resource + * @return bool|string The generated password if new_password is empty or omitted. Otherwise true on success and false on failure. + */ + public function exopPasswd($link, string $userDN, string $oldPassword, string $password); + + /** * Sets the value of the specified option to be $value - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @param int $option a defined LDAP Server option * @param mixed $value the new value for the option * @return bool true on success, false otherwise @@ -186,14 +160,14 @@ interface ILDAPWrapper { /** * establish Start TLS - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @return bool true on success, false otherwise */ public function startTls($link); /** * Unbind from LDAP directory - * @param resource|\LDAP\Connection $link LDAP link resource + * @param \LDAP\Connection $link LDAP link resource * @return bool true on success, false otherwise */ public function unbind($link); @@ -209,6 +183,7 @@ interface ILDAPWrapper { /** * Checks whether the submitted parameter is a resource * @param mixed $resource the resource variable to check + * @psalm-assert-if-true object $resource * @return bool true if it is a resource or LDAP object, false otherwise */ public function isResource($resource); diff --git a/apps/user_ldap/lib/IUserLDAP.php b/apps/user_ldap/lib/IUserLDAP.php index dfba11c5d34..5e8e29c3adf 100644 --- a/apps/user_ldap/lib/IUserLDAP.php +++ b/apps/user_ldap/lib/IUserLDAP.php @@ -1,43 +1,26 @@ <?php + /** - * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de) - * - * @author Roger Szabo <roger.szabo@web.de> - * @author root <root@localhost.localdomain> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; interface IUserLDAP { //Functions used by LDAPProvider - + /** * Return access for LDAP interaction. * @param string $uid * @return Access instance of Access for LDAP interaction */ public function getLDAPAccess($uid); - + /** * Return a new LDAP connection for the specified user. * @param string $uid - * @return resource|\LDAP\Connection of the LDAP connection + * @return \LDAP\Connection of the LDAP connection */ public function getNewLDAPConnection($uid); diff --git a/apps/user_ldap/lib/Jobs/CleanUp.php b/apps/user_ldap/lib/Jobs/CleanUp.php index 1fb423b5faf..76277b43c0b 100644 --- a/apps/user_ldap/lib/Jobs/CleanUp.php +++ b/apps/user_ldap/lib/Jobs/CleanUp.php @@ -1,36 +1,21 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Jobs; -use OC\BackgroundJob\TimedJob; use OCA\User_LDAP\Helper; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\DeletedUsersIndex; -use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\User_Proxy; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\TimedJob; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\Server; /** * Class CleanUp @@ -44,15 +29,12 @@ class CleanUp extends TimedJob { protected $limit; /** @var int $defaultIntervalMin default interval in minutes */ - protected $defaultIntervalMin = 51; + protected $defaultIntervalMin = 60; - /** @var User_LDAP|User_Proxy $userBackend */ - protected $userBackend; - - /** @var \OCP\IConfig $ocConfig */ + /** @var IConfig $ocConfig */ protected $ocConfig; - /** @var \OCP\IDBConnection $db */ + /** @var IDBConnection $db */ protected $db; /** @var Helper $ldapHelper */ @@ -61,15 +43,15 @@ class CleanUp extends TimedJob { /** @var UserMapping */ protected $mapping; - /** @var DeletedUsersIndex */ - protected $dui; - - public function __construct(User_Proxy $userBackend, DeletedUsersIndex $dui) { - $minutes = \OC::$server->getConfig()->getSystemValue( + public function __construct( + ITimeFactory $timeFactory, + protected User_Proxy $userBackend, + protected DeletedUsersIndex $dui, + ) { + parent::__construct($timeFactory); + $minutes = Server::get(IConfig::class)->getSystemValue( 'ldapUserCleanupInterval', (string)$this->defaultIntervalMin); $this->setInterval((int)$minutes * 60); - $this->userBackend = $userBackend; - $this->dui = $dui; } /** @@ -85,13 +67,13 @@ class CleanUp extends TimedJob { if (isset($arguments['helper'])) { $this->ldapHelper = $arguments['helper']; } else { - $this->ldapHelper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $this->ldapHelper = Server::get(Helper::class); } if (isset($arguments['ocConfig'])) { $this->ocConfig = $arguments['ocConfig']; } else { - $this->ocConfig = \OC::$server->getConfig(); + $this->ocConfig = Server::get(IConfig::class); } if (isset($arguments['userBackend'])) { @@ -101,13 +83,13 @@ class CleanUp extends TimedJob { if (isset($arguments['db'])) { $this->db = $arguments['db']; } else { - $this->db = \OC::$server->getDatabaseConnection(); + $this->db = Server::get(IDBConnection::class); } if (isset($arguments['mapping'])) { $this->mapping = $arguments['mapping']; } else { - $this->mapping = new UserMapping($this->db); + $this->mapping = Server::get(UserMapping::class); } if (isset($arguments['deletedUsersIndex'])) { @@ -197,8 +179,8 @@ class CleanUp extends TimedJob { * @param bool $reset whether the offset should be set to 0 */ public function setOffset(bool $reset = false): void { - $newOffset = $reset ? 0 : - $this->getOffset() + $this->getChunkSize(); + $newOffset = $reset ? 0 + : $this->getOffset() + $this->getChunkSize(); $this->ocConfig->setAppValue('user_ldap', 'cleanUpJobOffset', (string)$newOffset); } diff --git a/apps/user_ldap/lib/Jobs/Sync.php b/apps/user_ldap/lib/Jobs/Sync.php index 3d0dd88dfd2..26888ae96ae 100644 --- a/apps/user_ldap/lib/Jobs/Sync.php +++ b/apps/user_ldap/lib/Jobs/Sync.php @@ -1,30 +1,12 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\User_LDAP\Jobs; -use OC\BackgroundJob\TimedJob; use OC\ServerNotAvailableException; use OCA\User_LDAP\AccessFactory; use OCA\User_LDAP\Configuration; @@ -32,7 +14,9 @@ use OCA\User_LDAP\ConnectionFactory; use OCA\User_LDAP\Helper; use OCA\User_LDAP\LDAP; use OCA\User_LDAP\Mapping\UserMapping; -use OCA\User_LDAP\User\Manager; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\TimedJob; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IDBConnection; @@ -43,46 +27,38 @@ use Psr\Log\LoggerInterface; class Sync extends TimedJob { public const MAX_INTERVAL = 12 * 60 * 60; // 12h public const MIN_INTERVAL = 30 * 60; // 30min - /** @var Helper */ - protected $ldapHelper; - /** @var LDAP */ - protected $ldap; - /** @var Manager */ - protected $userManager; - /** @var UserMapping */ - protected $mapper; - /** @var IConfig */ - protected $config; - /** @var IAvatarManager */ - protected $avatarManager; - /** @var IDBConnection */ - protected $dbc; - /** @var IUserManager */ - protected $ncUserManager; - /** @var LoggerInterface */ - protected $logger; - /** @var IManager */ - protected $notificationManager; - /** @var ConnectionFactory */ - protected $connectionFactory; - /** @var AccessFactory */ - protected $accessFactory; - public function __construct(Manager $userManager) { - $this->userManager = $userManager; + protected LDAP $ldap; + + public function __construct( + ITimeFactory $timeFactory, + private IEventDispatcher $dispatcher, + private IConfig $config, + private IDBConnection $dbc, + private IAvatarManager $avatarManager, + private IUserManager $ncUserManager, + private LoggerInterface $logger, + private IManager $notificationManager, + private UserMapping $mapper, + private Helper $ldapHelper, + private ConnectionFactory $connectionFactory, + private AccessFactory $accessFactory, + ) { + parent::__construct($timeFactory); $this->setInterval( - \OC::$server->getConfig()->getAppValue( + (int)$this->config->getAppValue( 'user_ldap', 'background_sync_interval', - self::MIN_INTERVAL + (string)self::MIN_INTERVAL ) ); + $this->ldap = new LDAP($this->config->getSystemValueString('ldap_log_file')); } /** - * updates the interval + * Updates the interval * - * the idea is to adjust the interval depending on the amount of known users + * The idea is to adjust the interval depending on the amount of known users * and the attempt to update each user one day. At most it would run every * 30 minutes, and at least every 12 hours. */ @@ -95,17 +71,16 @@ class Sync extends TimedJob { $interval = floor(24 * 60 * 60 / $runsPerDay); $interval = min(max($interval, self::MIN_INTERVAL), self::MAX_INTERVAL); - $this->config->setAppValue('user_ldap', 'background_sync_interval', $interval); + $this->config->setAppValue('user_ldap', 'background_sync_interval', (string)$interval); } /** * returns the smallest configured paging size - * @return int */ - protected function getMinPagingSize() { + protected function getMinPagingSize(): int { $configKeys = $this->config->getAppKeys('user_ldap'); $configKeys = array_filter($configKeys, function ($key) { - return strpos($key, 'ldap_paging_size') !== false; + return str_contains($key, 'ldap_paging_size'); }); $minPagingSize = null; foreach ($configKeys as $configKey) { @@ -119,10 +94,8 @@ class Sync extends TimedJob { * @param array $argument */ public function run($argument) { - $this->setArgument($argument); - $isBackgroundJobModeAjax = $this->config - ->getAppValue('core', 'backgroundjobs_mode', 'ajax') === 'ajax'; + ->getAppValue('core', 'backgroundjobs_mode', 'ajax') === 'ajax'; if ($isBackgroundJobModeAjax) { return; } @@ -155,10 +128,10 @@ class Sync extends TimedJob { } /** - * @param array $cycleData + * @param array{offset: int, prefix: string} $cycleData * @return bool whether more results are expected from the same configuration */ - public function runCycle($cycleData) { + public function runCycle(array $cycleData): bool { $connection = $this->connectionFactory->get($cycleData['prefix']); $access = $this->accessFactory->get($connection); $access->setUserMapper($this->mapper); @@ -171,7 +144,7 @@ class Sync extends TimedJob { $results = $access->fetchListOfUsers( $filter, $access->userManager->getAttributes(), - $connection->ldapPagingSize, + (int)$connection->ldapPagingSize, $cycleData['offset'], true ); @@ -183,24 +156,22 @@ class Sync extends TimedJob { } /** - * returns the info about the current cycle that should be run, if any, + * Returns the info about the current cycle that should be run, if any, * otherwise null - * - * @return array|null */ - public function getCycle() { + public function getCycle(): ?array { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); if (count($prefixes) === 0) { return null; } $cycleData = [ - 'prefix' => $this->config->getAppValue('user_ldap', 'background_sync_prefix', null), - 'offset' => (int)$this->config->getAppValue('user_ldap', 'background_sync_offset', 0), + 'prefix' => $this->config->getAppValue('user_ldap', 'background_sync_prefix', 'none'), + 'offset' => (int)$this->config->getAppValue('user_ldap', 'background_sync_offset', '0'), ]; if ( - $cycleData['prefix'] !== null + $cycleData['prefix'] !== 'none' && in_array($cycleData['prefix'], $prefixes) ) { return $cycleData; @@ -212,21 +183,21 @@ class Sync extends TimedJob { /** * Save the provided cycle information in the DB * - * @param array $cycleData + * @param array{prefix: ?string, offset: int} $cycleData */ - public function setCycle(array $cycleData) { + public function setCycle(array $cycleData): void { $this->config->setAppValue('user_ldap', 'background_sync_prefix', $cycleData['prefix']); - $this->config->setAppValue('user_ldap', 'background_sync_offset', $cycleData['offset']); + $this->config->setAppValue('user_ldap', 'background_sync_offset', (string)$cycleData['offset']); } /** * returns data about the next cycle that should run, if any, otherwise * null. It also always goes for the next LDAP configuration! * - * @param array|null $cycleData the old cycle - * @return array|null + * @param ?array{prefix: string, offset: int} $cycleData the old cycle + * @return ?array{prefix: string, offset: int} */ - public function determineNextCycle(array $cycleData = null) { + public function determineNextCycle(?array $cycleData = null): ?array { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); if (count($prefixes) === 0) { return null; @@ -246,14 +217,13 @@ class Sync extends TimedJob { } /** - * Checks whether the provided cycle should be run. Currently only the + * Checks whether the provided cycle should be run. Currently, only the * last configuration change goes into account (at least one hour). * - * @param $cycleData - * @return bool + * @param array{prefix: string} $cycleData */ - public function qualifiesToRun($cycleData) { - $lastChange = $this->config->getAppValue('user_ldap', $cycleData['prefix'] . '_lastChange', 0); + public function qualifiesToRun(array $cycleData): bool { + $lastChange = (int)$this->config->getAppValue('user_ldap', $cycleData['prefix'] . '_lastChange', '0'); if ((time() - $lastChange) > 60 * 30) { return true; } @@ -261,23 +231,20 @@ class Sync extends TimedJob { } /** - * increases the offset of the current cycle for the next run + * Increases the offset of the current cycle for the next run * - * @param $cycleData + * @param array{prefix: string, offset: int} $cycleData */ - protected function increaseOffset($cycleData) { + protected function increaseOffset(array $cycleData): void { $ldapConfig = new Configuration($cycleData['prefix']); $cycleData['offset'] += (int)$ldapConfig->ldapPagingSize; $this->setCycle($cycleData); } /** - * determines the next configuration prefix based on the last one (if any) - * - * @param string|null $lastPrefix - * @return string|null + * Determines the next configuration prefix based on the last one (if any) */ - protected function getNextPrefix($lastPrefix) { + protected function getNextPrefix(?string $lastPrefix): ?string { $prefixes = $this->ldapHelper->getServerConfigurationPrefixes(true); $noOfPrefixes = count($prefixes); if ($noOfPrefixes === 0) { @@ -297,86 +264,9 @@ class Sync extends TimedJob { } /** - * "fixes" DI - * - * @param array $argument + * Only used in tests */ - public function setArgument($argument) { - if (isset($argument['config'])) { - $this->config = $argument['config']; - } else { - $this->config = \OC::$server->getConfig(); - } - - if (isset($argument['helper'])) { - $this->ldapHelper = $argument['helper']; - } else { - $this->ldapHelper = new Helper($this->config, \OC::$server->getDatabaseConnection()); - } - - if (isset($argument['ldapWrapper'])) { - $this->ldap = $argument['ldapWrapper']; - } else { - $this->ldap = new LDAP($this->config->getSystemValueString('ldap_log_file')); - } - - if (isset($argument['avatarManager'])) { - $this->avatarManager = $argument['avatarManager']; - } else { - $this->avatarManager = \OC::$server->getAvatarManager(); - } - - if (isset($argument['dbc'])) { - $this->dbc = $argument['dbc']; - } else { - $this->dbc = \OC::$server->getDatabaseConnection(); - } - - if (isset($argument['ncUserManager'])) { - $this->ncUserManager = $argument['ncUserManager']; - } else { - $this->ncUserManager = \OC::$server->getUserManager(); - } - - if (isset($argument['logger'])) { - $this->logger = $argument['logger']; - } else { - $this->logger = \OC::$server->get(LoggerInterface::class); - } - - if (isset($argument['notificationManager'])) { - $this->notificationManager = $argument['notificationManager']; - } else { - $this->notificationManager = \OC::$server->getNotificationManager(); - } - - if (isset($argument['userManager'])) { - $this->userManager = $argument['userManager']; - } - - if (isset($argument['mapper'])) { - $this->mapper = $argument['mapper']; - } else { - $this->mapper = new UserMapping($this->dbc); - } - - if (isset($argument['connectionFactory'])) { - $this->connectionFactory = $argument['connectionFactory']; - } else { - $this->connectionFactory = new ConnectionFactory($this->ldap); - } - - if (isset($argument['accessFactory'])) { - $this->accessFactory = $argument['accessFactory']; - } else { - $this->accessFactory = new AccessFactory( - $this->ldap, - $this->userManager, - $this->ldapHelper, - $this->config, - $this->ncUserManager, - $this->logger - ); - } + public function overwritePropertiesForTest(LDAP $ldapWrapper): void { + $this->ldap = $ldapWrapper; } } diff --git a/apps/user_ldap/lib/Jobs/UpdateGroups.php b/apps/user_ldap/lib/Jobs/UpdateGroups.php index b42049eb3a8..9e72bcd8432 100644 --- a/apps/user_ldap/lib/Jobs/UpdateGroups.php +++ b/apps/user_ldap/lib/Jobs/UpdateGroups.php @@ -1,259 +1,38 @@ <?php + +declare(strict_types=1); + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Jobs; -use OC\BackgroundJob\TimedJob; -use OCA\User_LDAP\Group_Proxy; -use OCP\EventDispatcher\IEventDispatcher; -use OCP\Group\Events\UserAddedEvent; -use OCP\Group\Events\UserRemovedEvent; -use OCP\IDBConnection; -use OCP\IGroupManager; -use OCP\IUser; -use OCP\IUserManager; +use OCA\User_LDAP\Service\UpdateGroupsService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\TimedJob; +use OCP\DB\Exception; +use OCP\IConfig; use Psr\Log\LoggerInterface; class UpdateGroups extends TimedJob { - private $groupsFromDB; - - /** @var Group_Proxy */ - private $groupBackend; - /** @var IEventDispatcher */ - private $dispatcher; - /** @var IGroupManager */ - private $groupManager; - /** @var IUserManager */ - private $userManager; - /** @var LoggerInterface */ - private $logger; - /** @var IDBConnection */ - private $dbc; - public function __construct( - Group_Proxy $groupBackend, - IEventDispatcher $dispatcher, - IGroupManager $groupManager, - IUserManager $userManager, - LoggerInterface $logger, - IDBConnection $dbc + private UpdateGroupsService $service, + private LoggerInterface $logger, + IConfig $config, + ITimeFactory $timeFactory, ) { - $this->interval = $this->getRefreshInterval(); - $this->groupBackend = $groupBackend; - $this->dispatcher = $dispatcher; - $this->groupManager = $groupManager; - $this->userManager = $userManager; - $this->logger = $logger; - $this->dbc = $dbc; - } - - /** - * @return int - */ - private function getRefreshInterval() { - //defaults to every hour - return \OC::$server->getConfig()->getAppValue('user_ldap', 'bgjRefreshInterval', 3600); + parent::__construct($timeFactory); + $this->interval = (int)$config->getAppValue('user_ldap', 'bgjRefreshInterval', '3600'); } /** * @param mixed $argument + * @throws Exception */ - public function run($argument) { - $this->updateGroups(); - } - - public function updateGroups() { - $this->logger->debug( - 'Run background job "updateGroups"', - ['app' => 'user_ldap'] - ); - - $knownGroups = array_keys($this->getKnownGroups()); - $actualGroups = $this->groupBackend->getGroups(); - - if (empty($actualGroups) && empty($knownGroups)) { - $this->logger->info( - 'bgJ "updateGroups" – groups do not seem to be configured properly, aborting.', - ['app' => 'user_ldap'] - ); - return; - } - - $this->handleKnownGroups(array_intersect($actualGroups, $knownGroups)); - $this->handleCreatedGroups(array_diff($actualGroups, $knownGroups)); - $this->handleRemovedGroups(array_diff($knownGroups, $actualGroups)); - - $this->logger->debug( - 'bgJ "updateGroups" – Finished.', - ['app' => 'user_ldap'] - ); - } - - /** - * @return array - */ - private function getKnownGroups() { - if (is_array($this->groupsFromDB)) { - $this->groupsFromDB; - } - $qb = $this->dbc->getQueryBuilder(); - $qb->select(['owncloudname', 'owncloudusers']) - ->from('ldap_group_members'); - - $qResult = $qb->execute(); - $result = $qResult->fetchAll(); - $qResult->closeCursor(); - - $this->groupsFromDB = []; - foreach ($result as $dataset) { - $this->groupsFromDB[$dataset['owncloudname']] = $dataset; - } - - return $this->groupsFromDB; - } - - private function handleKnownGroups(array $groups) { - $this->logger->debug( - 'bgJ "updateGroups" – Dealing with known Groups.', - ['app' => 'user_ldap'] - ); - $qb = $this->dbc->getQueryBuilder(); - $qb->update('ldap_group_members') - ->set('owncloudusers', $qb->createParameter('members')) - ->where($qb->expr()->eq('owncloudname', $qb->createParameter('groupId'))); - - if (!is_array($this->groupsFromDB)) { - $this->getKnownGroups(); - } - foreach ($groups as $group) { - $knownUsers = unserialize($this->groupsFromDB[$group]['owncloudusers']); - $actualUsers = $this->groupBackend->usersInGroup($group); - $hasChanged = false; - - $groupObject = $this->groupManager->get($group); - foreach (array_diff($knownUsers, $actualUsers) as $removedUser) { - $userObject = $this->userManager->get($removedUser); - if ($userObject instanceof IUser) { - $this->dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject)); - } - $this->logger->info( - 'bgJ "updateGroups" – {user} removed from {group}', - [ - 'app' => 'user_ldap', - 'user' => $removedUser, - 'group' => $group - ] - ); - $hasChanged = true; - } - foreach (array_diff($actualUsers, $knownUsers) as $addedUser) { - $userObject = $this->userManager->get($addedUser); - if ($userObject instanceof IUser) { - $this->dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject)); - } - $this->logger->info( - 'bgJ "updateGroups" – {user} added to {group}', - [ - 'app' => 'user_ldap', - 'user' => $addedUser, - 'group' => $group - ] - ); - $hasChanged = true; - } - if ($hasChanged) { - $qb->setParameters([ - 'members' => serialize($actualUsers), - 'groupId' => $group - ]); - $qb->execute(); - } - } - $this->logger->debug( - 'bgJ "updateGroups" – FINISHED dealing with known Groups.', - ['app' => 'user_ldap'] - ); - } - - /** - * @param string[] $createdGroups - */ - private function handleCreatedGroups($createdGroups) { - $this->logger->debug( - 'bgJ "updateGroups" – dealing with created Groups.', - ['app' => 'user_ldap'] - ); - - $query = $this->dbc->getQueryBuilder(); - $query->insert('ldap_group_members') - ->setValue('owncloudname', $query->createParameter('owncloudname')) - ->setValue('owncloudusers', $query->createParameter('owncloudusers')); - foreach ($createdGroups as $createdGroup) { - $this->logger->info( - 'bgJ "updateGroups" – new group "' . $createdGroup . '" found.', - ['app' => 'user_ldap'] - ); - $users = serialize($this->groupBackend->usersInGroup($createdGroup)); - - $query->setParameter('owncloudname', $createdGroup) - ->setParameter('owncloudusers', $users); - $query->execute(); - } - $this->logger->debug( - 'bgJ "updateGroups" – FINISHED dealing with created Groups.', - ['app' => 'user_ldap'] - ); - } - - /** - * @param string[] $removedGroups - */ - private function handleRemovedGroups($removedGroups) { - $this->logger->debug( - 'bgJ "updateGroups" – dealing with removed groups.', - ['app' => 'user_ldap'] - ); - - $query = $this->dbc->getQueryBuilder(); - $query->delete('ldap_group_members') - ->where($query->expr()->eq('owncloudname', $query->createParameter('owncloudname'))); - - foreach ($removedGroups as $removedGroup) { - $this->logger->info( - 'bgJ "updateGroups" – group "' . $removedGroup . '" was removed.', - ['app' => 'user_ldap'] - ); - $query->setParameter('owncloudname', $removedGroup); - $query->execute(); - } - $this->logger->debug( - 'bgJ "updateGroups" – FINISHED dealing with removed groups.', - ['app' => 'user_ldap'] - ); + public function run($argument): void { + $this->logger->debug('Run background job "updateGroups"'); + $this->service->updateGroups(); } } diff --git a/apps/user_ldap/lib/LDAP.php b/apps/user_ldap/lib/LDAP.php index 3c579596941..1cf20c4b939 100644 --- a/apps/user_ldap/lib/LDAP.php +++ b/apps/user_ldap/lib/LDAP.php @@ -1,65 +1,40 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Alexander Bergolth <leo@strike.wu.ac.at> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author J0WI <J0WI@users.noreply.github.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Peter Kubica <peter@kubica.ch> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Carl Schwan <carl@carlschwan.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; -use OCP\Profiler\IProfiler; use OC\ServerNotAvailableException; use OCA\User_LDAP\DataCollector\LdapDataCollector; use OCA\User_LDAP\Exceptions\ConstraintViolationException; -use OCA\User_LDAP\PagedResults\IAdapter; -use OCA\User_LDAP\PagedResults\Php73; +use OCP\IConfig; +use OCP\ILogger; +use OCP\Profiler\IProfiler; +use OCP\Server; +use Psr\Log\LoggerInterface; class LDAP implements ILDAPWrapper { - protected $logFile = ''; - protected $curFunc = ''; - protected $curArgs = []; - - /** @var IAdapter */ - protected $pagedResultsAdapter; + protected array $curArgs = []; + protected LoggerInterface $logger; + protected IConfig $config; private ?LdapDataCollector $dataCollector = null; - public function __construct(string $logFile = '') { - $this->pagedResultsAdapter = new Php73(); - $this->logFile = $logFile; - + public function __construct( + protected string $logFile = '', + ) { /** @var IProfiler $profiler */ - $profiler = \OC::$server->get(IProfiler::class); + $profiler = Server::get(IProfiler::class); if ($profiler->isEnabled()) { $this->dataCollector = new LdapDataCollector(); $profiler->add($this->dataCollector); } + + $this->logger = Server::get(LoggerInterface::class); + $this->config = Server::get(IConfig::class); } /** @@ -73,10 +48,12 @@ class LDAP implements ILDAPWrapper { * {@inheritDoc} */ public function connect($host, $port) { - if (strpos($host, '://') === false) { + $pos = strpos($host, '://'); + if ($pos === false) { $host = 'ldap://' . $host; + $pos = 4; } - if (strpos($host, ':', strpos($host, '://') + 1) === false) { + if (strpos($host, ':', $pos + 1) === false && !empty($port)) { //ldap_connect ignores port parameter when URLs are passed $host .= ':' . $port; } @@ -87,39 +64,30 @@ class LDAP implements ILDAPWrapper { * {@inheritDoc} */ public function controlPagedResultResponse($link, $result, &$cookie): bool { - $this->preFunctionCall( - $this->pagedResultsAdapter->getResponseCallFunc(), - $this->pagedResultsAdapter->getResponseCallArgs([$link, $result, &$cookie]) - ); - - $result = $this->pagedResultsAdapter->responseCall($link); - $cookie = $this->pagedResultsAdapter->getCookie($link); - - if ($this->isResultFalse($result)) { - $this->postFunctionCall(); + $errorCode = 0; + $errorMsg = ''; + $controls = []; + $matchedDn = null; + $referrals = []; + + /** Cannot use invokeLDAPMethod because arguments are passed by reference */ + $this->preFunctionCall('ldap_parse_result', [$link, $result]); + $success = ldap_parse_result($link, $result, + $errorCode, + $matchedDn, + $errorMsg, + $referrals, + $controls); + if ($errorCode !== 0) { + $this->processLDAPError($link, 'ldap_parse_result', $errorCode, $errorMsg); } - - return $result; - } - - /** - * {@inheritDoc} - */ - public function controlPagedResult($link, $pageSize, $isCritical) { - $fn = $this->pagedResultsAdapter->getRequestCallFunc(); - $this->pagedResultsAdapter->setRequestParameters($link, $pageSize, $isCritical); - if ($fn === null) { - return true; + if ($this->dataCollector !== null) { + $this->dataCollector->stopLastLdapRequest(); } - $this->preFunctionCall($fn, $this->pagedResultsAdapter->getRequestCallArgs($link)); - $result = $this->pagedResultsAdapter->requestCall($link); + $cookie = $controls[LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] ?? ''; - if ($this->isResultFalse($result)) { - $this->postFunctionCall(); - } - - return $result; + return $success; } /** @@ -146,7 +114,7 @@ class LDAP implements ILDAPWrapper { /** * Splits DN into its component parts * @param string $dn - * @param int @withAttrib + * @param int $withAttrib * @return array|false * @link https://www.php.net/manual/en/function.ldap-explode-dn.php */ @@ -193,24 +161,36 @@ class LDAP implements ILDAPWrapper { * {@inheritDoc} */ public function read($link, $baseDN, $filter, $attr) { - $this->pagedResultsAdapter->setReadArgs($link, $baseDN, $filter, $attr); - return $this->invokeLDAPMethod('read', ...$this->pagedResultsAdapter->getReadArgs($link)); + return $this->invokeLDAPMethod('read', $link, $baseDN, $filter, $attr, 0, -1); } /** * {@inheritDoc} */ - public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0) { + public function search($link, $baseDN, $filter, $attr, $attrsOnly = 0, $limit = 0, int $pageSize = 0, string $cookie = '') { + if ($pageSize > 0 || $cookie !== '') { + $serverControls = [[ + 'oid' => LDAP_CONTROL_PAGEDRESULTS, + 'value' => [ + 'size' => $pageSize, + 'cookie' => $cookie, + ], + 'iscritical' => false, + ]]; + } else { + $serverControls = []; + } + + /** @psalm-suppress UndefinedVariable $oldHandler is defined when the closure is called but psalm fails to get that */ $oldHandler = set_error_handler(function ($no, $message, $file, $line) use (&$oldHandler) { - if (strpos($message, 'Partial search results returned: Sizelimit exceeded') !== false) { + if (str_contains($message, 'Partial search results returned: Sizelimit exceeded')) { return true; } $oldHandler($no, $message, $file, $line); return true; }); try { - $this->pagedResultsAdapter->setSearchArgs($link, $baseDN, $filter, $attr, $attrsOnly, $limit); - $result = $this->invokeLDAPMethod('search', ...$this->pagedResultsAdapter->getSearchArgs($link)); + $result = $this->invokeLDAPMethod('search', $link, $baseDN, $filter, $attr, $attrsOnly, $limit, -1, LDAP_DEREF_NEVER, $serverControls); restore_error_handler(); return $result; @@ -230,7 +210,7 @@ class LDAP implements ILDAPWrapper { /** * {@inheritDoc} */ - public function exopPasswd($link, $userDN, $oldPassword, $password) { + public function exopPasswd($link, string $userDN, string $oldPassword, string $password) { return $this->invokeLDAPMethod('exop_passwd', $link, $userDN, $oldPassword, $password); } @@ -276,15 +256,14 @@ class LDAP implements ILDAPWrapper { * When using ldap_search we provide an array, in case multiple bases are * configured. Thus, we need to check the array elements. * - * @param $result - * @return bool + * @param mixed $result */ - protected function isResultFalse($result) { + protected function isResultFalse(string $functionName, $result): bool { if ($result === false) { return true; } - if ($this->curFunc === 'ldap_search' && is_array($result)) { + if ($functionName === 'ldap_search' && is_array($result)) { foreach ($result as $singleResult) { if ($singleResult === false) { return true; @@ -296,16 +275,16 @@ class LDAP implements ILDAPWrapper { } /** + * @param array $arguments * @return mixed */ - protected function invokeLDAPMethod() { - $arguments = func_get_args(); - $func = 'ldap_' . array_shift($arguments); + protected function invokeLDAPMethod(string $func, ...$arguments) { + $func = 'ldap_' . $func; if (function_exists($func)) { $this->preFunctionCall($func, $arguments); $result = call_user_func_array($func, $arguments); - if ($this->isResultFalse($result)) { - $this->postFunctionCall(); + if ($this->isResultFalse($func, $result)) { + $this->postFunctionCall($func); } if ($this->dataCollector !== null) { $this->dataCollector->stopLastLdapRequest(); @@ -315,21 +294,49 @@ class LDAP implements ILDAPWrapper { return null; } + /** + * Turn resources into string, and removes potentially problematic cookie string to avoid breaking logfiles + */ + private function sanitizeFunctionParameters(array $args): array { + return array_map(function ($item) { + if ($this->isResource($item)) { + return '(resource)'; + } + if (isset($item[0]['value']['cookie']) && $item[0]['value']['cookie'] !== '') { + $item[0]['value']['cookie'] = '*opaque cookie*'; + } + return $item; + }, $args); + } + private function preFunctionCall(string $functionName, array $args): void { - $this->curFunc = $functionName; $this->curArgs = $args; + if (strcasecmp($functionName, 'ldap_bind') === 0 || strcasecmp($functionName, 'ldap_exop_passwd') === 0) { + // The arguments are not key value pairs + // \OCA\User_LDAP\LDAP::bind passes 3 arguments, the 3rd being the pw + // Remove it via direct array access for now, although a better solution could be found mebbe? + // @link https://github.com/nextcloud/server/issues/38461 + $args[2] = IConfig::SENSITIVE_VALUE; + } - if ($this->dataCollector !== null) { - $args = array_map(fn ($item) => (!$this->isResource($item) ? $item : '(resource)'), $this->curArgs); + if ($this->config->getSystemValue('loglevel') === ILogger::DEBUG) { + /* Only running this if debug loglevel is on, to avoid processing parameters on production */ + $this->logger->debug('Calling LDAP function {func} with parameters {args}', [ + 'app' => 'user_ldap', + 'func' => $functionName, + 'args' => $this->sanitizeFunctionParameters($args), + ]); + } - $this->dataCollector->startLdapRequest($this->curFunc, $args); + if ($this->dataCollector !== null) { + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + $this->dataCollector->startLdapRequest($functionName, $this->sanitizeFunctionParameters($args), $backtrace); } if ($this->logFile !== '' && is_writable(dirname($this->logFile)) && (!file_exists($this->logFile) || is_writable($this->logFile))) { - $args = array_map(fn ($item) => (!$this->isResource($item) ? $item : '(resource)'), $this->curArgs); file_put_contents( $this->logFile, - $this->curFunc . '::' . json_encode($args) . "\n", + $functionName . '::' . json_encode($this->sanitizeFunctionParameters($args)) . "\n", FILE_APPEND ); } @@ -338,19 +345,19 @@ class LDAP implements ILDAPWrapper { /** * Analyzes the returned LDAP error and acts accordingly if not 0 * - * @param resource|\LDAP\Connection $resource the LDAP Connection resource + * @param \LDAP\Connection $resource the LDAP Connection resource * @throws ConstraintViolationException * @throws ServerNotAvailableException * @throws \Exception */ - private function processLDAPError($resource) { - $errorCode = ldap_errno($resource); - if ($errorCode === 0) { - return; - } - $errorMsg = ldap_error($resource); - - if ($this->curFunc === 'ldap_get_entries' + private function processLDAPError($resource, string $functionName, int $errorCode, string $errorMsg): void { + $this->logger->debug('LDAP error {message} ({code}) after calling {func}', [ + 'app' => 'user_ldap', + 'message' => $errorMsg, + 'code' => $errorCode, + 'func' => $functionName, + ]); + if ($functionName === 'ldap_get_entries' && $errorCode === -4) { } elseif ($errorCode === 32) { //for now @@ -365,27 +372,20 @@ class LDAP implements ILDAPWrapper { } elseif ($errorCode === 1) { throw new \Exception('LDAP Operations error', $errorCode); } elseif ($errorCode === 19) { - ldap_get_option($this->curArgs[0], LDAP_OPT_ERROR_STRING, $extended_error); - throw new ConstraintViolationException(!empty($extended_error)?$extended_error:$errorMsg, $errorCode); - } else { - \OC::$server->getLogger()->debug('LDAP error {message} ({code}) after calling {func}', [ - 'app' => 'user_ldap', - 'message' => $errorMsg, - 'code' => $errorCode, - 'func' => $this->curFunc, - ]); + ldap_get_option($resource, LDAP_OPT_ERROR_STRING, $extended_error); + throw new ConstraintViolationException(!empty($extended_error) ? $extended_error : $errorMsg, $errorCode); } } /** * Called after an ldap method is run to act on LDAP error if necessary - * @throw \Exception + * @throws \Exception */ - private function postFunctionCall() { + private function postFunctionCall(string $functionName): void { if ($this->isResource($this->curArgs[0])) { $resource = $this->curArgs[0]; } elseif ( - $this->curFunc === 'ldap_search' + $functionName === 'ldap_search' && is_array($this->curArgs[0]) && $this->isResource($this->curArgs[0][0]) ) { @@ -396,9 +396,14 @@ class LDAP implements ILDAPWrapper { return; } - $this->processLDAPError($resource); + $errorCode = ldap_errno($resource); + if ($errorCode === 0) { + return; + } + $errorMsg = ldap_error($resource); + + $this->processLDAPError($resource, $functionName, $errorCode, $errorMsg); - $this->curFunc = ''; $this->curArgs = []; } } diff --git a/apps/user_ldap/lib/LDAPProvider.php b/apps/user_ldap/lib/LDAPProvider.php index 751ebf68768..d9750ae3fcf 100644 --- a/apps/user_ldap/lib/LDAPProvider.php +++ b/apps/user_ldap/lib/LDAPProvider.php @@ -1,30 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de) - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author root <root@localhost.localdomain> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; @@ -32,32 +11,33 @@ use OCA\User_LDAP\User\DeletedUsersIndex; use OCP\IServerContainer; use OCP\LDAP\IDeletionFlagSupport; use OCP\LDAP\ILDAPProvider; +use Psr\Log\LoggerInterface; /** - * LDAP provider for pulic access to the LDAP backend. + * LDAP provider for public access to the LDAP backend. */ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport { private $userBackend; private $groupBackend; private $logger; - private $helper; - private $deletedUsersIndex; /** * Create new LDAPProvider - * @param \OCP\IServerContainer $serverContainer + * @param IServerContainer $serverContainer * @param Helper $helper * @param DeletedUsersIndex $deletedUsersIndex * @throws \Exception if user_ldap app was not enabled */ - public function __construct(IServerContainer $serverContainer, Helper $helper, DeletedUsersIndex $deletedUsersIndex) { - $this->logger = $serverContainer->getLogger(); - $this->helper = $helper; - $this->deletedUsersIndex = $deletedUsersIndex; + public function __construct( + IServerContainer $serverContainer, + private Helper $helper, + private DeletedUsersIndex $deletedUsersIndex, + ) { + $this->logger = $serverContainer->get(LoggerInterface::class); $userBackendFound = false; $groupBackendFound = false; foreach ($serverContainer->getUserManager()->getBackends() as $backend) { - $this->logger->debug('instance '.get_class($backend).' user backend.', ['app' => 'user_ldap']); + $this->logger->debug('instance ' . get_class($backend) . ' user backend.', ['app' => 'user_ldap']); if ($backend instanceof IUserLDAP) { $this->userBackend = $backend; $userBackendFound = true; @@ -65,7 +45,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport { } } foreach ($serverContainer->getGroupManager()->getBackends() as $backend) { - $this->logger->debug('instance '.get_class($backend).' group backend.', ['app' => 'user_ldap']); + $this->logger->debug('instance ' . get_class($backend) . ' group backend.', ['app' => 'user_ldap']); if ($backend instanceof IGroupLDAP) { $this->groupBackend = $backend; $groupBackendFound = true; @@ -138,8 +118,8 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport { /** * Sanitize a DN received from the LDAP server. - * @param array $dn the DN in question - * @return array the sanitized DN + * @param array|string $dn the DN in question + * @return array|string the sanitized DN */ public function sanitizeDN($dn) { return $this->helper->sanitizeDN($dn); @@ -149,7 +129,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport { * Return a new LDAP connection resource for the specified user. * The connection must be closed manually. * @param string $uid user id - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection * @throws \Exception if user id was not found in LDAP */ public function getLDAPConnection($uid) { @@ -163,7 +143,7 @@ class LDAPProvider implements ILDAPProvider, IDeletionFlagSupport { * Return a new LDAP connection resource for the specified user. * The connection must be closed manually. * @param string $gid group id - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection * @throws \Exception if group id was not found in LDAP */ public function getGroupLDAPConnection($gid) { diff --git a/apps/user_ldap/lib/LDAPProviderFactory.php b/apps/user_ldap/lib/LDAPProviderFactory.php index 13887921603..8fad9d52206 100644 --- a/apps/user_ldap/lib/LDAPProviderFactory.php +++ b/apps/user_ldap/lib/LDAPProviderFactory.php @@ -1,27 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de) - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author root <root@localhost.localdomain> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; @@ -30,11 +12,10 @@ use OCP\LDAP\ILDAPProvider; use OCP\LDAP\ILDAPProviderFactory; class LDAPProviderFactory implements ILDAPProviderFactory { - /** * @var IServerContainer */ - private $serverContainer; - - public function __construct(IServerContainer $serverContainer) { - $this->serverContainer = $serverContainer; + public function __construct( + /** * @var IServerContainer */ + private IServerContainer $serverContainer, + ) { } public function getLDAPProvider(): ILDAPProvider { diff --git a/apps/user_ldap/lib/LDAPUtility.php b/apps/user_ldap/lib/LDAPUtility.php index 0b16f74333b..39b517528e2 100644 --- a/apps/user_ldap/lib/LDAPUtility.php +++ b/apps/user_ldap/lib/LDAPUtility.php @@ -1,37 +1,19 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; abstract class LDAPUtility { - protected $ldap; - /** * constructor, make sure the subclasses call this one! - * @param ILDAPWrapper $ldapWrapper an instance of an ILDAPWrapper + * @param ILDAPWrapper $ldap an instance of an ILDAPWrapper */ - public function __construct(ILDAPWrapper $ldapWrapper) { - $this->ldap = $ldapWrapper; + public function __construct( + protected ILDAPWrapper $ldap, + ) { } } diff --git a/apps/user_ldap/lib/LoginListener.php b/apps/user_ldap/lib/LoginListener.php new file mode 100644 index 00000000000..f397f4694d2 --- /dev/null +++ b/apps/user_ldap/lib/LoginListener.php @@ -0,0 +1,147 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\User_LDAP; + +use OCA\User_LDAP\Db\GroupMembership; +use OCA\User_LDAP\Db\GroupMembershipMapper; +use OCP\DB\Exception; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; +use OCP\IGroupManager; +use OCP\IUser; +use OCP\User\Events\PostLoginEvent; +use Psr\Log\LoggerInterface; + +/** + * @template-implements IEventListener<PostLoginEvent> + */ +class LoginListener implements IEventListener { + public function __construct( + private IEventDispatcher $dispatcher, + private Group_Proxy $groupBackend, + private IGroupManager $groupManager, + private LoggerInterface $logger, + private GroupMembershipMapper $groupMembershipMapper, + ) { + } + + public function handle(Event $event): void { + if ($event instanceof PostLoginEvent) { + $this->onPostLogin($event->getUser()); + } + } + + public function onPostLogin(IUser $user): void { + $this->logger->info( + self::class . ' - {user} postLogin', + [ + 'app' => 'user_ldap', + 'user' => $user->getUID(), + ] + ); + $this->updateGroups($user); + } + + private function updateGroups(IUser $userObject): void { + $userId = $userObject->getUID(); + $groupMemberships = $this->groupMembershipMapper->findGroupMembershipsForUser($userId); + $knownGroups = array_map( + static fn (GroupMembership $groupMembership): string => $groupMembership->getGroupid(), + $groupMemberships + ); + $groupMemberships = array_combine($knownGroups, $groupMemberships); + $actualGroups = $this->groupBackend->getUserGroups($userId); + + $newGroups = array_diff($actualGroups, $knownGroups); + $oldGroups = array_diff($knownGroups, $actualGroups); + foreach ($newGroups as $groupId) { + $groupObject = $this->groupManager->get($groupId); + if ($groupObject === null) { + $this->logger->error( + self::class . ' - group {group} could not be found (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $userId, + 'group' => $groupId + ] + ); + continue; + } + try { + $this->groupMembershipMapper->insert(GroupMembership::fromParams(['groupid' => $groupId,'userid' => $userId])); + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + $this->logger->error( + self::class . ' - group {group} membership failed to be added (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $userId, + 'group' => $groupId, + 'exception' => $e, + ] + ); + } + /* We failed to insert the groupmembership so we do not want to advertise it */ + continue; + } + $this->groupBackend->addRelationshipToCaches($userId, null, $groupId); + $this->dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject)); + $this->logger->info( + self::class . ' - {user} added to {group}', + [ + 'app' => 'user_ldap', + 'user' => $userId, + 'group' => $groupId + ] + ); + } + foreach ($oldGroups as $groupId) { + try { + $this->groupMembershipMapper->delete($groupMemberships[$groupId]); + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_DATABASE_OBJECT_NOT_FOUND) { + $this->logger->error( + self::class . ' - group {group} membership failed to be removed (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $userId, + 'group' => $groupId, + 'exception' => $e, + ] + ); + } + /* We failed to delete the groupmembership so we do not want to advertise it */ + continue; + } + $groupObject = $this->groupManager->get($groupId); + if ($groupObject === null) { + $this->logger->error( + self::class . ' - group {group} could not be found (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $userId, + 'group' => $groupId + ] + ); + continue; + } + $this->dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject)); + $this->logger->info( + 'service "updateGroups" - {user} removed from {group}', + [ + 'user' => $userId, + 'group' => $groupId + ] + ); + } + } +} diff --git a/apps/user_ldap/lib/Mapping/AbstractMapping.php b/apps/user_ldap/lib/Mapping/AbstractMapping.php index 9026b8cfb78..fa10312a915 100644 --- a/apps/user_ldap/lib/Mapping/AbstractMapping.php +++ b/apps/user_ldap/lib/Mapping/AbstractMapping.php @@ -1,35 +1,18 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Aaron Wood <aaronjwood@gmail.com> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author blizzz <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Mapping; use Doctrine\DBAL\Exception; -use OC\DB\QueryBuilder\QueryBuilder; use OCP\DB\IPreparedStatement; use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; +use OCP\Server; +use Psr\Log\LoggerInterface; /** * Class AbstractMapping @@ -38,11 +21,6 @@ use OCP\DB\QueryBuilder\IQueryBuilder; */ abstract class AbstractMapping { /** - * @var \OCP\IDBConnection $dbc - */ - protected $dbc; - - /** * returns the DB table name which holds the mappings * * @return string @@ -50,10 +28,11 @@ abstract class AbstractMapping { abstract protected function getTableName(bool $includePrefix = true); /** - * @param \OCP\IDBConnection $dbc + * @param IDBConnection $dbc */ - public function __construct(\OCP\IDBConnection $dbc) { - $this->dbc = $dbc; + public function __construct( + protected IDBConnection $dbc, + ) { } /** @var array caches Names (value) by DN (key) */ @@ -191,12 +170,7 @@ abstract class AbstractMapping { * Get the hash to store in database column ldap_dn_hash for a given dn */ protected function getDNHash(string $fdn): string { - $hash = hash('sha256', $fdn, false); - if (is_string($hash)) { - return $hash; - } else { - throw new \RuntimeException('hash function did not return a string'); - } + return hash('sha256', $fdn, false); } /** @@ -219,12 +193,12 @@ abstract class AbstractMapping { $qb = $this->dbc->getQueryBuilder(); $qb->select('owncloud_name', 'ldap_dn_hash', 'ldap_dn') ->from($this->getTableName(false)) - ->where($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($hashList, QueryBuilder::PARAM_STR_ARRAY))); + ->where($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($hashList, IQueryBuilder::PARAM_STR_ARRAY))); return $qb; } protected function collectResultsFromListOfIdsQuery(IQueryBuilder $qb, array &$results): void { - $stmt = $qb->execute(); + $stmt = $qb->executeQuery(); while ($entry = $stmt->fetch(\Doctrine\DBAL\FetchMode::ASSOCIATIVE)) { $results[$entry['ldap_dn']] = $entry['owncloud_name']; $this->cache[$entry['ldap_dn']] = $entry['owncloud_name']; @@ -239,7 +213,7 @@ abstract class AbstractMapping { public function getListOfIdsByDn(array $fdns): array { $totalDBParamLimit = 65000; $sliceSize = 1000; - $maxSlices = $totalDBParamLimit / $sliceSize; + $maxSlices = $this->dbc->getDatabaseProvider() === IDBConnection::PLATFORM_SQLITE ? 9 : $totalDBParamLimit / $sliceSize; $results = []; $slice = 1; @@ -261,7 +235,7 @@ abstract class AbstractMapping { } if (!empty($fdnsSlice)) { - $qb->orWhere($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($fdnsSlice, QueryBuilder::PARAM_STR_ARRAY))); + $qb->orWhere($qb->expr()->in('ldap_dn_hash', $qb->createNamedParameter($fdnsSlice, IQueryBuilder::PARAM_STR_ARRAY))); } if ($slice % $maxSlices === 0) { @@ -282,7 +256,7 @@ abstract class AbstractMapping { * * @return string[] */ - public function getNamesBySearch(string $search, string $prefixMatch = "", string $postfixMatch = ""): array { + public function getNamesBySearch(string $search, string $prefixMatch = '', string $postfixMatch = ''): array { $statement = $this->dbc->prepare(' SELECT `owncloud_name` FROM `' . $this->getTableName() . '` @@ -326,7 +300,7 @@ abstract class AbstractMapping { return $this->getXbyY('directory_uuid', 'ldap_dn_hash', $this->getDNHash($dn)); } - public function getList(int $offset = 0, int $limit = null, bool $invalidatedOnly = false): array { + public function getList(int $offset = 0, ?int $limit = null, bool $invalidatedOnly = false): array { $select = $this->dbc->getQueryBuilder(); $select->selectAlias('ldap_dn', 'dn') ->selectAlias('owncloud_name', 'name') @@ -356,7 +330,7 @@ abstract class AbstractMapping { */ public function map($fdn, $name, $uuid) { if (mb_strlen($fdn) > 4000) { - \OC::$server->getLogger()->error( + Server::get(LoggerInterface::class)->error( 'Cannot map, because the DN exceeds 4000 characters: {dn}', [ 'app' => 'user_ldap', @@ -429,7 +403,7 @@ abstract class AbstractMapping { * @param callable $preCallback * @param callable $postCallback * @return bool true on success, false when at least one row was not - * deleted + * deleted */ public function clearCb(callable $preCallback, callable $postCallback): bool { $picker = $this->dbc->getQueryBuilder(); @@ -457,7 +431,7 @@ abstract class AbstractMapping { $query = $this->dbc->getQueryBuilder(); $query->select($query->func()->count('ldap_dn_hash')) ->from($this->getTableName()); - $res = $query->execute(); + $res = $query->executeQuery(); $count = $res->fetchOne(); $res->closeCursor(); return (int)$count; @@ -468,7 +442,7 @@ abstract class AbstractMapping { $query->select($query->func()->count('ldap_dn_hash')) ->from($this->getTableName()) ->where($query->expr()->like('directory_uuid', $query->createNamedParameter('invalidated_%'))); - $res = $query->execute(); + $res = $query->executeQuery(); $count = $res->fetchOne(); $res->closeCursor(); return (int)$count; diff --git a/apps/user_ldap/lib/Mapping/GroupMapping.php b/apps/user_ldap/lib/Mapping/GroupMapping.php index e8518e5e9fc..d9ae5e749fc 100644 --- a/apps/user_ldap/lib/Mapping/GroupMapping.php +++ b/apps/user_ldap/lib/Mapping/GroupMapping.php @@ -1,24 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Mapping; diff --git a/apps/user_ldap/lib/Mapping/UserMapping.php b/apps/user_ldap/lib/Mapping/UserMapping.php index 899cc015c9f..a030cd0ab52 100644 --- a/apps/user_ldap/lib/Mapping/UserMapping.php +++ b/apps/user_ldap/lib/Mapping/UserMapping.php @@ -1,33 +1,58 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Mapping; +use OCP\HintException; +use OCP\IDBConnection; +use OCP\IRequest; +use OCP\Server; +use OCP\Support\Subscription\IAssertion; + /** * Class UserMapping + * * @package OCA\User_LDAP\Mapping */ class UserMapping extends AbstractMapping { + protected const PROV_API_REGEX = '/\/ocs\/v[1-9].php\/cloud\/(groups|users)/'; + + public function __construct( + IDBConnection $dbc, + private IAssertion $assertion, + ) { + parent::__construct($dbc); + } + + /** + * @throws HintException + */ + public function map($fdn, $name, $uuid): bool { + try { + $this->assertion->createUserIsLegit(); + } catch (HintException $e) { + static $isProvisioningApi = null; + + if ($isProvisioningApi === null) { + $request = Server::get(IRequest::class); + $isProvisioningApi = \preg_match(self::PROV_API_REGEX, $request->getRequestUri()) === 1; + } + if ($isProvisioningApi) { + // only throw when prov API is being used, since functionality + // should not break for end users (e.g. when sharing). + // On direct API usage, e.g. on users page, this is desired. + throw $e; + } + return false; + } + return parent::map($fdn, $name, $uuid); + } + /** * returns the DB table name which holds the mappings * @return string diff --git a/apps/user_ldap/lib/Migration/GroupMappingMigration.php b/apps/user_ldap/lib/Migration/GroupMappingMigration.php index f89bebe57d6..7dfb8705770 100644 --- a/apps/user_ldap/lib/Migration/GroupMappingMigration.php +++ b/apps/user_ldap/lib/Migration/GroupMappingMigration.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -31,11 +14,9 @@ use OCP\Migration\SimpleMigrationStep; abstract class GroupMappingMigration extends SimpleMigrationStep { - /** @var IDBConnection */ - private $dbc; - - public function __construct(IDBConnection $dbc) { - $this->dbc = $dbc; + public function __construct( + private IDBConnection $dbc, + ) { } protected function copyGroupMappingData(string $sourceTable, string $destinationTable): void { @@ -60,7 +41,7 @@ abstract class GroupMappingMigration extends SimpleMigrationStep { ->setParameter('owncloud_name', $row['owncloud_name']) ->setParameter('directory_uuid', $row['directory_uuid']) ->setParameter('ldap_dn_hash', $row['ldap_dn_hash']) - ; + ; $insert->executeStatement(); } diff --git a/apps/user_ldap/lib/Migration/RemoveRefreshTime.php b/apps/user_ldap/lib/Migration/RemoveRefreshTime.php index 501076ed0e8..88ac56ccb84 100644 --- a/apps/user_ldap/lib/Migration/RemoveRefreshTime.php +++ b/apps/user_ldap/lib/Migration/RemoveRefreshTime.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -39,14 +22,10 @@ use OCP\Migration\IRepairStep; */ class RemoveRefreshTime implements IRepairStep { - /** @var IDBConnection */ - private $dbc; - /** @var IConfig */ - private $config; - - public function __construct(IDBConnection $dbc, IConfig $config) { - $this->dbc = $dbc; - $this->config = $config; + public function __construct( + private IDBConnection $dbc, + private IConfig $config, + ) { } public function getName() { @@ -60,6 +39,6 @@ class RemoveRefreshTime implements IRepairStep { $qb->delete('preferences') ->where($qb->expr()->eq('appid', $qb->createNamedParameter('user_ldap'))) ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lastFeatureRefresh'))) - ->execute(); + ->executeStatement(); } } diff --git a/apps/user_ldap/lib/Migration/SetDefaultProvider.php b/apps/user_ldap/lib/Migration/SetDefaultProvider.php index 15dba57e5f3..0bb04438a1d 100644 --- a/apps/user_ldap/lib/Migration/SetDefaultProvider.php +++ b/apps/user_ldap/lib/Migration/SetDefaultProvider.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright 2020 Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -33,16 +16,10 @@ use OCP\Migration\IRepairStep; class SetDefaultProvider implements IRepairStep { - /** @var IConfig */ - private $config; - - /** @var Helper */ - private $helper; - - public function __construct(IConfig $config, - Helper $helper) { - $this->config = $config; - $this->helper = $helper; + public function __construct( + private IConfig $config, + private Helper $helper, + ) { } public function getName(): string { diff --git a/apps/user_ldap/lib/Migration/UUIDFix.php b/apps/user_ldap/lib/Migration/UUIDFix.php index 74ab65d347c..e853f3bba66 100644 --- a/apps/user_ldap/lib/Migration/UUIDFix.php +++ b/apps/user_ldap/lib/Migration/UUIDFix.php @@ -1,39 +1,19 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; -use OC\BackgroundJob\QueuedJob; use OCA\User_LDAP\Mapping\AbstractMapping; use OCA\User_LDAP\Proxy; use OCA\User_LDAP\User_Proxy; +use OCP\BackgroundJob\QueuedJob; abstract class UUIDFix extends QueuedJob { - /** @var AbstractMapping */ - protected $mapper; - - /** @var Proxy */ - protected $proxy; + protected AbstractMapping $mapper; + protected Proxy $proxy; public function run($argument) { $isUser = $this->proxy instanceof User_Proxy; diff --git a/apps/user_ldap/lib/Migration/UUIDFixGroup.php b/apps/user_ldap/lib/Migration/UUIDFixGroup.php index a90dcb5a938..3924c91e7ba 100644 --- a/apps/user_ldap/lib/Migration/UUIDFixGroup.php +++ b/apps/user_ldap/lib/Migration/UUIDFixGroup.php @@ -1,32 +1,18 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; use OCA\User_LDAP\Group_Proxy; use OCA\User_LDAP\Mapping\GroupMapping; +use OCP\AppFramework\Utility\ITimeFactory; class UUIDFixGroup extends UUIDFix { - public function __construct(GroupMapping $mapper, Group_Proxy $proxy) { + public function __construct(ITimeFactory $time, GroupMapping $mapper, Group_Proxy $proxy) { + parent::__construct($time); $this->mapper = $mapper; $this->proxy = $proxy; } diff --git a/apps/user_ldap/lib/Migration/UUIDFixInsert.php b/apps/user_ldap/lib/Migration/UUIDFixInsert.php index a8e9d2829d7..bb92314d93a 100644 --- a/apps/user_ldap/lib/Migration/UUIDFixInsert.php +++ b/apps/user_ldap/lib/Migration/UUIDFixInsert.php @@ -1,26 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -33,23 +15,12 @@ use OCP\Migration\IRepairStep; class UUIDFixInsert implements IRepairStep { - /** @var IConfig */ - protected $config; - - /** @var UserMapping */ - protected $userMapper; - - /** @var GroupMapping */ - protected $groupMapper; - - /** @var IJobList */ - protected $jobList; - - public function __construct(IConfig $config, UserMapping $userMapper, GroupMapping $groupMapper, IJobList $jobList) { - $this->config = $config; - $this->userMapper = $userMapper; - $this->groupMapper = $groupMapper; - $this->jobList = $jobList; + public function __construct( + protected IConfig $config, + protected UserMapping $userMapper, + protected GroupMapping $groupMapper, + protected IJobList $jobList, + ) { } /** @@ -90,7 +61,7 @@ class UUIDFixInsert implements IRepairStep { $this->jobList->add($jobClass, ['records' => $records]); $offset += $batchSize; } catch (\InvalidArgumentException $e) { - if (strpos($e->getMessage(), 'Background job arguments can\'t exceed 4000') !== false) { + if (str_contains($e->getMessage(), 'Background job arguments can\'t exceed 4000')) { $batchSize = (int)floor(count($records) * 0.8); $retry = true; } diff --git a/apps/user_ldap/lib/Migration/UUIDFixUser.php b/apps/user_ldap/lib/Migration/UUIDFixUser.php index 2cb7ac8bdfb..71c3f638095 100644 --- a/apps/user_ldap/lib/Migration/UUIDFixUser.php +++ b/apps/user_ldap/lib/Migration/UUIDFixUser.php @@ -1,32 +1,18 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; -use OCA\User_LDAP\User_Proxy; use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\User_Proxy; +use OCP\AppFramework\Utility\ITimeFactory; class UUIDFixUser extends UUIDFix { - public function __construct(UserMapping $mapper, User_Proxy $proxy) { + public function __construct(ITimeFactory $time, UserMapping $mapper, User_Proxy $proxy) { + parent::__construct($time); $this->mapper = $mapper; $this->proxy = $proxy; } diff --git a/apps/user_ldap/lib/Migration/UnsetDefaultProvider.php b/apps/user_ldap/lib/Migration/UnsetDefaultProvider.php index a696b815856..025415cf712 100644 --- a/apps/user_ldap/lib/Migration/UnsetDefaultProvider.php +++ b/apps/user_ldap/lib/Migration/UnsetDefaultProvider.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright 2021 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -32,11 +15,9 @@ use OCP\Migration\IRepairStep; class UnsetDefaultProvider implements IRepairStep { - /** @var IConfig */ - private $config; - - public function __construct(IConfig $config) { - $this->config = $config; + public function __construct( + private IConfig $config, + ) { } public function getName(): string { diff --git a/apps/user_ldap/lib/Migration/Version1010Date20200630192842.php b/apps/user_ldap/lib/Migration/Version1010Date20200630192842.php index 5c7dc7db95c..1464e50e359 100644 --- a/apps/user_ldap/lib/Migration/Version1010Date20200630192842.php +++ b/apps/user_ldap/lib/Migration/Version1010Date20200630192842.php @@ -3,32 +3,14 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; use Closure; -use OCP\DB\Types; use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; use OCP\Migration\IOutput; use OCP\Migration\SimpleMigrationStep; diff --git a/apps/user_ldap/lib/Migration/Version1120Date20210917155206.php b/apps/user_ldap/lib/Migration/Version1120Date20210917155206.php index b7a9b81d6a0..dc3823bf771 100644 --- a/apps/user_ldap/lib/Migration/Version1120Date20210917155206.php +++ b/apps/user_ldap/lib/Migration/Version1120Date20210917155206.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -31,7 +14,6 @@ use OC\Hooks\PublicEmitter; use OCP\DB\Exception; use OCP\DB\ISchemaWrapper; use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\DB\Types; use OCP\IDBConnection; use OCP\IUserManager; use OCP\Migration\IOutput; @@ -40,17 +22,11 @@ use Psr\Log\LoggerInterface; class Version1120Date20210917155206 extends SimpleMigrationStep { - /** @var IDBConnection */ - private $dbc; - /** @var IUserManager */ - private $userManager; - /** @var LoggerInterface */ - private $logger; - - public function __construct(IDBConnection $dbc, IUserManager $userManager, LoggerInterface $logger) { - $this->dbc = $dbc; - $this->userManager = $userManager; - $this->logger = $logger; + public function __construct( + private IDBConnection $dbc, + private IUserManager $userManager, + private LoggerInterface $logger, + ) { } public function getName() { diff --git a/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php b/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php index 5c5ed44c899..2457acd840d 100644 --- a/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php +++ b/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -39,16 +22,13 @@ use Psr\Log\LoggerInterface; class Version1130Date20211102154716 extends SimpleMigrationStep { - /** @var IDBConnection */ - private $dbc; - /** @var LoggerInterface */ - private $logger; /** @var string[] */ private $hashColumnAddedToTables = []; - public function __construct(IDBConnection $dbc, LoggerInterface $logger) { - $this->dbc = $dbc; - $this->logger = $logger; + public function __construct( + private IDBConnection $dbc, + private LoggerInterface $logger, + ) { } public function getName() { diff --git a/apps/user_ldap/lib/Migration/Version1130Date20220110154717.php b/apps/user_ldap/lib/Migration/Version1130Date20220110154717.php index 2ffda4198c1..80960373edf 100644 --- a/apps/user_ldap/lib/Migration/Version1130Date20220110154717.php +++ b/apps/user_ldap/lib/Migration/Version1130Date20220110154717.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; diff --git a/apps/user_ldap/lib/Migration/Version1130Date20220110154718.php b/apps/user_ldap/lib/Migration/Version1130Date20220110154718.php index 74dd2d873bc..f67b791daad 100644 --- a/apps/user_ldap/lib/Migration/Version1130Date20220110154718.php +++ b/apps/user_ldap/lib/Migration/Version1130Date20220110154718.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; diff --git a/apps/user_ldap/lib/Migration/Version1130Date20220110154719.php b/apps/user_ldap/lib/Migration/Version1130Date20220110154719.php index 9e9ed38cb70..c34ee5357f5 100644 --- a/apps/user_ldap/lib/Migration/Version1130Date20220110154719.php +++ b/apps/user_ldap/lib/Migration/Version1130Date20220110154719.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Joas Schilling <coding@schilljs.com> - * - * @author Côme Chilliet <come.chilliet@nextcloud.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; diff --git a/apps/user_ldap/lib/Migration/Version1141Date20220323143801.php b/apps/user_ldap/lib/Migration/Version1141Date20220323143801.php index 10043371aae..ecedbf1de20 100644 --- a/apps/user_ldap/lib/Migration/Version1141Date20220323143801.php +++ b/apps/user_ldap/lib/Migration/Version1141Date20220323143801.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2022 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Migration; @@ -35,10 +18,9 @@ use OCP\Migration\SimpleMigrationStep; class Version1141Date20220323143801 extends SimpleMigrationStep { - private IDBConnection $dbc; - - public function __construct(IDBConnection $dbc) { - $this->dbc = $dbc; + public function __construct( + private IDBConnection $dbc, + ) { } /** diff --git a/apps/user_ldap/lib/Migration/Version1190Date20230706134108.php b/apps/user_ldap/lib/Migration/Version1190Date20230706134108.php new file mode 100644 index 00000000000..85b046ab7c9 --- /dev/null +++ b/apps/user_ldap/lib/Migration/Version1190Date20230706134108.php @@ -0,0 +1,108 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Migration; + +use Closure; +use OCP\DB\ISchemaWrapper; +use OCP\DB\Types; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +class Version1190Date20230706134108 extends SimpleMigrationStep { + public function __construct( + private IDBConnection $dbc, + ) { + } + + public function preSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + } + + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + if (!$schema->hasTable('ldap_group_membership')) { + $table = $schema->createTable('ldap_group_membership'); + $table->addColumn('id', Types::BIGINT, [ + 'autoincrement' => true, + 'notnull' => true, + ]); + $table->addColumn('groupid', Types::STRING, [ + 'notnull' => true, + 'length' => 255, + 'default' => '', + ]); + $table->addColumn('userid', Types::STRING, [ + 'notnull' => true, + 'length' => 64, + 'default' => '', + ]); + $table->setPrimaryKey(['id']); + $table->addUniqueIndex(['groupid', 'userid'], 'user_ldap_membership_unique'); + return $schema; + } else { + return null; + } + } + + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + if (!$schema->hasTable('ldap_group_members')) { + // Old table does not exist + return; + } + + $output->startProgress(); + $this->copyGroupMembershipData(); + $output->finishProgress(); + } + + protected function copyGroupMembershipData(): void { + $insert = $this->dbc->getQueryBuilder(); + $insert->insert('ldap_group_membership') + ->values([ + 'userid' => $insert->createParameter('userid'), + 'groupid' => $insert->createParameter('groupid'), + ]); + + $query = $this->dbc->getQueryBuilder(); + $query->select('*') + ->from('ldap_group_members'); + + $result = $query->executeQuery(); + while ($row = $result->fetch()) { + $knownUsers = unserialize($row['owncloudusers']); + if (!is_array($knownUsers)) { + /* Unserialize failed or data was incorrect in database, ignore */ + continue; + } + $knownUsers = array_unique($knownUsers); + foreach ($knownUsers as $knownUser) { + try { + $insert + ->setParameter('groupid', $row['owncloudname']) + ->setParameter('userid', $knownUser) + ; + + $insert->executeStatement(); + } catch (\OCP\DB\Exception $e) { + /* + * If it fails on unique constaint violation it may just be left over value from previous half-migration + * If it fails on something else, ignore as well, data will be filled by background job later anyway + */ + } + } + } + $result->closeCursor(); + } +} diff --git a/apps/user_ldap/lib/Migration/Version1190Date20230706134109.php b/apps/user_ldap/lib/Migration/Version1190Date20230706134109.php new file mode 100644 index 00000000000..2d3c26f0d49 --- /dev/null +++ b/apps/user_ldap/lib/Migration/Version1190Date20230706134109.php @@ -0,0 +1,29 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Migration; + +use Closure; +use OCP\DB\ISchemaWrapper; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + +class Version1190Date20230706134109 extends SimpleMigrationStep { + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + + if ($schema->hasTable('ldap_group_members')) { + $schema->dropTable('ldap_group_members'); + return $schema; + } + + return null; + } +} diff --git a/apps/user_ldap/lib/Notification/Notifier.php b/apps/user_ldap/lib/Notification/Notifier.php index 04c03febb0e..0195cb9e65b 100644 --- a/apps/user_ldap/lib/Notification/Notifier.php +++ b/apps/user_ldap/lib/Notification/Notifier.php @@ -1,44 +1,24 @@ <?php + /** - * @copyright Copyright (c) 2017 Roger Szabo <roger.szabo@web.de> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Notification; use OCP\L10N\IFactory; use OCP\Notification\INotification; use OCP\Notification\INotifier; +use OCP\Notification\UnknownNotificationException; class Notifier implements INotifier { - /** @var IFactory */ - protected $l10nFactory; - /** * @param IFactory $l10nFactory */ - public function __construct(\OCP\L10N\IFactory $l10nFactory) { - $this->l10nFactory = $l10nFactory; + public function __construct( + protected IFactory $l10nFactory, + ) { } /** @@ -65,12 +45,12 @@ class Notifier implements INotifier { * @param INotification $notification * @param string $languageCode The code of the language that should be used to prepare the notification * @return INotification - * @throws \InvalidArgumentException When the notification was not prepared by a notifier + * @throws UnknownNotificationException When the notification was not prepared by a notifier */ public function prepare(INotification $notification, string $languageCode): INotification { if ($notification->getApp() !== 'user_ldap') { // Not my app => throw - throw new \InvalidArgumentException(); + throw new UnknownNotificationException(); } // Read the language from the notification @@ -80,7 +60,7 @@ class Notifier implements INotifier { // Deal with known subjects case 'pwd_exp_warn_days': $params = $notification->getSubjectParameters(); - $days = (int) $params[0]; + $days = (int)$params[0]; if ($days === 2) { $notification->setParsedSubject($l->t('Your password will expire tomorrow.')); } elseif ($days === 1) { @@ -96,7 +76,7 @@ class Notifier implements INotifier { default: // Unknown subject => Unknown notification => throw - throw new \InvalidArgumentException(); + throw new UnknownNotificationException(); } } } diff --git a/apps/user_ldap/lib/PagedResults/IAdapter.php b/apps/user_ldap/lib/PagedResults/IAdapter.php deleted file mode 100644 index 31338126e40..00000000000 --- a/apps/user_ldap/lib/PagedResults/IAdapter.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -namespace OCA\User_LDAP\PagedResults; - -interface IAdapter { - - /** - * Methods for initiating Paged Results Control - */ - - /** - * The adapter receives paged result parameters from the client. It may - * store the parameters for later use. - */ - public function setRequestParameters($link, int $pageSize, bool $isCritical): void; - - /** - * The adapter is asked for an function that is being explicitly called to - * send the control parameters to LDAP. If not function has to be called, - * null shall be returned. - * - * It will used by the callee for diagnosis and error handling. - */ - public function getRequestCallFunc(): ?string; - - /** - * The adapter is asked to provide the arguments it would pass to the - * function returned by getRequestCallFunc(). If none shall be called, an - * empty array should be returned. - * - * It will used by the callee for diagnosis and error handling. - */ - public function getRequestCallArgs($link): array; - - /** - * The adapter is asked to do the necessary calls to LDAP, if - * getRequestCallFunc returned a function. If none, it will not be called - * so the return value is best set to false. Otherwise it shall respond - * whether setting the controls was successful. - */ - public function requestCall($link): bool; - - /** - * The adapter shall report which PHP function will be called to process - * the paged results call - * - * It will used by the callee for diagnosis and error handling. - */ - public function getResponseCallFunc(): string; - - /** - * The adapter shall report with arguments will be provided to the LDAP - * function it will call - * - * It will used by the callee for diagnosis and error handling. - */ - public function getResponseCallArgs(array $originalArgs): array; - - /** - * the adapter should do it's LDAP function call and return success state - * - * @param resource|\LDAP\Connection $link LDAP resource - * @return bool - */ - public function responseCall($link): bool; - - /** - * The adapter receives the parameters that were passed to a search - * operation. Typically it wants to save the them for the call proper later - * on. - */ - public function setSearchArgs( - $link, - string $baseDN, - string $filter, - array $attr, - int $attrsOnly, - int $limit - ): void; - - /** - * The adapter shall report which arguments shall be passed to the - * ldap_search function. - */ - public function getSearchArgs($link): array; - - /** - * The adapter receives the parameters that were passed to a read - * operation. Typically it wants to save the them for the call proper later - * on. - */ - public function setReadArgs($link, string $baseDN, string $filter, array $attr): void; - - /** - * The adapter shall report which arguments shall be passed to the - * ldap_read function. - */ - public function getReadArgs($link): array; - - /** - * Returns the current paged results cookie - * - * @param resource|\LDAP\Connection $link LDAP resource - * @return string - */ - public function getCookie($link): string; -} diff --git a/apps/user_ldap/lib/PagedResults/Php73.php b/apps/user_ldap/lib/PagedResults/Php73.php deleted file mode 100644 index 1fc1fcdbab8..00000000000 --- a/apps/user_ldap/lib/PagedResults/Php73.php +++ /dev/null @@ -1,173 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -namespace OCA\User_LDAP\PagedResults; - -/** - * Class Php73 - * - * implements paged results support with PHP APIs available from PHP 7.3 - * - * @package OCA\User_LDAP\PagedResults - */ -class Php73 implements IAdapter { - use TLinkId; - - /** @var array */ - protected $linkData = []; - - public function getResponseCallFunc(): string { - return 'ldap_parse_result'; - } - - public function responseCall($link): bool { - $linkId = $this->getLinkId($link); - return ldap_parse_result(...$this->linkData[$linkId]['responseArgs']); - } - - public function getResponseCallArgs(array $originalArgs): array { - $link = array_shift($originalArgs); - $linkId = $this->getLinkId($link); - - if (!isset($this->linkData[$linkId])) { - $this->linkData[$linkId] = []; - } - - $this->linkData[$linkId]['responseErrorCode'] = 0; - $this->linkData[$linkId]['responseErrorMessage'] = ''; - $this->linkData[$linkId]['serverControls'] = []; - $matchedDn = null; - $referrals = []; - - $this->linkData[$linkId]['responseArgs'] = [ - $link, - array_shift($originalArgs), - &$this->linkData[$linkId]['responseErrorCode'], - $matchedDn, - &$this->linkData[$linkId]['responseErrorMessage'], - $referrals, - &$this->linkData[$linkId]['serverControls'] - ]; - - - return $this->linkData[$linkId]['responseArgs']; - } - - public function getCookie($link): string { - $linkId = $this->getLinkId($link); - return $this->linkData[$linkId]['serverControls'][LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] ?? ''; - } - - private function resetCookie(int $linkId): void { - if (isset($this->linkData[$linkId]['serverControls'][LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'])) { - $this->linkData[$linkId]['serverControls'][LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] = ''; - } - } - - public function getRequestCallFunc(): ?string { - return null; - } - - public function setRequestParameters($link, int $pageSize, bool $isCritical): void { - $linkId = $this->getLinkId($link); - if (!isset($this->linkData[$linkId])) { - $this->linkData[$linkId] = []; - } - $this->linkData[$linkId]['requestArgs'] = []; - $this->linkData[$linkId]['requestArgs']['pageSize'] = $pageSize; - $this->linkData[$linkId]['requestArgs']['isCritical'] = $isCritical; - - if ($pageSize === 0) { - $this->resetCookie($linkId); - } - } - - public function getRequestCallArgs($link): array { - // no separate call - return []; - } - - public function requestCall($link): bool { - // no separate call - return false; - } - - public function setSearchArgs( - $link, - string $baseDN, - string $filter, - array $attr, - int $attrsOnly, - int $limit - ): void { - $linkId = $this->getLinkId($link); - if (!isset($this->linkData[$linkId])) { - $this->linkData[$linkId] = []; - } - - $this->linkData[$linkId]['searchArgs'] = func_get_args(); - $this->preparePagesResultsArgs($linkId, 'searchArgs'); - } - - public function getSearchArgs($link): array { - $linkId = $this->getLinkId($link); - return $this->linkData[$linkId]['searchArgs']; - } - - public function setReadArgs($link, string $baseDN, string $filter, array $attr): void { - $linkId = $this->getLinkId($link); - if (!isset($this->linkData[$linkId])) { - $this->linkData[$linkId] = []; - } - - $this->linkData[$linkId]['readArgs'] = func_get_args(); - $this->linkData[$linkId]['readArgs'][] = 0; // $attrsonly default - $this->linkData[$linkId]['readArgs'][] = -1; // $sizelimit default - } - - public function getReadArgs($link): array { - $linkId = $this->getLinkId($link); - return $this->linkData[$linkId]['readArgs']; - } - - protected function preparePagesResultsArgs(int $linkId, string $methodKey): void { - if (!isset($this->linkData[$linkId]['requestArgs'])) { - return; - } - - $serverControls = [[ - 'oid' => LDAP_CONTROL_PAGEDRESULTS, - 'value' => [ - 'size' => $this->linkData[$linkId]['requestArgs']['pageSize'], - 'cookie' => $this->linkData[$linkId]['serverControls'][LDAP_CONTROL_PAGEDRESULTS]['value']['cookie'] ?? '', - ] - ]]; - - $this->linkData[$linkId][$methodKey][] = -1; // timelimit - $this->linkData[$linkId][$methodKey][] = LDAP_DEREF_NEVER; - $this->linkData[$linkId][$methodKey][] = $serverControls; - } -} diff --git a/apps/user_ldap/lib/PagedResults/TLinkId.php b/apps/user_ldap/lib/PagedResults/TLinkId.php index 02c36da97f9..46d392995e0 100644 --- a/apps/user_ldap/lib/PagedResults/TLinkId.php +++ b/apps/user_ldap/lib/PagedResults/TLinkId.php @@ -3,26 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\PagedResults; diff --git a/apps/user_ldap/lib/Proxy.php b/apps/user_ldap/lib/Proxy.php index d9546a163ab..22b2c6617af 100644 --- a/apps/user_ldap/lib/Proxy.php +++ b/apps/user_ldap/lib/Proxy.php @@ -1,104 +1,87 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\Mapping\UserMapping; -use OCA\User_LDAP\User\Manager; -use OCP\Share\IManager; -use Psr\Log\LoggerInterface; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\Server; +/** + * @template T + */ abstract class Proxy { - private static $accesses = []; - private $ldap = null; - /** @var bool */ - private $isSingleBackend; - - /** @var \OCP\ICache|null */ - private $cache; - - /** - * @param ILDAPWrapper $ldap - */ - public function __construct(ILDAPWrapper $ldap) { - $this->ldap = $ldap; - $memcache = \OC::$server->getMemCacheFactory(); + /** @var array<string,Access> */ + private static array $accesses = []; + private ?bool $isSingleBackend = null; + private ?ICache $cache = null; + + /** @var T[] */ + protected array $backends = []; + /** @var ?T */ + protected $refBackend = null; + + protected bool $isSetUp = false; + + public function __construct( + private Helper $helper, + private ILDAPWrapper $ldap, + private AccessFactory $accessFactory, + ) { + $memcache = Server::get(ICacheFactory::class); if ($memcache->isAvailable()) { $this->cache = $memcache->createDistributed(); } } + protected function setup(): void { + if ($this->isSetUp) { + return; + } + + $serverConfigPrefixes = $this->helper->getServerConfigurationPrefixes(true); + foreach ($serverConfigPrefixes as $configPrefix) { + $this->backends[$configPrefix] = $this->newInstance($configPrefix); + + if (is_null($this->refBackend)) { + $this->refBackend = $this->backends[$configPrefix]; + } + } + + $this->isSetUp = true; + } + /** - * @param string $configPrefix + * @return T */ - private function addAccess($configPrefix) { - static $ocConfig; - static $fs; - static $log; - static $avatarM; - static $userMap; - static $groupMap; - static $shareManager; - static $coreUserManager; - static $coreNotificationManager; - static $logger; - if ($fs === null) { - $ocConfig = \OC::$server->getConfig(); - $fs = new FilesystemHelper(); - $avatarM = \OC::$server->getAvatarManager(); - $db = \OC::$server->getDatabaseConnection(); - $userMap = new UserMapping($db); - $groupMap = new GroupMapping($db); - $coreUserManager = \OC::$server->getUserManager(); - $coreNotificationManager = \OC::$server->getNotificationManager(); - $shareManager = \OC::$server->get(IManager::class); - $logger = \OC::$server->get(LoggerInterface::class); - } - $userManager = - new Manager($ocConfig, $fs, $logger, $avatarM, new \OCP\Image(), - $coreUserManager, $coreNotificationManager, $shareManager); + abstract protected function newInstance(string $configPrefix): object; + + /** + * @return T + */ + public function getBackend(string $configPrefix): object { + $this->setup(); + return $this->backends[$configPrefix]; + } + + private function addAccess(string $configPrefix): void { + $userMap = Server::get(UserMapping::class); + $groupMap = Server::get(GroupMapping::class); + $connector = new Connection($this->ldap, $configPrefix); - $access = new Access($connector, $this->ldap, $userManager, new Helper($ocConfig, \OC::$server->getDatabaseConnection()), $ocConfig, $coreUserManager, $logger); + $access = $this->accessFactory->get($connector); $access->setUserMapper($userMap); $access->setGroupMapper($groupMap); self::$accesses[$configPrefix] = $access; } - /** - * @param string $configPrefix - * @return mixed - */ - protected function getAccess($configPrefix) { + protected function getAccess(string $configPrefix): Access { if (!isset(self::$accesses[$configPrefix])) { $this->addAccess($configPrefix); } @@ -160,7 +143,7 @@ abstract class Proxy { * @param string $method string, the method of the user backend that shall be called * @param array $parameters an array of parameters to be passed * @param bool $passOnWhen - * @return mixed, the result of the specified method + * @return mixed the result of the specified method */ protected function handleRequest($id, $method, $parameters, $passOnWhen = false) { if (!$this->isSingleBackend()) { diff --git a/apps/user_ldap/lib/Service/BirthdateParserService.php b/apps/user_ldap/lib/Service/BirthdateParserService.php new file mode 100644 index 00000000000..8234161b3d8 --- /dev/null +++ b/apps/user_ldap/lib/Service/BirthdateParserService.php @@ -0,0 +1,44 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Service; + +use DateTimeImmutable; +use Exception; +use InvalidArgumentException; + +class BirthdateParserService { + /** + * Try to parse the birthdate from LDAP. + * Supports LDAP's generalized time syntax, YYYYMMDD and YYYY-MM-DD. + * + * @throws InvalidArgumentException If the format of then given date is unknown + */ + public function parseBirthdate(string $value): DateTimeImmutable { + // Minimum LDAP generalized date is "1994121610Z" with 11 chars + // While maximum other format is "1994-12-16" with 10 chars + if (strlen($value) > strlen('YYYY-MM-DD')) { + // Probably LDAP generalized time syntax + $value = substr($value, 0, 8); + } + + // Should be either YYYYMMDD or YYYY-MM-DD + if (!preg_match('/^(\d{8}|\d{4}-\d{2}-\d{2})$/', $value)) { + throw new InvalidArgumentException("Unknown date format: $value"); + } + + try { + return new DateTimeImmutable($value); + } catch (Exception $e) { + throw new InvalidArgumentException( + "Unknown date format: $value", + 0, + $e, + ); + } + } +} diff --git a/apps/user_ldap/lib/Service/UpdateGroupsService.php b/apps/user_ldap/lib/Service/UpdateGroupsService.php new file mode 100644 index 00000000000..94f2a7fd4a1 --- /dev/null +++ b/apps/user_ldap/lib/Service/UpdateGroupsService.php @@ -0,0 +1,221 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ + +namespace OCA\User_LDAP\Service; + +use OCA\User_LDAP\Db\GroupMembership; +use OCA\User_LDAP\Db\GroupMembershipMapper; +use OCA\User_LDAP\Group_Proxy; +use OCP\DB\Exception; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IUser; +use OCP\IUserManager; +use Psr\Log\LoggerInterface; + +class UpdateGroupsService { + public function __construct( + private Group_Proxy $groupBackend, + private IEventDispatcher $dispatcher, + private IGroupManager $groupManager, + private IUserManager $userManager, + private LoggerInterface $logger, + private GroupMembershipMapper $groupMembershipMapper, + ) { + } + + /** + * @throws Exception + */ + public function updateGroups(): void { + $knownGroups = $this->groupMembershipMapper->getKnownGroups(); + $actualGroups = $this->groupBackend->getGroups(); + + if (empty($actualGroups) && empty($knownGroups)) { + $this->logger->info( + 'service "updateGroups" - groups do not seem to be configured properly, aborting.', + ); + return; + } + + $this->handleKnownGroups(array_intersect($actualGroups, $knownGroups)); + $this->handleCreatedGroups(array_diff($actualGroups, $knownGroups)); + $this->handleRemovedGroups(array_diff($knownGroups, $actualGroups)); + + $this->logger->debug('service "updateGroups" - Finished.'); + } + + /** + * @param string[] $groups + * @throws Exception + */ + public function handleKnownGroups(array $groups): void { + $this->logger->debug('service "updateGroups" - Dealing with known Groups.'); + + foreach ($groups as $group) { + $this->logger->debug('service "updateGroups" - Dealing with {group}.', ['group' => $group]); + $groupMemberships = $this->groupMembershipMapper->findGroupMemberships($group); + $knownUsers = array_map( + static fn (GroupMembership $groupMembership): string => $groupMembership->getUserid(), + $groupMemberships + ); + $groupMemberships = array_combine($knownUsers, $groupMemberships); + $actualUsers = $this->groupBackend->usersInGroup($group); + + $groupObject = $this->groupManager->get($group); + if ($groupObject === null) { + /* We are not expecting the group to not be found since it was returned by $this->groupBackend->getGroups() */ + $this->logger->error( + 'service "updateGroups" - Failed to get group {group} for update', + [ + 'group' => $group + ] + ); + continue; + } + foreach (array_diff($knownUsers, $actualUsers) as $removedUser) { + try { + $this->groupMembershipMapper->delete($groupMemberships[$removedUser]); + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_DATABASE_OBJECT_NOT_FOUND) { + /* If reason is not found something else removed the membership, that’s fine */ + $this->logger->error( + self::class . ' - group {group} membership failed to be removed (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $removedUser, + 'group' => $group, + 'exception' => $e, + ] + ); + } + /* We failed to delete the groupmembership so we do not want to advertise it */ + continue; + } + $userObject = $this->userManager->get($removedUser); + if ($userObject instanceof IUser) { + $this->dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject)); + } + $this->logger->info( + 'service "updateGroups" - {user} removed from {group}', + [ + 'user' => $removedUser, + 'group' => $group + ] + ); + } + foreach (array_diff($actualUsers, $knownUsers) as $addedUser) { + try { + $this->groupMembershipMapper->insert(GroupMembership::fromParams(['groupid' => $group,'userid' => $addedUser])); + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + /* If reason is unique constraint something else added the membership, that’s fine */ + $this->logger->error( + self::class . ' - group {group} membership failed to be added (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $addedUser, + 'group' => $group, + 'exception' => $e, + ] + ); + } + /* We failed to insert the groupmembership so we do not want to advertise it */ + continue; + } + $userObject = $this->userManager->get($addedUser); + if ($userObject instanceof IUser) { + $this->dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject)); + } + $this->logger->info( + 'service "updateGroups" - {user} added to {group}', + [ + 'user' => $addedUser, + 'group' => $group + ] + ); + } + } + $this->logger->debug('service "updateGroups" - FINISHED dealing with known Groups.'); + } + + /** + * @param string[] $createdGroups + * @throws Exception + */ + public function handleCreatedGroups(array $createdGroups): void { + $this->logger->debug('service "updateGroups" - dealing with created Groups.'); + + foreach ($createdGroups as $createdGroup) { + $this->logger->info('service "updateGroups" - new group "' . $createdGroup . '" found.'); + + $users = $this->groupBackend->usersInGroup($createdGroup); + $groupObject = $this->groupManager->get($createdGroup); + foreach ($users as $user) { + try { + $this->groupMembershipMapper->insert(GroupMembership::fromParams(['groupid' => $createdGroup,'userid' => $user])); + } catch (Exception $e) { + if ($e->getReason() !== Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + $this->logger->error( + self::class . ' - group {group} membership failed to be added (user {user})', + [ + 'app' => 'user_ldap', + 'user' => $user, + 'group' => $createdGroup, + 'exception' => $e, + ] + ); + } + /* We failed to insert the groupmembership so we do not want to advertise it */ + continue; + } + if ($groupObject instanceof IGroup) { + $userObject = $this->userManager->get($user); + if ($userObject instanceof IUser) { + $this->dispatcher->dispatchTyped(new UserAddedEvent($groupObject, $userObject)); + } + } + } + } + $this->logger->debug('service "updateGroups" - FINISHED dealing with created Groups.'); + } + + /** + * @param string[] $removedGroups + * @throws Exception + */ + public function handleRemovedGroups(array $removedGroups): void { + $this->logger->debug('service "updateGroups" - dealing with removed groups.'); + + $this->groupMembershipMapper->deleteGroups($removedGroups); + foreach ($removedGroups as $group) { + $groupObject = $this->groupManager->get($group); + if ($groupObject instanceof IGroup) { + $groupMemberships = $this->groupMembershipMapper->findGroupMemberships($group); + foreach ($groupMemberships as $groupMembership) { + $userObject = $this->userManager->get($groupMembership->getUserid()); + if ($userObject instanceof IUser) { + $this->dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject)); + } + } + } + } + + $this->logger->info( + 'service "updateGroups" - groups {removedGroups} were removed.', + [ + 'removedGroups' => $removedGroups + ] + ); + } +} diff --git a/apps/user_ldap/lib/Settings/Admin.php b/apps/user_ldap/lib/Settings/Admin.php index 21805b6f7b5..89fb063265b 100644 --- a/apps/user_ldap/lib/Settings/Admin.php +++ b/apps/user_ldap/lib/Settings/Admin.php @@ -1,27 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Settings; @@ -29,25 +10,22 @@ use OCA\User_LDAP\Configuration; use OCA\User_LDAP\Helper; use OCP\AppFramework\Http\TemplateResponse; use OCP\IL10N; +use OCP\Server; use OCP\Settings\IDelegatedSettings; -use OCP\Template; +use OCP\Template\ITemplateManager; class Admin implements IDelegatedSettings { - /** @var IL10N */ - private $l; - - /** - * @param IL10N $l - */ - public function __construct(IL10N $l) { - $this->l = $l; + public function __construct( + private IL10N $l, + private ITemplateManager $templateManager, + ) { } /** * @return TemplateResponse */ public function getForm() { - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $prefixes = $helper->getServerConfigurationPrefixes(); if (count($prefixes) === 0) { $newPrefix = $helper->getNextServerConfigurationPrefix(); @@ -59,11 +37,12 @@ class Admin implements IDelegatedSettings { $hosts = $helper->getServerConfigurationHosts(); - $wControls = new Template('user_ldap', 'part.wizardcontrols'); + $wControls = $this->templateManager->getTemplate('user_ldap', 'part.wizardcontrols'); $wControls = $wControls->fetchPage(); - $sControls = new Template('user_ldap', 'part.settingcontrols'); + $sControls = $this->templateManager->getTemplate('user_ldap', 'part.settingcontrols'); $sControls = $sControls->fetchPage(); + $parameters = []; $parameters['serverConfigurationPrefixes'] = $prefixes; $parameters['serverConfigurationHosts'] = $hosts; $parameters['settingControls'] = $sControls; @@ -75,7 +54,7 @@ class Admin implements IDelegatedSettings { } $defaults = $config->getDefaults(); foreach ($defaults as $key => $default) { - $parameters[$key.'_default'] = $default; + $parameters[$key . '_default'] = $default; } return new TemplateResponse('user_ldap', 'settings', $parameters); @@ -90,8 +69,8 @@ class Admin implements IDelegatedSettings { /** * @return int whether the form should be rather on the top or bottom of - * the admin section. The forms are arranged in ascending order of the - * priority values. It is required to return a value between 0 and 100. + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. * * E.g.: 70 */ diff --git a/apps/user_ldap/lib/Settings/Section.php b/apps/user_ldap/lib/Settings/Section.php index 7c4bc5bf44d..3b95e25513d 100644 --- a/apps/user_ldap/lib/Settings/Section.php +++ b/apps/user_ldap/lib/Settings/Section.php @@ -1,27 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Valdnet <47037905+Valdnet@users.noreply.github.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Settings; @@ -30,18 +11,14 @@ use OCP\IURLGenerator; use OCP\Settings\IIconSection; class Section implements IIconSection { - /** @var IL10N */ - private $l; - /** @var IURLGenerator */ - private $url; - /** * @param IURLGenerator $url * @param IL10N $l */ - public function __construct(IURLGenerator $url, IL10N $l) { - $this->url = $url; - $this->l = $l; + public function __construct( + private IURLGenerator $url, + private IL10N $l, + ) { } /** @@ -66,8 +43,8 @@ class Section implements IIconSection { /** * @return int whether the form should be rather on the top or bottom of - * the settings navigation. The sections are arranged in ascending order of - * the priority values. It is required to return a value between 0 and 99. + * the settings navigation. The sections are arranged in ascending order of + * the priority values. It is required to return a value between 0 and 99. * * E.g.: 70 */ diff --git a/apps/user_ldap/lib/SetupChecks/LdapConnection.php b/apps/user_ldap/lib/SetupChecks/LdapConnection.php new file mode 100644 index 00000000000..ee8c4ddd595 --- /dev/null +++ b/apps/user_ldap/lib/SetupChecks/LdapConnection.php @@ -0,0 +1,94 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\SetupChecks; + +use OCA\User_LDAP\AccessFactory; +use OCA\User_LDAP\ConnectionFactory; +use OCA\User_LDAP\Helper; +use OCP\IL10N; +use OCP\SetupCheck\ISetupCheck; +use OCP\SetupCheck\SetupResult; + +class LdapConnection implements ISetupCheck { + public function __construct( + private IL10N $l10n, + private Helper $helper, + private ConnectionFactory $connectionFactory, + private AccessFactory $accessFactory, + ) { + } + + public function getCategory(): string { + return 'ldap'; + } + + public function getName(): string { + return $this->l10n->t('LDAP Connection'); + } + + public function run(): SetupResult { + $availableConfigs = $this->helper->getServerConfigurationPrefixes(); + $inactiveConfigurations = []; + $bindFailedConfigurations = []; + $searchFailedConfigurations = []; + foreach ($availableConfigs as $configID) { + $connection = $this->connectionFactory->get($configID); + if (!$connection->ldapConfigurationActive) { + $inactiveConfigurations[] = $configID; + continue; + } + if (!$connection->bind()) { + $bindFailedConfigurations[] = $configID; + continue; + } + $access = $this->accessFactory->get($connection); + $result = $access->countObjects(1); + if (!is_int($result) || ($result <= 0)) { + $searchFailedConfigurations[] = $configID; + } + } + $output = ''; + if (!empty($bindFailedConfigurations)) { + $output .= $this->l10n->n( + 'Binding failed for this LDAP configuration: %s', + 'Binding failed for %n LDAP configurations: %s', + count($bindFailedConfigurations), + [implode(',', $bindFailedConfigurations)] + ) . "\n"; + } + if (!empty($searchFailedConfigurations)) { + $output .= $this->l10n->n( + 'Searching failed for this LDAP configuration: %s', + 'Searching failed for %n LDAP configurations: %s', + count($searchFailedConfigurations), + [implode(',', $searchFailedConfigurations)] + ) . "\n"; + } + if (!empty($inactiveConfigurations)) { + $output .= $this->l10n->n( + 'There is an inactive LDAP configuration: %s', + 'There are %n inactive LDAP configurations: %s', + count($inactiveConfigurations), + [implode(',', $inactiveConfigurations)] + ) . "\n"; + } + if (!empty($bindFailedConfigurations) || !empty($searchFailedConfigurations)) { + return SetupResult::error($output); + } elseif (!empty($inactiveConfigurations)) { + return SetupResult::warning($output); + } + return SetupResult::success($this->l10n->n( + 'Binding and searching works on the configured LDAP connection (%s)', + 'Binding and searching works on all of the %n configured LDAP connections (%s)', + count($availableConfigs), + [implode(',', $availableConfigs)] + )); + } +} diff --git a/apps/user_ldap/lib/SetupChecks/LdapInvalidUuids.php b/apps/user_ldap/lib/SetupChecks/LdapInvalidUuids.php new file mode 100644 index 00000000000..ac502b6b59e --- /dev/null +++ b/apps/user_ldap/lib/SetupChecks/LdapInvalidUuids.php @@ -0,0 +1,42 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\SetupChecks; + +use OCA\User_LDAP\Mapping\GroupMapping; +use OCA\User_LDAP\Mapping\UserMapping; +use OCP\IL10N; +use OCP\SetupCheck\ISetupCheck; +use OCP\SetupCheck\SetupResult; + +class LdapInvalidUuids implements ISetupCheck { + public function __construct( + private IL10N $l10n, + private UserMapping $userMapping, + private GroupMapping $groupMapping, + ) { + } + + public function getCategory(): string { + return 'ldap'; + } + + public function getName(): string { + return $this->l10n->t('Invalid LDAP UUIDs'); + } + + public function run(): SetupResult { + if (count($this->userMapping->getList(0, 1, true)) === 0 + && count($this->groupMapping->getList(0, 1, true)) === 0) { + return SetupResult::success($this->l10n->t('None found')); + } else { + return SetupResult::warning($this->l10n->t('Invalid UUIDs of LDAP accounts or groups have been found. Please review your "Override UUID detection" settings in the Expert part of the LDAP configuration and use "occ ldap:update-uuid" to update them.')); + } + } +} diff --git a/apps/user_ldap/lib/User/DeletedUsersIndex.php b/apps/user_ldap/lib/User/DeletedUsersIndex.php index 1e057987eef..f57f71a9d47 100644 --- a/apps/user_ldap/lib/User/DeletedUsersIndex.php +++ b/apps/user_ldap/lib/User/DeletedUsersIndex.php @@ -1,29 +1,14 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\User; use OCA\User_LDAP\Mapping\UserMapping; +use OCP\IConfig; +use OCP\PreConditionNotMetException; use OCP\Share\IManager; /** @@ -31,40 +16,30 @@ use OCP\Share\IManager; * @package OCA\User_LDAP */ class DeletedUsersIndex { - /** - * @var \OCP\IConfig $config - */ - protected $config; - - /** - * @var \OCA\User_LDAP\Mapping\UserMapping $mapping - */ - protected $mapping; + protected ?array $deletedUsers = null; - /** - * @var array $deletedUsers - */ - protected $deletedUsers; - /** @var IManager */ - private $shareManager; - - public function __construct(\OCP\IConfig $config, UserMapping $mapping, IManager $shareManager) { - $this->config = $config; - $this->mapping = $mapping; - $this->shareManager = $shareManager; + public function __construct( + protected IConfig $config, + protected UserMapping $mapping, + private IManager $shareManager, + ) { } /** * reads LDAP users marked as deleted from the database - * @return \OCA\User_LDAP\User\OfflineUser[] + * @return OfflineUser[] */ - private function fetchDeletedUsers() { - $deletedUsers = $this->config->getUsersForUserValue( - 'user_ldap', 'isDeleted', '1'); + private function fetchDeletedUsers(): array { + $deletedUsers = $this->config->getUsersForUserValue('user_ldap', 'isDeleted', '1'); $userObjects = []; foreach ($deletedUsers as $user) { - $userObjects[] = new OfflineUser($user, $this->config, $this->mapping, $this->shareManager); + $userObject = new OfflineUser($user, $this->config, $this->mapping, $this->shareManager); + if ($userObject->getLastLogin() > $userObject->getDetectedOn()) { + $userObject->unmark(); + } else { + $userObjects[] = $userObject; + } } $this->deletedUsers = $userObjects; @@ -73,9 +48,9 @@ class DeletedUsersIndex { /** * returns all LDAP users that are marked as deleted - * @return \OCA\User_LDAP\User\OfflineUser[] + * @return OfflineUser[] */ - public function getUsers() { + public function getUsers(): array { if (is_array($this->deletedUsers)) { return $this->deletedUsers; } @@ -84,9 +59,8 @@ class DeletedUsersIndex { /** * whether at least one user was detected as deleted - * @return bool */ - public function hasUsers() { + public function hasUsers(): bool { if (!is_array($this->deletedUsers)) { $this->fetchDeletedUsers(); } @@ -96,12 +70,10 @@ class DeletedUsersIndex { /** * marks a user as deleted * - * @param string $ocName - * @throws \OCP\PreConditionNotMetException + * @throws PreConditionNotMetException */ - public function markUser($ocName) { - $curValue = $this->config->getUserValue($ocName, 'user_ldap', 'isDeleted', '0'); - if ($curValue === '1') { + public function markUser(string $ocName): void { + if ($this->isUserMarked($ocName)) { // the user is already marked, do not write to DB again return; } @@ -109,4 +81,8 @@ class DeletedUsersIndex { $this->config->setUserValue($ocName, 'user_ldap', 'foundDeleted', (string)time()); $this->deletedUsers = null; } + + public function isUserMarked(string $ocName): bool { + return ($this->config->getUserValue($ocName, 'user_ldap', 'isDeleted', '0') === '1'); + } } diff --git a/apps/user_ldap/lib/User/Manager.php b/apps/user_ldap/lib/User/Manager.php index e752b113e3f..88a001dd965 100644 --- a/apps/user_ldap/lib/User/Manager.php +++ b/apps/user_ldap/lib/User/Manager.php @@ -1,36 +1,14 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\User; -use OC\Cache\CappedMemoryCache; use OCA\User_LDAP\Access; -use OCA\User_LDAP\FilesystemHelper; +use OCP\Cache\CappedMemoryCache; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IDBConnection; @@ -47,64 +25,24 @@ use Psr\Log\LoggerInterface; * cache */ class Manager { - /** @var Access */ - protected $access; - - /** @var IConfig */ - protected $ocConfig; - - /** @var IDBConnection */ - protected $db; - - /** @var IUserManager */ - protected $userManager; - - /** @var INotificationManager */ - protected $notificationManager; - - /** @var FilesystemHelper */ - protected $ocFilesystem; - - /** @var LoggerInterface */ - protected $logger; - - /** @var Image */ - protected $image; - - /** @param \OCP\IAvatarManager */ - protected $avatarManager; - - /** - * @var CappedMemoryCache $usersByDN - */ - protected $usersByDN; - /** - * @var CappedMemoryCache $usersByUid - */ - protected $usersByUid; - /** @var IManager */ - private $shareManager; + protected ?Access $access = null; + protected IDBConnection $db; + /** @var CappedMemoryCache<User> $usersByDN */ + protected CappedMemoryCache $usersByDN; + /** @var CappedMemoryCache<User> $usersByUid */ + protected CappedMemoryCache $usersByUid; public function __construct( - IConfig $ocConfig, - FilesystemHelper $ocFilesystem, - LoggerInterface $logger, - IAvatarManager $avatarManager, - Image $image, - IUserManager $userManager, - INotificationManager $notificationManager, - IManager $shareManager + protected IConfig $ocConfig, + protected LoggerInterface $logger, + protected IAvatarManager $avatarManager, + protected Image $image, + protected IUserManager $userManager, + protected INotificationManager $notificationManager, + private IManager $shareManager, ) { - $this->ocConfig = $ocConfig; - $this->ocFilesystem = $ocFilesystem; - $this->logger = $logger; - $this->avatarManager = $avatarManager; - $this->image = $image; - $this->userManager = $userManager; - $this->notificationManager = $notificationManager; $this->usersByDN = new CappedMemoryCache(); $this->usersByUid = new CappedMemoryCache(); - $this->shareManager = $shareManager; } /** @@ -121,12 +59,12 @@ class Manager { * property array * @param string $dn the DN of the user * @param string $uid the internal (owncloud) username - * @return \OCA\User_LDAP\User\User + * @return User */ private function createAndCache($dn, $uid) { $this->checkAccess(); $user = new User($uid, $dn, $this->access, $this->ocConfig, - $this->ocFilesystem, clone $this->image, $this->logger, + clone $this->image, $this->logger, $this->avatarManager, $this->userManager, $this->notificationManager); $this->usersByDN[$dn] = $user; @@ -150,6 +88,7 @@ class Manager { /** * @brief checks whether the Access instance has been set * @throws \Exception if Access has not been set + * @psalm-assert !null $this->access * @return null */ private function checkAccess() { @@ -163,22 +102,34 @@ class Manager { * email, displayname, or others. * * @param bool $minimal - optional, set to true to skip attributes with big - * payload + * payload * @return string[] */ public function getAttributes($minimal = false) { $baseAttributes = array_merge(Access::UUID_ATTRIBUTES, ['dn', 'uid', 'samaccountname', 'memberof']); $attributes = [ $this->access->getConnection()->ldapExpertUUIDUserAttr, + $this->access->getConnection()->ldapExpertUsernameAttr, $this->access->getConnection()->ldapQuotaAttribute, $this->access->getConnection()->ldapEmailAttribute, $this->access->getConnection()->ldapUserDisplayName, $this->access->getConnection()->ldapUserDisplayName2, $this->access->getConnection()->ldapExtStorageHomeAttribute, + $this->access->getConnection()->ldapAttributePhone, + $this->access->getConnection()->ldapAttributeWebsite, + $this->access->getConnection()->ldapAttributeAddress, + $this->access->getConnection()->ldapAttributeTwitter, + $this->access->getConnection()->ldapAttributeFediverse, + $this->access->getConnection()->ldapAttributeOrganisation, + $this->access->getConnection()->ldapAttributeRole, + $this->access->getConnection()->ldapAttributeHeadline, + $this->access->getConnection()->ldapAttributeBiography, + $this->access->getConnection()->ldapAttributeBirthDate, + $this->access->getConnection()->ldapAttributePronouns, ]; $homeRule = (string)$this->access->getConnection()->homeFolderNamingRule; - if (strpos($homeRule, 'attr:') === 0) { + if (str_starts_with($homeRule, 'attr:')) { $attributes[] = substr($homeRule, strlen('attr:')); } @@ -220,7 +171,7 @@ class Manager { /** * creates and returns an instance of OfflineUser for the specified user * @param string $id - * @return \OCA\User_LDAP\User\OfflineUser + * @return OfflineUser */ public function getDeletedUser($id) { return new OfflineUser( @@ -232,9 +183,9 @@ class Manager { } /** - * @brief returns a User object by it's Nextcloud username + * @brief returns a User object by its Nextcloud username * @param string $id the DN or username of the user - * @return \OCA\User_LDAP\User\User|\OCA\User_LDAP\User\OfflineUser|null + * @return User|OfflineUser|null */ protected function createInstancyByUserName($id) { //most likely a uid. Check whether it is a deleted user @@ -249,9 +200,9 @@ class Manager { } /** - * @brief returns a User object by it's DN or Nextcloud username + * @brief returns a User object by its DN or Nextcloud username * @param string $id the DN or username of the user - * @return \OCA\User_LDAP\User\User|\OCA\User_LDAP\User\OfflineUser|null + * @return User|OfflineUser|null * @throws \Exception when connection could not be established */ public function get($id) { @@ -271,4 +222,37 @@ class Manager { return $this->createInstancyByUserName($id); } + + /** + * @brief Checks whether a User object by its DN or Nextcloud username exists + * @param string $id the DN or username of the user + * @throws \Exception when connection could not be established + */ + public function exists($id): bool { + $this->checkAccess(); + $this->logger->debug('Checking if {id} exists', ['id' => $id]); + if (isset($this->usersByDN[$id])) { + return true; + } elseif (isset($this->usersByUid[$id])) { + return true; + } + + if ($this->access->stringResemblesDN($id)) { + $this->logger->debug('{id} looks like a dn', ['id' => $id]); + $uid = $this->access->dn2username($id); + if ($uid !== false) { + return true; + } + } + + // Most likely a uid. Check whether it is a deleted user + if ($this->isDeletedUser($id)) { + return true; + } + $dn = $this->access->username2dn($id); + if ($dn !== false) { + return true; + } + return false; + } } diff --git a/apps/user_ldap/lib/User/OfflineUser.php b/apps/user_ldap/lib/User/OfflineUser.php index 4adf5302bfe..ecaab7188ba 100644 --- a/apps/user_ldap/lib/User/OfflineUser.php +++ b/apps/user_ldap/lib/User/OfflineUser.php @@ -1,27 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\User; @@ -33,10 +15,6 @@ use OCP\Share\IShare; class OfflineUser { /** - * @var string $ocName - */ - protected $ocName; - /** * @var string $dn */ protected $dn; @@ -60,6 +38,7 @@ class OfflineUser { * @var string $foundDeleted the timestamp when the user was detected as unavailable */ protected $foundDeleted; + protected ?string $extStorageHome = null; /** * @var string $email */ @@ -69,30 +48,19 @@ class OfflineUser { */ protected $hasActiveShares; /** - * @var IConfig $config - */ - protected $config; - /** * @var IDBConnection $db */ protected $db; + /** - * @var \OCA\User_LDAP\Mapping\UserMapping + * @param string $ocName */ - protected $mapping; - /** @var IManager */ - private $shareManager; - public function __construct( - $ocName, - IConfig $config, - UserMapping $mapping, - IManager $shareManager + protected $ocName, + protected IConfig $config, + protected UserMapping $mapping, + private IManager $shareManager, ) { - $this->ocName = $ocName; - $this->config = $config; - $this->mapping = $mapping; - $this->shareManager = $shareManager; } /** @@ -207,6 +175,13 @@ class OfflineUser { return (int)$this->foundDeleted; } + public function getExtStorageHome(): string { + if ($this->extStorageHome === null) { + $this->fetchDetails(); + } + return (string)$this->extStorageHome; + } + /** * getter for having active shares * @return bool @@ -227,6 +202,7 @@ class OfflineUser { 'uid' => 'user_ldap', 'homePath' => 'user_ldap', 'foundDeleted' => 'user_ldap', + 'extStorageHome' => 'user_ldap', 'email' => 'settings', 'lastLogin' => 'login', ]; @@ -244,7 +220,7 @@ class OfflineUser { $shareConstants = $shareInterface->getConstants(); foreach ($shareConstants as $constantName => $constantValue) { - if (strpos($constantName, 'TYPE_') !== 0 + if (!str_starts_with($constantName, 'TYPE_') || $constantValue === IShare::TYPE_USERGROUP ) { continue; diff --git a/apps/user_ldap/lib/User/User.php b/apps/user_ldap/lib/User/User.php index 15894ce04b7..8f97ec1701f 100644 --- a/apps/user_ldap/lib/User/User.php +++ b/apps/user_ldap/lib/User/User.php @@ -1,47 +1,30 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Philipp Staiger <philipp@staiger.it> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Vincent Petry <vincent@nextcloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\User; +use InvalidArgumentException; +use OC\Accounts\AccountManager; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; use OCA\User_LDAP\Exceptions\AttributeNotSet; -use OCA\User_LDAP\FilesystemHelper; +use OCA\User_LDAP\Service\BirthdateParserService; +use OCP\Accounts\IAccountManager; +use OCP\Accounts\PropertyDoesNotExistException; use OCP\IAvatarManager; use OCP\IConfig; -use OCP\ILogger; use OCP\Image; +use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; +use OCP\PreConditionNotMetException; +use OCP\Server; +use OCP\Util; use Psr\Log\LoggerInterface; /** @@ -50,102 +33,51 @@ use Psr\Log\LoggerInterface; * represents an LDAP user, gets and holds user-specific information from LDAP */ class User { + protected Connection $connection; /** - * @var Access - */ - protected $access; - /** - * @var Connection - */ - protected $connection; - /** - * @var IConfig - */ - protected $config; - /** - * @var FilesystemHelper - */ - protected $fs; - /** - * @var Image - */ - protected $image; - /** - * @var LoggerInterface - */ - protected $logger; - /** - * @var IAvatarManager - */ - protected $avatarManager; - /** - * @var IUserManager + * @var array<string,1> */ - protected $userManager; - /** - * @var INotificationManager - */ - protected $notificationManager; - /** - * @var string - */ - protected $dn; - /** - * @var string - */ - protected $uid; - /** - * @var string[] - */ - protected $refreshedFeatures = []; - /** - * @var string - */ - protected $avatarImage; + protected array $refreshedFeatures = []; + protected string|false|null $avatarImage = null; + + protected BirthdateParserService $birthdateParser; /** * DB config keys for user preferences + * @var string */ public const USER_PREFKEY_FIRSTLOGIN = 'firstLoginAccomplished'; /** * @brief constructor, make sure the subclasses call this one! - * @param string $username the internal username - * @param string $dn the LDAP DN */ - public function __construct($username, $dn, Access $access, - IConfig $config, FilesystemHelper $fs, Image $image, - LoggerInterface $logger, IAvatarManager $avatarManager, IUserManager $userManager, - INotificationManager $notificationManager) { - if ($username === null) { - $logger->error("uid for '$dn' must not be null!", ['app' => 'user_ldap']); - throw new \InvalidArgumentException('uid must not be null!'); - } elseif ($username === '') { + public function __construct( + protected string $uid, + protected string $dn, + protected Access $access, + protected IConfig $config, + protected Image $image, + protected LoggerInterface $logger, + protected IAvatarManager $avatarManager, + protected IUserManager $userManager, + protected INotificationManager $notificationManager, + ) { + if ($uid === '') { $logger->error("uid for '$dn' must not be an empty string", ['app' => 'user_ldap']); throw new \InvalidArgumentException('uid must not be an empty string!'); } + $this->connection = $this->access->getConnection(); + $this->birthdateParser = new BirthdateParserService(); - $this->access = $access; - $this->connection = $access->getConnection(); - $this->config = $config; - $this->fs = $fs; - $this->dn = $dn; - $this->uid = $username; - $this->image = $image; - $this->logger = $logger; - $this->avatarManager = $avatarManager; - $this->userManager = $userManager; - $this->notificationManager = $notificationManager; - - \OCP\Util::connectHook('OC_User', 'post_login', $this, 'handlePasswordExpiry'); + Util::connectHook('OC_User', 'post_login', $this, 'handlePasswordExpiry'); } /** * marks a user as deleted * - * @throws \OCP\PreConditionNotMetException + * @throws PreConditionNotMetException */ - public function markUser() { + public function markUser(): void { $curValue = $this->config->getUserValue($this->getUsername(), 'user_ldap', 'isDeleted', '0'); if ($curValue === '1') { // the user is already marked, do not write to DB again @@ -159,7 +91,7 @@ class User { * processes results from LDAP for attributes as returned by getAttributesToRead() * @param array $ldapEntry the user entry as retrieved from LDAP */ - public function processAttributes($ldapEntry) { + public function processAttributes(array $ldapEntry): void { //Quota $attr = strtolower($this->connection->ldapQuotaAttribute); if (isset($ldapEntry[$attr])) { @@ -196,7 +128,14 @@ class User { //change event that will trigger fetching the display name again $attr = strtolower($this->connection->ldapEmailAttribute); if (isset($ldapEntry[$attr])) { - $this->updateEmail($ldapEntry[$attr][0]); + $mailValue = 0; + for ($x = 0; $x < count($ldapEntry[$attr]); $x++) { + if (filter_var($ldapEntry[$attr][$x], FILTER_VALIDATE_EMAIL)) { + $mailValue = $x; + break; + } + } + $this->updateEmail($ldapEntry[$attr][$mailValue]); } unset($attr); @@ -208,7 +147,7 @@ class User { } //homePath - if (strpos($this->connection->homeFolderNamingRule, 'attr:') === 0) { + if (str_starts_with($this->connection->homeFolderNamingRule, 'attr:')) { $attr = strtolower(substr($this->connection->homeFolderNamingRule, strlen('attr:'))); if (isset($ldapEntry[$attr])) { $this->access->cacheUserHome( @@ -217,7 +156,7 @@ class User { } //memberOf groups - $cacheKey = 'getMemberOf'.$this->getUsername(); + $cacheKey = 'getMemberOf' . $this->getUsername(); $groups = false; if (isset($ldapEntry['memberof'])) { $groups = $ldapEntry['memberof']; @@ -231,6 +170,134 @@ class User { } unset($attr); + // check for cached profile data + $username = $this->getUsername(); // buffer variable, to save resource + $cacheKey = 'getUserProfile-' . $username; + $profileCached = $this->connection->getFromCache($cacheKey); + // honoring profile disabled in config.php and check if user profile was refreshed + if ($this->config->getSystemValueBool('profile.enabled', true) + && ($profileCached === null) // no cache or TTL not expired + && !$this->wasRefreshed('profile')) { + // check current data + $profileValues = []; + //User Profile Field - Phone number + $attr = strtolower($this->connection->ldapAttributePhone); + if (!empty($attr)) { // attribute configured + $profileValues[IAccountManager::PROPERTY_PHONE] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - website + $attr = strtolower($this->connection->ldapAttributeWebsite); + if (isset($ldapEntry[$attr])) { + $cutPosition = strpos($ldapEntry[$attr][0], ' '); + if ($cutPosition) { + // drop appended label + $profileValues[IAccountManager::PROPERTY_WEBSITE] + = substr($ldapEntry[$attr][0], 0, $cutPosition); + } else { + $profileValues[IAccountManager::PROPERTY_WEBSITE] + = $ldapEntry[$attr][0]; + } + } elseif (!empty($attr)) { // configured, but not defined + $profileValues[IAccountManager::PROPERTY_WEBSITE] = ''; + } + //User Profile Field - Address + $attr = strtolower($this->connection->ldapAttributeAddress); + if (isset($ldapEntry[$attr])) { + if (str_contains($ldapEntry[$attr][0], '$')) { + // basic format conversion from postalAddress syntax to commata delimited + $profileValues[IAccountManager::PROPERTY_ADDRESS] + = str_replace('$', ', ', $ldapEntry[$attr][0]); + } else { + $profileValues[IAccountManager::PROPERTY_ADDRESS] + = $ldapEntry[$attr][0]; + } + } elseif (!empty($attr)) { // configured, but not defined + $profileValues[IAccountManager::PROPERTY_ADDRESS] = ''; + } + //User Profile Field - Twitter + $attr = strtolower($this->connection->ldapAttributeTwitter); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_TWITTER] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - fediverse + $attr = strtolower($this->connection->ldapAttributeFediverse); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_FEDIVERSE] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - organisation + $attr = strtolower($this->connection->ldapAttributeOrganisation); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_ORGANISATION] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - role + $attr = strtolower($this->connection->ldapAttributeRole); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_ROLE] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - headline + $attr = strtolower($this->connection->ldapAttributeHeadline); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_HEADLINE] + = $ldapEntry[$attr][0] ?? ''; + } + //User Profile Field - biography + $attr = strtolower($this->connection->ldapAttributeBiography); + if (isset($ldapEntry[$attr])) { + if (str_contains($ldapEntry[$attr][0], '\r')) { + // convert line endings + $profileValues[IAccountManager::PROPERTY_BIOGRAPHY] + = str_replace(["\r\n","\r"], "\n", $ldapEntry[$attr][0]); + } else { + $profileValues[IAccountManager::PROPERTY_BIOGRAPHY] + = $ldapEntry[$attr][0]; + } + } elseif (!empty($attr)) { // configured, but not defined + $profileValues[IAccountManager::PROPERTY_BIOGRAPHY] = ''; + } + //User Profile Field - birthday + $attr = strtolower($this->connection->ldapAttributeBirthDate); + if (!empty($attr) && !empty($ldapEntry[$attr][0])) { + $value = $ldapEntry[$attr][0]; + try { + $birthdate = $this->birthdateParser->parseBirthdate($value); + $profileValues[IAccountManager::PROPERTY_BIRTHDATE] + = $birthdate->format('Y-m-d'); + } catch (InvalidArgumentException $e) { + // Invalid date -> just skip the property + $this->logger->info("Failed to parse user's birthdate from LDAP: $value", [ + 'exception' => $e, + 'userId' => $username, + ]); + } + } + //User Profile Field - pronouns + $attr = strtolower($this->connection->ldapAttributePronouns); + if (!empty($attr)) { + $profileValues[IAccountManager::PROPERTY_PRONOUNS] + = $ldapEntry[$attr][0] ?? ''; + } + // check for changed data and cache just for TTL checking + $checksum = hash('sha256', json_encode($profileValues)); + $this->connection->writeToCache($cacheKey, $checksum // write array to cache. is waste of cache space + , null); // use ldapCacheTTL from configuration + // Update user profile + if ($this->config->getUserValue($username, 'user_ldap', 'lastProfileChecksum', null) !== $checksum) { + $this->config->setUserValue($username, 'user_ldap', 'lastProfileChecksum', $checksum); + $this->updateProfile($profileValues); + $this->logger->info("updated profile uid=$username", ['app' => 'user_ldap']); + } else { + $this->logger->debug('profile data from LDAP unchanged', ['app' => 'user_ldap', 'uid' => $username]); + } + unset($attr); + } elseif ($profileCached !== null) { // message delayed, to declutter log + $this->logger->debug('skipping profile check, while cached data exist', ['app' => 'user_ldap', 'uid' => $username]); + } + //Avatar /** @var Connection $connection */ $connection = $this->access->getConnection(); @@ -238,11 +305,7 @@ class User { foreach ($attributes as $attribute) { if (isset($ldapEntry[$attribute])) { $this->avatarImage = $ldapEntry[$attribute][0]; - // the call to the method that saves the avatar in the file - // system must be postponed after the login. It is to ensure - // external mounts are mounted properly (e.g. with login - // credentials from the session). - \OCP\Util::connectHook('OC_User', 'post_login', $this, 'updateAvatarPostLogin'); + $this->updateAvatar(); break; } } @@ -266,20 +329,22 @@ class User { /** * returns the home directory of the user if specified by LDAP settings - * @param ?string $valueFromLDAP - * @return false|string * @throws \Exception */ - public function getHomePath($valueFromLDAP = null) { + public function getHomePath(?string $valueFromLDAP = null): string|false { $path = (string)$valueFromLDAP; $attr = null; if (is_null($valueFromLDAP) - && strpos($this->access->connection->homeFolderNamingRule, 'attr:') === 0 + && str_starts_with($this->access->connection->homeFolderNamingRule, 'attr:') && $this->access->connection->homeFolderNamingRule !== 'attr:') { $attr = substr($this->access->connection->homeFolderNamingRule, strlen('attr:')); - $homedir = $this->access->readAttribute($this->access->username2dn($this->getUsername()), $attr); - if ($homedir && isset($homedir[0])) { + $dn = $this->access->username2dn($this->getUsername()); + if ($dn === false) { + return false; + } + $homedir = $this->access->readAttribute($dn, $attr); + if ($homedir !== false && isset($homedir[0])) { $path = $homedir[0]; } } @@ -287,12 +352,12 @@ class User { if ($path !== '') { //if attribute's value is an absolute path take this, otherwise append it to data dir //check for / at the beginning or pattern c:\ resp. c:/ - if ('/' !== $path[0] - && !(3 < strlen($path) && ctype_alpha($path[0]) - && $path[1] === ':' && ('\\' === $path[2] || '/' === $path[2])) + if ($path[0] !== '/' + && !(strlen($path) > 3 && ctype_alpha($path[0]) + && $path[1] === ':' && ($path[2] === '\\' || $path[2] === '/')) ) { $path = $this->config->getSystemValue('datadirectory', - \OC::$SERVERROOT.'/data') . '/' . $path; + \OC::$SERVERROOT . '/data') . '/' . $path; } //we need it to store it in the DB as well in case a user gets //deleted so we can clean up afterwards @@ -303,7 +368,7 @@ class User { } if (!is_null($attr) - && $this->config->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', true) + && $this->config->getAppValue('user_ldap', 'enforce_home_folder_naming_rule', 'true') ) { // a naming rule attribute is defined, but it doesn't exist for that LDAP user throw new \Exception('Home dir attribute can\'t be read from LDAP for uid: ' . $this->getUsername()); @@ -314,8 +379,8 @@ class User { return false; } - public function getMemberOfGroups() { - $cacheKey = 'getMemberOf'.$this->getUsername(); + public function getMemberOfGroups(): array|false { + $cacheKey = 'getMemberOf' . $this->getUsername(); $memberOfGroups = $this->connection->getFromCache($cacheKey); if (!is_null($memberOfGroups)) { return $memberOfGroups; @@ -327,9 +392,9 @@ class User { /** * @brief reads the image from LDAP that shall be used as Avatar - * @return string data (provided by LDAP) | false + * @return string|false data (provided by LDAP) */ - public function getAvatarImage() { + public function getAvatarImage(): string|false { if (!is_null($this->avatarImage)) { return $this->avatarImage; } @@ -340,7 +405,7 @@ class User { $attributes = $connection->resolveRule('avatar'); foreach ($attributes as $attribute) { $result = $this->access->readAttribute($this->dn, $attribute); - if ($result !== false && is_array($result) && isset($result[0])) { + if ($result !== false && isset($result[0])) { $this->avatarImage = $result[0]; break; } @@ -351,20 +416,16 @@ class User { /** * @brief marks the user as having logged in at least once - * @return null */ - public function markLogin() { + public function markLogin(): void { $this->config->setUserValue( - $this->uid, 'user_ldap', self::USER_PREFKEY_FIRSTLOGIN, 1); + $this->uid, 'user_ldap', self::USER_PREFKEY_FIRSTLOGIN, '1'); } /** * Stores a key-value pair in relation to this user - * - * @param string $key - * @param string $value */ - private function store($key, $value) { + private function store(string $key, string $value): void { $this->config->setUserValue($this->uid, 'user_ldap', $key, $value); } @@ -372,12 +433,9 @@ class User { * Composes the display name and stores it in the database. The final * display name is returned. * - * @param string $displayName - * @param string $displayName2 * @return string the effective display name */ - public function composeAndStoreDisplayName($displayName, $displayName2 = '') { - $displayName2 = (string)$displayName2; + public function composeAndStoreDisplayName(string $displayName, string $displayName2 = ''): string { if ($displayName2 !== '') { $displayName .= ' (' . $displayName2 . ')'; } @@ -396,9 +454,8 @@ class User { /** * Stores the LDAP Username in the Database - * @param string $userName */ - public function storeLDAPUserName($userName) { + public function storeLDAPUserName(string $userName): void { $this->store('uid', $userName); } @@ -406,10 +463,9 @@ class User { * @brief checks whether an update method specified by feature was run * already. If not, it will marked like this, because it is expected that * the method will be run, when false is returned. - * @param string $feature email | quota | avatar (can be extended) - * @return bool + * @param string $feature email | quota | avatar | profile (can be extended) */ - private function wasRefreshed($feature) { + private function wasRefreshed(string $feature): bool { if (isset($this->refreshedFeatures[$feature])) { return true; } @@ -419,10 +475,9 @@ class User { /** * fetches the email from LDAP and stores it as Nextcloud user value - * @param string $valueFromLDAP if known, to save an LDAP read request - * @return null + * @param ?string $valueFromLDAP if known, to save an LDAP read request */ - public function updateEmail($valueFromLDAP = null) { + public function updateEmail(?string $valueFromLDAP = null): void { if ($this->wasRefreshed('email')) { return; } @@ -441,7 +496,7 @@ class User { if (!is_null($user)) { $currentEmail = (string)$user->getSystemEMailAddress(); if ($currentEmail !== $email) { - $user->setEMailAddress($email); + $user->setSystemEMailAddress($email); } } } @@ -460,14 +515,13 @@ class User { * fetch all the user's attributes in one call and use the fetched values in this function. * The expected value for that parameter is a string describing the quota for the user. Valid * values are 'none' (unlimited), 'default' (the Nextcloud's default quota), '1234' (quota in - * bytes), '1234 MB' (quota in MB - check the \OC_Helper::computerFileSize method for more info) + * bytes), '1234 MB' (quota in MB - check the \OCP\Util::computerFileSize method for more info) * * fetches the quota from LDAP and stores it as Nextcloud user value * @param ?string $valueFromLDAP the quota attribute's value can be passed, - * to save the readAttribute request - * @return void + * to save the readAttribute request */ - public function updateQuota($valueFromLDAP = null) { + public function updateQuota(?string $valueFromLDAP = null): void { if ($this->wasRefreshed('quota')) { return; } @@ -481,7 +535,7 @@ class User { $quota = false; if (is_null($valueFromLDAP) && $quotaAttribute !== '') { $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute); - if ($aQuota && (count($aQuota) > 0) && $this->verifyQuotaValue($aQuota[0])) { + if ($aQuota !== false && isset($aQuota[0]) && $this->verifyQuotaValue($aQuota[0])) { $quota = $aQuota[0]; } elseif (is_array($aQuota) && isset($aQuota[0])) { $this->logger->debug('no suitable LDAP quota found for user ' . $this->uid . ': [' . $aQuota[0] . ']', ['app' => 'user_ldap']); @@ -489,7 +543,7 @@ class User { } elseif (!is_null($valueFromLDAP) && $this->verifyQuotaValue($valueFromLDAP)) { $quota = $valueFromLDAP; } else { - $this->logger->debug('no suitable LDAP quota found for user ' . $this->uid . ': [' . $valueFromLDAP . ']', ['app' => 'user_ldap']); + $this->logger->debug('no suitable LDAP quota found for user ' . $this->uid . ': [' . ($valueFromLDAP ?? '') . ']', ['app' => 'user_ldap']); } if ($quota === false && $this->verifyQuotaValue($defaultQuota)) { @@ -508,26 +562,65 @@ class User { } } - private function verifyQuotaValue(string $quotaValue) { - return $quotaValue === 'none' || $quotaValue === 'default' || \OC_Helper::computerFileSize($quotaValue) !== false; + private function verifyQuotaValue(string $quotaValue): bool { + return $quotaValue === 'none' || $quotaValue === 'default' || Util::computerFileSize($quotaValue) !== false; } /** - * called by a post_login hook to save the avatar picture + * takes values from LDAP and stores it as Nextcloud user profile value * - * @param array $params + * @param array $profileValues associative array of property keys and values from LDAP */ - public function updateAvatarPostLogin($params) { - if (isset($params['uid']) && $params['uid'] === $this->getUsername()) { - $this->updateAvatar(); + private function updateProfile(array $profileValues): void { + // check if given array is empty + if (empty($profileValues)) { + return; // okay, nothing to do + } + // fetch/prepare user + $user = $this->userManager->get($this->uid); + if (is_null($user)) { + $this->logger->error('could not get user for uid=' . $this->uid . '', ['app' => 'user_ldap']); + return; + } + // prepare AccountManager and Account + $accountManager = Server::get(IAccountManager::class); + $account = $accountManager->getAccount($user); // get Account + $defaultScopes = array_merge(AccountManager::DEFAULT_SCOPES, + $this->config->getSystemValue('account_manager.default_property_scope', [])); + // loop through the properties and handle them + foreach ($profileValues as $property => $valueFromLDAP) { + // check and update profile properties + $value = (is_array($valueFromLDAP) ? $valueFromLDAP[0] : $valueFromLDAP); // take ONLY the first value, if multiple values specified + try { + $accountProperty = $account->getProperty($property); + $currentValue = $accountProperty->getValue(); + $scope = ($accountProperty->getScope() ?: $defaultScopes[$property]); + } catch (PropertyDoesNotExistException $e) { // thrown at getProperty + $this->logger->error('property does not exist: ' . $property + . ' for uid=' . $this->uid . '', ['app' => 'user_ldap', 'exception' => $e]); + $currentValue = ''; + $scope = $defaultScopes[$property]; + } + $verified = IAccountManager::VERIFIED; // trust the LDAP admin knew what they put there + if ($currentValue !== $value) { + $account->setProperty($property, $value, $scope, $verified); + $this->logger->debug('update user profile: ' . $property . '=' . $value + . ' for uid=' . $this->uid . '', ['app' => 'user_ldap']); + } + } + try { + $accountManager->updateAccount($account); // may throw InvalidArgumentException + } catch (\InvalidArgumentException $e) { + $this->logger->error('invalid data from LDAP: for uid=' . $this->uid . '', ['app' => 'user_ldap', 'func' => 'updateProfile' + , 'exception' => $e]); } } /** * @brief attempts to get an image from LDAP and sets it as Nextcloud avatar - * @return bool + * @return bool true when the avatar was set successfully or is up to date */ - public function updateAvatar($force = false) { + public function updateAvatar(bool $force = false): bool { if (!$force && $this->wasRefreshed('avatar')) { return false; } @@ -544,11 +637,11 @@ class User { // use the checksum before modifications $checksum = md5($this->image->data()); - if ($checksum === $this->config->getUserValue($this->uid, 'user_ldap', 'lastAvatarChecksum', '')) { + if ($checksum === $this->config->getUserValue($this->uid, 'user_ldap', 'lastAvatarChecksum', '') && $this->avatarExists()) { return true; } - $isSet = $this->setOwnCloudAvatar(); + $isSet = $this->setNextcloudAvatar(); if ($isSet) { // save checksum only after successful setting @@ -558,38 +651,38 @@ class User { return $isSet; } + private function avatarExists(): bool { + try { + $currentAvatar = $this->avatarManager->getAvatar($this->uid); + return $currentAvatar->exists() && $currentAvatar->isCustomAvatar(); + } catch (\Exception $e) { + return false; + } + } + /** * @brief sets an image as Nextcloud avatar - * @return bool */ - private function setOwnCloudAvatar() { + private function setNextcloudAvatar(): bool { if (!$this->image->valid()) { - $this->logger->error('avatar image data from LDAP invalid for '.$this->dn, ['app' => 'user_ldap']); + $this->logger->error('avatar image data from LDAP invalid for ' . $this->dn, ['app' => 'user_ldap']); return false; } - //make sure it is a square and not bigger than 128x128 - $size = min([$this->image->width(), $this->image->height(), 128]); + //make sure it is a square and not bigger than 512x512 + $size = min([$this->image->width(), $this->image->height(), 512]); if (!$this->image->centerCrop($size)) { - $this->logger->error('croping image for avatar failed for '.$this->dn, ['app' => 'user_ldap']); + $this->logger->error('croping image for avatar failed for ' . $this->dn, ['app' => 'user_ldap']); return false; } - if (!$this->fs->isLoaded()) { - $this->fs->setup($this->uid); - } - try { $avatar = $this->avatarManager->getAvatar($this->uid); $avatar->set($this->image); return true; } catch (\Exception $e) { - \OC::$server->getLogger()->logException($e, [ - 'message' => 'Could not set avatar for ' . $this->dn, - 'level' => ILogger::INFO, - 'app' => 'user_ldap', - ]); + $this->logger->info('Could not set avatar for ' . $this->dn, ['exception' => $e]); } return false; } @@ -597,7 +690,7 @@ class User { /** * @throws AttributeNotSet * @throws \OC\ServerNotAvailableException - * @throws \OCP\PreConditionNotMetException + * @throws PreConditionNotMetException */ public function getExtStorageHome():string { $value = $this->config->getUserValue($this->getUsername(), 'user_ldap', 'extStorageHome', ''); @@ -616,16 +709,16 @@ class User { } /** - * @throws \OCP\PreConditionNotMetException + * @throws PreConditionNotMetException * @throws \OC\ServerNotAvailableException */ - public function updateExtStorageHome(string $valueFromLDAP = null):string { + public function updateExtStorageHome(?string $valueFromLDAP = null):string { if ($valueFromLDAP === null) { $extHomeValues = $this->access->readAttribute($this->getDN(), $this->connection->ldapExtStorageHomeAttribute); } else { $extHomeValues = [$valueFromLDAP]; } - if ($extHomeValues && isset($extHomeValues[0])) { + if ($extHomeValues !== false && isset($extHomeValues[0])) { $extHome = $extHomeValues[0]; $this->config->setUserValue($this->getUsername(), 'user_ldap', 'extStorageHome', $extHome); return $extHome; @@ -637,29 +730,30 @@ class User { /** * called by a post_login hook to handle password expiry - * - * @param array $params */ - public function handlePasswordExpiry($params) { + public function handlePasswordExpiry(array $params): void { $ppolicyDN = $this->connection->ldapDefaultPPolicyDN; if (empty($ppolicyDN) || ((int)$this->connection->turnOnPasswordChange !== 1)) { - return;//password expiry handling disabled + //password expiry handling disabled + return; } $uid = $params['uid']; if (isset($uid) && $uid === $this->getUsername()) { //retrieve relevant user attributes $result = $this->access->search('objectclass=*', $this->dn, ['pwdpolicysubentry', 'pwdgraceusetime', 'pwdreset', 'pwdchangedtime']); - if (array_key_exists('pwdpolicysubentry', $result[0])) { - $pwdPolicySubentry = $result[0]['pwdpolicysubentry']; - if ($pwdPolicySubentry && (count($pwdPolicySubentry) > 0)) { - $ppolicyDN = $pwdPolicySubentry[0];//custom ppolicy DN + if (!empty($result)) { + if (array_key_exists('pwdpolicysubentry', $result[0])) { + $pwdPolicySubentry = $result[0]['pwdpolicysubentry']; + if ($pwdPolicySubentry && (count($pwdPolicySubentry) > 0)) { + $ppolicyDN = $pwdPolicySubentry[0];//custom ppolicy DN + } } - } - $pwdGraceUseTime = array_key_exists('pwdgraceusetime', $result[0]) ? $result[0]['pwdgraceusetime'] : []; - $pwdReset = array_key_exists('pwdreset', $result[0]) ? $result[0]['pwdreset'] : []; - $pwdChangedTime = array_key_exists('pwdchangedtime', $result[0]) ? $result[0]['pwdchangedtime'] : []; + $pwdGraceUseTime = array_key_exists('pwdgraceusetime', $result[0]) ? $result[0]['pwdgraceusetime'] : []; + $pwdReset = array_key_exists('pwdreset', $result[0]) ? $result[0]['pwdreset'] : []; + $pwdChangedTime = array_key_exists('pwdchangedtime', $result[0]) ? $result[0]['pwdchangedtime'] : []; + } //retrieve relevant password policy attributes $cacheKey = 'ppolicyAttributes' . $ppolicyDN; @@ -678,19 +772,19 @@ class User { if (!empty($pwdGraceAuthNLimit) && count($pwdGraceUseTime) < (int)$pwdGraceAuthNLimit[0]) { //at least one more grace login available? $this->config->setUserValue($uid, 'user_ldap', 'needsPasswordReset', 'true'); - header('Location: '.\OC::$server->getURLGenerator()->linkToRouteAbsolute( - 'user_ldap.renewPassword.showRenewPasswordForm', ['user' => $uid])); + header('Location: ' . Server::get(IURLGenerator::class)->linkToRouteAbsolute( + 'user_ldap.renewPassword.showRenewPasswordForm', ['user' => $uid])); } else { //no more grace login available - header('Location: '.\OC::$server->getURLGenerator()->linkToRouteAbsolute( - 'user_ldap.renewPassword.showLoginFormInvalidPassword', ['user' => $uid])); + header('Location: ' . Server::get(IURLGenerator::class)->linkToRouteAbsolute( + 'user_ldap.renewPassword.showLoginFormInvalidPassword', ['user' => $uid])); } exit(); } //handle pwdReset attribute - if (!empty($pwdReset) && $pwdReset[0] === 'TRUE') { //user must change his password + if (!empty($pwdReset) && $pwdReset[0] === 'TRUE') { //user must change their password $this->config->setUserValue($uid, 'user_ldap', 'needsPasswordReset', 'true'); - header('Location: '.\OC::$server->getURLGenerator()->linkToRouteAbsolute( - 'user_ldap.renewPassword.showRenewPasswordForm', ['user' => $uid])); + header('Location: ' . Server::get(IURLGenerator::class)->linkToRouteAbsolute( + 'user_ldap.renewPassword.showRenewPasswordForm', ['user' => $uid])); exit(); } //handle password expiry warning @@ -701,7 +795,7 @@ class User { $pwdExpireWarningInt = (int)$pwdExpireWarning[0]; if ($pwdMaxAgeInt > 0 && $pwdExpireWarningInt > 0) { $pwdChangedTimeDt = \DateTime::createFromFormat('YmdHisZ', $pwdChangedTime[0]); - $pwdChangedTimeDt->add(new \DateInterval('PT'.$pwdMaxAgeInt.'S')); + $pwdChangedTimeDt->add(new \DateInterval('PT' . $pwdMaxAgeInt . 'S')); $currentDateTime = new \DateTime(); $secondsToExpiry = $pwdChangedTimeDt->getTimestamp() - $currentDateTime->getTimestamp(); if ($secondsToExpiry <= $pwdExpireWarningInt) { @@ -718,7 +812,7 @@ class User { ->setUser($uid) ->setDateTime($currentDateTime) ->setObject('pwd_exp_warn', $uid) - ->setSubject('pwd_exp_warn_days', [(int) ceil($secondsToExpiry / 60 / 60 / 24)]) + ->setSubject('pwd_exp_warn_days', [(int)ceil($secondsToExpiry / 60 / 60 / 24)]) ; $this->notificationManager->notify($notification); } diff --git a/apps/user_ldap/lib/UserPluginManager.php b/apps/user_ldap/lib/UserPluginManager.php index 748a210cf60..ed87fea6fde 100644 --- a/apps/user_ldap/lib/UserPluginManager.php +++ b/apps/user_ldap/lib/UserPluginManager.php @@ -1,31 +1,14 @@ <?php + /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Filis Futsarov <filisko@users.noreply.github.com> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP; use OC\User\Backend; +use OCP\Server; +use Psr\Log\LoggerInterface; class UserPluginManager { private int $respondToActions = 0; @@ -62,12 +45,12 @@ class UserPluginManager { foreach ($this->which as $action => $v) { if (is_int($action) && (bool)($respondToActions & $action)) { $this->which[$action] = $plugin; - \OC::$server->getLogger()->debug("Registered action ".$action." to plugin ".get_class($plugin), ['app' => 'user_ldap']); + Server::get(LoggerInterface::class)->debug('Registered action ' . $action . ' to plugin ' . get_class($plugin), ['app' => 'user_ldap']); } } - if (method_exists($plugin,'deleteUser')) { + if (method_exists($plugin, 'deleteUser')) { $this->which['deleteUser'] = $plugin; - \OC::$server->getLogger()->debug("Registered action deleteUser to plugin ".get_class($plugin), ['app' => 'user_ldap']); + Server::get(LoggerInterface::class)->debug('Registered action deleteUser to plugin ' . get_class($plugin), ['app' => 'user_ldap']); } } @@ -92,7 +75,7 @@ class UserPluginManager { $plugin = $this->which[Backend::CREATE_USER]; if ($plugin) { - return $plugin->createUser($username,$password); + return $plugin->createUser($username, $password); } throw new \Exception('No plugin implements createUser in this LDAP Backend.'); } @@ -108,13 +91,13 @@ class UserPluginManager { $plugin = $this->which[Backend::SET_PASSWORD]; if ($plugin) { - return $plugin->setPassword($uid,$password); + return $plugin->setPassword($uid, $password); } throw new \Exception('No plugin implements setPassword in this LDAP Backend.'); } /** - * checks whether the user is allowed to change his avatar in Nextcloud + * checks whether the user is allowed to change their avatar in Nextcloud * @param string $uid the Nextcloud user name * @return boolean either the user can or cannot * @throws \Exception @@ -176,7 +159,7 @@ class UserPluginManager { /** * Count the number of users - * @return int|bool + * @return int|false * @throws \Exception */ public function countUsers() { diff --git a/apps/user_ldap/lib/User_LDAP.php b/apps/user_ldap/lib/User_LDAP.php index 5a445100052..c3f56f5ff9b 100644 --- a/apps/user_ldap/lib/User_LDAP.php +++ b/apps/user_ldap/lib/User_LDAP.php @@ -1,40 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Daniel Kesselberg <mail@danielkesselberg.de> - * @author Dominik Schmidt <dev@dominik-schmidt.de> - * @author felixboehm <felix@webhippie.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roger Szabo <roger.szabo@web.de> - * @author root <root@localhost.localdomain> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Tom Needham <tom@owncloud.com> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; @@ -42,45 +11,30 @@ use OC\ServerNotAvailableException; use OC\User\Backend; use OC\User\NoUserException; use OCA\User_LDAP\Exceptions\NotOnLDAP; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User\OfflineUser; use OCA\User_LDAP\User\User; -use OCP\IConfig; -use OCP\IUserSession; -use OCP\Notification\IManager as INotificationManager; -use OCP\User\Backend\ICountUsersBackend; use OCP\IUserBackend; +use OCP\Notification\IManager as INotificationManager; +use OCP\User\Backend\ICountMappedUsersBackend; +use OCP\User\Backend\ILimitAwareCountUsersBackend; +use OCP\User\Backend\IProvideEnabledStateBackend; use OCP\UserInterface; use Psr\Log\LoggerInterface; -class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, IUserLDAP, ICountUsersBackend { - /** @var \OCP\IConfig */ - protected $ocConfig; - - /** @var INotificationManager */ - protected $notificationManager; - - /** @var UserPluginManager */ - protected $userPluginManager; - - /** @var LoggerInterface */ - protected $logger; - - /** - * @param Access $access - * @param \OCP\IConfig $ocConfig - * @param \OCP\Notification\IManager $notificationManager - * @param IUserSession $userSession - */ - public function __construct(Access $access, IConfig $ocConfig, INotificationManager $notificationManager, IUserSession $userSession, UserPluginManager $userPluginManager) { +class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, IUserLDAP, ILimitAwareCountUsersBackend, ICountMappedUsersBackend, IProvideEnabledStateBackend { + public function __construct( + Access $access, + protected INotificationManager $notificationManager, + protected UserPluginManager $userPluginManager, + protected LoggerInterface $logger, + protected DeletedUsersIndex $deletedUsersIndex, + ) { parent::__construct($access); - $this->ocConfig = $ocConfig; - $this->notificationManager = $notificationManager; - $this->userPluginManager = $userPluginManager; - $this->logger = \OC::$server->get(LoggerInterface::class); } /** - * checks whether the user is allowed to change his avatar in Nextcloud + * checks whether the user is allowed to change their avatar in Nextcloud * * @param string $uid the Nextcloud user name * @return boolean either the user can or cannot @@ -113,11 +67,12 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I * @return string|false * @throws \Exception */ - public function loginName2UserName($loginName) { + public function loginName2UserName($loginName, bool $forceLdapRefetch = false) { $cacheKey = 'loginName2UserName-' . $loginName; $username = $this->access->connection->getFromCache($cacheKey); - if ($username !== null) { + $ignoreCache = ($username === false && $forceLdapRefetch); + if ($username !== null && !$ignoreCache) { return $username; } @@ -132,6 +87,9 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I } $username = $user->getUsername(); $this->access->connection->writeToCache($cacheKey, $username); + if ($forceLdapRefetch) { + $user->processAttributes($ldapRecord); + } return $username; } catch (NotOnLDAP $e) { $this->access->connection->writeToCache($cacheKey, false); @@ -161,8 +119,8 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I $attrs = $this->access->userManager->getAttributes(); $users = $this->access->fetchUsersByLoginName($loginName, $attrs); if (count($users) < 1) { - throw new NotOnLDAP('No user available for the given login name on ' . - $this->access->connection->ldapHost . ':' . $this->access->connection->ldapPort); + throw new NotOnLDAP('No user available for the given login name on ' + . $this->access->connection->ldapHost . ':' . $this->access->connection->ldapPort); } return $users[0]; } @@ -175,22 +133,17 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I * @return false|string */ public function checkPassword($uid, $password) { - try { - $ldapRecord = $this->getLDAPUserByLoginName($uid); - } catch (NotOnLDAP $e) { - $this->logger->debug( - $e->getMessage(), - ['app' => 'user_ldap', 'exception' => $e] - ); + $username = $this->loginName2UserName($uid, true); + if ($username === false) { return false; } - $dn = $ldapRecord['dn'][0]; + $dn = $this->access->username2dn($username); $user = $this->access->userManager->get($dn); if (!$user instanceof User) { $this->logger->warning( - 'LDAP Login: Could not get user object for DN ' . $dn . - '. Maybe the LDAP entry has no set display name attribute?', + 'LDAP Login: Could not get user object for DN ' . $dn + . '. Maybe the LDAP entry has no set display name attribute?', ['app' => 'user_ldap'] ); return false; @@ -202,7 +155,6 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I } $this->access->cacheUserExists($user->getUsername()); - $user->processAttributes($ldapRecord); $user->markLogin(); return $user->getUsername(); @@ -225,8 +177,8 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I $user = $this->access->userManager->get($uid); if (!$user instanceof User) { - throw new \Exception('LDAP setPassword: Could not get user object for uid ' . $uid . - '. Maybe the LDAP entry has no set display name attribute?'); + throw new \Exception('LDAP setPassword: Could not get user object for uid ' . $uid + . '. Maybe the LDAP entry has no set display name attribute?'); } if ($user->getUsername() !== false && $this->access->setPassword($user->getDN(), $password)) { $ldapDefaultPPolicyDN = $this->access->connection->ldapDefaultPPolicyDN; @@ -256,7 +208,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I */ public function getUsers($search = '', $limit = 10, $offset = 0) { $search = $this->access->escapeFilterPart($search, true); - $cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset; + $cachekey = 'getUsers-' . $search . '-' . $limit . '-' . $offset; //check if users are cached, if so return $ldap_users = $this->access->connection->getFromCache($cachekey); @@ -276,7 +228,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I ]); $this->logger->debug( - 'getUsers: Options: search '.$search.' limit '.$limit.' offset '.$offset.' Filter: '.$filter, + 'getUsers: Options: search ' . $search . ' limit ' . $limit . ' offset ' . $offset . ' Filter: ' . $filter, ['app' => 'user_ldap'] ); //do the search and translate results to Nextcloud names @@ -286,7 +238,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I $limit, $offset); $ldap_users = $this->access->nextcloudUserNames($ldap_users); $this->logger->debug( - 'getUsers: '.count($ldap_users). ' Users found', + 'getUsers: ' . count($ldap_users) . ' Users found', ['app' => 'user_ldap'] ); @@ -297,8 +249,8 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I /** * checks whether a user is still available on LDAP * - * @param string|\OCA\User_LDAP\User\User $user either the Nextcloud user - * name or an instance of that user + * @param string|User $user either the Nextcloud user + * name or an instance of that user * @throws \Exception * @throws \OC\ServerNotAvailableException */ @@ -334,8 +286,6 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I return false; } $this->access->getUserMapper()->setDNbyUUID($newDn, $uuid); - $this->access->connection->writeToCache($cacheKey, true); - return true; } catch (ServerNotAvailableException $e) { throw $e; } catch (\Exception $e) { @@ -359,23 +309,22 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I * @throws \Exception when connection could not be established */ public function userExists($uid) { - $userExists = $this->access->connection->getFromCache('userExists'.$uid); + $userExists = $this->access->connection->getFromCache('userExists' . $uid); if (!is_null($userExists)) { return (bool)$userExists; } - //getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking. - $user = $this->access->userManager->get($uid); + $userExists = $this->access->userManager->exists($uid); - if (is_null($user)) { + if (!$userExists) { $this->logger->debug( - 'No DN found for '.$uid.' on '.$this->access->connection->ldapHost, + 'No DN found for ' . $uid . ' on ' . $this->access->connection->ldapHost, ['app' => 'user_ldap'] ); - $this->access->connection->writeToCache('userExists'.$uid, false); + $this->access->connection->writeToCache('userExists' . $uid, false); return false; } - $this->access->connection->writeToCache('userExists'.$uid, true); + $this->access->connection->writeToCache('userExists' . $uid, true); return true; } @@ -393,13 +342,13 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I } } - $marked = (int)$this->ocConfig->getUserValue($uid, 'user_ldap', 'isDeleted', 0); - if ($marked === 0) { + $marked = $this->deletedUsersIndex->isUserMarked($uid); + if (!$marked) { try { $user = $this->access->userManager->get($uid); if (($user instanceof User) && !$this->userExistsOnLDAP($uid, true)) { $user->markUser(); - $marked = 1; + $marked = true; } } catch (\Exception $e) { $this->logger->debug( @@ -407,9 +356,9 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I ['app' => 'user_ldap', 'exception' => $e] ); } - if ($marked === 0) { + if (!$marked) { $this->logger->notice( - 'User '.$uid . ' is not marked as deleted, not cleaning up.', + 'User ' . $uid . ' is not marked as deleted, not cleaning up.', ['app' => 'user_ldap'] ); return false; @@ -442,7 +391,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I return $this->userPluginManager->getHome($uid); } - $cacheKey = 'getHome'.$uid; + $cacheKey = 'getHome' . $uid; $path = $this->access->connection->getFromCache($cacheKey); if (!is_null($path)) { return $path; @@ -474,7 +423,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I return false; } - $cacheKey = 'getDisplayName'.$uid; + $cacheKey = 'getDisplayName' . $uid; if (!is_null($displayName = $this->access->connection->getFromCache($cacheKey))) { return $displayName; } @@ -501,11 +450,10 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I $user = $this->access->userManager->get($uid); if ($user instanceof User) { - $displayName = $user->composeAndStoreDisplayName($displayName, $displayName2); + $displayName = $user->composeAndStoreDisplayName($displayName, (string)$displayName2); $this->access->connection->writeToCache($cacheKey, $displayName); } if ($user instanceof OfflineUser) { - /** @var OfflineUser $user*/ $displayName = $user->getDisplayName(); } return $displayName; @@ -538,7 +486,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I * @return array an array of all displayNames (value) and the corresponding uids (key) */ public function getDisplayNames($search = '', $limit = null, $offset = null) { - $cacheKey = 'getDisplayNames-'.$search.'-'.$limit.'-'.$offset; + $cacheKey = 'getDisplayNames-' . $search . '-' . $limit . '-' . $offset; if (!is_null($displayNames = $this->access->connection->getFromCache($cacheKey))) { return $displayNames; } @@ -580,24 +528,26 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I /** * counts the users in LDAP - * - * @return int|bool */ - public function countUsers() { + public function countUsers(int $limit = 0): int|false { if ($this->userPluginManager->implementsActions(Backend::COUNT_USERS)) { return $this->userPluginManager->countUsers(); } $filter = $this->access->getFilterForUserCount(); - $cacheKey = 'countUsers-'.$filter; + $cacheKey = 'countUsers-' . $filter . '-' . $limit; if (!is_null($entries = $this->access->connection->getFromCache($cacheKey))) { return $entries; } - $entries = $this->access->countUsers($filter); + $entries = $this->access->countUsers($filter, limit:$limit); $this->access->connection->writeToCache($cacheKey, $entries); return $entries; } + public function countMappedUsers(): int { + return $this->access->getUserMapper()->count(); + } + /** * Backend name to be shown in user management * @return string the name of the backend to be shown @@ -620,7 +570,7 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I * The cloned connection needs to be closed manually. * of the current access. * @param string $uid - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection */ public function getNewLDAPConnection($uid) { $connection = clone $this->access->getConnection(); @@ -648,7 +598,6 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I $uuid, true ); - $this->access->cacheUserExists($username); } else { $this->logger->warning( 'Failed to map created LDAP user with userid {userid}, because UUID could not be determined', @@ -659,11 +608,28 @@ class User_LDAP extends BackendUtility implements IUserBackend, UserInterface, I ); } } else { - throw new \UnexpectedValueException("LDAP Plugin: Method createUser changed to return the user DN instead of boolean."); + throw new \UnexpectedValueException('LDAP Plugin: Method createUser changed to return the user DN instead of boolean.'); } } - return (bool) $dn; + return (bool)$dn; } return false; } + + public function isUserEnabled(string $uid, callable $queryDatabaseValue): bool { + if ($this->deletedUsersIndex->isUserMarked($uid) && ((int)$this->access->connection->markRemnantsAsDisabled === 1)) { + return false; + } else { + return $queryDatabaseValue(); + } + } + + public function setUserEnabled(string $uid, bool $enabled, callable $queryDatabaseValue, callable $setDatabaseValue): bool { + $setDatabaseValue($enabled); + return $enabled; + } + + public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array { + throw new \Exception('This is implemented directly in User_Proxy'); + } } diff --git a/apps/user_ldap/lib/User_Proxy.php b/apps/user_ldap/lib/User_Proxy.php index 040d4f5aa69..0d41f495ce9 100644 --- a/apps/user_ldap/lib/User_Proxy.php +++ b/apps/user_ldap/lib/User_Proxy.php @@ -1,65 +1,47 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christopher Schäpers <kondou@ts.unde.re> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roger Szabo <roger.szabo@web.de> - * @author root <root@localhost.localdomain> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; +use OCA\User_LDAP\User\DeletedUsersIndex; +use OCA\User_LDAP\User\OfflineUser; use OCA\User_LDAP\User\User; -use OCP\IConfig; -use OCP\IUserSession; +use OCP\IUserBackend; use OCP\Notification\IManager as INotificationManager; -use OCP\User\Backend\ICountUsersBackend; - -class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, IUserLDAP, ICountUsersBackend { - private $backends = []; - /** @var User_LDAP */ - private $refBackend = null; +use OCP\User\Backend\ICountMappedUsersBackend; +use OCP\User\Backend\ILimitAwareCountUsersBackend; +use OCP\User\Backend\IProvideEnabledStateBackend; +use OCP\UserInterface; +use Psr\Log\LoggerInterface; +/** + * @template-extends Proxy<User_LDAP> + */ +class User_Proxy extends Proxy implements IUserBackend, UserInterface, IUserLDAP, ILimitAwareCountUsersBackend, ICountMappedUsersBackend, IProvideEnabledStateBackend { public function __construct( - Helper $helper, + private Helper $helper, ILDAPWrapper $ldap, - IConfig $ocConfig, - INotificationManager $notificationManager, - IUserSession $userSession, - UserPluginManager $userPluginManager + AccessFactory $accessFactory, + private INotificationManager $notificationManager, + private UserPluginManager $userPluginManager, + private LoggerInterface $logger, + private DeletedUsersIndex $deletedUsersIndex, ) { - parent::__construct($ldap); - $serverConfigPrefixes = $helper->getServerConfigurationPrefixes(true); - foreach ($serverConfigPrefixes as $configPrefix) { - $this->backends[$configPrefix] = - new User_LDAP($this->getAccess($configPrefix), $ocConfig, $notificationManager, $userSession, $userPluginManager); - - if (is_null($this->refBackend)) { - $this->refBackend = &$this->backends[$configPrefix]; - } - } + parent::__construct($helper, $ldap, $accessFactory); + } + + protected function newInstance(string $configPrefix): User_LDAP { + return new User_LDAP( + $this->getAccess($configPrefix), + $this->notificationManager, + $this->userPluginManager, + $this->logger, + $this->deletedUsersIndex, + ); } /** @@ -71,6 +53,8 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return mixed the result of the method or false */ protected function walkBackends($id, $method, $parameters) { + $this->setup(); + $uid = $id; $cacheKey = $this->getUserCacheKey($uid); foreach ($this->backends as $configPrefix => $backend) { @@ -99,6 +83,8 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return mixed the result of the method or false */ protected function callOnLastSeenOn($id, $method, $parameters, $passOnWhen) { + $this->setup(); + $uid = $id; $cacheKey = $this->getUserCacheKey($uid); $prefix = $this->getFromCache($cacheKey); @@ -129,6 +115,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, } protected function activeBackends(): int { + $this->setup(); return count($this->backends); } @@ -142,6 +129,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * compared with \OC\User\Backend::CREATE_USER etc. */ public function implementsActions($actions) { + $this->setup(); //it's the same across all our user backends obviously return $this->refBackend->implementsActions($actions); } @@ -152,6 +140,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return string the name of the backend to be shown */ public function getBackendName() { + $this->setup(); return $this->refBackend->getBackendName(); } @@ -164,6 +153,8 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return string[] an array of all uids */ public function getUsers($search = '', $limit = 10, $offset = 0) { + $this->setup(); + //we do it just as the /OC_User implementation: do not play around with limit and offset but ask all backends $users = []; foreach ($this->backends as $backend) { @@ -203,8 +194,8 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, /** * check if a user exists on LDAP * - * @param string|\OCA\User_LDAP\User\User $user either the Nextcloud user - * name or an instance of that user + * @param string|User $user either the Nextcloud user + * name or an instance of that user */ public function userExistsOnLDAP($user, bool $ignoreCache = false): bool { $id = ($user instanceof User) ? $user->getUsername() : $user; @@ -278,7 +269,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, } /** - * checks whether the user is allowed to change his avatar in Nextcloud + * checks whether the user is allowed to change their avatar in Nextcloud * * @param string $uid the Nextcloud user name * @return boolean either the user can or cannot @@ -296,6 +287,8 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return array an array of all displayNames (value) and the corresponding uids (key) */ public function getDisplayNames($search = '', $limit = null, $offset = null) { + $this->setup(); + //we do it just as the /OC_User implementation: do not play around with limit and offset but ask all backends $users = []; foreach ($this->backends as $backend) { @@ -335,26 +328,46 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * @return bool */ public function hasUserListings() { + $this->setup(); return $this->refBackend->hasUserListings(); } /** * Count the number of users - * - * @return int|bool */ - public function countUsers() { + public function countUsers(int $limit = 0): int|false { + $this->setup(); + $users = false; foreach ($this->backends as $backend) { - $backendUsers = $backend->countUsers(); + $backendUsers = $backend->countUsers($limit); if ($backendUsers !== false) { - $users += $backendUsers; + $users = (int)$users + $backendUsers; + if ($limit > 0) { + if ($users >= $limit) { + break; + } + $limit -= $users; + } } } return $users; } /** + * Count the number of mapped users + */ + public function countMappedUsers(): int { + $this->setup(); + + $users = 0; + foreach ($this->backends as $backend) { + $users += $backend->countMappedUsers(); + } + return $users; + } + + /** * Return access for LDAP interaction. * * @param string $uid @@ -369,7 +382,7 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, * The connection needs to be closed manually. * * @param string $uid - * @return resource|\LDAP\Connection The LDAP connection + * @return \LDAP\Connection The LDAP connection */ public function getNewLDAPConnection($uid) { return $this->handleRequest($uid, 'getNewLDAPConnection', [$uid]); @@ -385,4 +398,37 @@ class User_Proxy extends Proxy implements \OCP\IUserBackend, \OCP\UserInterface, public function createUser($username, $password) { return $this->handleRequest($username, 'createUser', [$username, $password]); } + + public function isUserEnabled(string $uid, callable $queryDatabaseValue): bool { + return $this->handleRequest($uid, 'isUserEnabled', [$uid, $queryDatabaseValue]); + } + + public function setUserEnabled(string $uid, bool $enabled, callable $queryDatabaseValue, callable $setDatabaseValue): bool { + return $this->handleRequest($uid, 'setUserEnabled', [$uid, $enabled, $queryDatabaseValue, $setDatabaseValue]); + } + + public function getDisabledUserList(?int $limit = null, int $offset = 0, string $search = ''): array { + if ((int)$this->getAccess(array_key_first($this->backends) ?? '')->connection->markRemnantsAsDisabled !== 1) { + return []; + } + $disabledUsers = $this->deletedUsersIndex->getUsers(); + if ($search !== '') { + $disabledUsers = array_filter( + $disabledUsers, + fn (OfflineUser $user): bool + => mb_stripos($user->getOCName(), $search) !== false + || mb_stripos($user->getUID(), $search) !== false + || mb_stripos($user->getDisplayName(), $search) !== false + || mb_stripos($user->getEmail(), $search) !== false, + ); + } + return array_map( + fn (OfflineUser $user) => $user->getOCName(), + array_slice( + $disabledUsers, + $offset, + $limit + ) + ); + } } diff --git a/apps/user_ldap/lib/Wizard.php b/apps/user_ldap/lib/Wizard.php index ae9546be08b..15a9f9cb212 100644 --- a/apps/user_ldap/lib/Wizard.php +++ b/apps/user_ldap/lib/Wizard.php @@ -1,56 +1,25 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Alexander Bergolth <leo@strike.wu.ac.at> - * @author Allan Nordhøy <epost@anotheragency.no> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Jean-Louis Dupond <jean-louis@dupond.be> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Nicolas Grekas <nicolas.grekas@gmail.com> - * @author Robin Appelman <robin@icewind.nl> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Stefan Weil <sw@weilnetz.de> - * @author Tobias Perschon <tobias@perschon.at> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Xuanwo <xuanwo@yunify.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ + namespace OCA\User_LDAP; use OC\ServerNotAvailableException; +use OCP\IL10N; +use OCP\L10N\IFactory as IL10NFactory; +use OCP\Server; +use OCP\Util; use Psr\Log\LoggerInterface; class Wizard extends LDAPUtility { - /** @var \OCP\IL10N */ - protected static $l; - protected $access; - protected $cr; - protected $configuration; - protected $result; - protected $resultCache = []; - - /** @var LoggerInterface */ - protected $logger; + protected static ?IL10N $l = null; + protected ?\LDAP\Connection $cr = null; + protected WizardResult $result; + protected LoggerInterface $logger; public const LRESULT_PROCESSED_OK = 2; public const LRESULT_PROCESSED_INVALID = 3; @@ -65,21 +34,17 @@ class Wizard extends LDAPUtility { public const LDAP_NW_TIMEOUT = 4; - /** - * Constructor - * @param Configuration $configuration an instance of Configuration - * @param ILDAPWrapper $ldap an instance of ILDAPWrapper - * @param Access $access - */ - public function __construct(Configuration $configuration, ILDAPWrapper $ldap, Access $access) { + public function __construct( + protected Configuration $configuration, + ILDAPWrapper $ldap, + protected Access $access, + ) { parent::__construct($ldap); - $this->configuration = $configuration; - if (is_null(Wizard::$l)) { - Wizard::$l = \OC::$server->getL10N('user_ldap'); + if (is_null(static::$l)) { + static::$l = Server::get(IL10NFactory::class)->get('user_ldap'); } - $this->access = $access; $this->result = new WizardResult(); - $this->logger = \OC::$server->get(LoggerInterface::class); + $this->logger = Server::get(LoggerInterface::class); } public function __destruct() { @@ -93,11 +58,13 @@ class Wizard extends LDAPUtility { * * @param string $filter the LDAP search filter * @param string $type a string being either 'users' or 'groups'; - * @return int * @throws \Exception */ public function countEntries(string $filter, string $type): int { - $reqs = ['ldapHost', 'ldapPort', 'ldapBase']; + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } if ($type === 'users') { $reqs[] = 'ldapUserFilter'; } @@ -121,24 +88,13 @@ class Wizard extends LDAPUtility { } /** - * formats the return value of a count operation to the string to be - * inserted. - * - * @param int $count - * @return string + * @return WizardResult|false */ - private function formatCountResult(int $count): string { - if ($count > 1000) { - return '> 1000'; - } - return (string)$count; - } - public function countGroups() { $filter = $this->configuration->ldapGroupFilter; if (empty($filter)) { - $output = self::$l->n('%s group found', '%s groups found', 0, [0]); + $output = self::$l->n('%n group found', '%n groups found', 0); $this->result->addChange('ldap_group_count', $output); return $this->result; } @@ -152,30 +108,36 @@ class Wizard extends LDAPUtility { } return false; } - $output = self::$l->n( - '%s group found', - '%s groups found', - $groupsTotal, - [$this->formatCountResult($groupsTotal)] - ); + + if ($groupsTotal > 1000) { + $output = self::$l->t('> 1000 groups found'); + } else { + $output = self::$l->n( + '%n group found', + '%n groups found', + $groupsTotal + ); + } $this->result->addChange('ldap_group_count', $output); return $this->result; } /** - * @return WizardResult * @throws \Exception */ - public function countUsers() { + public function countUsers(): WizardResult { $filter = $this->access->getFilterForUserCount(); $usersTotal = $this->countEntries($filter, 'users'); - $output = self::$l->n( - '%s user found', - '%s users found', - $usersTotal, - [$this->formatCountResult($usersTotal)] - ); + if ($usersTotal > 1000) { + $output = self::$l->t('> 1000 users found'); + } else { + $output = self::$l->n( + '%n user found', + '%n users found', + $usersTotal + ); + } $this->result->addChange('ldap_user_count', $output); return $this->result; } @@ -183,31 +145,25 @@ class Wizard extends LDAPUtility { /** * counts any objects in the currently set base dn * - * @return WizardResult * @throws \Exception */ - public function countInBaseDN() { + public function countInBaseDN(): WizardResult { // we don't need to provide a filter in this case $total = $this->countEntries('', 'objects'); - if ($total === false) { - throw new \Exception('invalid results received'); - } $this->result->addChange('ldap_test_base', $total); return $this->result; } /** * counts users with a specified attribute - * @param string $attr - * @param bool $existsCheck - * @return int|bool + * @return int|false */ - public function countUsersWithAttribute($attr, $existsCheck = false) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + public function countUsersWithAttribute(string $attr, bool $existsCheck = false) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -216,7 +172,7 @@ class Wizard extends LDAPUtility { $attr . '=*' ]); - $limit = ($existsCheck === false) ? null : 1; + $limit = $existsCheck ? null : 1; return $this->access->countUsers($filter, ['dn'], $limit); } @@ -224,15 +180,15 @@ class Wizard extends LDAPUtility { /** * detects the display name attribute. If a setting is already present that * returns at least one hit, the detection will be canceled. - * @return WizardResult|bool + * @return WizardResult|false * @throws \Exception */ public function detectUserDisplayNameAttribute() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -270,11 +226,11 @@ class Wizard extends LDAPUtility { * @return WizardResult|bool */ public function detectEmailAttribute() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -304,8 +260,8 @@ class Wizard extends LDAPUtility { $this->applyFind('ldap_email_attr', $winner); if ($writeLog) { $this->logger->info( - 'The mail attribute has automatically been reset, '. - 'because the original value did not return any results.', + 'The mail attribute has automatically been reset, ' + . 'because the original value did not return any results.', ['app' => 'user_ldap'] ); } @@ -315,20 +271,24 @@ class Wizard extends LDAPUtility { } /** - * @return WizardResult + * @return WizardResult|false * @throws \Exception */ public function determineAttributes() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $attributes = $this->getUserAttributes(); + if (!is_array($attributes)) { + throw new \Exception('Failed to determine user attributes'); + } + natcasesort($attributes); $attributes = array_values($attributes); @@ -344,15 +304,15 @@ class Wizard extends LDAPUtility { /** * detects the available LDAP attributes - * @return array|false The instance's WizardResult instance + * @return array|false * @throws \Exception */ private function getUserAttributes() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -366,8 +326,12 @@ class Wizard extends LDAPUtility { if (!$this->ldap->isResource($rr)) { return false; } + /** @var \LDAP\Result $rr */ $er = $this->ldap->firstEntry($cr, $rr); $attributes = $this->ldap->getAttributes($cr, $er); + if ($attributes === false) { + return false; + } $pureAttributes = []; for ($i = 0; $i < $attributes['count']; $i++) { $pureAttributes[] = $attributes[$i]; @@ -382,8 +346,8 @@ class Wizard extends LDAPUtility { */ public function determineGroupsForGroups() { return $this->determineGroups('ldap_groupfilter_groups', - 'ldapGroupFilterGroups', - false); + 'ldapGroupFilterGroups', + false); } /** @@ -392,22 +356,20 @@ class Wizard extends LDAPUtility { */ public function determineGroupsForUsers() { return $this->determineGroups('ldap_userfilter_groups', - 'ldapUserFilterGroups'); + 'ldapUserFilterGroups'); } /** * detects the available LDAP groups - * @param string $dbKey - * @param string $confKey - * @param bool $testMemberOf * @return WizardResult|false the instance's WizardResult instance * @throws \Exception */ - private function determineGroups($dbKey, $confKey, $testMemberOf = true) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + private function determineGroups(string $dbKey, string $confKey, bool $testMemberOf = true) { + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -418,7 +380,7 @@ class Wizard extends LDAPUtility { $this->fetchGroups($dbKey, $confKey); if ($testMemberOf) { - $this->configuration->hasMemberOfFilterSupport = $this->testMemberOf(); + $this->configuration->hasMemberOfFilterSupport = (string)$this->testMemberOf(); $this->result->markChange(); if (!$this->configuration->hasMemberOfFilterSupport) { throw new \Exception('memberOf is not supported by the server'); @@ -431,17 +393,14 @@ class Wizard extends LDAPUtility { /** * fetches all groups from LDAP and adds them to the result object * - * @param string $dbKey - * @param string $confKey - * @return array $groupEntries * @throws \Exception */ - public function fetchGroups($dbKey, $confKey) { + public function fetchGroups(string $dbKey, string $confKey): array { $obclasses = ['posixGroup', 'group', 'zimbraDistributionList', 'groupOfNames', 'groupOfUniqueNames']; $filterParts = []; foreach ($obclasses as $obclass) { - $filterParts[] = 'objectclass='.$obclass; + $filterParts[] = 'objectclass=' . $obclass; } //we filter for everything //- that looks like a group and @@ -458,7 +417,7 @@ class Wizard extends LDAPUtility { // detection will fail later $result = $this->access->searchGroups($filter, ['cn', 'dn'], $limit, $offset); foreach ($result as $item) { - if (!isset($item['cn']) && !is_array($item['cn']) && !isset($item['cn'][0])) { + if (!isset($item['cn']) || !is_array($item['cn']) || !isset($item['cn'][0])) { // just in case - no issue known continue; } @@ -483,11 +442,15 @@ class Wizard extends LDAPUtility { return $groupEntries; } + /** + * @return WizardResult|false + */ public function determineGroupMemberAssoc() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapGroupFilter', - ])) { + $reqs = ['ldapHost', 'ldapGroupFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $attribute = $this->detectGroupMemberAssoc(); @@ -506,10 +469,11 @@ class Wizard extends LDAPUtility { * @throws \Exception */ public function determineGroupObjectClasses() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -519,24 +483,25 @@ class Wizard extends LDAPUtility { $obclasses = ['groupOfNames', 'groupOfUniqueNames', 'group', 'posixGroup', '*']; $this->determineFeature($obclasses, - 'objectclass', - 'ldap_groupfilter_objectclass', - 'ldapGroupFilterObjectclass', - false); + 'objectclass', + 'ldap_groupfilter_objectclass', + 'ldapGroupFilterObjectclass', + false); return $this->result; } /** * detects the available object classes - * @return WizardResult + * @return WizardResult|false * @throws \Exception */ public function determineUserObjectClasses() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->getConnection(); @@ -550,10 +515,10 @@ class Wizard extends LDAPUtility { //if filter is empty, it is probably the first time the wizard is called //then, apply suggestions. $this->determineFeature($obclasses, - 'objectclass', - 'ldap_userfilter_objectclass', - 'ldapUserFilterObjectclass', - empty($filter)); + 'objectclass', + 'ldap_userfilter_objectclass', + 'ldapUserFilterObjectclass', + empty($filter)); return $this->result; } @@ -563,10 +528,11 @@ class Wizard extends LDAPUtility { * @throws \Exception */ public function getGroupFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } //make sure the use display name is set @@ -574,7 +540,7 @@ class Wizard extends LDAPUtility { if ($displayName === '') { $d = $this->configuration->getDefaults(); $this->applyFind('ldap_group_display_name', - $d['ldap_group_display_name']); + $d['ldap_group_display_name']); } $filter = $this->composeLdapFilter(self::LFILTER_GROUP_LIST); @@ -587,10 +553,11 @@ class Wizard extends LDAPUtility { * @throws \Exception */ public function getUserListFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - ])) { + $reqs = ['ldapHost', 'ldapBase']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } //make sure the use display name is set @@ -609,15 +576,15 @@ class Wizard extends LDAPUtility { } /** - * @return bool|WizardResult + * @return WizardResult|false * @throws \Exception */ public function getUserLoginFilter() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapUserFilter', - ])) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -631,23 +598,19 @@ class Wizard extends LDAPUtility { } /** - * @return bool|WizardResult - * @param string $loginName + * @return WizardResult|false * @throws \Exception */ - public function testLoginName($loginName) { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - 'ldapBase', - 'ldapLoginFilter', - ])) { + public function testLoginName(string $loginName) { + $reqs = ['ldapHost', 'ldapBase', 'ldapUserFilter']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } $cr = $this->access->connection->getConnectionResource(); - if (!$this->ldap->isResource($cr)) { - throw new \Exception('connection error'); - } if (mb_strpos($this->access->connection->ldapLoginFilter, '%uid', 0, 'UTF-8') === false) { @@ -677,19 +640,15 @@ class Wizard extends LDAPUtility { $this->checkHost(); $portSettings = $this->getPortSettingsToTry(); - if (!is_array($portSettings)) { - throw new \Exception(print_r($portSettings, true)); - } - //proceed from the best configuration and return on first success foreach ($portSettings as $setting) { $p = $setting['port']; $t = $setting['tls']; $this->logger->debug( - 'Wiz: trying port '. $p . ', TLS '. $t, + 'Wiz: trying port ' . $p . ', TLS ' . $t, ['app' => 'user_ldap'] ); - //connectAndBind may throw Exception, it needs to be catched by the + //connectAndBind may throw Exception, it needs to be caught by the //callee of this method try { @@ -707,8 +666,8 @@ class Wizard extends LDAPUtility { if ($settingsFound === true) { $config = [ - 'ldapPort' => $p, - 'ldapTLS' => (int)$t + 'ldapPort' => (string)$p, + 'ldapTLS' => (string)$t, ]; $this->configuration->setConfiguration($config); $this->logger->debug( @@ -729,9 +688,11 @@ class Wizard extends LDAPUtility { * @return WizardResult|false WizardResult on success, false otherwise */ public function guessBaseDN() { - if (!$this->checkRequirements(['ldapHost', - 'ldapPort', - ])) { + $reqs = ['ldapHost']; + if (!$this->configuration->usesLdapi()) { + $reqs[] = 'ldapPort'; + } + if (!$this->checkRequirements($reqs)) { return false; } @@ -749,7 +710,7 @@ class Wizard extends LDAPUtility { //this did not help :( //Let's see whether we can parse the Host URL and convert the domain to //a base DN - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $domain = $helper->getDomainFromURL($this->configuration->ldapHost); if (!$domain) { return false; @@ -775,7 +736,7 @@ class Wizard extends LDAPUtility { * @param string $value the (detected) value * */ - private function applyFind($key, $value) { + private function applyFind(string $key, string $value): void { $this->result->addChange($key, $value); $this->configuration->setConfiguration([$key => $value]); } @@ -785,23 +746,23 @@ class Wizard extends LDAPUtility { * field. In this case the port will be stripped off, but also stored as * setting. */ - private function checkHost() { + private function checkHost(): void { $host = $this->configuration->ldapHost; $hostInfo = parse_url($host); //removes Port from Host if (is_array($hostInfo) && isset($hostInfo['port'])) { $port = $hostInfo['port']; - $host = str_replace(':'.$port, '', $host); + $host = str_replace(':' . $port, '', $host); $this->applyFind('ldap_host', $host); - $this->applyFind('ldap_port', $port); + $this->applyFind('ldap_port', (string)$port); } } /** * tries to detect the group member association attribute which is * one of 'uniqueMember', 'memberUid', 'member', 'gidNumber' - * @return string|false, string with the attribute name, false on error + * @return string|false string with the attribute name, false on error * @throws \Exception */ private function detectGroupMemberAssoc() { @@ -819,6 +780,7 @@ class Wizard extends LDAPUtility { if (!$this->ldap->isResource($rr)) { return false; } + /** @var \LDAP\Result $rr */ $er = $this->ldap->firstEntry($cr, $rr); while ($this->ldap->isResource($er)) { $this->ldap->getDN($cr, $er); @@ -847,7 +809,7 @@ class Wizard extends LDAPUtility { * @return bool true on success, false otherwise * @throws \Exception */ - private function testBaseDN($base) { + private function testBaseDN(string $base): bool { $cr = $this->getConnection(); if (!$cr) { throw new \Exception('Could not connect to LDAP'); @@ -860,11 +822,12 @@ class Wizard extends LDAPUtility { $errorNo = $this->ldap->errno($cr); $errorMsg = $this->ldap->error($cr); $this->logger->info( - 'Wiz: Could not search base '.$base.' Error '.$errorNo.': '.$errorMsg, + 'Wiz: Could not search base ' . $base . ' Error ' . $errorNo . ': ' . $errorMsg, ['app' => 'user_ldap'] ); return false; } + /** @var \LDAP\Result $rr */ $entries = $this->ldap->countEntries($cr, $rr); return ($entries !== false) && ($entries > 0); } @@ -878,7 +841,7 @@ class Wizard extends LDAPUtility { * @return bool true if it does, false otherwise * @throws \Exception */ - private function testMemberOf() { + private function testMemberOf(): bool { $cr = $this->getConnection(); if (!$cr) { throw new \Exception('Could not connect to LDAP'); @@ -892,13 +855,12 @@ class Wizard extends LDAPUtility { /** * creates an LDAP Filter from given configuration - * @param integer $filterType int, for which use case the filter shall be created - * can be any of self::LFILTER_USER_LIST, self::LFILTER_LOGIN or - * self::LFILTER_GROUP_LIST - * @return string|false string with the filter on success, false otherwise + * @param int $filterType int, for which use case the filter shall be created + * can be any of self::LFILTER_USER_LIST, self::LFILTER_LOGIN or + * self::LFILTER_GROUP_LIST * @throws \Exception */ - private function composeLdapFilter($filterType) { + private function composeLdapFilter(int $filterType): string { $filter = ''; $parts = 0; switch ($filterType) { @@ -908,7 +870,7 @@ class Wizard extends LDAPUtility { if (is_array($objcs) && count($objcs) > 0) { $filter .= '(|'; foreach ($objcs as $objc) { - $filter .= '(objectclass=' . $objc . ')'; + $filter .= '(objectclass=' . ldap_escape($objc, '', LDAP_ESCAPE_FILTER) . ')'; } $filter .= ')'; $parts++; @@ -924,20 +886,21 @@ class Wizard extends LDAPUtility { } $base = $this->configuration->ldapBase[0]; foreach ($cns as $cn) { - $rr = $this->ldap->search($cr, $base, 'cn=' . $cn, ['dn', 'primaryGroupToken']); + $rr = $this->ldap->search($cr, $base, 'cn=' . ldap_escape($cn, '', LDAP_ESCAPE_FILTER), ['dn', 'primaryGroupToken']); if (!$this->ldap->isResource($rr)) { continue; } + /** @var \LDAP\Result $rr */ $er = $this->ldap->firstEntry($cr, $rr); $attrs = $this->ldap->getAttributes($cr, $er); $dn = $this->ldap->getDN($cr, $er); if ($dn === false || $dn === '') { continue; } - $filterPart = '(memberof=' . $dn . ')'; + $filterPart = '(memberof=' . ldap_escape($dn, '', LDAP_ESCAPE_FILTER) . ')'; if (isset($attrs['primaryGroupToken'])) { $pgt = $attrs['primaryGroupToken'][0]; - $primaryFilterPart = '(primaryGroupID=' . $pgt .')'; + $primaryFilterPart = '(primaryGroupID=' . ldap_escape($pgt, '', LDAP_ESCAPE_FILTER) . ')'; $filterPart = '(|' . $filterPart . $primaryFilterPart . ')'; } $filter .= $filterPart; @@ -961,7 +924,7 @@ class Wizard extends LDAPUtility { if (is_array($objcs) && count($objcs) > 0) { $filter .= '(|'; foreach ($objcs as $objc) { - $filter .= '(objectclass=' . $objc . ')'; + $filter .= '(objectclass=' . ldap_escape($objc, '', LDAP_ESCAPE_FILTER) . ')'; } $filter .= ')'; $parts++; @@ -971,7 +934,7 @@ class Wizard extends LDAPUtility { if (is_array($cns) && count($cns) > 0) { $filter .= '(|'; foreach ($cns as $cn) { - $filter .= '(cn=' . $cn . ')'; + $filter .= '(cn=' . ldap_escape($cn, '', LDAP_ESCAPE_FILTER) . ')'; } $filter .= ')'; } @@ -987,6 +950,9 @@ class Wizard extends LDAPUtility { $loginpart = '=%uid'; $filterUsername = ''; $userAttributes = $this->getUserAttributes(); + if ($userAttributes === false) { + throw new \Exception('Failed to get user attributes'); + } $userAttributes = array_change_key_case(array_flip($userAttributes)); $parts = 0; @@ -1034,12 +1000,12 @@ class Wizard extends LDAPUtility { $filterLogin .= ')'; } - $filter = '(&'.$ulf.$filterLogin.')'; + $filter = '(&' . $ulf . $filterLogin . ')'; break; } $this->logger->debug( - 'Wiz: Final filter '.$filter, + 'Wiz: Final filter ' . $filter, ['app' => 'user_ldap'] ); @@ -1051,24 +1017,24 @@ class Wizard extends LDAPUtility { * * @param int $port the port to connect with * @param bool $tls whether startTLS is to be used - * @return bool * @throws \Exception */ - private function connectAndBind($port, $tls) { + private function connectAndBind(int $port, bool $tls): bool { //connect, does not really trigger any server communication $host = $this->configuration->ldapHost; - $hostInfo = parse_url($host); - if (!$hostInfo) { + $hostInfo = parse_url((string)$host); + if (!is_string($host) || !$hostInfo) { throw new \Exception(self::$l->t('Invalid Host')); } $this->logger->debug( 'Wiz: Attempting to connect', ['app' => 'user_ldap'] ); - $cr = $this->ldap->connect($host, $port); + $cr = $this->ldap->connect($host, (string)$port); if (!$this->ldap->isResource($cr)) { throw new \Exception(self::$l->t('Invalid Host')); } + /** @var \LDAP\Connection $cr */ //set LDAP options $this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3); @@ -1084,7 +1050,7 @@ class Wizard extends LDAPUtility { } $this->logger->debug( - 'Wiz: Attemping to Bind', + 'Wiz: Attempting to Bind', ['app' => 'user_ldap'] ); //interesting part: do the bind! @@ -1093,16 +1059,15 @@ class Wizard extends LDAPUtility { $this->configuration->ldapAgentPassword ); $errNo = $this->ldap->errno($cr); - $error = ldap_error($cr); + $error = $this->ldap->error($cr); $this->ldap->unbind($cr); } catch (ServerNotAvailableException $e) { return false; } if ($login === true) { - $this->ldap->unbind($cr); $this->logger->debug( - 'Wiz: Bind successful to Port '. $port . ' TLS ' . (int)$tls, + 'Wiz: Bind successful to Port ' . $port . ' TLS ' . (int)$tls, ['app' => 'user_ldap'] ); return true; @@ -1118,9 +1083,9 @@ class Wizard extends LDAPUtility { /** * checks whether a valid combination of agent and password has been * provided (either two values or nothing for anonymous connect) - * @return bool, true if everything is fine, false otherwise + * @return bool true if everything is fine, false otherwise */ - private function checkAgentRequirements() { + private function checkAgentRequirements(): bool { $agent = $this->configuration->ldapAgentName; $pwd = $this->configuration->ldapAgentPassword; @@ -1130,11 +1095,7 @@ class Wizard extends LDAPUtility { ; } - /** - * @param array $reqs - * @return bool - */ - private function checkRequirements($reqs) { + private function checkRequirements(array $reqs): bool { $this->checkAgentRequirements(); foreach ($reqs as $option) { $value = $this->configuration->$option; @@ -1151,12 +1112,12 @@ class Wizard extends LDAPUtility { * @param string[] $filters array, the filters that shall be used in the search * @param string $attr the attribute of which a list of values shall be returned * @param int $dnReadLimit the amount of how many DNs should be analyzed. - * The lower, the faster + * The lower, the faster * @param string $maxF string. if not null, this variable will have the filter that - * yields most result entries + * yields most result entries * @return array|false an array with the values on success, false otherwise */ - public function cumulativeSearchOnAttribute($filters, $attr, $dnReadLimit = 3, &$maxF = null) { + public function cumulativeSearchOnAttribute(array $filters, string $attr, int $dnReadLimit = 3, ?string &$maxF = null) { $dnRead = []; $foundItems = []; $maxEntries = 0; @@ -1169,6 +1130,7 @@ class Wizard extends LDAPUtility { if (!$this->ldap->isResource($cr)) { return false; } + /** @var \LDAP\Connection $cr */ $lastFilter = null; if (isset($filters[count($filters) - 1])) { $lastFilter = $filters[count($filters) - 1]; @@ -1183,6 +1145,7 @@ class Wizard extends LDAPUtility { if (!$this->ldap->isResource($rr)) { continue; } + /** @var \LDAP\Result $rr */ $entries = $this->ldap->countEntries($cr, $rr); $getEntryFunc = 'firstEntry'; if (($entries !== false) && ($entries > 0)) { @@ -1200,20 +1163,19 @@ class Wizard extends LDAPUtility { $rr = $entry; //will be expected by nextEntry next round $attributes = $this->ldap->getAttributes($cr, $entry); $dn = $this->ldap->getDN($cr, $entry); - if ($dn === false || in_array($dn, $dnRead)) { + if ($attributes === false || $dn === false || in_array($dn, $dnRead)) { continue; } $newItems = []; - $state = $this->getAttributeValuesFromEntry($attributes, - $attr, - $newItems); + $state = $this->getAttributeValuesFromEntry( + $attributes, + $attr, + $newItems + ); $dnReadCount++; $foundItems = array_merge($foundItems, $newItems); - $this->resultCache[$dn][$attr] = $newItems; $dnRead[] = $dn; - } while (($state === self::LRESULT_PROCESSED_SKIP - || $this->ldap->isResource($entry)) - && ($dnReadLimit === 0 || $dnReadCount < $dnReadLimit)); + } while ($dnReadLimit === 0 || $dnReadCount < $dnReadLimit); } } @@ -1226,20 +1188,20 @@ class Wizard extends LDAPUtility { * @param string $attr the attribute to look for * @param string $dbkey the dbkey of the setting the feature is connected to * @param string $confkey the confkey counterpart for the $dbkey as used in the - * Configuration class + * Configuration class * @param bool $po whether the objectClass with most result entries - * shall be pre-selected via the result - * @return array|false list of found items. + * shall be pre-selected via the result + * @return array list of found items. * @throws \Exception */ - private function determineFeature($objectclasses, $attr, $dbkey, $confkey, $po = false) { + private function determineFeature(array $objectclasses, string $attr, string $dbkey, string $confkey, bool $po = false): array { $cr = $this->getConnection(); if (!$cr) { throw new \Exception('Could not connect to LDAP'); } $p = 'objectclass='; foreach ($objectclasses as $key => $value) { - $objectclasses[$key] = $p.$value; + $objectclasses[$key] = $p . $value; } $maxEntryObjC = ''; @@ -1247,9 +1209,9 @@ class Wizard extends LDAPUtility { //When looking for objectclasses, testing few entries is sufficient, $dig = 3; - $availableFeatures = - $this->cumulativeSearchOnAttribute($objectclasses, $attr, - $dig, $maxEntryObjC); + $availableFeatures + = $this->cumulativeSearchOnAttribute($objectclasses, $attr, + $dig, $maxEntryObjC); if (is_array($availableFeatures) && count($availableFeatures) > 0) { natcasesort($availableFeatures); @@ -1279,18 +1241,17 @@ class Wizard extends LDAPUtility { * @param array $result the return value from ldap_get_attributes * @param string $attribute the attribute values to look for * @param array &$known new values will be appended here - * @return int, state on of the class constants LRESULT_PROCESSED_OK, - * LRESULT_PROCESSED_INVALID or LRESULT_PROCESSED_SKIP + * @return int state on of the class constants LRESULT_PROCESSED_OK, + * LRESULT_PROCESSED_INVALID or LRESULT_PROCESSED_SKIP */ - private function getAttributeValuesFromEntry($result, $attribute, &$known) { - if (!is_array($result) - || !isset($result['count']) + private function getAttributeValuesFromEntry(array $result, string $attribute, array &$known): int { + if (!isset($result['count']) || !$result['count'] > 0) { return self::LRESULT_PROCESSED_INVALID; } // strtolower on all keys for proper comparison - $result = \OCP\Util::mb_array_change_key_case($result); + $result = Util::mb_array_change_key_case($result); $attribute = strtolower($attribute); if (isset($result[$attribute])) { foreach ($result[$attribute] as $key => $val) { @@ -1308,9 +1269,9 @@ class Wizard extends LDAPUtility { } /** - * @return bool|mixed + * @return \LDAP\Connection|false a link resource on success, otherwise false */ - private function getConnection() { + private function getConnection(): \LDAP\Connection|false { if (!is_null($this->cr)) { return $this->cr; } @@ -1320,16 +1281,20 @@ class Wizard extends LDAPUtility { $this->configuration->ldapPort ); + if ($cr === false) { + return false; + } + $this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3); $this->ldap->setOption($cr, LDAP_OPT_REFERRALS, 0); $this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT); - if ($this->configuration->ldapTLS === 1) { + if ($this->configuration->ldapTLS) { $this->ldap->startTls($cr); } $lo = @$this->ldap->bind($cr, - $this->configuration->ldapAgentName, - $this->configuration->ldapAgentPassword); + $this->configuration->ldapAgentName, + $this->configuration->ldapAgentPassword); if ($lo === true) { $this->cr = $cr; return $cr; @@ -1339,9 +1304,9 @@ class Wizard extends LDAPUtility { } /** - * @return array + * @return array<array{port:int,tls:bool}> */ - private function getDefaultLdapPortSettings() { + private function getDefaultLdapPortSettings(): array { static $settings = [ ['port' => 7636, 'tls' => false], ['port' => 636, 'tls' => false], @@ -1354,9 +1319,9 @@ class Wizard extends LDAPUtility { } /** - * @return array + * @return array<array{port:int,tls:bool}> */ - private function getPortSettingsToTry() { + private function getPortSettingsToTry(): array { //389 ← LDAP / Unencrypted or StartTLS //636 ← LDAPS / SSL //7xxx ← UCS. need to be checked first, because both ports may be open @@ -1373,11 +1338,13 @@ class Wizard extends LDAPUtility { $portSettings[] = ['port' => $port, 'tls' => true]; } $portSettings[] = ['port' => $port, 'tls' => false]; + } elseif ($this->configuration->usesLdapi()) { + $portSettings[] = ['port' => 0, 'tls' => false]; } //default ports $portSettings = array_merge($portSettings, - $this->getDefaultLdapPortSettings()); + $this->getDefaultLdapPortSettings()); return $portSettings; } diff --git a/apps/user_ldap/lib/WizardResult.php b/apps/user_ldap/lib/WizardResult.php index 0f8d9f46fdd..d6fd67d4204 100644 --- a/apps/user_ldap/lib/WizardResult.php +++ b/apps/user_ldap/lib/WizardResult.php @@ -1,29 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Bart Visscher <bartv@thisnet.nl> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP; @@ -40,7 +20,7 @@ class WizardResult { $this->changes[$key] = $value; } - + public function markChange() { $this->markedChange = true; } diff --git a/apps/user_ldap/openapi.json b/apps/user_ldap/openapi.json new file mode 100644 index 00000000000..0881d2e7d51 --- /dev/null +++ b/apps/user_ldap/openapi.json @@ -0,0 +1,477 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "user_ldap", + "version": "0.0.1", + "description": "This application enables administrators to connect Nextcloud to an LDAP-based user directory.", + "license": { + "name": "agpl" + } + }, + "components": { + "securitySchemes": { + "basic_auth": { + "type": "http", + "scheme": "basic" + }, + "bearer_auth": { + "type": "http", + "scheme": "bearer" + } + }, + "schemas": { + "OCSMeta": { + "type": "object", + "required": [ + "status", + "statuscode" + ], + "properties": { + "status": { + "type": "string" + }, + "statuscode": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "totalitems": { + "type": "string" + }, + "itemsperpage": { + "type": "string" + } + } + } + } + }, + "paths": { + "/ocs/v2.php/apps/user_ldap/api/v1/config": { + "post": { + "operationId": "configapi-create", + "summary": "Create a new (empty) configuration and return the resulting prefix", + "description": "This endpoint requires admin access", + "tags": [ + "configapi" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Config created successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "required": [ + "configID" + ], + "properties": { + "configID": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/ocs/v2.php/apps/user_ldap/api/v1/config/{configID}": { + "get": { + "operationId": "configapi-show", + "summary": "Get a configuration", + "description": "Output can look like this: <?xml version=\"1.0\"?> <ocs> <meta> <status>ok</status> <statuscode>200</statuscode> <message>OK</message> </meta> <data> <ldapHost>ldaps://my.ldap.server</ldapHost> <ldapPort>7770</ldapPort> <ldapBackupHost></ldapBackupHost> <ldapBackupPort></ldapBackupPort> <ldapBase>ou=small,dc=my,dc=ldap,dc=server</ldapBase> <ldapBaseUsers>ou=users,ou=small,dc=my,dc=ldap,dc=server</ldapBaseUsers> <ldapBaseGroups>ou=small,dc=my,dc=ldap,dc=server</ldapBaseGroups> <ldapAgentName>cn=root,dc=my,dc=ldap,dc=server</ldapAgentName> <ldapAgentPassword>clearTextWithShowPassword=1</ldapAgentPassword> <ldapTLS>1</ldapTLS> <turnOffCertCheck>0</turnOffCertCheck> <ldapIgnoreNamingRules/> <ldapUserDisplayName>displayname</ldapUserDisplayName> <ldapUserDisplayName2>uid</ldapUserDisplayName2> <ldapUserFilterObjectclass>inetOrgPerson</ldapUserFilterObjectclass> <ldapUserFilterGroups></ldapUserFilterGroups> <ldapUserFilter>(&(objectclass=nextcloudUser)(nextcloudEnabled=TRUE))</ldapUserFilter> <ldapUserFilterMode>1</ldapUserFilterMode> <ldapGroupFilter>(&(|(objectclass=nextcloudGroup)))</ldapGroupFilter> <ldapGroupFilterMode>0</ldapGroupFilterMode> <ldapGroupFilterObjectclass>nextcloudGroup</ldapGroupFilterObjectclass> <ldapGroupFilterGroups></ldapGroupFilterGroups> <ldapGroupDisplayName>cn</ldapGroupDisplayName> <ldapGroupMemberAssocAttr>memberUid</ldapGroupMemberAssocAttr> <ldapLoginFilter>(&(|(objectclass=inetOrgPerson))(uid=%uid))</ldapLoginFilter> <ldapLoginFilterMode>0</ldapLoginFilterMode> <ldapLoginFilterEmail>0</ldapLoginFilterEmail> <ldapLoginFilterUsername>1</ldapLoginFilterUsername> <ldapLoginFilterAttributes></ldapLoginFilterAttributes> <ldapQuotaAttribute></ldapQuotaAttribute> <ldapQuotaDefault></ldapQuotaDefault> <ldapEmailAttribute>mail</ldapEmailAttribute> <ldapCacheTTL>20</ldapCacheTTL> <ldapUuidUserAttribute>auto</ldapUuidUserAttribute> <ldapUuidGroupAttribute>auto</ldapUuidGroupAttribute> <ldapOverrideMainServer></ldapOverrideMainServer> <ldapConfigurationActive>1</ldapConfigurationActive> <ldapAttributesForUserSearch>uid;sn;givenname</ldapAttributesForUserSearch> <ldapAttributesForGroupSearch></ldapAttributesForGroupSearch> <ldapExperiencedAdmin>0</ldapExperiencedAdmin> <homeFolderNamingRule></homeFolderNamingRule> <hasMemberOfFilterSupport></hasMemberOfFilterSupport> <useMemberOfToDetectMembership>1</useMemberOfToDetectMembership> <ldapExpertUsernameAttr>uid</ldapExpertUsernameAttr> <ldapExpertUUIDUserAttr>uid</ldapExpertUUIDUserAttr> <ldapExpertUUIDGroupAttr></ldapExpertUUIDGroupAttr> <lastJpegPhotoLookup>0</lastJpegPhotoLookup> <ldapNestedGroups>0</ldapNestedGroups> <ldapPagingSize>500</ldapPagingSize> <turnOnPasswordChange>1</turnOnPasswordChange> <ldapDynamicGroupMemberURL></ldapDynamicGroupMemberURL> </data> </ocs>\nThis endpoint requires admin access", + "tags": [ + "configapi" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "configID", + "in": "path", + "description": "ID of the config", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "showPassword", + "in": "query", + "description": "Whether to show the password", + "schema": { + "type": "integer", + "default": 0, + "enum": [ + 0, + 1 + ] + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Config returned", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "object", + "additionalProperties": { + "type": "object" + } + } + } + } + } + } + } + } + }, + "404": { + "description": "Config not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + } + } + }, + "put": { + "operationId": "configapi-modify", + "summary": "Modify a configuration", + "description": "This endpoint requires admin access", + "tags": [ + "configapi" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "configData" + ], + "properties": { + "configData": { + "type": "object", + "description": "New config", + "additionalProperties": { + "type": "object" + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "configID", + "in": "path", + "description": "ID of the config", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Config returned", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "400": { + "description": "Modifying config is not possible", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "404": { + "description": "Config not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + } + } + }, + "delete": { + "operationId": "configapi-delete", + "summary": "Delete a LDAP configuration", + "description": "This endpoint requires admin access", + "tags": [ + "configapi" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "configID", + "in": "path", + "description": "ID of the config", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Config deleted successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "404": { + "description": "Config not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + } + } + } + } + }, + "tags": [] +} diff --git a/apps/user_ldap/openapi.json.license b/apps/user_ldap/openapi.json.license new file mode 100644 index 00000000000..83559daa9dc --- /dev/null +++ b/apps/user_ldap/openapi.json.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors +SPDX-License-Identifier: AGPL-3.0-or-later
\ No newline at end of file diff --git a/apps/user_ldap/templates/part.settingcontrols.php b/apps/user_ldap/templates/part.settingcontrols.php index a418885f47e..4105fa751b9 100644 --- a/apps/user_ldap/templates/part.settingcontrols.php +++ b/apps/user_ldap/templates/part.settingcontrols.php @@ -1,10 +1,18 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2017 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <div class="ldapSettingControls"> <button type="button" class="ldap_action_test_connection" name="ldap_action_test_connection"> <?php p($l->t('Test Configuration'));?> </button> <a href="<?php p(link_to_docs('admin-ldap')); ?>" target="_blank" rel="noreferrer noopener"> - <img src="<?php print_unescaped(image_path('', 'actions/info.svg')); ?>" + <img src="<?php print_unescaped(image_path('core', 'actions/info.svg')); ?>" style="height:1.75ex" /> <?php p($l->t('Help'));?> </a> diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php index a059b466812..bab08d85da8 100644 --- a/apps/user_ldap/templates/part.wizard-groupfilter.php +++ b/apps/user_ldap/templates/part.wizard-groupfilter.php @@ -1,3 +1,11 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2015 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <fieldset id="ldapWizard4"> <div> <p> @@ -27,13 +35,21 @@ <p class="ldapManyGroupsSupport hidden"> <label></label> <select class="ldapGroupList ldapGroupListAvailable" multiple="multiple" + aria-describedby="ldapGroupListAvailable_instructions" title="<?php p($l->t('Available groups'));?>"></select> + <p class="hidden-visually" id="ldapGroupListAvailable_instructions"> + <?php p($l->t('Available groups'));?> + </p> <span class="buttonSpan"> <button class="ldapGroupListSelect" type="button">></button><br/> <button class="ldapGroupListDeselect" type="button"><</button> </span> <select class="ldapGroupList ldapGroupListSelected" multiple="multiple" + aria-describedby="ldapGroupListSelected_instructions" title="<?php p($l->t('Selected groups'));?>"></select> + <p class="hidden-visually" id="ldapGroupListSelected_instructions"> + <?php p($l->t('Selected groups'));?> + </p> </p> <p> <label><a id='toggleRawGroupFilter' class='ldapToggle'>↓ <?php p($l->t('Edit LDAP Query'));?></a></label> @@ -45,8 +61,13 @@ <p id="rawGroupFilterContainer" class="invisible"> <textarea type="text" id="ldap_group_filter" name="ldap_group_filter" placeholder="<?php p($l->t('Edit LDAP Query'));?>" + aria-describedby="rawGroupFilterContainer_instructions" title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', [$theme->getName()]));?>"> </textarea> + <p class="hidden-visually" id="rawGroupFilterContainer_instructions"> + <?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', [$theme->getName()]));?> + </p> + </p> <p> <div class="ldapWizardInfo invisible"> </div> diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php index 1cc46ff52c4..541a5c06c8c 100644 --- a/apps/user_ldap/templates/part.wizard-loginfilter.php +++ b/apps/user_ldap/templates/part.wizard-loginfilter.php @@ -1,3 +1,11 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2017 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <fieldset id="ldapWizard3"> <div> <p> @@ -9,8 +17,12 @@ </label> <input type="checkbox" id="ldap_loginfilter_username" + aria-describedby="ldap_loginfilter_username_instructions" title="<?php p($l->t('Allows login against the LDAP/AD username, which is either "uid" or "sAMAccountName" and will be detected.'));?>" name="ldap_loginfilter_username" value="1" /> + <p class="hidden-visually" id="ldap_loginfilter_username_instructions"> + <?php p($l->t('Allows login against the LDAP/AD username, which is either "uid" or "sAMAccountName" and will be detected.'));?> + </p> </p> <p> <label for="ldap_loginfilter_email"> @@ -19,7 +31,11 @@ <input type="checkbox" id="ldap_loginfilter_email" title="<?php p($l->t('Allows login against an email attribute. "mail" and "mailPrimaryAddress" allowed.'));?>" + aria-describedby="ldap_loginfilter_email_instructions" name="ldap_loginfilter_email" value="1" /> + <p class="hidden-visually" id="ldap_loginfilter_email_instructions"> + <?php p($l->t('Allows login against an email attribute. "mail" and "mailPrimaryAddress" allowed.'));?> + </p> </p> <p> <label for="ldap_loginfilter_attributes"> @@ -41,8 +57,12 @@ <textarea type="text" id="ldap_login_filter" name="ldap_login_filter" class="ldapFilterInputElement" placeholder="<?php p($l->t('Edit LDAP Query'));?>" + aria-describedby="ldap_login_filter_instructions" title="<?php p($l->t('Defines the filter to apply, when login is attempted. "%%uid" replaces the username in the login action. Example: "uid=%%uid"'));?>"> </textarea> + <p class="hidden-visually" id="ldap_login_filter_instructions"> + <?php p($l->t('Defines the filter to apply, when login is attempted. "%%uid" replaces the username in the login action. Example: "uid=%%uid"'));?> + </p> </p> <p> <div class="ldapWizardInfo invisible"> </div> @@ -51,7 +71,11 @@ <input type="text" id="ldap_test_loginname" name="ldap_test_loginname" placeholder="<?php p($l->t('Test Loginname'));?>" class="ldapVerifyInput" - title="Attempts to receive a DN for the given loginname and the current login filter"/> + aria-describedby="ldap_test_loginname_instructions" + title="<?php p($l->t('Attempts to receive a DN for the given loginname and the current login filter'));?>"/> + <p class="hidden-visually" id="ldap_test_loginname_instructions"> + <?php p($l->t('Attempts to receive a DN for the given loginname and the current login filter'));?> + </p> <button class="ldapVerifyLoginName" name="ldapTestLoginSettings" type="button" disabled="disabled"> <?php p($l->t('Verify settings'));?> </button> diff --git a/apps/user_ldap/templates/part.wizard-server.php b/apps/user_ldap/templates/part.wizard-server.php index ff8630c62cd..9fb67342247 100644 --- a/apps/user_ldap/templates/part.wizard-server.php +++ b/apps/user_ldap/templates/part.wizard-server.php @@ -1,27 +1,47 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2017 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <fieldset id="ldapWizard1"> <p> <select id="ldap_serverconfig_chooser" name="ldap_serverconfig_chooser"> - <?php - $i = 1; - $sel = ' selected'; - foreach ($_['serverConfigurationPrefixes'] as $prefix) { - ?> +<?php +$i = 1; +$sel = ' selected'; +foreach ($_['serverConfigurationPrefixes'] as $prefix) { + ?> <option value="<?php p($prefix); ?>"<?php p($sel); - $sel = ''; ?>><?php p($l->t('%s. Server:', [$i++])); ?> <?php p(' '.$_['serverConfigurationHosts'][$prefix]); ?></option> - <?php - } - ?> + $sel = ''; ?>><?php p($l->t('%s. Server:', [$i++])); ?> <?php p(' ' . $_['serverConfigurationHosts'][$prefix]); ?></option> +<?php +} +?> </select> <button type="button" id="ldap_action_add_configuration" + aria-describedby="ldap_action_add_configuration_instructions" name="ldap_action_add_configuration" class="icon-add icon-default-style" title="<?php p($l->t('Add a new configuration'));?>"> </button> + <p class="hidden-visually" id="ldap_action_add_configuration_instructions"> + <?php p($l->t('Add a new configuration'));?> + </p> <button type="button" id="ldap_action_copy_configuration" name="ldap_action_copy_configuration" + aria-describedby="ldap_action_copy_configuration_instructions" class="ldapIconCopy icon-default-style" title="<?php p($l->t('Copy current configuration into new directory binding'));?>"> </button> + <p class="hidden-visually" id="ldap_action_copy_configuration_instructions"> + <?php p($l->t('Copy current configuration into new directory binding'));?> + </p> <button type="button" id="ldap_action_delete_configuration" + aria-describedby="ldap_action_delete_configuration_instructions" name="ldap_action_delete_configuration" class="icon-delete icon-default-style" title="<?php p($l->t('Delete the current configuration'));?>"> </button> + <p class="hidden-visually" id="ldap_action_delete_configuration_instructions"> + <?php p($l->t('Delete the current configuration'));?> + </p> </p> <div class="hostPortCombinator"> @@ -30,9 +50,13 @@ <div class="table"> <input type="text" class="host" id="ldap_host" name="ldap_host" + aria-describedby="ldap_host_instructions" placeholder="<?php p($l->t('Host'));?>" title="<?php p($l->t('You can omit the protocol, unless you require SSL. If so, start with ldaps://'));?>" /> + <p class="hidden-visually" id="ldap_host_instructions"> + <?php p($l->t('You can omit the protocol, unless you require SSL. If so, start with ldaps://'));?> + </p> <span class="hostPortCombinatorSpan"> <input type="number" id="ldap_port" name="ldap_port" placeholder="<?php p($l->t('Port'));?>" /> @@ -47,17 +71,25 @@ <div class="tablerow"> <input type="text" id="ldap_dn" name="ldap_dn" class="tablecell" + aria-describedby="ldap_dn_instructions" placeholder="<?php p($l->t('User DN'));?>" autocomplete="off" title="<?php p($l->t('The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.'));?>" /> + <p class="hidden-visually" id="ldap_dn_instructions"> + <?php p($l->t('The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.'));?> + </p> </div> <div class="tablerow"> <input type="password" id="ldap_agent_password" class="tablecell" name="ldap_agent_password" + aria-describedby="ldap_agent_password_instructions" placeholder="<?php p($l->t('Password'));?>" autocomplete="off" title="<?php p($l->t('For anonymous access, leave DN and Password empty.'));?>" /> + <p class="hidden-visually" id="ldap_agent_password_instructions"> + <?php p($l->t('For anonymous access, leave DN and Password empty.'));?> + </p> <button class="ldapSaveAgentCredentials" name="ldapSaveAgentCredentials" type="button"> <?php p($l->t('Save Credentials'));?> </button> @@ -67,9 +99,13 @@ <div class="tablerow"> <textarea id="ldap_base" name="ldap_base" class="tablecell" + aria-describedby="ldap_base_instructions" placeholder="<?php p($l->t('One Base DN per line'));?>" title="<?php p($l->t('You can specify Base DN for users and groups in the Advanced tab'));?>"> </textarea> + <p class="hidden-visually" id="ldap_base_instructions"> + <?php p($l->t('You can specify Base DN for users and groups in the Advanced tab'));?> + </p> <button class="ldapDetectBase" name="ldapDetectBase" type="button"> <?php p($l->t('Detect Base DN'));?> </button> @@ -81,8 +117,12 @@ <div class="tablerow left"> <input type="checkbox" id="ldap_experienced_admin" value="1" name="ldap_experienced_admin" class="tablecell" + aria-describedby="ldap_experienced_admin_instructions" title="<?php p($l->t('Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.'));?>" /> + <p class="hidden-visually" id="ldap_experienced_admin_instructions"> + <?php p($l->t('Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge.'));?> + </p> <label for="ldap_experienced_admin" class="tablecell"> <?php p($l->t('Manually enter LDAP filters (recommended for large directories)'));?> </label> diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php index 2b8c3adb686..ab505c65d44 100644 --- a/apps/user_ldap/templates/part.wizard-userfilter.php +++ b/apps/user_ldap/templates/part.wizard-userfilter.php @@ -1,3 +1,11 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <fieldset id="ldapWizard2"> <div> <p> @@ -30,13 +38,21 @@ <p class="ldapManyGroupsSupport hidden"> <label></label> <select class="ldapGroupList ldapGroupListAvailable" multiple="multiple" + aria-describedby="ldapGroupListAvailable_instructions" title="<?php p($l->t('Available groups'));?>"></select> + <p class="hidden-visually" id="ldapGroupListAvailable_instructions"> + <?php p($l->t('Available groups'));?> + </p> <span class="buttonSpan"> <button class="ldapGroupListSelect" type="button">></button><br/> <button class="ldapGroupListDeselect" type="button"><</button> </span> <select class="ldapGroupList ldapGroupListSelected" multiple="multiple" + aria-describedby="ldapGroupListSelected_instructions" title="<?php p($l->t('Selected groups'));?>"></select> + <p class="hidden-visually" id="ldapGroupListSelected_instructions"> + <?php p($l->t('Selected groups'));?> + </p> </p> <p> <label><a id='toggleRawUserFilter' class='ldapToggle'>↓ <?php p($l->t('Edit LDAP Query'));?></a></label> @@ -49,8 +65,12 @@ <textarea type="text" id="ldap_userlist_filter" name="ldap_userlist_filter" class="ldapFilterInputElement" placeholder="<?php p($l->t('Edit LDAP Query'));?>" + aria-describedby="ldap_userlist_filter_instructions" title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', [$theme->getName()]));?>"> </textarea> + <p class="hidden-visually" id="ldap_userlist_filter_instructions"> + <?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', [$theme->getName()]));?> + </p> </p> <p> <div class="ldapWizardInfo invisible"> </div> diff --git a/apps/user_ldap/templates/part.wizardcontrols.php b/apps/user_ldap/templates/part.wizardcontrols.php index bd84b23c76d..2c6b1f16d67 100644 --- a/apps/user_ldap/templates/part.wizardcontrols.php +++ b/apps/user_ldap/templates/part.wizardcontrols.php @@ -1,3 +1,11 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2017-2022 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2013-2017 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ +?> <div class="ldapWizardControls"> <span class="ldap_saving hidden"><?php p($l->t('Saving'));?> <img class="wizSpinner" src="<?php p(image_path('core', 'loading.gif')); ?>"/></span> <span class="ldap_config_state_indicator"></span> <span class="ldap_config_state_indicator_sign"></span> @@ -10,7 +18,7 @@ </button> <a href="<?php p(link_to_docs('admin-ldap')); ?>" target="_blank" rel="noreferrer noopener"> - <img src="<?php print_unescaped(image_path('', 'actions/info.svg')); ?>" + <img src="<?php print_unescaped(image_path('core', 'actions/info.svg')); ?>" style="height:1.75ex" /> <span class="ldap_grey"><?php p($l->t('Help'));?></span> </a> diff --git a/apps/user_ldap/templates/renewpassword.php b/apps/user_ldap/templates/renewpassword.php index 752327ce872..3345be29c13 100644 --- a/apps/user_ldap/templates/renewpassword.php +++ b/apps/user_ldap/templates/renewpassword.php @@ -1,10 +1,16 @@ -<?php /** @var \OCP\IL10N $l */ ?> <?php -script('user_ldap', 'renewPassword'); + +/** + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +/** @var \OCP\IL10N $l */ + +\OCP\Util::addScript('user_ldap', 'renewPassword', 'core'); style('user_ldap', 'renewPassword'); ?> -<form method="post" name="renewpassword" id="renewpassword" action="<?php p(\OC::$server->getURLGenerator()->linkToRoute('user_ldap.renewPassword.tryRenewPassword')); ?>"> +<form method="post" name="renewpassword" id="renewpassword" action="<?php p(\OCP\Server::get(\OCP\IURLGenerator::class)->linkToRoute('user_ldap.renewPassword.tryRenewPassword')); ?>"> <fieldset> <div class="warning title"> <?php p($l->t('Please renew your password.')); ?><br> @@ -30,7 +36,7 @@ style('user_ldap', 'renewPassword'); <p class="grouptop"> <input type="password" id="oldPassword" name="oldPassword" placeholder="<?php echo $l->t('Current password');?>" - autofocus autocomplete="off" autocapitalize="off" autocorrect="off" required/> + autofocus autocomplete="off" autocapitalize="off" spellcheck="false" required/> <label for="oldPassword" class="infield"><?php p($l->t('Current password')); ?></label> </p> @@ -39,10 +45,10 @@ style('user_ldap', 'renewPassword'); <label id="newPassword-label" for="newPassword" class="infield"><?php p($l->t('New password')); ?></label> <input type="password" id="newPassword" name="newPassword" placeholder="<?php echo $l->t('New password');?>" - data-typetoggle="#personal-show" autofocus autocomplete="off" autocapitalize="off" autocorrect="off" required/> + data-typetoggle="#personal-show" autofocus autocomplete="off" autocapitalize="off" spellcheck="false" required/> </p> - - <input type="submit" id="submit" class="login primary icon-confirm-white" title="" value="<?php p($l->t('Renew password')); ?>"/> + + <input type="submit" id="submit" class="login primary icon-confirm-white" value="<?php p($l->t('Renew password')); ?>"/> <?php if (!empty($_['invalidpassword'])) { ?> <p class="warning"> diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index 7c0f31663f0..9117a9f533c 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -1,6 +1,12 @@ <?php -style('user_ldap', 'vendor/ui-multiselect/jquery.multiselect'); +/** + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2011-2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only + */ + +style('user_ldap', 'vendor/ui-multiselect/jquery.multiselect'); script('user_ldap', [ 'vendor/ui-multiselect/src/jquery.multiselect', @@ -67,9 +73,9 @@ style('user_ldap', 'settings'); </ul> <?php if (!function_exists('ldap_connect')) { - print_unescaped('<p class="ldapwarning">'.$l->t('<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.').'</p>'); + print_unescaped('<p class="ldapwarning">' . $l->t('<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it.') . '</p>'); } - ?> +?> <?php require_once __DIR__ . '/part.wizard-server.php'; ?> <?php require_once __DIR__ . '/part.wizard-userfilter.php'; ?> <?php require_once __DIR__ . '/part.wizard-loginfilter.php'; ?> @@ -78,54 +84,69 @@ style('user_ldap', 'settings'); <div id="ldapAdvancedAccordion"> <h3><?php p($l->t('Connection Settings'));?></h3> <div> - <p><label for="ldap_configuration_active"><?php p($l->t('Configuration Active'));?></label><input type="checkbox" id="ldap_configuration_active" name="ldap_configuration_active" value="1" data-default="<?php p($_['ldap_configuration_active_default']); ?>" title="<?php p($l->t('When unchecked, this configuration will be skipped.'));?>" /></p> - <p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"></p> + <p><label for="ldap_configuration_active"><?php p($l->t('Configuration Active'));?></label><input type="checkbox" id="ldap_configuration_active" name="ldap_configuration_active" value="1" data-default="<?php p($_['ldap_configuration_active_default']); ?>" aria-describedby="ldap_configuration_active_instructions" title="<?php p($l->t('When unchecked, this configuration will be skipped.'));?>" /><p class="hidden-visually" id="ldap_configuration_active_instructions"><?php p($l->t('When unchecked, this configuration will be skipped.'));?></p></p> + <p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" aria-describedby="ldap_backup_host_instructions" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"><p class="hidden-visually" id="ldap_backup_host_instructions"><?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?></p></p> <p><label for="ldap_backup_port"><?php p($l->t('Backup (Replica) Port'));?></label><input type="number" id="ldap_backup_port" name="ldap_backup_port" data-default="<?php p($_['ldap_backup_port_default']); ?>" /></p> - <p><label for="ldap_override_main_server"><?php p($l->t('Disable Main Server'));?></label><input type="checkbox" id="ldap_override_main_server" name="ldap_override_main_server" value="1" data-default="<?php p($_['ldap_override_main_server_default']); ?>" title="<?php p($l->t('Only connect to the replica server.'));?>" /></p> - <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', [$theme->getName()]));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p> - <p><label for="ldap_cache_ttl"><?php p($l->t('Cache Time-To-Live'));?></label><input type="number" id="ldap_cache_ttl" name="ldap_cache_ttl" title="<?php p($l->t('in seconds. A change empties the cache.'));?>" data-default="<?php p($_['ldap_cache_ttl_default']); ?>" /></p> + <p><label for="ldap_override_main_server"><?php p($l->t('Disable Main Server'));?></label><input type="checkbox" id="ldap_override_main_server" name="ldap_override_main_server" value="1" data-default="<?php p($_['ldap_override_main_server_default']); ?>" aria-describedby="ldap_override_main_server_instructions" title="<?php p($l->t('Only connect to the replica server.'));?>" /><p class="hidden-visually" id="ldap_override_main_server_instructions"><?php p($l->t('Only connect to the replica server.'));?></p></p> + <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" aria-describedby="ldap_turn_off_cert_check_instructions" title="<?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', [$theme->getName()]));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><p class="hidden-visually" id="ldap_turn_off_cert_check_instructions"><?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', [$theme->getName()]));?></p><br/></p> + <p><label for="ldap_cache_ttl"><?php p($l->t('Cache Time-To-Live'));?></label><input type="number" id="ldap_cache_ttl" name="ldap_cache_ttl" aria-describedby="ldap_cache_ttl_instructions" title="<?php p($l->t('in seconds. A change empties the cache.'));?>" data-default="<?php p($_['ldap_cache_ttl_default']); ?>" /><p class="hidden-visually" id="ldap_cache_ttl_instructions"><?php p($l->t('in seconds. A change empties the cache.'));?></p></p> </div> <h3><?php p($l->t('Directory Settings'));?></h3> <div> - <p><label for="ldap_display_name"><?php p($l->t('User Display Name Field'));?></label><input type="text" id="ldap_display_name" name="ldap_display_name" data-default="<?php p($_['ldap_display_name_default']); ?>" title="<?php p($l->t('The LDAP attribute to use to generate the user\'s display name.'));?>" /></p> - <p><label for="ldap_user_display_name_2"><?php p($l->t('2nd User Display Name Field'));?></label><input type="text" id="ldap_user_display_name_2" name="ldap_user_display_name_2" data-default="<?php p($_['ldap_user_display_name_2_default']); ?>" title="<?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?>" /></p> - <p><label for="ldap_base_users"><?php p($l->t('Base User Tree'));?></label><textarea id="ldap_base_users" name="ldap_base_users" placeholder="<?php p($l->t('One User Base DN per line'));?>" data-default="<?php p($_['ldap_base_users_default']); ?>" title="<?php p($l->t('Base User Tree'));?>"></textarea></p> - <p><label for="ldap_attributes_for_user_search"><?php p($l->t('User Search Attributes'));?></label><textarea id="ldap_attributes_for_user_search" name="ldap_attributes_for_user_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_user_search_default']); ?>" title="<?php p($l->t('User Search Attributes'));?>"></textarea></p> - <p><label for="ldap_group_display_name"><?php p($l->t('Group Display Name Field'));?></label><input type="text" id="ldap_group_display_name" name="ldap_group_display_name" data-default="<?php p($_['ldap_group_display_name_default']); ?>" title="<?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?>" /></p> - <p><label for="ldap_base_groups"><?php p($l->t('Base Group Tree'));?></label><textarea id="ldap_base_groups" name="ldap_base_groups" placeholder="<?php p($l->t('One Group Base DN per line'));?>" data-default="<?php p($_['ldap_base_groups_default']); ?>" title="<?php p($l->t('Base Group Tree'));?>"></textarea></p> - <p><label for="ldap_attributes_for_group_search"><?php p($l->t('Group Search Attributes'));?></label><textarea id="ldap_attributes_for_group_search" name="ldap_attributes_for_group_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_group_search_default']); ?>" title="<?php p($l->t('Group Search Attributes'));?>"></textarea></p> + <p><label for="ldap_display_name"><?php p($l->t('User Display Name Field'));?></label><input type="text" id="ldap_display_name" name="ldap_display_name" data-default="<?php p($_['ldap_display_name_default']); ?>" aria-describedby="ldap_display_name_instructions" title="<?php p($l->t('The LDAP attribute to use to generate the user\'s display name.'));?>" /><p class="hidden-visually" id="ldap_display_name_instructions"><?php p($l->t('The LDAP attribute to use to generate the user\'s display name.'));?></p></p> + <p><label for="ldap_user_display_name_2"><?php p($l->t('2nd User Display Name Field'));?></label><input type="text" id="ldap_user_display_name_2" name="ldap_user_display_name_2" data-default="<?php p($_['ldap_user_display_name_2_default']); ?>" aria-describedby="ldap_user_display_name_2_instructions" title="<?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?>" /><p class="hidden-visually" id="ldap_user_display_name_2_instructions"><?php p($l->t('Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«.'));?></p></p> + <p><label for="ldap_base_users"><?php p($l->t('Base User Tree'));?></label><textarea id="ldap_base_users" name="ldap_base_users" placeholder="<?php p($l->t('One User Base DN per line'));?>" data-default="<?php p($_['ldap_base_users_default']); ?>" aria-describedby="ldap_base_users_instructions" title="<?php p($l->t('Base User Tree'));?>"></textarea><p class="hidden-visually" id="ldap_base_users_instructions"><?php p($l->t('Base User Tree'));?></p></p> + <p><label for="ldap_attributes_for_user_search"><?php p($l->t('User Search Attributes'));?></label><textarea id="ldap_attributes_for_user_search" name="ldap_attributes_for_user_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_user_search_default']); ?>" aria-describedby="ldap_attributes_for_user_search_instructions" title="<?php p($l->t('User Search Attributes'));?>"></textarea><p class="hidden-visually" id="ldap_attributes_for_user_search_instructions"><?php p($l->t('User Search Attributes'));?></p></p> + <p><label for="ldap_mark_remnants_as_disabled"><?php p($l->t('Disable users missing from LDAP'));?></label><input type="checkbox" id="ldap_mark_remnants_as_disabled" name="ldap_mark_remnants_as_disabled" value="1" data-default="<?php p($_['ldap_mark_remnants_as_disabled_default']); ?>" aria-describedby="ldap_mark_remnants_as_disabled_instructions" title="<?php p($l->t('When switched on, users imported from LDAP which are then missing will be disabled'));?>" /><p class="hidden-visually" id="ldap_mark_remnants_as_disabled_instructions"><?php p($l->t('When switched on, users imported from LDAP which are then missing will be disabled'));?></p></p> + <p><label for="ldap_group_display_name"><?php p($l->t('Group Display Name Field'));?></label><input type="text" id="ldap_group_display_name" name="ldap_group_display_name" data-default="<?php p($_['ldap_group_display_name_default']); ?>" aria-describedby="ldap_group_display_name_instructions" title="<?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?>" /><p class="hidden-visually" id="ldap_group_display_name_instructions"><?php p($l->t('The LDAP attribute to use to generate the groups\'s display name.'));?></p></p> + <p><label for="ldap_base_groups"><?php p($l->t('Base Group Tree'));?></label><textarea id="ldap_base_groups" name="ldap_base_groups" placeholder="<?php p($l->t('One Group Base DN per line'));?>" data-default="<?php p($_['ldap_base_groups_default']); ?>" aria-describedby="ldap_base_groups_instructions" title="<?php p($l->t('Base Group Tree'));?>"></textarea><p class="hidden-visually" id="ldap_base_groups_instructions"><?php p($l->t('Base Group Tree'));?></p></p> + <p><label for="ldap_attributes_for_group_search"><?php p($l->t('Group Search Attributes'));?></label><textarea id="ldap_attributes_for_group_search" name="ldap_attributes_for_group_search" placeholder="<?php p($l->t('Optional; one attribute per line'));?>" data-default="<?php p($_['ldap_attributes_for_group_search_default']); ?>" aria-describedby="ldap_attributes_for_group_search_instructions" title="<?php p($l->t('Group Search Attributes'));?>"></textarea><p class="hidden-visually" id="ldap_attributes_for_group_search_instructions"><?php p($l->t('Group Search Attributes'));?></p></p> <p><label for="ldap_group_member_assoc_attribute"><?php p($l->t('Group-Member association'));?></label><select id="ldap_group_member_assoc_attribute" name="ldap_group_member_assoc_attribute" data-default="<?php p($_['ldap_group_member_assoc_attribute_default']); ?>" ><option value="uniqueMember"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'uniqueMember')) { - p(' selected'); - } ?>>uniqueMember</option><option value="memberUid"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'memberUid')) { - p(' selected'); - } ?>>memberUid</option><option value="member"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'member')) { - p(' selected'); - } ?>>member (AD)</option><option value="gidNumber"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'gidNumber')) { - p(' selected'); - } ?>>gidNumber</option><option value="zimbraMailForwardingAddress"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'zimbraMailForwardingAddress')) { - p(' selected'); - } ?>>zimbraMailForwardingAddress</option></select></p> - <p><label for="ldap_dynamic_group_member_url"><?php p($l->t('Dynamic Group Member URL'));?></label><input type="text" id="ldap_dynamic_group_member_url" name="ldap_dynamic_group_member_url" title="<?php p($l->t('The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)'));?>" data-default="<?php p($_['ldap_dynamic_group_member_url_default']); ?>" /></p> - <p><label for="ldap_nested_groups"><?php p($l->t('Nested Groups'));?></label><input type="checkbox" id="ldap_nested_groups" name="ldap_nested_groups" value="1" data-default="<?php p($_['ldap_nested_groups_default']); ?>" title="<?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?>" /></p> - <p><label for="ldap_paging_size"><?php p($l->t('Paging chunksize'));?></label><input type="number" id="ldap_paging_size" name="ldap_paging_size" title="<?php p($l->t('Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)'));?>" data-default="<?php p($_['ldap_paging_size_default']); ?>" /></p> - <p><label for="ldap_turn_on_pwd_change"><?php p($l->t('Enable LDAP password changes per user'));?></label><span class="inlinetable"><span class="tablerow left"><input type="checkbox" id="ldap_turn_on_pwd_change" name="ldap_turn_on_pwd_change" value="1" data-default="<?php p($_['ldap_turn_on_pwd_change_default']); ?>" title="<?php p($l->t('Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.'));?>" /><span class="tablecell"><?php p($l->t('(New password is sent as plain text to LDAP)'));?></span></span> + p(' selected'); + } ?>>uniqueMember</option><option value="memberUid"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'memberUid')) { + p(' selected'); + } ?>>memberUid</option><option value="member"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'member')) { + p(' selected'); + } ?>>member (AD)</option><option value="gidNumber"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'gidNumber')) { + p(' selected'); + } ?>>gidNumber</option><option value="zimbraMailForwardingAddress"<?php if (isset($_['ldap_group_member_assoc_attribute']) && ($_['ldap_group_member_assoc_attribute'] === 'zimbraMailForwardingAddress')) { + p(' selected'); + } ?>>zimbraMailForwardingAddress</option></select></p> + <p><label for="ldap_dynamic_group_member_url"><?php p($l->t('Dynamic Group Member URL'));?></label><input type="text" id="ldap_dynamic_group_member_url" name="ldap_dynamic_group_member_url" aria-describedby="ldap_dynamic_group_member_url_instructions" title="<?php p($l->t('The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)'));?>" data-default="<?php p($_['ldap_dynamic_group_member_url_default']); ?>" /><p class="hidden-visually" id="ldap_dynamic_group_member_url_instructions"><?php p($l->t('The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)'));?></p></p> + <p><label for="ldap_nested_groups"><?php p($l->t('Nested Groups'));?></label><input type="checkbox" id="ldap_nested_groups" name="ldap_nested_groups" value="1" data-default="<?php p($_['ldap_nested_groups_default']); ?>" aria-describedby="ldap_nested_groups_instructions" title="<?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?>" /><p class="hidden-visually" id="ldap_nested_groups_instructions"><?php p($l->t('When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)'));?></p></p> + <p><label for="ldap_paging_size"><?php p($l->t('Paging chunksize'));?></label><input type="number" id="ldap_paging_size" name="ldap_paging_size" aria-describedby="ldap_paging_size_instructions" title="<?php p($l->t('Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)'));?>" data-default="<?php p($_['ldap_paging_size_default']); ?>" /><p class="hidden-visually" id="ldap_paging_size_instructions"><?php p($l->t('Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)'));?></p></p> + <p><label for="ldap_turn_on_pwd_change"><?php p($l->t('Enable LDAP password changes per user'));?></label><span class="inlinetable"><span class="tablerow left"><input type="checkbox" id="ldap_turn_on_pwd_change" name="ldap_turn_on_pwd_change" value="1" data-default="<?php p($_['ldap_turn_on_pwd_change_default']); ?>" aria-describedby="ldap_turn_on_pwd_change_instructions" title="<?php p($l->t('Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.'));?>" /><p class="hidden-visually" id="ldap_turn_on_pwd_change_instructions"><?php p($l->t('Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server.'));?></p><span class="tablecell"><?php p($l->t('(New password is sent as plain text to LDAP)'));?></span></span> </span><br/></p> - <p><label for="ldap_default_ppolicy_dn"><?php p($l->t('Default password policy DN'));?></label><input type="text" id="ldap_default_ppolicy_dn" name="ldap_default_ppolicy_dn" title="<?php p($l->t('The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.'));?>" data-default="<?php p($_['ldap_default_ppolicy_dn_default']); ?>" /></p> + <p><label for="ldap_default_ppolicy_dn"><?php p($l->t('Default password policy DN'));?></label><input type="text" id="ldap_default_ppolicy_dn" name="ldap_default_ppolicy_dn" aria-describedby="ldap_default_ppolicy_dn_instructions" title="<?php p($l->t('The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.'));?>" data-default="<?php p($_['ldap_default_ppolicy_dn_default']); ?>" /><p class="hidden-visually" id="ldap_default_ppolicy_dn_instructions"><?php p($l->t('The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling.'));?></p></p> </div> <h3><?php p($l->t('Special Attributes'));?></h3> <div> - <p><label for="ldap_quota_attr"><?php p($l->t('Quota Field'));?></label><input type="text" id="ldap_quota_attr" name="ldap_quota_attr" data-default="<?php p($_['ldap_quota_attr_default']); ?>" title="<?php p($l->t('Leave empty for user\'s default quota. Otherwise, specify an LDAP/AD attribute.'));?>" /></p> - <p><label for="ldap_quota_def"><?php p($l->t('Quota Default'));?></label><input type="text" id="ldap_quota_def" name="ldap_quota_def" data-default="<?php p($_['ldap_quota_def_default']); ?>" title="<?php p($l->t('Override default quota for LDAP users who do not have a quota set in the Quota Field.'));?>" /></p> - <p><label for="ldap_email_attr"><?php p($l->t('Email Field'));?></label><input type="text" id="ldap_email_attr" name="ldap_email_attr" data-default="<?php p($_['ldap_email_attr_default']); ?>" title="<?php p($l->t('Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.'));?>" /></p> - <p><label for="home_folder_naming_rule"><?php p($l->t('User Home Folder Naming Rule'));?></label><input type="text" id="home_folder_naming_rule" name="home_folder_naming_rule" title="<?php p($l->t('Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.'));?>" data-default="<?php p($_['home_folder_naming_rule_default']); ?>" /></p> - <p><label for="ldap_ext_storage_home_attribute"> <?php p($l->t('"$home" Placeholder Field')); ?></label><input type="text" id="ldap_ext_storage_home_attribute" name="ldap_ext_storage_home_attribute" title="<?php p($l->t('$home in an external storage configuration will be replaced with the value of the specified attribute')); ?>" data-default="<?php p($_['ldap_ext_storage_home_attribute_default']); ?>"></p> + <p><label for="ldap_quota_attr"><?php p($l->t('Quota Field'));?></label><input type="text" id="ldap_quota_attr" name="ldap_quota_attr" data-default="<?php p($_['ldap_quota_attr_default']); ?>" aria-describedby="ldap_quota_attr_instructions" title="<?php p($l->t('Leave empty for user\'s default quota. Otherwise, specify an LDAP/AD attribute.'));?>" /><p class="hidden-visually" id="ldap_quota_attr_instructions"><?php p($l->t('Leave empty for user\'s default quota. Otherwise, specify an LDAP/AD attribute.'));?></p></p> + <p><label for="ldap_quota_def"><?php p($l->t('Quota Default'));?></label><input type="text" id="ldap_quota_def" name="ldap_quota_def" data-default="<?php p($_['ldap_quota_def_default']); ?>" aria-describedby="ldap_quota_def_instructions" title="<?php p($l->t('Override default quota for LDAP users who do not have a quota set in the Quota Field.'));?>" /><p class="hidden-visually" id="ldap_quota_def_instructions"><?php p($l->t('Override default quota for LDAP users who do not have a quota set in the Quota Field.'));?></p></p> + <p><label for="ldap_email_attr"><?php p($l->t('Email Field'));?></label><input type="text" id="ldap_email_attr" name="ldap_email_attr" data-default="<?php p($_['ldap_email_attr_default']); ?>" aria-describedby="ldap_email_attr_instructions" title="<?php p($l->t('Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.'));?>" /><p class="hidden-visually" id="ldap_email_attr_instructions"><?php p($l->t('Set the user\'s email from their LDAP attribute. Leave it empty for default behaviour.'));?></p></p> + <p><label for="home_folder_naming_rule"><?php p($l->t('User Home Folder Naming Rule'));?></label><input type="text" id="home_folder_naming_rule" name="home_folder_naming_rule" aria-describedby="home_folder_naming_rule_instructions" title="<?php p($l->t('Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.'));?>" data-default="<?php p($_['home_folder_naming_rule_default']); ?>" /><p class="hidden-visually" id="home_folder_naming_rule_instructions"><?php p($l->t('Leave empty for username (default). Otherwise, specify an LDAP/AD attribute.'));?></p></p> + <p><label for="ldap_ext_storage_home_attribute"> <?php p($l->t('"$home" Placeholder Field')); ?></label><input type="text" id="ldap_ext_storage_home_attribute" name="ldap_ext_storage_home_attribute" aria-describedby="ldap_ext_storage_home_attribute_instructions" title="<?php p($l->t('$home in an external storage configuration will be replaced with the value of the specified attribute')); ?>" data-default="<?php p($_['ldap_ext_storage_home_attribute_default']); ?>"><p class="hidden-visually" id="ldap_ext_storage_home_attribute_instructions"><?php p($l->t('$home in an external storage configuration will be replaced with the value of the specified attribute')); ?></p></p> + </div> + <h3><?php p($l->t('User Profile Attributes'));?></h3> + <div> + <p><label for="ldap_attr_phone"> <?php p($l->t('Phone Field')); ?></label><input type="text" id="ldap_attr_phone" name="ldap_attr_phone" title="<?php p($l->t('User profile Phone will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_phone_default']); ?>"></p> + <p><label for="ldap_attr_website"> <?php p($l->t('Website Field')); ?></label><input type="text" id="ldap_attr_website" name="ldap_attr_website" title="<?php p($l->t('User profile Website will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_website_default']); ?>"></p> + <p><label for="ldap_attr_address"> <?php p($l->t('Address Field')); ?></label><input type="text" id="ldap_attr_address" name="ldap_attr_address" title="<?php p($l->t('User profile Address will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_address_default']); ?>"></p> + <p><label for="ldap_attr_twitter"> <?php p($l->t('Twitter Field')); ?></label><input type="text" id="ldap_attr_twitter" name="ldap_attr_twitter" title="<?php p($l->t('User profile Twitter will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_twitter_default']); ?>"></p> + <p><label for="ldap_attr_fediverse"> <?php p($l->t('Fediverse Field')); ?></label><input type="text" id="ldap_attr_fediverse" name="ldap_attr_fediverse" title="<?php p($l->t('User profile Fediverse will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_fediverse_default']); ?>"></p> + <p><label for="ldap_attr_organisation"> <?php p($l->t('Organisation Field')); ?></label><input type="text" id="ldap_attr_organisation" name="ldap_attr_organisation" title="<?php p($l->t('User profile Organisation will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_organisation_default']); ?>"></p> + <p><label for="ldap_attr_role"> <?php p($l->t('Role Field')); ?></label><input type="text" id="ldap_attr_role" name="ldap_attr_role" title="<?php p($l->t('User profile Role will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_role_default']); ?>"></p> + <p><label for="ldap_attr_headline"> <?php p($l->t('Headline Field')); ?></label><input type="text" id="ldap_attr_headline" name="ldap_attr_headline" title="<?php p($l->t('User profile Headline will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_headline_default']); ?>"></p> + <p><label for="ldap_attr_biography"> <?php p($l->t('Biography Field')); ?></label><input type="text" id="ldap_attr_biography" name="ldap_attr_biography" title="<?php p($l->t('User profile Biography will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_biography_default']); ?>"></p> + <p><label for="ldap_attr_birthdate"> <?php p($l->t('Birthdate Field')); ?></label><input type="text" id="ldap_attr_birthdate" name="ldap_attr_birthdate" title="<?php p($l->t('User profile Date of birth will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_birthdate_default']); ?>"></p> + <p></p><label for="ldap_attr_pronouns"> <?php p($l->t('Pronouns Field')); ?></label><input type="text" id="ldap_attr_pronouns" name="ldap_attr_pronouns" title="<?php p($l->t('User profile Pronouns will be set from the specified attribute')); ?>" data-default="<?php p($_['ldap_attr_pronouns_default']); ?>"></p> </div> </div> <?php print_unescaped($_['settingControls']); ?> </fieldset> <fieldset id="ldapSettings-2"> <p><strong><?php p($l->t('Internal Username'));?></strong></p> - <p class="ldapIndent"><?php p($l->t('By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.'));?></p> + <p class="ldapIndent"><?php p($l->t('By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [a-zA-Z0-9_.@-]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all DAV services. With this setting, the default behavior can be overridden. Changes will have effect only on newly mapped (added) LDAP users. Leave it empty for default behavior.'));?></p> <p class="ldapIndent"><label for="ldap_expert_username_attr"><?php p($l->t('Internal Username Attribute:'));?></label><input type="text" id="ldap_expert_username_attr" name="ldap_expert_username_attr" data-default="<?php p($_['ldap_expert_username_attr_default']); ?>" /></p> <p><strong><?php p($l->t('Override UUID detection'));?></strong></p> <p class="ldapIndent"><?php p($l->t('By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups.'));?></p> diff --git a/apps/user_ldap/tests/.htaccess b/apps/user_ldap/tests/.htaccess index 6fde30e763a..e62a37927bf 100755 --- a/apps/user_ldap/tests/.htaccess +++ b/apps/user_ldap/tests/.htaccess @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors +# SPDX-FileCopyrightText: 2015 ownCloud, Inc. +# SPDX-License-Identifier: AGPL-3.0-only +# # Generated by ownCloud on 2015-06-18 14:16:40 # line below if for Apache 2.4 <ifModule mod_authz_core.c> diff --git a/apps/user_ldap/tests/AccessTest.php b/apps/user_ldap/tests/AccessTest.php index c2902a67766..54be29d0f86 100644 --- a/apps/user_ldap/tests/AccessTest.php +++ b/apps/user_ldap/tests/AccessTest.php @@ -1,41 +1,17 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch> - * - * @author Andreas Fischer <bantu@owncloud.com> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; +use OC\ServerNotAvailableException; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; use OCA\User_LDAP\Exceptions\ConstraintViolationException; -use OCA\User_LDAP\FilesystemHelper; use OCA\User_LDAP\Helper; use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\LDAP; @@ -44,12 +20,17 @@ use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\OfflineUser; use OCA\User_LDAP\User\User; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\HintException; +use OCP\IAppConfig; use OCP\IAvatarManager; use OCP\IConfig; use OCP\Image; use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; +use OCP\Server; use OCP\Share\IManager; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; @@ -61,32 +42,25 @@ use Test\TestCase; * @package OCA\User_LDAP\Tests */ class AccessTest extends TestCase { - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $userMapper; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $shareManager; - /** @var GroupMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $groupMapper; - /** @var Connection|\PHPUnit\Framework\MockObject\MockObject */ - private $connection; - /** @var LDAP|\PHPUnit\Framework\MockObject\MockObject */ - private $ldap; - /** @var Manager|\PHPUnit\Framework\MockObject\MockObject */ - private $userManager; - /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */ - private $helper; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - private $ncUserManager; - /** @var LoggerInterface|MockObject */ - private $logger; - /** @var Access */ - private $access; + protected UserMapping&MockObject $userMapper; + protected IManager&MockObject $shareManager; + protected GroupMapping&MockObject $groupMapper; + private Connection&MockObject $connection; + private LDAP&MockObject $ldap; + private Manager&MockObject $userManager; + private Helper&MockObject $helper; + private IConfig&MockObject $config; + private IUserManager&MockObject $ncUserManager; + private LoggerInterface&MockObject $logger; + private IAppConfig&MockObject $appConfig; + private IEventDispatcher&MockObject $dispatcher; + private Access $access; protected function setUp(): void { - $this->connection = $this->createMock(Connection::class); $this->ldap = $this->createMock(LDAP::class); + $this->connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->ldap]) + ->getMock(); $this->userManager = $this->createMock(Manager::class); $this->helper = $this->createMock(Helper::class); $this->config = $this->createMock(IConfig::class); @@ -95,29 +69,39 @@ class AccessTest extends TestCase { $this->ncUserManager = $this->createMock(IUserManager::class); $this->shareManager = $this->createMock(IManager::class); $this->logger = $this->createMock(LoggerInterface::class); + $this->appConfig = $this->createMock(IAppConfig::class); + $this->dispatcher = $this->createMock(IEventDispatcher::class); $this->access = new Access( - $this->connection, $this->ldap, + $this->connection, $this->userManager, $this->helper, $this->config, $this->ncUserManager, - $this->logger + $this->logger, + $this->appConfig, + $this->dispatcher, ); + $this->dispatcher->expects($this->any())->method('dispatchTyped'); $this->access->setUserMapper($this->userMapper); $this->access->setGroupMapper($this->groupMapper); } private function getConnectorAndLdapMock() { + /** @var ILDAPWrapper&MockObject */ $lw = $this->createMock(ILDAPWrapper::class); + /** @var Connection&MockObject */ $connector = $this->getMockBuilder(Connection::class) ->setConstructorArgs([$lw, '', null]) ->getMock(); + $connector->expects($this->any()) + ->method('getConnectionResource') + ->willReturn(ldap_connect('ldap://example.com')); + /** @var Manager&MockObject */ $um = $this->getMockBuilder(Manager::class) ->setConstructorArgs([ $this->createMock(IConfig::class), - $this->createMock(FilesystemHelper::class), $this->createMock(LoggerInterface::class), $this->createMock(IAvatarManager::class), $this->createMock(Image::class), @@ -125,39 +109,39 @@ class AccessTest extends TestCase { $this->createMock(INotificationManager::class), $this->shareManager]) ->getMock(); - $helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); return [$lw, $connector, $um, $helper]; } - public function testEscapeFilterPartValidChars() { + public function testEscapeFilterPartValidChars(): void { $input = 'okay'; - $this->assertTrue($input === $this->access->escapeFilterPart($input)); + $this->assertSame($input, $this->access->escapeFilterPart($input)); } - public function testEscapeFilterPartEscapeWildcard() { + public function testEscapeFilterPartEscapeWildcard(): void { $input = '*'; - $expected = '\\\\*'; - $this->assertTrue($expected === $this->access->escapeFilterPart($input)); + $expected = '\\2a'; + $this->assertSame($expected, $this->access->escapeFilterPart($input)); } - public function testEscapeFilterPartEscapeWildcard2() { + public function testEscapeFilterPartEscapeWildcard2(): void { $input = 'foo*bar'; - $expected = 'foo\\\\*bar'; - $this->assertTrue($expected === $this->access->escapeFilterPart($input)); + $expected = 'foo\\2abar'; + $this->assertSame($expected, $this->access->escapeFilterPart($input)); } /** - * @dataProvider convertSID2StrSuccessData * @param array $sidArray * @param $sidExpected */ - public function testConvertSID2StrSuccess(array $sidArray, $sidExpected) { + #[\PHPUnit\Framework\Attributes\DataProvider('convertSID2StrSuccessData')] + public function testConvertSID2StrSuccess(array $sidArray, $sidExpected): void { $sidBinary = implode('', $sidArray); $this->assertSame($sidExpected, $this->access->convertSID2Str($sidBinary)); } - public function convertSID2StrSuccessData() { + public static function convertSID2StrSuccessData(): array { return [ [ [ @@ -184,14 +168,14 @@ class AccessTest extends TestCase { ]; } - public function testConvertSID2StrInputError() { + public function testConvertSID2StrInputError(): void { $sidIllegal = 'foobar'; $sidExpected = ''; $this->assertSame($sidExpected, $this->access->convertSID2Str($sidIllegal)); } - public function testGetDomainDNFromDNSuccess() { + public function testGetDomainDNFromDNSuccess(): void { $inputDN = 'uid=zaphod,cn=foobar,dc=my,dc=server,dc=com'; $domainDN = 'dc=my,dc=server,dc=com'; @@ -203,7 +187,7 @@ class AccessTest extends TestCase { $this->assertSame($domainDN, $this->access->getDomainDNFromDN($inputDN)); } - public function testGetDomainDNFromDNError() { + public function testGetDomainDNFromDNError(): void { $inputDN = 'foobar'; $expected = ''; @@ -215,83 +199,82 @@ class AccessTest extends TestCase { $this->assertSame($expected, $this->access->getDomainDNFromDN($inputDN)); } - public function dnInputDataProvider() { - return [[ + public static function dnInputDataProvider(): array { + return [ [ - 'input' => 'foo=bar,bar=foo,dc=foobar', - 'interResult' => [ + 'foo=bar,bar=foo,dc=foobar', + [ 'count' => 3, 0 => 'foo=bar', 1 => 'bar=foo', 2 => 'dc=foobar' ], - 'expectedResult' => true + true ], [ - 'input' => 'foobarbarfoodcfoobar', - 'interResult' => false, - 'expectedResult' => false + 'foobarbarfoodcfoobar', + false, + false ] - ]]; + ]; } - /** - * @dataProvider dnInputDataProvider - * @param array $case - */ - public function testStringResemblesDN($case) { + #[\PHPUnit\Framework\Attributes\DataProvider('dnInputDataProvider')] + public function testStringResemblesDN(string $input, array|bool $interResult, bool $expectedResult): void { [$lw, $con, $um, $helper] = $this->getConnectorAndLdapMock(); - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject $config */ + /** @var IConfig&MockObject $config */ $config = $this->createMock(IConfig::class); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($lw, $con, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->appConfig, $this->dispatcher); $lw->expects($this->exactly(1)) ->method('explodeDN') - ->willReturnCallback(function ($dn) use ($case) { - if ($dn === $case['input']) { - return $case['interResult']; + ->willReturnCallback(function ($dn) use ($input, $interResult) { + if ($dn === $input) { + return $interResult; } return null; }); - $this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input'])); + $this->assertSame($expectedResult, $access->stringResemblesDN($input)); } - /** - * @dataProvider dnInputDataProvider - * @param $case - */ - public function testStringResemblesDNLDAPmod($case) { + #[\PHPUnit\Framework\Attributes\DataProvider('dnInputDataProvider')] + public function testStringResemblesDNLDAPmod(string $input, array|bool $interResult, bool $expectedResult): void { [, $con, $um, $helper] = $this->getConnectorAndLdapMock(); - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject $config */ + /** @var IConfig&MockObject $config */ $config = $this->createMock(IConfig::class); $lw = new LDAP(); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($lw, $con, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->appConfig, $this->dispatcher); if (!function_exists('ldap_explode_dn')) { $this->markTestSkipped('LDAP Module not available'); } - $this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input'])); + $this->assertSame($expectedResult, $access->stringResemblesDN($input)); } - public function testCacheUserHome() { + public function testCacheUserHome(): void { $this->connection->expects($this->once()) ->method('writeToCache'); $this->access->cacheUserHome('foobar', '/foobars/path'); } - public function testBatchApplyUserAttributes() { + public function testBatchApplyUserAttributes(): void { $this->ldap->expects($this->any()) ->method('isResource') ->willReturn(true); + $this->connection + ->expects($this->any()) + ->method('getConnectionResource') + ->willReturn(ldap_connect('ldap://example.com')); + $this->ldap->expects($this->any()) ->method('getAttributes') ->willReturn(['displayname' => ['bar', 'count' => 1]]); - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject $mapperMock */ + /** @var UserMapping&MockObject $mapperMock */ $mapperMock = $this->createMock(UserMapping::class); $mapperMock->expects($this->any()) ->method('getNameByDN') @@ -335,8 +318,8 @@ class AccessTest extends TestCase { $this->access->batchApplyUserAttributes($data); } - public function testBatchApplyUserAttributesSkipped() { - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject $mapperMock */ + public function testBatchApplyUserAttributesSkipped(): void { + /** @var UserMapping&MockObject $mapperMock */ $mapperMock = $this->createMock(UserMapping::class); $mapperMock->expects($this->any()) ->method('getNameByDN') @@ -376,8 +359,8 @@ class AccessTest extends TestCase { $this->access->batchApplyUserAttributes($data); } - public function testBatchApplyUserAttributesDontSkip() { - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject $mapperMock */ + public function testBatchApplyUserAttributesDontSkip(): void { + /** @var UserMapping&MockObject $mapperMock */ $mapperMock = $this->createMock(UserMapping::class); $mapperMock->expects($this->any()) ->method('getNameByDN') @@ -417,7 +400,7 @@ class AccessTest extends TestCase { $this->access->batchApplyUserAttributes($data); } - public function dNAttributeProvider() { + public static function dNAttributeProvider(): array { // corresponds to Access::resemblesDN() return [ 'dn' => ['dn'], @@ -427,13 +410,10 @@ class AccessTest extends TestCase { ]; } - /** - * @dataProvider dNAttributeProvider - * @param $attribute - */ - public function testSanitizeDN($attribute) { + #[\PHPUnit\Framework\Attributes\DataProvider('dNAttributeProvider')] + public function testSanitizeDN(string $attribute): void { [$lw, $con, $um, $helper] = $this->getConnectorAndLdapMock(); - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject $config */ + /** @var IConfig&MockObject $config */ $config = $this->createMock(IConfig::class); $dnFromServer = 'cn=Mixed Cases,ou=Are Sufficient To,ou=Test,dc=example,dc=org'; @@ -447,13 +427,13 @@ class AccessTest extends TestCase { $attribute => ['count' => 1, $dnFromServer] ]); - $access = new Access($con, $lw, $um, $helper, $config, $this->ncUserManager, $this->logger); + $access = new Access($lw, $con, $um, $helper, $config, $this->ncUserManager, $this->logger, $this->appConfig, $this->dispatcher); $values = $access->readAttribute('uid=whoever,dc=example,dc=org', $attribute); $this->assertSame($values[0], strtolower($dnFromServer)); } - public function testSetPasswordWithDisabledChanges() { + public function testSetPasswordWithDisabledChanges(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('LDAP password changes are disabled'); @@ -465,45 +445,39 @@ class AccessTest extends TestCase { $this->access->setPassword('CN=foo', 'MyPassword'); } - public function testSetPasswordWithLdapNotAvailable() { + public function testSetPasswordWithLdapNotAvailable(): void { $this->connection ->method('__get') ->willReturn(true); - $connection = $this->createMock(LDAP::class); + $connection = ldap_connect('ldap://example.com'); $this->connection ->expects($this->once()) ->method('getConnectionResource') - ->willReturn($connection); + ->willThrowException(new ServerNotAvailableException('Connection to LDAP server could not be established')); $this->ldap - ->expects($this->once()) - ->method('isResource') - ->with($connection) - ->willReturn(false); + ->expects($this->never()) + ->method('isResource'); - /** @noinspection PhpUnhandledExceptionInspection */ - $this->assertFalse($this->access->setPassword('CN=foo', 'MyPassword')); + $this->expectException(ServerNotAvailableException::class); + $this->expectExceptionMessage('Connection to LDAP server could not be established'); + $this->access->setPassword('CN=foo', 'MyPassword'); } - public function testSetPasswordWithRejectedChange() { - $this->expectException(\OCP\HintException::class); + public function testSetPasswordWithRejectedChange(): void { + $this->expectException(HintException::class); $this->expectExceptionMessage('Password change rejected.'); $this->connection ->method('__get') ->willReturn(true); - $connection = $this->createMock(LDAP::class); + $connection = ldap_connect('ldap://example.com'); $this->connection ->expects($this->any()) ->method('getConnectionResource') ->willReturn($connection); $this->ldap ->expects($this->once()) - ->method('isResource') - ->with($connection) - ->willReturn(true); - $this->ldap - ->expects($this->once()) ->method('modReplace') ->with($connection, 'CN=foo', 'MyPassword') ->willThrowException(new ConstraintViolationException()); @@ -512,22 +486,17 @@ class AccessTest extends TestCase { $this->access->setPassword('CN=foo', 'MyPassword'); } - public function testSetPassword() { + public function testSetPassword(): void { $this->connection ->method('__get') ->willReturn(true); - $connection = $this->createMock(LDAP::class); + $connection = ldap_connect('ldap://example.com'); $this->connection ->expects($this->any()) ->method('getConnectionResource') ->willReturn($connection); $this->ldap ->expects($this->once()) - ->method('isResource') - ->with($connection) - ->willReturn(true); - $this->ldap - ->expects($this->once()) ->method('modReplace') ->with($connection, 'CN=foo', 'MyPassword') ->willReturn(true); @@ -540,7 +509,7 @@ class AccessTest extends TestCase { $base, $fakeConnection, $fakeSearchResultResource, - $fakeLdapEntries + $fakeLdapEntries, ) { $this->connection ->expects($this->any()) @@ -559,7 +528,7 @@ class AccessTest extends TestCase { ->expects($this->any()) ->method('isResource') ->willReturnCallback(function ($resource) { - return is_resource($resource) || is_object($resource); + return is_object($resource); }); $this->ldap ->expects($this->any()) @@ -579,7 +548,7 @@ class AccessTest extends TestCase { ->willReturnArgument(0); } - public function testSearchNoPagedSearch() { + public function testSearchNoPagedSearch(): void { // scenario: no pages search, 1 search base $filter = 'objectClass=nextcloudUser'; $base = 'ou=zombies,dc=foobar,dc=nextcloud,dc=com'; @@ -606,7 +575,7 @@ class AccessTest extends TestCase { $this->assertSame($expected, $result); } - public function testFetchListOfUsers() { + public function testFetchListOfUsers(): void { $filter = 'objectClass=nextcloudUser'; $base = 'ou=zombies,dc=foobar,dc=nextcloud,dc=com'; $attrs = ['dn', 'uid']; @@ -626,20 +595,21 @@ class AccessTest extends TestCase { ]; $expected = $fakeLdapEntries; unset($expected['count']); - array_walk($expected, function (&$v) { + array_walk($expected, function (&$v): void { $v['dn'] = [$v['dn']]; // dn is translated into an array internally for consistency }); $this->prepareMocksForSearchTests($base, $fakeConnection, $fakeSearchResultResource, $fakeLdapEntries); - $this->connection->expects($this->exactly($fakeLdapEntries['count'])) + // Called twice per user, for userExists and userExistsOnLdap + $this->connection->expects($this->exactly(2 * $fakeLdapEntries['count'])) ->method('writeToCache') ->with($this->stringStartsWith('userExists'), true); $this->userMapper->expects($this->exactly($fakeLdapEntries['count'])) ->method('getNameByDN') ->willReturnCallback(function ($fdn) { - $parts = ldap_explode_dn($fdn, false); + $parts = ldap_explode_dn($fdn, 0); return $parts[0]; }); @@ -648,7 +618,7 @@ class AccessTest extends TestCase { $this->assertSame($expected, $list); } - public function testFetchListOfGroupsKnown() { + public function testFetchListOfGroupsKnown(): void { $filter = 'objectClass=nextcloudGroup'; $attributes = ['cn', 'gidNumber', 'dn']; $base = 'ou=SomeGroups,dc=my,dc=directory'; @@ -678,7 +648,7 @@ class AccessTest extends TestCase { $this->groupMapper->expects($this->never()) ->method('getNameByDN'); - $this->connection->expects($this->exactly(2)) + $this->connection->expects($this->exactly(1)) ->method('writeToCache'); $groups = $this->access->fetchListOfGroups($filter, $attributes); @@ -687,7 +657,7 @@ class AccessTest extends TestCase { $this->assertSame('Another Good Team', $groups[1]['cn'][0]); } - public function intUsernameProvider() { + public static function intUsernameProvider(): array { return [ ['alice', 'alice'], ['b/ob', 'bob'], @@ -705,7 +675,7 @@ class AccessTest extends TestCase { ]; } - public function groupIDCandidateProvider() { + public static function groupIDCandidateProvider(): array { return [ ['alice', 'alice'], ['b/ob', 'b/ob'], @@ -722,13 +692,8 @@ class AccessTest extends TestCase { ]; } - /** - * @dataProvider intUsernameProvider - * - * @param $name - * @param $expected - */ - public function testSanitizeUsername($name, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('intUsernameProvider')] + public function testSanitizeUsername(string $name, ?string $expected): void { if ($expected === null) { $this->expectException(\InvalidArgumentException::class); } @@ -736,15 +701,13 @@ class AccessTest extends TestCase { $this->assertSame($expected, $sanitizedName); } - /** - * @dataProvider groupIDCandidateProvider - */ - public function testSanitizeGroupIDCandidate(string $name, string $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('groupIDCandidateProvider')] + public function testSanitizeGroupIDCandidate(string $name, string $expected): void { $sanitizedName = $this->access->sanitizeGroupIDCandidate($name); $this->assertSame($expected, $sanitizedName); } - public function testUserStateUpdate() { + public function testUserStateUpdate(): void { $this->connection->expects($this->any()) ->method('__get') ->willReturnMap([ @@ -763,7 +726,7 @@ class AccessTest extends TestCase { ->with('detta') ->willReturnOnConsecutiveCalls($offlineUserMock, $regularUserMock); - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject $mapperMock */ + /** @var UserMapping&MockObject $mapperMock */ $mapperMock = $this->createMock(UserMapping::class); $mapperMock->expects($this->any()) ->method('getNameByDN') diff --git a/apps/user_ldap/tests/ConfigurationTest.php b/apps/user_ldap/tests/ConfigurationTest.php index 6be09c474a2..db92598fcfd 100644 --- a/apps/user_ldap/tests/ConfigurationTest.php +++ b/apps/user_ldap/tests/ConfigurationTest.php @@ -1,41 +1,24 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; use OCA\User_LDAP\Configuration; class ConfigurationTest extends \Test\TestCase { - /** @var Configuration */ - protected $configuration; + protected Configuration $configuration; protected function setUp(): void { parent::setUp(); $this->configuration = new Configuration('t01', false); } - public function configurationDataProvider() { + public static function configurationDataProvider(): array { $inputWithDN = [ 'cn=someUsers,dc=example,dc=org', ' ', @@ -103,15 +86,13 @@ class ConfigurationTest extends \Test\TestCase { ]; } - /** - * @dataProvider configurationDataProvider - */ - public function testSetValue($key, $input, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('configurationDataProvider')] + public function testSetValue(string $key, string|array $input, string|array $expected): void { $this->configuration->setConfiguration([$key => $input]); $this->assertSame($this->configuration->$key, $expected); } - public function avatarRuleValueProvider() { + public static function avatarRuleValueProvider(): array { return [ ['none', []], ['data:selfie', ['selfie']], @@ -122,18 +103,14 @@ class ConfigurationTest extends \Test\TestCase { ]; } - /** - * @dataProvider avatarRuleValueProvider - */ - public function testGetAvatarAttributes($setting, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('avatarRuleValueProvider')] + public function testGetAvatarAttributes(string $setting, array $expected): void { $this->configuration->setConfiguration(['ldapUserAvatarRule' => $setting]); $this->assertSame($expected, $this->configuration->getAvatarAttributes()); } - /** - * @dataProvider avatarRuleValueProvider - */ - public function testResolveRule($setting, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('avatarRuleValueProvider')] + public function testResolveRule(string $setting, array $expected): void { $this->configuration->setConfiguration(['ldapUserAvatarRule' => $setting]); // so far the only thing that can get resolved :) $this->assertSame($expected, $this->configuration->resolveRule('avatar')); diff --git a/apps/user_ldap/tests/ConnectionTest.php b/apps/user_ldap/tests/ConnectionTest.php index 3b771c6d04f..7116e15898f 100644 --- a/apps/user_ldap/tests/ConnectionTest.php +++ b/apps/user_ldap/tests/ConnectionTest.php @@ -1,36 +1,17 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Jarkko Lehtoranta <devel@jlranta.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Julius Härtl <jus@bitgrid.net> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; +use OC\ServerNotAvailableException; use OCA\User_LDAP\Connection; use OCA\User_LDAP\ILDAPWrapper; +use PHPUnit\Framework\MockObject\MockObject; /** * Class Test_Connection @@ -40,19 +21,16 @@ use OCA\User_LDAP\ILDAPWrapper; * @package OCA\User_LDAP\Tests */ class ConnectionTest extends \Test\TestCase { - /** @var \OCA\User_LDAP\ILDAPWrapper|\PHPUnit\Framework\MockObject\MockObject */ - protected $ldap; - - /** @var Connection */ - protected $connection; + protected ILDAPWrapper&MockObject $ldap; + protected Connection $connection; protected function setUp(): void { parent::setUp(); $this->ldap = $this->createMock(ILDAPWrapper::class); // we use a mock here to replace the cache mechanism, due to missing DI in LDAP backend. - $this->connection = $this->getMockBuilder('OCA\User_LDAP\Connection') - ->setMethods(['getFromCache', 'writeToCache']) + $this->connection = $this->getMockBuilder(Connection::class) + ->onlyMethods(['getFromCache', 'writeToCache']) ->setConstructorArgs([$this->ldap, '', null]) ->getMock(); @@ -61,7 +39,7 @@ class ConnectionTest extends \Test\TestCase { ->willReturn(true); } - public function testOriginalAgentUnchangedOnClone() { + public function testOriginalAgentUnchangedOnClone(): void { //background: upon login a bind is done with the user credentials //which is valid for the whole LDAP resource. It needs to be reset //to the agent's credentials @@ -88,7 +66,7 @@ class ConnectionTest extends \Test\TestCase { $this->assertSame($agentPawd, $agent['ldapAgentPassword']); } - public function testUseBackupServer() { + public function testUseBackupServer(): void { $mainHost = 'ldap://nixda.ldap'; $backupHost = 'ldap://fallback.ldap'; $config = [ @@ -114,17 +92,16 @@ class ConnectionTest extends \Test\TestCase { $this->ldap->expects($this->exactly(3)) ->method('connect') - ->willReturn('ldapResource'); + ->willReturn(ldap_connect('ldap://example.com')); $this->ldap->expects($this->any()) ->method('errno') ->willReturn(0); // Not called often enough? Then, the fallback to the backup server is broken. - $this->connection->expects($this->exactly(4)) + $this->connection->expects($this->exactly(2)) ->method('getFromCache') - ->with('overrideMainServer') - ->will($this->onConsecutiveCalls(false, false, true, true)); + ->with('overrideMainServer')->willReturnOnConsecutiveCalls(false, false, true, true); $this->connection->expects($this->once()) ->method('writeToCache') @@ -136,7 +113,7 @@ class ConnectionTest extends \Test\TestCase { ->willReturnCallback(function () use (&$isThrown) { if (!$isThrown) { $isThrown = true; - throw new \OC\ServerNotAvailableException(); + throw new ServerNotAvailableException(); } return true; }); @@ -147,7 +124,7 @@ class ConnectionTest extends \Test\TestCase { $this->connection->init(); } - public function testDontUseBackupServerOnFailedAuth() { + public function testDontUseBackupServerOnFailedAuth(): void { $mainHost = 'ldap://nixda.ldap'; $backupHost = 'ldap://fallback.ldap'; $config = [ @@ -173,7 +150,7 @@ class ConnectionTest extends \Test\TestCase { $this->ldap->expects($this->once()) ->method('connect') - ->willReturn('ldapResource'); + ->willReturn(ldap_connect('ldap://example.com')); $this->ldap->expects($this->any()) ->method('errno') @@ -194,7 +171,7 @@ class ConnectionTest extends \Test\TestCase { $this->connection->init(); } - public function testBindWithInvalidCredentials() { + public function testBindWithInvalidCredentials(): void { // background: Bind with invalid credentials should return false // and not throw a ServerNotAvailableException. @@ -221,7 +198,7 @@ class ConnectionTest extends \Test\TestCase { $this->ldap->expects($this->any()) ->method('connect') - ->willReturn('ldapResource'); + ->willReturn(ldap_connect('ldap://example.com')); $this->ldap->expects($this->once()) ->method('bind') @@ -234,12 +211,12 @@ class ConnectionTest extends \Test\TestCase { try { $this->assertFalse($this->connection->bind(), 'Connection::bind() should not return true with invalid credentials.'); - } catch (\OC\ServerNotAvailableException $e) { + } catch (ServerNotAvailableException $e) { $this->fail('Failed asserting that exception of type "OC\ServerNotAvailableException" is not thrown.'); } } - public function testStartTlsNegotiationFailure() { + public function testStartTlsNegotiationFailure(): void { // background: If Start TLS negotiation fails, // a ServerNotAvailableException should be thrown. @@ -264,7 +241,7 @@ class ConnectionTest extends \Test\TestCase { $this->ldap->expects($this->any()) ->method('connect') - ->willReturn('ldapResource'); + ->willReturn(ldap_connect('ldap://example.com')); $this->ldap->expects($this->any()) ->method('setOption') @@ -282,7 +259,7 @@ class ConnectionTest extends \Test\TestCase { ->method('startTls') ->willReturn(false); - $this->expectException(\OC\ServerNotAvailableException::class); + $this->expectException(ServerNotAvailableException::class); $this->expectExceptionMessage('Start TLS failed, when connecting to LDAP host ' . $host . '.'); $this->connection->init(); diff --git a/apps/user_ldap/tests/GroupLDAPPluginTest.php b/apps/user_ldap/tests/GroupLDAPPluginTest.php index 660608d6b1f..9f4cff64d6b 100644 --- a/apps/user_ldap/tests/GroupLDAPPluginTest.php +++ b/apps/user_ldap/tests/GroupLDAPPluginTest.php @@ -1,26 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; @@ -28,27 +11,23 @@ use OCA\User_LDAP\GroupPluginManager; use OCP\GroupInterface; class GroupLDAPPluginTest extends \Test\TestCase { - - /** - * @return GroupPluginManager - */ - private function getGroupPluginManager() { + private function getGroupPluginManager(): GroupPluginManager { return new GroupPluginManager(); } - public function testImplementsActions() { + public function testImplementsActions(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions']) ->getMock(); $plugin->expects($this->any()) ->method('respondToActions') ->willReturn(GroupInterface::CREATE_GROUP); - $plugin2 = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions']) + $plugin2 = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions']) ->getMock(); $plugin2->expects($this->any()) @@ -63,11 +42,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $this->assertTrue($pluginManager->implementsActions(GroupInterface::ADD_TO_GROUP)); } - public function testCreateGroup() { + public function testCreateGroup(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'createGroup']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'createGroup']) ->getMock(); $plugin->expects($this->any()) @@ -85,7 +64,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testCreateGroupNotRegistered() { + public function testCreateGroupNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements createGroup in this LDAP Backend.'); @@ -93,11 +72,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $pluginManager->createGroup('foo'); } - public function testDeleteGroup() { + public function testDeleteGroup(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'deleteGroup']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'deleteGroup']) ->getMock(); $plugin->expects($this->any()) @@ -115,7 +94,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testDeleteGroupNotRegistered() { + public function testDeleteGroupNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements deleteGroup in this LDAP Backend.'); @@ -123,11 +102,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $pluginManager->deleteGroup('foo'); } - public function testAddToGroup() { + public function testAddToGroup(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'addToGroup']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'addToGroup']) ->getMock(); $plugin->expects($this->any()) @@ -146,7 +125,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testAddToGroupNotRegistered() { + public function testAddToGroupNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements addToGroup in this LDAP Backend.'); @@ -154,11 +133,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $pluginManager->addToGroup('foo', 'bar'); } - public function testRemoveFromGroup() { + public function testRemoveFromGroup(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'removeFromGroup']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'removeFromGroup']) ->getMock(); $plugin->expects($this->any()) @@ -177,7 +156,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testRemoveFromGroupNotRegistered() { + public function testRemoveFromGroupNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements removeFromGroup in this LDAP Backend.'); @@ -185,11 +164,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $pluginManager->removeFromGroup('foo', 'bar'); } - public function testCountUsersInGroup() { + public function testCountUsersInGroup(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'countUsersInGroup']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'countUsersInGroup']) ->getMock(); $plugin->expects($this->any()) @@ -208,7 +187,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testCountUsersInGroupNotRegistered() { + public function testCountUsersInGroupNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements countUsersInGroup in this LDAP Backend.'); @@ -216,11 +195,11 @@ class GroupLDAPPluginTest extends \Test\TestCase { $pluginManager->countUsersInGroup('foo', 'bar'); } - public function testgetGroupDetails() { + public function testgetGroupDetails(): void { $pluginManager = $this->getGroupPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPGroupPluginDummy') - ->setMethods(['respondToActions', 'getGroupDetails']) + $plugin = $this->getMockBuilder(LDAPGroupPluginDummy::class) + ->onlyMethods(['respondToActions', 'getGroupDetails']) ->getMock(); $plugin->expects($this->any()) @@ -238,7 +217,7 @@ class GroupLDAPPluginTest extends \Test\TestCase { } - public function testgetGroupDetailsNotRegistered() { + public function testgetGroupDetailsNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements getGroupDetails in this LDAP Backend.'); diff --git a/apps/user_ldap/tests/Group_LDAPTest.php b/apps/user_ldap/tests/Group_LDAPTest.php index 6204c22cb9e..10182111768 100644 --- a/apps/user_ldap/tests/Group_LDAPTest.php +++ b/apps/user_ldap/tests/Group_LDAPTest.php @@ -1,32 +1,10 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Vincent Petry <vincent@nextcloud.com> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * @author Xuanwo <xuanwo@yunify.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; @@ -37,7 +15,15 @@ use OCA\User_LDAP\GroupPluginManager; use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\User\Manager; +use OCA\User_LDAP\User\OfflineUser; +use OCA\User_LDAP\User\User; +use OCA\User_LDAP\User_Proxy; use OCP\GroupInterface; +use OCP\IConfig; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Security\ISecureRandom; +use OCP\Server; use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; @@ -49,17 +35,34 @@ use Test\TestCase; * @package OCA\User_LDAP\Tests */ class Group_LDAPTest extends TestCase { - public function testCountEmptySearchString() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); + private Access&MockObject $access; + private GroupPluginManager&MockObject $pluginManager; + private IConfig&MockObject $config; + private IUserManager&MockObject $ncUserManager; + private GroupLDAP $groupBackend; + + public function setUp(): void { + parent::setUp(); + + $this->access = $this->getAccessMock(); + $this->pluginManager = $this->createMock(GroupPluginManager::class); + $this->config = $this->createMock(IConfig::class); + $this->ncUserManager = $this->createMock(IUserManager::class); + } + + public function initBackend(): void { + $this->groupBackend = new GroupLDAP($this->access, $this->pluginManager, $this->config, $this->ncUserManager); + } + + public function testCountEmptySearchString(): void { $groupDN = 'cn=group,dc=foo,dc=bar'; - $this->enableGroups($access); + $this->enableGroups(); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn($groupDN); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn) use ($groupDN) { if ($dn === $groupDN) { @@ -72,20 +75,20 @@ class Group_LDAPTest extends TestCase { } return []; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); // for primary groups - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('countUsers') ->willReturn(2); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['displayName', 'mail']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $users = $groupBackend->countUsersInGroup('group'); + $this->initBackend(); + $users = $this->groupBackend->countUsersInGroup('group'); $this->assertSame(6, $users); } @@ -94,39 +97,20 @@ class Group_LDAPTest extends TestCase { * @return MockObject|Access */ private function getAccessMock() { - static $conMethods; - static $accMethods; - - if (is_null($conMethods) || is_null($accMethods)) { - $conMethods = get_class_methods(Connection::class); - $accMethods = get_class_methods(Access::class); - } $lw = $this->createMock(ILDAPWrapper::class); $connector = $this->getMockBuilder(Connection::class) - ->setMethods($conMethods) ->setConstructorArgs([$lw, '', null]) ->getMock(); - $access = $this->createMock(Access::class); - - $access->connection = $connector; - - $access->userManager = $this->createMock(Manager::class); + $this->access = $this->createMock(Access::class); + $this->access->connection = $connector; + $this->access->userManager = $this->createMock(Manager::class); - return $access; + return $this->access; } - /** - * @return MockObject|GroupPluginManager - */ - private function getPluginManagerMock() { - return $this->createMock(GroupPluginManager::class); - } - - private function enableGroups(Access $access) { - $access->connection = $this->createMock(Connection::class); - - $access->connection->expects($this->any()) + private function enableGroups(): void { + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { if ($name === 'ldapDynamicGroupMemberURL') { @@ -138,372 +122,317 @@ class Group_LDAPTest extends TestCase { }); } - public function testCountWithSearchString() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); + public function testCountWithSearchString(): void { + $this->enableGroups(); - $this->enableGroups($access); - - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn('cn=group,dc=foo,dc=bar'); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('fetchListOfUsers') ->willReturn([]); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($name) { //the search operation will call readAttribute, thus we need - //to anaylze the "dn". All other times we just need to return + //to analyze the "dn". All other times we just need to return //something that is neither null or false, but once an array //with the users in the group – so we do so all other times for - //simplicicity. - if (strpos($name, 'u') === 0) { + //simplicity. + if (str_starts_with($name, 'u')) { return strpos($name, '3'); } return ['u11', 'u22', 'u33', 'u34']; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('dn2username') ->willReturnCallback(function () { - return 'foobar' . \OC::$server->getSecureRandom()->generate(7); + return 'foobar' . Server::get(ISecureRandom::class)->generate(7); }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('escapeFilterPart') ->willReturnArgument(0); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['displayName', 'mail']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $users = $groupBackend->countUsersInGroup('group', '3'); + $this->initBackend(); + $users = $this->groupBackend->countUsersInGroup('group', '3'); $this->assertSame(2, $users); } - public function testCountUsersWithPlugin() { + public function testCountUsersWithPlugin(): void { /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'countUsersInGroup']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'countUsersInGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::COUNT_USERS) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('countUsersInGroup') ->with('gid', 'search') ->willReturn(42); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertEquals($ldap->countUsersInGroup('gid', 'search'), 42); + $this->initBackend(); + $this->assertEquals($this->groupBackend->countUsersInGroup('gid', 'search'), 42); } - public function testGidNumber2NameSuccess() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGidNumber2NameSuccess(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([['dn' => ['cn=foo,dc=barfoo,dc=bar']]]); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('dn2groupname') ->with('cn=foo,dc=barfoo,dc=bar') ->willReturn('MyGroup'); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->gidNumber2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->gidNumber2Name('3117', $userDN); $this->assertSame('MyGroup', $group); } - public function testGidNumberID2NameNoGroup() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGidNumberID2NameNoGroup(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([]); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('dn2groupname'); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->gidNumber2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->gidNumber2Name('3117', $userDN); $this->assertSame(false, $group); } - public function testGidNumberID2NameNoName() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGidNumberID2NameNoName(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([['dn' => ['cn=foo,dc=barfoo,dc=bar']]]); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('dn2groupname') ->willReturn(false); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->gidNumber2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->gidNumber2Name('3117', $userDN); $this->assertSame(false, $group); } - public function testGetEntryGidNumberValue() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGetEntryGidNumberValue(): void { + $this->enableGroups(); $dn = 'cn=foobar,cn=foo,dc=barfoo,dc=bar'; $attr = 'gidNumber'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('readAttribute') ->with($dn, $attr) ->willReturn(['3117']); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $gid = $groupBackend->getGroupGidNumber($dn); + $this->initBackend(); + $gid = $this->groupBackend->getGroupGidNumber($dn); $this->assertSame('3117', $gid); } - public function testGetEntryGidNumberNoValue() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGetEntryGidNumberNoValue(): void { + $this->enableGroups(); $dn = 'cn=foobar,cn=foo,dc=barfoo,dc=bar'; $attr = 'gidNumber'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('readAttribute') ->with($dn, $attr) ->willReturn(false); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $gid = $groupBackend->getGroupGidNumber($dn); + $this->initBackend(); + $gid = $this->groupBackend->getGroupGidNumber($dn); $this->assertSame(false, $gid); } - public function testPrimaryGroupID2NameSuccessCache() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testPrimaryGroupID2NameSuccessCache(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; $gid = '3117'; - $groupDN = 'cn=foo,dc=barfoo,dc=bar'; /** @var MockObject $connection */ - $connection = $access->connection; + $connection = $this->access->connection; $connection->expects($this->once()) ->method('getFromCache') ->with('primaryGroupIDtoName_' . $gid) ->willReturn('MyGroup'); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('getSID'); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('searchGroups'); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('dn2groupname'); - $groupBackend = new GroupLDAP($access, $pluginManager); - $group = $groupBackend->primaryGroupID2Name($gid, $userDN); + $this->initBackend(); + $group = $this->groupBackend->primaryGroupID2Name($gid, $userDN); $this->assertSame('MyGroup', $group); } - public function testPrimaryGroupID2NameSuccess() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testPrimaryGroupID2NameSuccess(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('getSID') ->with($userDN) ->willReturn('S-1-5-21-249921958-728525901-1594176202'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([['dn' => ['cn=foo,dc=barfoo,dc=bar']]]); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('dn2groupname') ->with('cn=foo,dc=barfoo,dc=bar') ->willReturn('MyGroup'); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->primaryGroupID2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->primaryGroupID2Name('3117', $userDN); $this->assertSame('MyGroup', $group); } - public function testPrimaryGroupID2NameNoSID() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testPrimaryGroupID2NameNoSID(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('getSID') ->with($userDN) ->willReturn(false); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('searchGroups'); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('dn2groupname'); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->primaryGroupID2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->primaryGroupID2Name('3117', $userDN); $this->assertSame(false, $group); } - public function testPrimaryGroupID2NameNoGroup() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testPrimaryGroupID2NameNoGroup(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('getSID') ->with($userDN) ->willReturn('S-1-5-21-249921958-728525901-1594176202'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([]); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('dn2groupname'); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->primaryGroupID2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->primaryGroupID2Name('3117', $userDN); $this->assertSame(false, $group); } - public function testPrimaryGroupID2NameNoName() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testPrimaryGroupID2NameNoName(): void { + $this->enableGroups(); $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('getSID') ->with($userDN) ->willReturn('S-1-5-21-249921958-728525901-1594176202'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('searchGroups') ->willReturn([['dn' => ['cn=foo,dc=barfoo,dc=bar']]]); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('dn2groupname') ->willReturn(false); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $group = $groupBackend->primaryGroupID2Name('3117', $userDN); + $this->initBackend(); + $group = $this->groupBackend->primaryGroupID2Name('3117', $userDN); $this->assertSame(false, $group); } - public function testGetEntryGroupIDValue() { + public function testGetEntryGroupIDValue(): void { //tests getEntryGroupID via getGroupPrimaryGroupID //which is basically identical to getUserPrimaryGroupIDs - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + $this->enableGroups(); $dn = 'cn=foobar,cn=foo,dc=barfoo,dc=bar'; $attr = 'primaryGroupToken'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('readAttribute') ->with($dn, $attr) ->willReturn(['3117']); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $gid = $groupBackend->getGroupPrimaryGroupID($dn); + $this->initBackend(); + $gid = $this->groupBackend->getGroupPrimaryGroupID($dn); $this->assertSame('3117', $gid); } - public function testGetEntryGroupIDNoValue() { + public function testGetEntryGroupIDNoValue(): void { //tests getEntryGroupID via getGroupPrimaryGroupID //which is basically identical to getUserPrimaryGroupIDs - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + $this->enableGroups(); $dn = 'cn=foobar,cn=foo,dc=barfoo,dc=bar'; $attr = 'primaryGroupToken'; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('readAttribute') ->with($dn, $attr) ->willReturn(false); - $groupBackend = new GroupLDAP($access, $pluginManager); - - $gid = $groupBackend->getGroupPrimaryGroupID($dn); + $this->initBackend(); + $gid = $this->groupBackend->getGroupPrimaryGroupID($dn); $this->assertSame(false, $gid); } @@ -512,29 +441,26 @@ class Group_LDAPTest extends TestCase { * tests whether Group Backend behaves correctly when cache with uid and gid * is hit */ - public function testInGroupHitsUidGidCache() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testInGroupHitsUidGidCache(): void { + $this->enableGroups(); $uid = 'someUser'; $gid = 'someGroup'; $cacheKey = 'inGroup' . $uid . ':' . $gid; - $access->connection->expects($this->once()) + $this->access->connection->expects($this->once()) ->method('getFromCache') ->with($cacheKey) ->willReturn(true); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('username2dn'); - $groupBackend = new GroupLDAP($access, $pluginManager); - $groupBackend->inGroup($uid, $gid); + $this->initBackend(); + $this->groupBackend->inGroup($uid, $gid); } - public function groupWithMembersProvider() { + public static function groupWithMembersProvider(): array { return [ [ 'someGroup', @@ -549,19 +475,12 @@ class Group_LDAPTest extends TestCase { ]; } - /** - * @dataProvider groupWithMembersProvider - */ - public function testInGroupMember(string $gid, string $groupDn, array $memberDNs) { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $access->connection = $this->createMock(Connection::class); - + #[\PHPUnit\Framework\Attributes\DataProvider('groupWithMembersProvider')] + public function testInGroupMember(string $gid, string $groupDn, array $memberDNs): void { $uid = 'someUser'; $userDn = $memberDNs[0]; - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { switch ($name) { @@ -576,38 +495,31 @@ class Group_LDAPTest extends TestCase { return 1; } }); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('username2dn') ->with($uid) ->willReturn($userDn); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('groupname2dn') ->willReturn($groupDn); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturn($memberDNs); - $groupBackend = new GroupLDAP($access, $pluginManager); - $this->assertTrue($groupBackend->inGroup($uid, $gid)); + $this->initBackend(); + $this->assertTrue($this->groupBackend->inGroup($uid, $gid)); } - /** - * @dataProvider groupWithMembersProvider - */ - public function testInGroupMemberNot(string $gid, string $groupDn, array $memberDNs) { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $access->connection = $this->createMock(Connection::class); - + #[\PHPUnit\Framework\Attributes\DataProvider('groupWithMembersProvider')] + public function testInGroupMemberNot(string $gid, string $groupDn, array $memberDNs): void { $uid = 'unelatedUser'; $userDn = 'uid=unrelatedUser,ou=unrelatedTeam,ou=unrelatedDepartment,dc=someDomain,dc=someTld'; - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { switch ($name) { @@ -622,46 +534,38 @@ class Group_LDAPTest extends TestCase { return 1; } }); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('username2dn') ->with($uid) ->willReturn($userDn); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('groupname2dn') ->willReturn($groupDn); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturn($memberDNs); - $groupBackend = new GroupLDAP($access, $pluginManager); - $this->assertFalse($groupBackend->inGroup($uid, $gid)); + $this->initBackend(); + $this->assertFalse($this->groupBackend->inGroup($uid, $gid)); } - /** - * @dataProvider groupWithMembersProvider - */ - public function testInGroupMemberUid(string $gid, string $groupDn, array $memberDNs) { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - + #[\PHPUnit\Framework\Attributes\DataProvider('groupWithMembersProvider')] + public function testInGroupMemberUid(string $gid, string $groupDn, array $memberDNs): void { $memberUids = []; $userRecords = []; foreach ($memberDNs as $dn) { - $memberUids[] = ldap_explode_dn($dn, false)[0]; + $memberUids[] = ldap_explode_dn($dn, 0)[0]; $userRecords[] = ['dn' => [$dn]]; } - - $access->connection = $this->createMock(Connection::class); - $uid = 'someUser'; $userDn = $memberDNs[0]; - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { switch ($name) { @@ -678,65 +582,59 @@ class Group_LDAPTest extends TestCase { return 1; } }); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['uid', 'mail', 'displayname']); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('username2dn') ->with($uid) ->willReturn($userDn); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('groupname2dn') ->willReturn($groupDn); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturn($memberUids); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('fetchListOfUsers') ->willReturn($userRecords); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('combineFilterWithOr') ->willReturn('(|(pseudo=filter)(filter=pseudo))'); - $groupBackend = new GroupLDAP($access, $pluginManager); - $this->assertTrue($groupBackend->inGroup($uid, $gid)); + $this->initBackend(); + $this->assertTrue($this->groupBackend->inGroup($uid, $gid)); } - public function testGetGroupsWithOffset() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); + public function testGetGroupsWithOffset(): void { + $this->enableGroups(); - $this->enableGroups($access); - - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('nextcloudGroupNames') ->willReturn(['group1', 'group2']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $groups = $groupBackend->getGroups('', 2, 2); + $this->initBackend(); + $groups = $this->groupBackend->getGroups('', 2, 2); $this->assertSame(2, count($groups)); } /** - * tests that a user listing is complete, if all it's members have the group + * tests that a user listing is complete, if all its members have the group * as their primary. */ - public function testUsersInGroupPrimaryMembersOnly() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testUsersInGroupPrimaryMembersOnly(): void { + $this->enableGroups(); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn, $attr) { if ($attr === 'primaryGroupToken') { @@ -746,43 +644,40 @@ class Group_LDAPTest extends TestCase { } return []; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn('cn=foobar,dc=foo,dc=bar'); - $access->expects($this->exactly(2)) + $this->access->expects($this->exactly(2)) ->method('nextcloudUserNames') ->willReturnOnConsecutiveCalls(['lisa', 'bart', 'kira', 'brad'], ['walle', 'dino', 'xenia']); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('combineFilterWithAnd') ->willReturn('pseudo=filter'); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['displayName', 'mail']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $users = $groupBackend->usersInGroup('foobar'); + $this->initBackend(); + $users = $this->groupBackend->usersInGroup('foobar'); $this->assertSame(7, count($users)); } /** - * tests that a user listing is complete, if all it's members have the group + * tests that a user listing is complete, if all its members have the group * as their primary. */ - public function testUsersInGroupPrimaryAndUnixMembers() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testUsersInGroupPrimaryAndUnixMembers(): void { + $this->enableGroups(); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn, $attr) { if ($attr === 'primaryGroupToken') { @@ -790,44 +685,41 @@ class Group_LDAPTest extends TestCase { } return []; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn('cn=foobar,dc=foo,dc=bar'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('nextcloudUserNames') ->willReturn(['lisa', 'bart', 'kira', 'brad']); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('combineFilterWithAnd') ->willReturn('pseudo=filter'); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['displayName', 'mail']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $users = $groupBackend->usersInGroup('foobar'); + $this->initBackend(); + $users = $this->groupBackend->usersInGroup('foobar'); $this->assertSame(4, count($users)); } /** - * tests that a user counting is complete, if all it's members have the group + * tests that a user counting is complete, if all its members have the group * as their primary. */ - public function testCountUsersInGroupPrimaryMembersOnly() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); + public function testCountUsersInGroupPrimaryMembersOnly(): void { + $this->enableGroups(); - $this->enableGroups($access); - - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('getFromCache') ->willReturn(null); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn, $attr) { if ($attr === 'primaryGroupToken') { @@ -835,65 +727,63 @@ class Group_LDAPTest extends TestCase { } return []; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn('cn=foobar,dc=foo,dc=bar'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('countUsers') ->willReturn(4); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $access->userManager->expects($this->any()) + $this->access->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['displayName', 'mail']); - $groupBackend = new GroupLDAP($access, $pluginManager); - $users = $groupBackend->countUsersInGroup('foobar'); + $this->initBackend(); + $users = $this->groupBackend->countUsersInGroup('foobar'); $this->assertSame(4, $users); } - public function testGetUserGroupsMemberOf() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $this->enableGroups($access); + public function testGetUserGroupsMemberOf(): void { + $this->enableGroups(); $dn = 'cn=userX,dc=foobar'; - $access->connection->hasPrimaryGroups = false; - $access->connection->hasGidNumber = false; + $this->access->connection->hasPrimaryGroups = false; + $this->access->connection->hasGidNumber = false; - $access->expects($this->any()) + $expectedGroups = ['cn=groupA,dc=foobar', 'cn=groupB,dc=foobar']; + + $this->access->expects($this->any()) ->method('username2dn') ->willReturn($dn); - $access->expects($this->exactly(5)) - ->method('readAttribute') - ->will($this->onConsecutiveCalls(['cn=groupA,dc=foobar', 'cn=groupB,dc=foobar'], [], [], [], [])); - $access->expects($this->any()) + $this->access->expects($this->exactly(5)) + ->method('readAttribute')->willReturnOnConsecutiveCalls($expectedGroups, [], [], [], []); + $this->access->expects($this->any()) ->method('dn2groupname') ->willReturnArgument(0); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturnArgument(0); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $groupBackend = new GroupLDAP($access, $pluginManager); - $groups = $groupBackend->getUserGroups('userX'); + $this->config->expects($this->once()) + ->method('setUserValue') + ->with('userX', 'user_ldap', 'cached-group-memberships-', \json_encode($expectedGroups)); + + $this->initBackend(); + $groups = $this->groupBackend->getUserGroups('userX'); $this->assertSame(2, count($groups)); } - public function testGetUserGroupsMemberOfDisabled() { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - - $access->connection = $this->createMock(Connection::class); - $access->connection->expects($this->any()) + public function testGetUserGroupsMemberOfDisabled(): void { + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { if ($name === 'useMemberOfToDetectMembership') { @@ -906,71 +796,187 @@ class Group_LDAPTest extends TestCase { $dn = 'cn=userX,dc=foobar'; - $access->connection->hasPrimaryGroups = false; - $access->connection->hasGidNumber = false; + $this->access->connection->hasPrimaryGroups = false; + $this->access->connection->hasGidNumber = false; - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('username2dn') ->willReturn($dn); - $access->expects($this->never()) + $this->access->expects($this->never()) ->method('readAttribute') ->with($dn, 'memberOf'); - $access->expects($this->once()) + $this->access->expects($this->once()) ->method('nextcloudGroupNames') ->willReturn([]); - $groupBackend = new GroupLDAP($access, $pluginManager); - $groupBackend->getUserGroups('userX'); + // empty group result should not be oer + $this->config->expects($this->once()) + ->method('setUserValue') + ->with('userX', 'user_ldap', 'cached-group-memberships-', '[]'); + + $ldapUser = $this->createMock(User::class); + + $this->access->userManager->expects($this->any()) + ->method('get') + ->with('userX') + ->willReturn($ldapUser); + + $userBackend = $this->createMock(User_Proxy::class); + $userBackend->expects($this->once()) + ->method('userExistsOnLDAP') + ->with('userX', true) + ->willReturn(true); + + $ncUser = $this->createMock(IUser::class); + $ncUser->expects($this->any()) + ->method('getBackend') + ->willReturn($userBackend); + + $this->ncUserManager->expects($this->once()) + ->method('get') + ->with('userX') + ->willReturn($ncUser); + + $this->initBackend(); + $this->groupBackend->getUserGroups('userX'); } - public function nestedGroupsProvider(): array { + public function testGetUserGroupsOfflineUser(): void { + $this->enableGroups(); + + $offlineUser = $this->createMock(OfflineUser::class); + + $this->config->expects($this->any()) + ->method('getUserValue') + ->with('userX', 'user_ldap', 'cached-group-memberships-', $this->anything()) + ->willReturn(\json_encode(['groupB', 'groupF'])); + + $this->access->userManager->expects($this->any()) + ->method('get') + ->with('userX') + ->willReturn($offlineUser); + + $this->initBackend(); + $returnedGroups = $this->groupBackend->getUserGroups('userX'); + $this->assertCount(2, $returnedGroups); + $this->assertContains('groupB', $returnedGroups); + $this->assertContains('groupF', $returnedGroups); + } + + /** + * regression tests against a case where a json object was stored instead of expected list + * @see https://github.com/nextcloud/server/issues/42374 + */ + public function testGetUserGroupsOfflineUserUnexpectedJson(): void { + $this->enableGroups(); + + $offlineUser = $this->createMock(OfflineUser::class); + + $this->config->expects($this->any()) + ->method('getUserValue') + ->with('userX', 'user_ldap', 'cached-group-memberships-', $this->anything()) + // results in a json object: {"0":"groupB","2":"groupF"} + ->willReturn(\json_encode([0 => 'groupB', 2 => 'groupF'])); + + $this->access->userManager->expects($this->any()) + ->method('get') + ->with('userX') + ->willReturn($offlineUser); + + $this->initBackend(); + $returnedGroups = $this->groupBackend->getUserGroups('userX'); + $this->assertCount(2, $returnedGroups); + $this->assertContains('groupB', $returnedGroups); + $this->assertContains('groupF', $returnedGroups); + } + + public function testGetUserGroupsUnrecognizedOfflineUser(): void { + $this->enableGroups(); + $dn = 'cn=userX,dc=foobar'; + + $ldapUser = $this->createMock(User::class); + + $userBackend = $this->createMock(User_Proxy::class); + $userBackend->expects($this->once()) + ->method('userExistsOnLDAP') + ->with('userX', true) + ->willReturn(false); + + $ncUser = $this->createMock(IUser::class); + $ncUser->expects($this->any()) + ->method('getBackend') + ->willReturn($userBackend); + + $this->config->expects($this->atLeastOnce()) + ->method('getUserValue') + ->with('userX', 'user_ldap', 'cached-group-memberships-', $this->anything()) + ->willReturn(\json_encode(['groupB', 'groupF'])); + + $this->access->expects($this->any()) + ->method('username2dn') + ->willReturn($dn); + + $this->access->userManager->expects($this->any()) + ->method('get') + ->with('userX') + ->willReturn($ldapUser); + + $this->ncUserManager->expects($this->once()) + ->method('get') + ->with('userX') + ->willReturn($ncUser); + + $this->initBackend(); + $returnedGroups = $this->groupBackend->getUserGroups('userX'); + $this->assertCount(2, $returnedGroups); + $this->assertContains('groupB', $returnedGroups); + $this->assertContains('groupF', $returnedGroups); + } + + public static function nestedGroupsProvider(): array { return [ [true], [false], ]; } - /** - * @dataProvider nestedGroupsProvider - */ - public function testGetGroupsByMember(bool $nestedGroups) { - $access = $this->getAccessMock(); - $pluginManager = $this->getPluginManagerMock(); - + #[\PHPUnit\Framework\Attributes\DataProvider('nestedGroupsProvider')] + public function testGetGroupsByMember(bool $nestedGroups): void { $groupFilter = '(&(objectclass=nextcloudGroup)(nextcloudEnabled=TRUE))'; - $access->connection = $this->createMock(Connection::class); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') - ->willReturnCallback(function ($name) use ($nestedGroups, $groupFilter) { + ->willReturnCallback(function (string $name) use ($nestedGroups, $groupFilter) { switch ($name) { case 'useMemberOfToDetectMembership': return 0; case 'ldapDynamicGroupMemberURL': return ''; case 'ldapNestedGroups': - return $nestedGroups; + return (int)$nestedGroups; case 'ldapGroupMemberAssocAttr': return 'member'; case 'ldapGroupFilter': return $groupFilter; case 'ldapBaseGroups': return []; + case 'ldapGroupDisplayName': + return 'cn'; } return 1; }); $dn = 'cn=userX,dc=foobar'; - $access->connection->hasPrimaryGroups = false; - $access->connection->hasGidNumber = false; + $this->access->connection->hasPrimaryGroups = false; + $this->access->connection->hasGidNumber = false; - $access->expects($this->exactly(2)) + $this->access->expects($this->exactly(2)) ->method('username2dn') ->willReturn($dn); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('readAttribute') ->willReturn([]); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('combineFilterWithAnd') ->willReturnCallback(function (array $filterParts) { // ⚠ returns a pseudo-filter only, not real LDAP Filter syntax @@ -980,352 +986,346 @@ class Group_LDAPTest extends TestCase { $group1 = [ 'cn' => 'group1', 'dn' => ['cn=group1,ou=groups,dc=domain,dc=com'], + 'member' => [$dn], ]; $group2 = [ 'cn' => 'group2', 'dn' => ['cn=group2,ou=groups,dc=domain,dc=com'], + 'member' => [$dn], + ]; + $group3 = [ + 'cn' => 'group3', + 'dn' => ['cn=group3,ou=groups,dc=domain,dc=com'], + 'member' => [$group2['dn'][0]], ]; - $access->expects($this->once()) + $expectedGroups = ($nestedGroups ? [$group1, $group2, $group3] : [$group1, $group2]); + $expectedGroupsNames = ($nestedGroups ? ['group1', 'group2', 'group3'] : ['group1', 'group2']); + + $this->access->expects($this->any()) ->method('nextcloudGroupNames') - ->with([$group1, $group2]) - ->willReturn(['group1', 'group2']); - $access->expects($nestedGroups ? $this->atLeastOnce() : $this->once()) + ->with($expectedGroups) + ->willReturn($expectedGroupsNames); + $this->access->expects($nestedGroups ? $this->atLeastOnce() : $this->once()) ->method('fetchListOfGroups') - ->willReturnCallback(function ($filter, $attr, $limit, $offset) use ($nestedGroups, $groupFilter, $group1, $group2) { + ->willReturnCallback(function ($filter, $attr, $limit, $offset) use ($nestedGroups, $groupFilter, $group1, $group2, $group3, $dn) { static $firstRun = true; if (!$nestedGroups) { // When nested groups are enabled, groups cannot be filtered early as it would // exclude intermediate groups. But we can, and should, when working with flat groups. - $this->assertTrue(strpos($filter, $groupFilter) !== false); + $this->assertTrue(str_contains($filter, $groupFilter)); } - if ($firstRun) { - $firstRun = false; + [$memberFilter] = explode('&', $filter); + if ($memberFilter === 'member=' . $dn) { return [$group1, $group2]; + return []; + } elseif ($memberFilter === 'member=' . $group2['dn'][0]) { + return [$group3]; + } else { + return []; } - return []; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('dn2groupname') ->willReturnCallback(function (string $dn) { return ldap_explode_dn($dn, 1)[0]; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') - ->willReturnCallback(function (string $gid) use ($group1, $group2) { + ->willReturnCallback(function (string $gid) use ($group1, $group2, $group3) { if ($gid === $group1['cn']) { return $group1['dn'][0]; } if ($gid === $group2['cn']) { return $group2['dn'][0]; } + if ($gid === $group3['cn']) { + return $group3['dn'][0]; + } }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('isDNPartOfBase') ->willReturn(true); - $groupBackend = new GroupLDAP($access, $pluginManager); - $groups = $groupBackend->getUserGroups('userX'); - $this->assertEquals(['group1', 'group2'], $groups); + $this->initBackend(); + $groups = $this->groupBackend->getUserGroups('userX'); + $this->assertEquals($expectedGroupsNames, $groups); - $groupsAgain = $groupBackend->getUserGroups('userX'); - $this->assertEquals(['group1', 'group2'], $groupsAgain); + $groupsAgain = $this->groupBackend->getUserGroups('userX'); + $this->assertEquals($expectedGroupsNames, $groupsAgain); } - public function testCreateGroupWithPlugin() { - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'createGroup']) + public function testCreateGroupWithPlugin(): void { + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'createGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::CREATE_GROUP) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('createGroup') ->with('gid') ->willReturn('result'); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertEquals($ldap->createGroup('gid'), true); + $this->initBackend(); + $this->assertTrue($this->groupBackend->createGroup('gid')); } - public function testCreateGroupFailing() { + public function testCreateGroupFailing(): void { $this->expectException(\Exception::class); - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'createGroup']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'createGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::CREATE_GROUP) ->willReturn(false); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $ldap->createGroup('gid'); + $this->initBackend(); + $this->groupBackend->createGroup('gid'); } - public function testDeleteGroupWithPlugin() { - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'deleteGroup']) + public function testDeleteGroupWithPlugin(): void { + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'deleteGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::DELETE_GROUP) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('deleteGroup') ->with('gid') ->willReturn(true); $mapper = $this->getMockBuilder(GroupMapping::class) - ->setMethods(['unmap']) + ->onlyMethods(['unmap']) ->disableOriginalConstructor() ->getMock(); - $access = $this->getAccessMock(); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('getGroupMapper') ->willReturn($mapper); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertTrue($ldap->deleteGroup('gid')); + $this->initBackend(); + $this->assertTrue($this->groupBackend->deleteGroup('gid')); } - public function testDeleteGroupFailing() { + public function testDeleteGroupFailing(): void { $this->expectException(\Exception::class); - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'deleteGroup']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'deleteGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::DELETE_GROUP) ->willReturn(false); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $ldap->deleteGroup('gid'); + $this->initBackend(); + $this->groupBackend->deleteGroup('gid'); } - public function testAddToGroupWithPlugin() { - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'addToGroup']) + public function testAddToGroupWithPlugin(): void { + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'addToGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::ADD_TO_GROUP) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('addToGroup') ->with('uid', 'gid') ->willReturn('result'); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertEquals($ldap->addToGroup('uid', 'gid'), 'result'); + $this->initBackend(); + $this->assertEquals('result', $this->groupBackend->addToGroup('uid', 'gid')); } - public function testAddToGroupFailing() { + public function testAddToGroupFailing(): void { $this->expectException(\Exception::class); - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'addToGroup']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'addToGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::ADD_TO_GROUP) ->willReturn(false); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $ldap->addToGroup('uid', 'gid'); + $this->initBackend(); + $this->groupBackend->addToGroup('uid', 'gid'); } - public function testRemoveFromGroupWithPlugin() { - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'removeFromGroup']) + public function testRemoveFromGroupWithPlugin(): void { + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'removeFromGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::REMOVE_FROM_GROUP) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('removeFromGroup') ->with('uid', 'gid') ->willReturn('result'); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertEquals($ldap->removeFromGroup('uid', 'gid'), 'result'); + $this->initBackend(); + $this->assertEquals('result', $this->groupBackend->removeFromGroup('uid', 'gid')); } - public function testRemoveFromGroupFailing() { + public function testRemoveFromGroupFailing(): void { $this->expectException(\Exception::class); - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'removeFromGroup']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'removeFromGroup']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::REMOVE_FROM_GROUP) ->willReturn(false); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $ldap->removeFromGroup('uid', 'gid'); + $this->initBackend(); + $this->groupBackend->removeFromGroup('uid', 'gid'); } - public function testGetGroupDetailsWithPlugin() { + public function testGetGroupDetailsWithPlugin(): void { /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'getGroupDetails']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'getGroupDetails']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::GROUP_DETAILS) ->willReturn(true); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('getGroupDetails') ->with('gid') ->willReturn('result'); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $this->assertEquals($ldap->getGroupDetails('gid'), 'result'); + $this->initBackend(); + $this->assertEquals('result', $this->groupBackend->getGroupDetails('gid')); } - - public function testGetGroupDetailsFailing() { + public function testGetGroupDetailsFailing(): void { $this->expectException(\Exception::class); - /** @var GroupPluginManager|MockObject $pluginManager */ - $pluginManager = $this->getMockBuilder(GroupPluginManager::class) - ->setMethods(['implementsActions', 'getGroupDetails']) + $this->pluginManager = $this->getMockBuilder(GroupPluginManager::class) + ->onlyMethods(['implementsActions', 'getGroupDetails']) ->getMock(); - $pluginManager->expects($this->once()) + $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(GroupInterface::GROUP_DETAILS) ->willReturn(false); - $access = $this->getAccessMock(); - $access->connection = $this->createMock(Connection::class); - - $ldap = new GroupLDAP($access, $pluginManager); - - $ldap->getGroupDetails('gid'); + $this->initBackend(); + $this->groupBackend->getGroupDetails('gid'); } - public function groupMemberProvider() { + public static function groupMemberProvider(): array { $base = 'dc=species,dc=earth'; - $groups0 = [ + $birdsDn = [ 'uid=3723,' . $base, 'uid=8372,' . $base, 'uid=8427,' . $base, 'uid=2333,' . $base, 'uid=4754,' . $base, ]; - $groups1 = [ + $birdsUid = [ '3723', '8372', '8427', '2333', '4754', ]; - $groups2Nested = ['6642', '1424']; - $expGroups2 = array_merge($groups1, $groups2Nested); + $animalsDn = [ + 'uid=lion,' . $base, + 'uid=tiger,' . $base, + ]; + $plantsDn = [ + 'uid=flower,' . $base, + 'uid=tree,' . $base, + ]; + $thingsDn = [ + 'uid=thing1,' . $base, + 'uid=thing2,' . $base, + ]; return [ [ #0 – test DNs - 'cn=Birds,' . $base, - $groups0, - ['cn=Birds,' . $base => $groups0] + ['cn=Birds,' . $base => $birdsDn], + ['cn=Birds,' . $base => $birdsDn] ], [ #1 – test uids - 'cn=Birds,' . $base, - $groups1, - ['cn=Birds,' . $base => $groups1] + ['cn=Birds,' . $base => $birdsUid], + ['cn=Birds,' . $base => $birdsUid] + ], + [ #2 – test simple nested group + ['cn=Animals,' . $base => array_merge($birdsDn, $animalsDn)], + [ + 'cn=Animals,' . $base => array_merge(['cn=Birds,' . $base], $animalsDn), + 'cn=Birds,' . $base => $birdsDn, + ] + ], + [ #3 – test recursive nested group + [ + 'cn=Animals,' . $base => array_merge($birdsDn, $animalsDn), + 'cn=Birds,' . $base => array_merge($birdsDn, $animalsDn), + ], + [ + 'cn=Animals,' . $base => array_merge(['cn=Birds,' . $base,'cn=Birds,' . $base,'cn=Animals,' . $base], $animalsDn), + 'cn=Birds,' . $base => array_merge(['cn=Animals,' . $base,'cn=Birds,' . $base], $birdsDn), + ] + ], + [ #4 – Complicated nested group + ['cn=Things,' . $base => array_merge($birdsDn, $animalsDn, $thingsDn, $plantsDn)], + [ + 'cn=Animals,' . $base => array_merge(['cn=Birds,' . $base], $animalsDn), + 'cn=Birds,' . $base => $birdsDn, + 'cn=Plants,' . $base => $plantsDn, + 'cn=Things,' . $base => array_merge(['cn=Animals,' . $base,'cn=Plants,' . $base], $thingsDn), + ] ], ]; } - /** - * @param string $groupDN - * @param string[] $expectedMembers - * @param array $groupsInfo - * @dataProvider groupMemberProvider - */ - public function testGroupMembers($groupDN, $expectedMembers, $groupsInfo = null) { - $access = $this->getAccessMock(); - $access->expects($this->any()) + #[\PHPUnit\Framework\Attributes\DataProvider('groupMemberProvider')] + public function testGroupMembers(array $expectedResult, array $groupsInfo): void { + $this->access->expects($this->any()) ->method('readAttribute') - ->willReturnCallback(function ($group) use ($groupDN, $expectedMembers, $groupsInfo) { + ->willReturnCallback(function ($group) use ($groupsInfo) { if (isset($groupsInfo[$group])) { return $groupsInfo[$group]; } return []; }); - $access->connection = $this->createMock(Connection::class); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') - ->willReturnCallback(function ($name) { + ->willReturnCallback(function (string $name) { if ($name === 'ldapNestedGroups') { return 1; } elseif ($name === 'ldapGroupMemberAssocAttr') { @@ -1334,35 +1334,32 @@ class Group_LDAPTest extends TestCase { return null; }); - /** @var GroupPluginManager $pluginManager */ - $pluginManager = $this->createMock(GroupPluginManager::class); - - $ldap = new GroupLDAP($access, $pluginManager); - $resultingMembers = $this->invokePrivate($ldap, '_groupMembers', [$groupDN]); + $this->initBackend(); + foreach ($expectedResult as $groupDN => $expectedMembers) { + $resultingMembers = $this->invokePrivate($this->groupBackend, '_groupMembers', [$groupDN]); - $this->assertEqualsCanonicalizing($expectedMembers, $resultingMembers); + sort($expectedMembers); + sort($resultingMembers); + $this->assertEquals($expectedMembers, $resultingMembers); + } } - public function displayNameProvider() { + public static function displayNameProvider(): array { return [ ['Graphic Novelists', ['Graphic Novelists']], ['', false], ]; } - /** - * @dataProvider displayNameProvider - */ - public function testGetDisplayName(string $expected, $ldapResult) { + #[\PHPUnit\Framework\Attributes\DataProvider('displayNameProvider')] + public function testGetDisplayName(string $expected, bool|array $ldapResult): void { $gid = 'graphic_novelists'; - $access = $this->getAccessMock(); - $access->expects($this->atLeastOnce()) + $this->access->expects($this->atLeastOnce()) ->method('readAttribute') ->willReturn($ldapResult); - $access->connection = $this->createMock(Connection::class); - $access->connection->expects($this->any()) + $this->access->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { if ($name === 'ldapGroupMemberAssocAttr') { @@ -1375,14 +1372,11 @@ class Group_LDAPTest extends TestCase { return null; }); - $access->expects($this->any()) + $this->access->expects($this->any()) ->method('groupname2dn') ->willReturn('fakedn'); - /** @var GroupPluginManager $pluginManager */ - $pluginManager = $this->createMock(GroupPluginManager::class); - - $ldap = new GroupLDAP($access, $pluginManager); - $this->assertSame($expected, $ldap->getDisplayName($gid)); + $this->initBackend(); + $this->assertSame($expected, $this->groupBackend->getDisplayName($gid)); } } diff --git a/apps/user_ldap/tests/HelperTest.php b/apps/user_ldap/tests/HelperTest.php index e8ccf0dfbcb..adea600d900 100644 --- a/apps/user_ldap/tests/HelperTest.php +++ b/apps/user_ldap/tests/HelperTest.php @@ -1,79 +1,69 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016 Roeland Jago Douma <roeland@famdouma.nl> - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ 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; /** * @group DB */ class HelperTest extends \Test\TestCase { + private IAppConfig&MockObject $appConfig; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - - /** @var Helper */ - private $helper; + private Helper $helper; protected function setUp(): void { parent::setUp(); - $this->config = $this->createMock(IConfig::class); - $this->helper = new Helper($this->config, \OC::$server->getDatabaseConnection()); + $this->appConfig = $this->createMock(IAppConfig::class); + $this->helper = new Helper( + $this->appConfig, + Server::get(IDBConnection::class) + ); } - public function testGetServerConfigurationPrefixes() { - $this->config->method('getAppKeys') - ->with($this->equalTo('user_ldap')) + public function testGetServerConfigurationPrefixes(): void { + $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() { - $this->config->method('getAppKeys') - ->with($this->equalTo('user_ldap')) + public function testGetServerConfigurationPrefixesActive(): void { + $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'; } @@ -85,21 +75,58 @@ class HelperTest extends \Test\TestCase { $this->assertEquals(['s1'], $result); } - public function testGetServerConfigurationHost() { - $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 e22678620c1..00f8be18586 100644 --- a/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php +++ b/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php @@ -1,48 +1,32 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author root <root@localhost.localdomain> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; -use OCA\User_LDAP\FilesystemHelper; use OCA\User_LDAP\GroupPluginManager; use OCA\User_LDAP\Helper; use OCA\User_LDAP\LDAP; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\UserPluginManager; +use OCP\IAvatarManager; +use OCP\IConfig; +use OCP\Image; +use OCP\IUserManager; +use OCP\Server; use OCP\Share\IManager; use Psr\Log\LoggerInterface; abstract class AbstractIntegrationTest { - /** @var LDAP */ + /** @var LDAP */ protected $ldap; - /** @var Connection */ + /** @var Connection */ protected $connection; /** @var Access */ @@ -54,14 +38,19 @@ abstract class AbstractIntegrationTest { /** @var Helper */ protected $helper; - /** @var string */ - protected $base; - /** @var string[] */ protected $server; - public function __construct($host, $port, $bind, $pwd, $base) { - $this->base = $base; + /** + * @param string $base + */ + public function __construct( + $host, + $port, + $bind, + $pwd, + protected $base, + ) { $this->server = [ 'host' => $host, 'port' => $port, @@ -76,10 +65,10 @@ abstract class AbstractIntegrationTest { */ public function init() { \OC::$server->registerService(UserPluginManager::class, function () { - return new \OCA\User_LDAP\UserPluginManager(); + return new UserPluginManager(); }); \OC::$server->registerService(GroupPluginManager::class, function () { - return new \OCA\User_LDAP\GroupPluginManager(); + return new GroupPluginManager(); }); $this->initLDAPWrapper(); @@ -121,14 +110,13 @@ abstract class AbstractIntegrationTest { */ protected function initUserManager() { $this->userManager = new Manager( - \OC::$server->getConfig(), - new FilesystemHelper(), - \OC::$server->get(LoggerInterface::class), - \OC::$server->getAvatarManager(), - new \OCP\Image(), - \OC::$server->getUserManager(), - \OC::$server->getNotificationManager(), - \OC::$server->get(IManager::class) + Server::get(IConfig::class), + Server::get(LoggerInterface::class), + Server::get(IAvatarManager::class), + new Image(), + Server::get(IUserManager::class), + Server::get(\OCP\Notification\IManager::class), + Server::get(IManager::class) ); } @@ -136,14 +124,14 @@ abstract class AbstractIntegrationTest { * initializes the test Helper */ protected function initHelper() { - $this->helper = new Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $this->helper = Server::get(Helper::class); } /** * initializes the Access test instance */ protected function initAccess() { - $this->access = new Access($this->connection, $this->ldap, $this->userManager, $this->helper, \OC::$server->getConfig(), \OC::$server->getLogger()); + $this->access = new Access($this->connection, $this->ldap, $this->userManager, $this->helper, Server::get(IConfig::class), Server::get(LoggerInterface::class)); } /** @@ -155,7 +143,7 @@ abstract class AbstractIntegrationTest { $methods = get_class_methods($this); $atLeastOneCaseRan = false; foreach ($methods as $method) { - if (strpos($method, 'case') === 0) { + if (str_starts_with($method, 'case')) { print("running $method " . PHP_EOL); try { if (!$this->$method()) { diff --git a/apps/user_ldap/tests/Integration/Bootstrap.php b/apps/user_ldap/tests/Integration/Bootstrap.php index 62537989171..ef0909d4bea 100644 --- a/apps/user_ldap/tests/Integration/Bootstrap.php +++ b/apps/user_ldap/tests/Integration/Bootstrap.php @@ -1,25 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ define('CLI_TEST_RUN', true); -require_once __DIR__ . '/../../../../lib/base.php'; +require_once __DIR__ . '/../../../../lib/base.php'; require_once __DIR__ . '/setup-scripts/config.php'; diff --git a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php index fa46f73054c..3eec3df675a 100644 --- a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php +++ b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php @@ -1,32 +1,16 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration; use OC\ServerNotAvailableException; use OCA\User_LDAP\LDAP; +use OCP\App\IAppManager; +use OCP\Server; /** * Class ExceptionOnLostConnection @@ -39,44 +23,29 @@ use OCA\User_LDAP\LDAP; * */ class ExceptionOnLostConnection { - /** @var string */ - private $toxiProxyHost; - - /** @var string */ - private $toxiProxyName; - - /** @var string */ - private $ldapBase; - - /** @var string|null */ - private $ldapBindDN; - - /** @var string|null */ - private $ldapBindPwd; - - /** @var string */ + /** @var string */ private $ldapHost; - /** @var \OCA\User_LDAP\LDAP */ + /** @var LDAP */ private $ldap; - /** @var bool */ + /** @var bool */ private $originalProxyState; /** - * @param string $proxyHost host of toxiproxy as url, like http://localhost:8474 - * @param string $proxyName name of the LDAP proxy service as configured in toxiProxy + * @param string $toxiProxyHost host of toxiproxy as url, like http://localhost:8474 + * @param string $toxiProxyName name of the LDAP proxy service as configured in toxiProxy * @param string $ldapBase any valid LDAP base DN - * @param null $bindDN optional, bind DN if anonymous bind is not possible - * @param null $bindPwd optional + * @param null $ldapBindDN optional, bind DN if anonymous bind is not possible + * @param null $ldapBindPwd optional */ - public function __construct($proxyHost, $proxyName, $ldapBase, $bindDN = null, $bindPwd = null) { - $this->toxiProxyHost = $proxyHost; - $this->toxiProxyName = $proxyName; - $this->ldapBase = $ldapBase; - $this->ldapBindDN = $bindDN; - $this->ldapBindPwd = $bindPwd; - + public function __construct( + private $toxiProxyHost, + private $toxiProxyName, + private $ldapBase, + private $ldapBindDN = null, + private $ldapBindPwd = null, + ) { $this->setUp(); } @@ -95,8 +64,8 @@ class ExceptionOnLostConnection { * @throws \Exception */ public function setUp(): void { - require_once __DIR__ . '/../../../../lib/base.php'; - \OC_App::loadApps(['user_ldap']); + require_once __DIR__ . '/../../../../lib/base.php'; + Server::get(IAppManager::class)->loadApps(['user_ldap']); $ch = $this->getCurl(); $proxyInfoJson = curl_exec($ch); @@ -135,10 +104,10 @@ class ExceptionOnLostConnection { try { $this->ldap->search($cr, $this->ldapBase, 'objectClass=*', ['dn'], true, 5); } catch (ServerNotAvailableException $e) { - print("Test PASSED" . PHP_EOL); + print('Test PASSED' . PHP_EOL); exit(0); } - print("Test FAILED" . PHP_EOL); + print('Test FAILED' . PHP_EOL); exit(1); } diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php index eb70c774e25..e1529384239 100644 --- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php +++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestAttributeDetection.php @@ -1,35 +1,25 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\user_ldap\tests\Integration\Lib; +namespace OCA\User_LDAP\Tests\Integration\Lib; use OCA\User_LDAP\Group_LDAP; use OCA\User_LDAP\GroupPluginManager; use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\IGroupManager; +use OCP\IUserManager; +use OCP\Server; +use Psr\Log\LoggerInterface; require_once __DIR__ . '/../Bootstrap.php'; @@ -43,28 +33,28 @@ class IntegrationTestAttributeDetection extends AbstractIntegrationTest { $this->connection->setConfiguration(['ldapGroupFilter' => 'objectClass=groupOfNames']); $this->connection->setConfiguration(['ldapGroupMemberAssocAttr' => 'member']); - $userMapper = new UserMapping(\OC::$server->getDatabaseConnection()); + $userMapper = new UserMapping(Server::get(IDBConnection::class)); $userMapper->clear(); $this->access->setUserMapper($userMapper); - $groupMapper = new GroupMapping(\OC::$server->getDatabaseConnection()); + $groupMapper = new GroupMapping(Server::get(IDBConnection::class)); $groupMapper->clear(); $this->access->setGroupMapper($groupMapper); - $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); - $userManager = \OC::$server->getUserManager(); + $userBackend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); + $userManager = Server::get(IUserManager::class); $userManager->clearBackends(); $userManager->registerBackend($userBackend); - $groupBackend = new Group_LDAP($this->access, \OC::$server->query(GroupPluginManager::class)); - $groupManger = \OC::$server->getGroupManager(); + $groupBackend = new Group_LDAP($this->access, Server::get(GroupPluginManager::class), Server::get(IConfig::class)); + $groupManger = Server::get(IGroupManager::class); $groupManger->clearBackends(); $groupManger->addBackend($groupBackend); } protected function caseNativeUUIDAttributeUsers() { // trigger importing of users which also triggers UUID attribute detection - \OC::$server->getUserManager()->search('', 5, 0); + Server::get(IUserManager::class)->search('', 5, 0); return $this->connection->ldapUuidUserAttribute === 'entryuuid'; } @@ -73,7 +63,7 @@ class IntegrationTestAttributeDetection extends AbstractIntegrationTest { // are similar, but we take no chances. // trigger importing of users which also triggers UUID attribute detection - \OC::$server->getGroupManager()->search('', 5, 0); + Server::get(IGroupManager::class)->search('', 5, 0); return $this->connection->ldapUuidGroupAttribute === 'entryuuid'; } } diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestCountUsersByLoginName.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestCountUsersByLoginName.php index c02ac5ccdae..8a1093e4304 100644 --- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestCountUsersByLoginName.php +++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestCountUsersByLoginName.php @@ -1,24 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib; diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php index 36c8ab4c0d3..1c2d7145ddf 100644 --- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php +++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestFetchUsersByLoginName.php @@ -1,38 +1,25 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\IDBConnection; +use OCP\Server; +use Psr\Log\LoggerInterface; require_once __DIR__ . '/../Bootstrap.php'; class IntegrationTestFetchUsersByLoginName extends AbstractIntegrationTest { - /** @var UserMapping */ + /** @var UserMapping */ protected $mapping; /** @var User_LDAP */ @@ -46,10 +33,10 @@ class IntegrationTestFetchUsersByLoginName extends AbstractIntegrationTest { require(__DIR__ . '/../setup-scripts/createExplicitUsers.php'); parent::init(); - $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $this->mapping = new UserMapping(Server::get(IDBConnection::class)); $this->mapping->clear(); $this->access->setUserMapper($this->mapping); - $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); + $this->backend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); } /** diff --git a/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php b/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php index b941fa6fc66..3e21d22fca3 100644 --- a/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php +++ b/apps/user_ldap/tests/Integration/Lib/IntegrationTestPaging.php @@ -1,39 +1,24 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\Server; +use Psr\Log\LoggerInterface; require_once __DIR__ . '/../Bootstrap.php'; class IntegrationTestPaging extends AbstractIntegrationTest { - /** @var UserMapping */ + /** @var UserMapping */ protected $mapping; /** @var User_LDAP */ @@ -50,7 +35,7 @@ class IntegrationTestPaging extends AbstractIntegrationTest { require(__DIR__ . '/../setup-scripts/createExplicitUsers.php'); parent::init(); - $this->backend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); + $this->backend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); } public function initConnection() { diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php index ec1cebbe087..6726143a449 100644 --- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php +++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserAvatar.php @@ -1,46 +1,31 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib\User; -use OCA\User_LDAP\FilesystemHelper; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\User; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\IAvatarManager; +use OCP\IConfig; +use OCP\IDBConnection; use OCP\Image; +use OCP\IUserManager; +use OCP\Server; use Psr\Log\LoggerInterface; require_once __DIR__ . '/../../Bootstrap.php'; class IntegrationTestUserAvatar extends AbstractIntegrationTest { - /** @var UserMapping */ + /** @var UserMapping */ protected $mapping; /** @@ -50,11 +35,11 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { public function init() { require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php'); parent::init(); - $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $this->mapping = new UserMapping(Server::get(IDBConnection::class)); $this->mapping->clear(); $this->access->setUserMapper($this->mapping); - $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); - \OC_User::useBackend($userBackend); + $userBackend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); + Server::get(IUserManager::class)->registerBackend($userBackend); } /** @@ -76,9 +61,9 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { \OC_Util::tearDownFS(); \OC_Util::setupFS($username); \OC::$server->getUserFolder($username); - \OC::$server->getConfig()->deleteUserValue($username, 'user_ldap', User::USER_PREFKEY_LASTREFRESH); - if (\OC::$server->getAvatarManager()->getAvatar($username)->exists()) { - \OC::$server->getAvatarManager()->getAvatar($username)->remove(); + Server::get(IConfig::class)->deleteUserValue($username, 'user_ldap', User::USER_PREFKEY_LASTREFRESH); + if (Server::get(IAvatarManager::class)->getAvatar($username)->exists()) { + Server::get(IAvatarManager::class)->getAvatar($username)->remove(); } // finally attempt to get the avatar set @@ -98,7 +83,7 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { $this->execFetchTest($dn, $username, $image); - return \OC::$server->getAvatarManager()->getAvatar($username)->exists(); + return Server::get(IAvatarManager::class)->getAvatar($username)->exists(); } /** @@ -115,7 +100,7 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { $this->execFetchTest($dn, $username, $image); - return !\OC::$server->getAvatarManager()->getAvatar($username)->exists(); + return !Server::get(IAvatarManager::class)->getAvatar($username)->exists(); } /** @@ -132,14 +117,13 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { protected function initUserManager() { $this->userManager = new Manager( - \OC::$server->getConfig(), - new FilesystemHelper(), - \OC::$server->get(LoggerInterface::class), - \OC::$server->getAvatarManager(), + Server::get(IConfig::class), + Server::get(LoggerInterface::class), + Server::get(IAvatarManager::class), new Image(), - \OC::$server->getDatabaseConnection(), - \OC::$server->getUserManager(), - \OC::$server->getNotificationManager() + Server::get(IDBConnection::class), + Server::get(IUserManager::class), + Server::get(\OCP\Notification\IManager::class) ); } diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php index 5da672d8a55..9b05298a151 100644 --- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php +++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserCleanUp.php @@ -1,38 +1,27 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib\User; use OCA\User_LDAP\Jobs\CleanUp; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Server; +use Psr\Log\LoggerInterface; require_once __DIR__ . '/../../Bootstrap.php'; class IntegrationTestUserCleanUp extends AbstractIntegrationTest { - /** @var UserMapping */ + /** @var UserMapping */ protected $mapping; /** @@ -42,12 +31,12 @@ class IntegrationTestUserCleanUp extends AbstractIntegrationTest { public function init() { require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php'); parent::init(); - $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $this->mapping = new UserMapping(Server::get(IDBConnection::class)); $this->mapping->clear(); $this->access->setUserMapper($this->mapping); - $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); - \OC_User::useBackend($userBackend); + $userBackend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); + Server::get(IUserManager::class)->registerBackend($userBackend); } /** @@ -84,13 +73,13 @@ class IntegrationTestUserCleanUp extends AbstractIntegrationTest { // user instance must not be requested from global user manager, before // it is deleted from the LDAP server. The instance will be returned // from cache and may false-positively confirm the correctness. - $user = \OC::$server->getUserManager()->get($username); + $user = Server::get(IUserManager::class)->get($username); if ($user === null) { return false; } $user->delete(); - return null === \OC::$server->getUserManager()->get($username); + return Server::get(IUserManager::class)->get($username) === null; } } diff --git a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php index 7353c5bef30..6fbfd9ba51b 100644 --- a/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php +++ b/apps/user_ldap/tests/Integration/Lib/User/IntegrationTestUserDisplayName.php @@ -1,38 +1,26 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Integration\Lib\User; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\Tests\Integration\AbstractIntegrationTest; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_LDAP; use OCA\User_LDAP\UserPluginManager; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Server; +use Psr\Log\LoggerInterface; require_once __DIR__ . '/../../Bootstrap.php'; class IntegrationTestUserDisplayName extends AbstractIntegrationTest { - /** @var UserMapping */ + /** @var UserMapping */ protected $mapping; /** @@ -42,11 +30,11 @@ class IntegrationTestUserDisplayName extends AbstractIntegrationTest { public function init() { require(__DIR__ . '/../../setup-scripts/createExplicitUsers.php'); parent::init(); - $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $this->mapping = new UserMapping(Server::get(IDBConnection::class)); $this->mapping->clear(); $this->access->setUserMapper($this->mapping); - $userBackend = new User_LDAP($this->access, \OC::$server->getConfig(), \OC::$server->getNotificationManager(), \OC::$server->getUserSession(), \OC::$server->query(UserPluginManager::class)); - \OC_User::useBackend($userBackend); + $userBackend = new User_LDAP($this->access, Server::get(\OCP\Notification\IManager::class), Server::get(UserPluginManager::class), Server::get(LoggerInterface::class), Server::get(DeletedUsersIndex::class)); + Server::get(IUserManager::class)->registerBackend($userBackend); } /** @@ -69,9 +57,9 @@ class IntegrationTestUserDisplayName extends AbstractIntegrationTest { $username = 'alice1337'; $dn = 'uid=alice,ou=Users,' . $this->base; $this->prepareUser($dn, $username); - $displayName = \OC::$server->getUserManager()->get($username)->getDisplayName(); + $displayName = Server::get(IUserManager::class)->get($username)->getDisplayName(); - return strpos($displayName, '(Alice@example.com)') !== false; + return str_contains($displayName, '(Alice@example.com)'); } /** @@ -86,9 +74,9 @@ class IntegrationTestUserDisplayName extends AbstractIntegrationTest { $username = 'boris23421'; $dn = 'uid=boris,ou=Users,' . $this->base; $this->prepareUser($dn, $username); - $displayName = \OC::$server->getUserManager()->get($username)->getDisplayName(); + $displayName = Server::get(IUserManager::class)->get($username)->getDisplayName(); - return strpos($displayName, '(Boris@example.com)') === false; + return !str_contains($displayName, '(Boris@example.com)'); } /** diff --git a/apps/user_ldap/tests/Integration/readme.md b/apps/user_ldap/tests/Integration/readme.md index e20efef8fdc..d551387c903 100644 --- a/apps/user_ldap/tests/Integration/readme.md +++ b/apps/user_ldap/tests/Integration/readme.md @@ -1,3 +1,8 @@ +<!-- + - SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + - SPDX-FileCopyrightText: 2015 ownCloud, Inc. + - SPDX-License-Identifier: AGPL-3.0-only + --> # Requirements # Have (as in do copy if not already done) the following files from https://github.com/owncloud/administration/tree/master/ldap-testing copied into the directory "setup-scripts": diff --git a/apps/user_ldap/tests/Integration/run-all.sh b/apps/user_ldap/tests/Integration/run-all.sh index 02bab97e45f..a0739a019eb 100755 --- a/apps/user_ldap/tests/Integration/run-all.sh +++ b/apps/user_ldap/tests/Integration/run-all.sh @@ -1,5 +1,8 @@ #!/bin/bash - +# +# SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later +# trigger_notification() { which notify-send 1>/dev/null if [[ $? == 1 ]] ; then diff --git a/apps/user_ldap/tests/Integration/run-test.sh b/apps/user_ldap/tests/Integration/run-test.sh index 7a29db25670..1b674aa04f3 100755 --- a/apps/user_ldap/tests/Integration/run-test.sh +++ b/apps/user_ldap/tests/Integration/run-test.sh @@ -1,5 +1,8 @@ #!/bin/sh - +# +# SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors +# SPDX-License-Identifier: AGPL-3.0-or-later +# if [ $1 ] ; then TESTSCRIPT=$1 else diff --git a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroups.php b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroups.php index 69bc90dedb2..819c4c6e860 100644 --- a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroups.php +++ b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroups.php @@ -1,25 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ if (php_sapi_name() !== 'cli') { print('Only via CLI, please.'); diff --git a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroupsDifferentOU.php b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroupsDifferentOU.php index e2607b0ccc3..b0a3cd46b4f 100644 --- a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroupsDifferentOU.php +++ b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitGroupsDifferentOU.php @@ -1,25 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ if (php_sapi_name() !== 'cli') { print('Only via CLI, please.'); diff --git a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitUsers.php b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitUsers.php index 6160179b9d4..7137bd18a58 100644 --- a/apps/user_ldap/tests/Integration/setup-scripts/createExplicitUsers.php +++ b/apps/user_ldap/tests/Integration/setup-scripts/createExplicitUsers.php @@ -1,25 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ if (php_sapi_name() !== 'cli') { print('Only via CLI, please.'); diff --git a/apps/user_ldap/tests/Integration/setup-scripts/createUsersWithoutDisplayName.php b/apps/user_ldap/tests/Integration/setup-scripts/createUsersWithoutDisplayName.php index 5a36ce24838..18584fbe748 100644 --- a/apps/user_ldap/tests/Integration/setup-scripts/createUsersWithoutDisplayName.php +++ b/apps/user_ldap/tests/Integration/setup-scripts/createUsersWithoutDisplayName.php @@ -1,24 +1,9 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ if (php_sapi_name() !== 'cli') { print('Only via CLI, please.'); diff --git a/apps/user_ldap/tests/Jobs/CleanUpTest.php b/apps/user_ldap/tests/Jobs/CleanUpTest.php index f70d65a6ea2..5a1e563a1e8 100644 --- a/apps/user_ldap/tests/Jobs/CleanUpTest.php +++ b/apps/user_ldap/tests/Jobs/CleanUpTest.php @@ -1,26 +1,10 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Jobs; @@ -29,20 +13,19 @@ use OCA\User_LDAP\Helper; use OCA\User_LDAP\Jobs\CleanUp; use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_Proxy; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\IConfig; use OCP\IDBConnection; use Test\TestCase; class CleanUpTest extends TestCase { - /** @var CleanUp */ - protected $bgJob; - - /** @var array */ - protected $mocks; + protected CleanUp $bgJob; + protected array $mocks; public function setUp(): void { + parent::setUp(); $this->createMocks(); - $this->bgJob = new CleanUp($this->mocks['userBackend'], $this->mocks['deletedUsersIndex']); + $this->bgJob = new CleanUp($this->mocks['timeFactory'], $this->mocks['userBackend'], $this->mocks['deletedUsersIndex']); $this->bgJob->setArguments($this->mocks); } @@ -53,12 +36,13 @@ class CleanUpTest extends TestCase { $this->mocks['ocConfig'] = $this->createMock(IConfig::class); $this->mocks['db'] = $this->createMock(IDBConnection::class); $this->mocks['helper'] = $this->createMock(Helper::class); + $this->mocks['timeFactory'] = $this->createMock(ITimeFactory::class); } /** * clean up job must not run when there are disabled configurations */ - public function test_runNotAllowedByDisabledConfigurations() { + public function test_runNotAllowedByDisabledConfigurations(): void { $this->mocks['helper']->expects($this->once()) ->method('haveDisabledConfigurations') ->willReturn(true); @@ -74,10 +58,10 @@ class CleanUpTest extends TestCase { * clean up job must not run when LDAP Helper is broken i.e. * returning unexpected results */ - public function test_runNotAllowedByBrokenHelper() { + public function test_runNotAllowedByBrokenHelper(): void { $this->mocks['helper']->expects($this->once()) ->method('haveDisabledConfigurations') - ->will($this->throwException(new Exception())); + ->willThrowException(new Exception()); $this->mocks['ocConfig']->expects($this->never()) ->method('getSystemValue'); @@ -89,7 +73,7 @@ class CleanUpTest extends TestCase { /** * clean up job must not run when it is not enabled */ - public function test_runNotAllowedBySysConfig() { + public function test_runNotAllowedBySysConfig(): void { $this->mocks['helper']->expects($this->once()) ->method('haveDisabledConfigurations') ->willReturn(false); @@ -105,7 +89,7 @@ class CleanUpTest extends TestCase { /** * clean up job is allowed to run */ - public function test_runIsAllowed() { + public function test_runIsAllowed(): void { $this->mocks['helper']->expects($this->once()) ->method('haveDisabledConfigurations') ->willReturn(false); @@ -121,7 +105,7 @@ class CleanUpTest extends TestCase { /** * check whether offset will be reset when it needs to */ - public function test_OffsetResetIsNecessary() { + public function test_OffsetResetIsNecessary(): void { $result = $this->bgJob->isOffsetResetNecessary($this->bgJob->getChunkSize() - 1); $this->assertSame(true, $result); } @@ -129,7 +113,7 @@ class CleanUpTest extends TestCase { /** * make sure offset is not reset when it is not due */ - public function test_OffsetResetIsNotNecessary() { + public function test_OffsetResetIsNotNecessary(): void { $result = $this->bgJob->isOffsetResetNecessary($this->bgJob->getChunkSize()); $this->assertSame(false, $result); } diff --git a/apps/user_ldap/tests/Jobs/SyncTest.php b/apps/user_ldap/tests/Jobs/SyncTest.php index 5592a2531bc..f6ecf984ab0 100644 --- a/apps/user_ldap/tests/Jobs/SyncTest.php +++ b/apps/user_ldap/tests/Jobs/SyncTest.php @@ -1,27 +1,8 @@ <?php + /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Jobs; @@ -34,41 +15,35 @@ use OCA\User_LDAP\Jobs\Sync; use OCA\User_LDAP\LDAP; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\EventDispatcher\IEventDispatcher; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IDBConnection; use OCP\IUserManager; use OCP\Notification\IManager; +use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; +/** + * @group DB + */ class SyncTest extends TestCase { - - /** @var array */ - protected $arguments; - /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */ - protected $helper; - /** @var LDAP|\PHPUnit\Framework\MockObject\MockObject */ - protected $ldapWrapper; - /** @var Manager|\PHPUnit\Framework\MockObject\MockObject */ - protected $userManager; - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $mapper; - /** @var Sync */ - protected $sync; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - /** @var IAvatarManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $avatarManager; - /** @var IDBConnection|\PHPUnit\Framework\MockObject\MockObject */ - protected $dbc; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $ncUserManager; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $notificationManager; - /** @var ConnectionFactory|\PHPUnit\Framework\MockObject\MockObject */ - protected $connectionFactory; - /** @var AccessFactory|\PHPUnit\Framework\MockObject\MockObject */ - protected $accessFactory; + protected Helper&MockObject $helper; + protected LDAP&MockObject $ldapWrapper; + protected Manager&MockObject $userManager; + protected UserMapping&MockObject $mapper; + protected IConfig&MockObject $config; + protected IAvatarManager&MockObject $avatarManager; + protected IDBConnection&MockObject $dbc; + protected IUserManager&MockObject $ncUserManager; + protected IManager&MockObject $notificationManager; + protected ConnectionFactory&MockObject $connectionFactory; + protected AccessFactory&MockObject $accessFactory; + protected array $arguments = []; + protected Sync $sync; protected function setUp(): void { parent::setUp(); @@ -82,26 +57,32 @@ class SyncTest extends TestCase { $this->dbc = $this->createMock(IDBConnection::class); $this->ncUserManager = $this->createMock(IUserManager::class); $this->notificationManager = $this->createMock(IManager::class); - $this->connectionFactory = $this->createMock(ConnectionFactory::class); + $this->connectionFactory = $this->getMockBuilder(ConnectionFactory::class) + ->setConstructorArgs([ + $this->ldapWrapper, + ]) + ->getMock(); $this->accessFactory = $this->createMock(AccessFactory::class); - $this->arguments = [ - 'helper' => $this->helper, - 'ldapWrapper' => $this->ldapWrapper, - 'mapper' => $this->mapper, - 'config' => $this->config, - 'avatarManager' => $this->avatarManager, - 'dbc' => $this->dbc, - 'ncUserManager' => $this->ncUserManager, - 'notificationManager' => $this->notificationManager, - 'connectionFactory' => $this->connectionFactory, - 'accessFactory' => $this->accessFactory, - ]; - - $this->sync = new Sync($this->userManager); + $this->sync = new Sync( + Server::get(ITimeFactory::class), + Server::get(IEventDispatcher::class), + $this->config, + $this->dbc, + $this->avatarManager, + $this->ncUserManager, + Server::get(LoggerInterface::class), + $this->notificationManager, + $this->mapper, + $this->helper, + $this->connectionFactory, + $this->accessFactory, + ); + + $this->sync->overwritePropertiesForTest($this->ldapWrapper); } - public function intervalDataProvider() { + public static function intervalDataProvider(): array { return [ [ 0, 1000, 750 @@ -121,10 +102,8 @@ class SyncTest extends TestCase { ]; } - /** - * @dataProvider intervalDataProvider - */ - public function testUpdateInterval($userCount, $pagingSize1, $pagingSize2) { + #[\PHPUnit\Framework\Attributes\DataProvider('intervalDataProvider')] + public function testUpdateInterval(int $userCount, int $pagingSize1, int $pagingSize2): void { $this->config->expects($this->once()) ->method('setAppValue') ->with('user_ldap', 'background_sync_interval', $this->anything()) @@ -154,7 +133,7 @@ class SyncTest extends TestCase { $this->sync->updateInterval(); } - public function moreResultsProvider() { + public static function moreResultsProvider(): array { return [ [ 3, 3, true ], [ 3, 5, true ], @@ -164,11 +143,13 @@ class SyncTest extends TestCase { ]; } - /** - * @dataProvider moreResultsProvider - */ - public function testMoreResults($pagingSize, $results, $expected) { - $connection = $this->createMock(Connection::class); + #[\PHPUnit\Framework\Attributes\DataProvider('moreResultsProvider')] + public function testMoreResults($pagingSize, $results, $expected): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([ + $this->ldapWrapper, + ]) + ->getMock(); $this->connectionFactory->expects($this->any()) ->method('get') ->willReturn($connection); @@ -181,7 +162,7 @@ class SyncTest extends TestCase { return null; }); - /** @var Access|\PHPUnit\Framework\MockObject\MockObject $access */ + /** @var Access&MockObject $access */ $access = $this->createMock(Access::class); $this->accessFactory->expects($this->any()) ->method('get') @@ -206,7 +187,7 @@ class SyncTest extends TestCase { $this->assertSame($expected, $hasMoreResults); } - public function cycleDataProvider() { + public static function cycleDataProvider(): array { $lastCycle = ['prefix' => 's01', 'offset' => 1000]; $lastCycle2 = ['prefix' => '', 'offset' => 1000]; return [ @@ -219,22 +200,24 @@ class SyncTest extends TestCase { ]; } - /** - * @dataProvider cycleDataProvider - */ - public function testDetermineNextCycle($cycleData, $prefixes, $expectedCycle) { + #[\PHPUnit\Framework\Attributes\DataProvider('cycleDataProvider')] + public function testDetermineNextCycle(?array $cycleData, array $prefixes, ?array $expectedCycle): void { $this->helper->expects($this->any()) ->method('getServerConfigurationPrefixes') ->with(true) ->willReturn($prefixes); if (is_array($expectedCycle)) { + $calls = [ + ['user_ldap', 'background_sync_prefix', $expectedCycle['prefix']], + ['user_ldap', 'background_sync_offset', $expectedCycle['offset']], + ]; $this->config->expects($this->exactly(2)) ->method('setAppValue') - ->withConsecutive( - ['user_ldap', 'background_sync_prefix', $expectedCycle['prefix']], - ['user_ldap', 'background_sync_offset', $expectedCycle['offset']] - ); + ->willReturnCallback(function () use (&$calls): void { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); } else { $this->config->expects($this->never()) ->method('setAppValue'); @@ -251,7 +234,7 @@ class SyncTest extends TestCase { } } - public function testQualifiesToRun() { + public function testQualifiesToRun(): void { $cycleData = ['prefix' => 's01']; $this->config->expects($this->exactly(2)) @@ -263,7 +246,7 @@ class SyncTest extends TestCase { $this->assertFalse($this->sync->qualifiesToRun($cycleData)); } - public function runDataProvider() { + public static function runDataProvider(): array { return [ #0 - one LDAP server, reset [[ @@ -295,10 +278,8 @@ class SyncTest extends TestCase { ]; } - /** - * @dataProvider runDataProvider - */ - public function testRun($runData) { + #[\PHPUnit\Framework\Attributes\DataProvider('runDataProvider')] + public function testRun(array $runData): void { $this->config->expects($this->any()) ->method('getAppValue') ->willReturnCallback(function ($app, $key, $default) use ($runData) { @@ -325,13 +306,18 @@ class SyncTest extends TestCase { return $default; }); + + $calls = [ + ['user_ldap', 'background_sync_prefix', $runData['expectedNextCycle']['prefix']], + ['user_ldap', 'background_sync_offset', $runData['expectedNextCycle']['offset']], + ['user_ldap', 'background_sync_interval', '43200'], + ]; $this->config->expects($this->exactly(3)) ->method('setAppValue') - ->withConsecutive( - ['user_ldap', 'background_sync_prefix', $runData['expectedNextCycle']['prefix']], - ['user_ldap', 'background_sync_offset', $runData['expectedNextCycle']['offset']], - ['user_ldap', 'background_sync_interval', $this->anything()] - ); + ->willReturnCallback(function () use (&$calls): void { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + }); $this->config->expects($this->any()) ->method('getAppKeys') ->with('user_ldap') @@ -342,7 +328,11 @@ class SyncTest extends TestCase { ->with(true) ->willReturn($runData['prefixes']); - $connection = $this->createMock(Connection::class); + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([ + $this->ldapWrapper, + ]) + ->getMock(); $this->connectionFactory->expects($this->any()) ->method('get') ->willReturn($connection); @@ -355,7 +345,7 @@ class SyncTest extends TestCase { return null; }); - /** @var Access|\PHPUnit\Framework\MockObject\MockObject $access */ + /** @var Access&MockObject $access */ $access = $this->createMock(Access::class); $this->accessFactory->expects($this->any()) ->method('get') diff --git a/apps/user_ldap/tests/Jobs/UpdateGroupsTest.php b/apps/user_ldap/tests/Jobs/UpdateGroupsTest.php deleted file mode 100644 index 9c9c62b0d0e..00000000000 --- a/apps/user_ldap/tests/Jobs/UpdateGroupsTest.php +++ /dev/null @@ -1,190 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -namespace OCA\user_ldap\tests\Jobs; - -use OCA\User_LDAP\Group_Proxy; -use OCA\User_LDAP\Jobs\UpdateGroups; -use OCP\DB\IResult; -use OCP\DB\QueryBuilder\IExpressionBuilder; -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\EventDispatcher\IEventDispatcher; -use OCP\Group\Events\UserAddedEvent; -use OCP\Group\Events\UserRemovedEvent; -use OCP\IDBConnection; -use OCP\IGroup; -use OCP\IGroupManager; -use OCP\IUser; -use OCP\IUserManager; -use Psr\Log\LoggerInterface; -use Test\TestCase; - -class UpdateGroupsTest extends TestCase { - - /** @var Group_Proxy|\PHPUnit\Framework\MockObject\MockObject */ - protected $groupBackend; - /** @var IEventDispatcher|\PHPUnit\Framework\MockObject\MockObject */ - protected $dispatcher; - /** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $groupManager; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $userManager; - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - protected $logger; - /** @var IDBConnection|\PHPUnit\Framework\MockObject\MockObject */ - protected $dbc; - - /** @var UpdateGroups */ - protected $updateGroupsJob; - - public function setUp(): void { - $this->groupBackend = $this->createMock(Group_Proxy::class); - $this->dispatcher = $this->createMock(IEventDispatcher::class); - $this->groupManager = $this->createMock(IGroupManager::class); - $this->userManager = $this->createMock(IUserManager::class); - $this->logger = $this->createMock(LoggerInterface::class); - $this->dbc = $this->createMock(IDBConnection::class); - - $this->updateGroupsJob = new UpdateGroups( - $this->groupBackend, - $this->dispatcher, - $this->groupManager, - $this->userManager, - $this->logger, - $this->dbc - ); - } - - public function testHandleKnownGroups() { - $knownGroups = [ - 'emptyGroup' => \serialize([]), - 'stableGroup' => \serialize(['userA', 'userC', 'userE']), - 'groupWithAdditions' => \serialize(['userA', 'userC', 'userE']), - 'groupWithRemovals' => \serialize(['userA', 'userC', 'userDeleted', 'userE']), - 'groupWithAdditionsAndRemovals' => \serialize(['userA', 'userC', 'userE']), - 'vanishedGroup' => \serialize(['userB', 'userDeleted']) - ]; - $knownGroupsDB = []; - foreach ($knownGroups as $gid => $members) { - $knownGroupsDB[] = [ - 'owncloudname' => $gid, - 'owncloudusers' => $members - ]; - } - $actualGroups = [ - 'emptyGroup' => [], - 'stableGroup' => ['userA', 'userC', 'userE'], - 'groupWithAdditions' => ['userA', 'userC', 'userE', 'userF'], - 'groupWithRemovals' => ['userA', 'userE'], - 'groupWithAdditionsAndRemovals' => ['userC', 'userE', 'userF'], - 'newGroup' => ['userB', 'userF'], - ]; - $groups = array_intersect(array_keys($knownGroups), array_keys($actualGroups)); - - /** @var IQueryBuilder|\PHPUnit\Framework\MockObject\MockObject $updateQb */ - $updateQb = $this->createMock(IQueryBuilder::class); - $updateQb->expects($this->once()) - ->method('update') - ->willReturn($updateQb); - $updateQb->expects($this->once()) - ->method('set') - ->willReturn($updateQb); - $updateQb->expects($this->once()) - ->method('where') - ->willReturn($updateQb); - // three groups need to be updated - $updateQb->expects($this->exactly(3)) - ->method('setParameters'); - $updateQb->expects($this->exactly(3)) - ->method('execute'); - $updateQb->expects($this->any()) - ->method('expr') - ->willReturn($this->createMock(IExpressionBuilder::class)); - - $stmt = $this->createMock(IResult::class); - $stmt->expects($this->once()) - ->method('fetchAll') - ->willReturn($knownGroupsDB); - - $selectQb = $this->createMock(IQueryBuilder::class); - $selectQb->expects($this->once()) - ->method('select') - ->willReturn($selectQb); - $selectQb->expects($this->once()) - ->method('from') - ->willReturn($selectQb); - $selectQb->expects($this->once()) - ->method('execute') - ->willReturn($stmt); - - $this->dbc->expects($this->any()) - ->method('getQueryBuilder') - ->willReturnOnConsecutiveCalls($updateQb, $selectQb); - - $this->groupBackend->expects($this->any()) - ->method('usersInGroup') - ->willReturnCallback(function ($groupID) use ($actualGroups) { - return isset($actualGroups[$groupID]) ? $actualGroups[$groupID] : []; - }); - - $this->groupManager->expects($this->any()) - ->method('get') - ->willReturnCallback(function (string $groupId): ?IGroup { - if ($groupId === 'vanishedGroup') { - return null; - } - return $this->createMock(IGroup::class); - }); - - $this->userManager->expects($this->exactly(5)) - ->method('get') - ->willReturnCallback(function (string $userId) { - if ($userId === 'userDeleted') { - // user already deleted - return null; - } - return $this->createMock(IUser::class); - }); - - $addedEvents = 0; - $removedEvents = 0; - $this->dispatcher->expects($this->exactly(4)) - ->method('dispatchTyped') - ->willReturnCallback(function ($event) use (&$addedEvents, &$removedEvents) { - if ($event instanceof UserRemovedEvent) { - $removedEvents++; - } elseif ($event instanceof UserAddedEvent) { - $addedEvents++; - } - }); - - $this->invokePrivate($this->updateGroupsJob, 'handleKnownGroups', [$groups]); - - $this->assertSame(2, $removedEvents); - $this->assertSame(2, $addedEvents); - // and no event for the user that is already deleted, the DB is nevertheless updated, hence 5 - } -} diff --git a/apps/user_ldap/tests/LDAPGroupPluginDummy.php b/apps/user_ldap/tests/LDAPGroupPluginDummy.php index 25350bfc16a..5ea1a491f14 100644 --- a/apps/user_ldap/tests/LDAPGroupPluginDummy.php +++ b/apps/user_ldap/tests/LDAPGroupPluginDummy.php @@ -1,24 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; diff --git a/apps/user_ldap/tests/LDAPProviderTest.php b/apps/user_ldap/tests/LDAPProviderTest.php index 59f51f204bf..57323e374aa 100644 --- a/apps/user_ldap/tests/LDAPProviderTest.php +++ b/apps/user_ldap/tests/LDAPProviderTest.php @@ -1,45 +1,29 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, Roger Szabo (roger.szabo@web.de) - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Julius Härtl <jus@bitgrid.net> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author root <root@localhost.localdomain> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; +use OC\Config; use OC\User\Manager; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; use OCA\User_LDAP\Group_LDAP; +use OCA\User_LDAP\Helper; use OCA\User_LDAP\IGroupLDAP; +use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\IUserLDAP; +use OCA\User_LDAP\LDAPProviderFactory; use OCA\User_LDAP\User_LDAP; use OCP\EventDispatcher\IEventDispatcher; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IServerContainer; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use OCP\Server; +use Psr\Log\LoggerInterface; /** * Class LDAPProviderTest @@ -49,39 +33,29 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface; * @package OCA\User_LDAP\Tests */ class LDAPProviderTest extends \Test\TestCase { - protected function setUp(): void { - parent::setUp(); - } - private function getServerMock(IUserLDAP $userBackend, IGroupLDAP $groupBackend) { $server = $this->getMockBuilder('OC\Server') - ->setMethods(['getUserManager', 'getBackends', 'getGroupManager']) - ->setConstructorArgs(['', new \OC\Config(\OC::$configDir)]) - ->getMock(); - $server->expects($this->at(1)) - ->method('getBackends') - ->willReturn([$userBackend]); + ->onlyMethods(['getUserManager', 'getGroupManager']) + ->setConstructorArgs(['', new Config(\OC::$configDir)]) + ->getMock(); $server->expects($this->any()) ->method('getUserManager') ->willReturn($this->getUserManagerMock($userBackend)); $server->expects($this->any()) ->method('getGroupManager') ->willReturn($this->getGroupManagerMock($groupBackend)); - $server->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); return $server; } private function getUserManagerMock(IUserLDAP $userBackend) { $userManager = $this->getMockBuilder(Manager::class) - ->setMethods(['getBackends']) + ->onlyMethods(['getBackends']) ->setConstructorArgs([ $this->createMock(IConfig::class), - $this->createMock(EventDispatcherInterface::class), $this->createMock(ICacheFactory::class), $this->createMock(IEventDispatcher::class), + $this->createMock(LoggerInterface::class), ]) ->getMock(); $userManager->expects($this->any()) @@ -92,7 +66,7 @@ class LDAPProviderTest extends \Test\TestCase { private function getGroupManagerMock(IGroupLDAP $groupBackend) { $groupManager = $this->getMockBuilder('OC\Group\Manager') - ->setMethods(['getBackends']) + ->onlyMethods(['getBackends']) ->disableOriginalConstructor() ->getMock(); $groupManager->expects($this->any()) @@ -110,19 +84,19 @@ class LDAPProviderTest extends \Test\TestCase { } private function getLDAPProvider(IServerContainer $serverContainer) { - $factory = new \OCA\User_LDAP\LDAPProviderFactory($serverContainer); + $factory = new LDAPProviderFactory($serverContainer); return $factory->getLDAPProvider(); } - public function testGetUserDNUserIDNotFound() { + public function testGetUserDNUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -131,20 +105,25 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getUserDN('nonexisting_user'); } - public function testGetUserDN() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'username2dn']) - ->disableOriginalConstructor() - ->getMock(); - $userBackend->expects($this->at(0)) - ->method('userExists') - ->willReturn(true); - $userBackend->expects($this->at(2)) + + public function testGetUserDN(): void { + $userAccess = $this->getMockBuilder(Access::class) + ->onlyMethods(['username2dn']) + ->disableOriginalConstructor() + ->getMock(); + $userAccess->expects($this->once()) ->method('username2dn') ->willReturn('cn=existing_user,ou=Are Sufficient To,ou=Test,dc=example,dc=org'); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) + ->disableOriginalConstructor() + ->getMock(); + $userBackend->expects($this->once()) + ->method('userExists') + ->willReturn(true); $userBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($userAccess); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -154,16 +133,13 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetGroupDNGroupIDNotFound() { + public function testGetGroupDNGroupIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Group id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() - ->getMock(); - - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists']) + $userBackend = $this->createMock(User_LDAP::class); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists']) ->disableOriginalConstructor() ->getMock(); @@ -175,26 +151,24 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getGroupDN('nonexisting_group'); } - public function testGetGroupDN() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'username2dn']) - ->disableOriginalConstructor() - ->getMock(); + public function testGetGroupDN(): void { + $userBackend = $this->createMock(User_LDAP::class); - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists', 'getLDAPAccess', 'groupname2dn']) + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists', 'getLDAPAccess']) ->disableOriginalConstructor() ->getMock(); - $groupBackend->expects($this->at(0)) - ->method('groupExists') - ->willReturn(true); - $groupBackend->expects($this->at(2)) + $groupAccess = $this->createMock(Access::class); + $groupAccess->expects($this->once()) ->method('groupname2dn') ->willReturn('cn=existing_group,ou=Are Sufficient To,ou=Test,dc=example,dc=org'); + $groupBackend->expects($this->once()) + ->method('groupExists') + ->willReturn(true); $groupBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($groupAccess); $server = $this->getServerMock($userBackend, $groupBackend); @@ -203,11 +177,11 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getGroupDN('existing_group')); } - public function testGetUserName() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['dn2UserName']) - ->disableOriginalConstructor() - ->getMock(); + public function testGetUserName(): void { + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['dn2UserName']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any()) ->method('dn2UserName') ->willReturn('existing_user'); @@ -219,15 +193,12 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getUserName('cn=existing_user,ou=Are Sufficient To,ou=Test,dc=example,dc=org')); } - public function testDNasBaseParameter() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods([]) - ->disableOriginalConstructor() - ->getMock(); + public function testDNasBaseParameter(): void { + $userBackend = $this->createMock(User_LDAP::class); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); - $helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $ldapProvider = $this->getLDAPProvider($server); $this->assertEquals( @@ -235,15 +206,12 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->DNasBaseParameter('cn=existing_user,ou=Are Sufficient To,ou=Test,dc=example,dc=org')); } - public function testSanitizeDN() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods([]) - ->disableOriginalConstructor() - ->getMock(); + public function testSanitizeDN(): void { + $userBackend = $this->createMock(User_LDAP::class); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); - $helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()); + $helper = Server::get(Helper::class); $ldapProvider = $this->getLDAPProvider($server); $this->assertEquals( @@ -252,14 +220,11 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetLDAPConnectionUserIDNotFound() { + public function testGetLDAPConnectionUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->createMock(User_LDAP::class); $userBackend->expects($this->any())->method('userExists')->willReturn(false); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -268,35 +233,33 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPConnection('nonexisting_user'); } - public function testGetLDAPConnection() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getNewLDAPConnection']) - ->disableOriginalConstructor() - ->getMock(); + public function testGetLDAPConnection(): void { + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getNewLDAPConnection']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any()) ->method('userExists') ->willReturn(true); + $ldapConnection = ldap_connect('ldap://example.com'); $userBackend->expects($this->any()) ->method('getNewLDAPConnection') - ->willReturn(true); + ->willReturn($ldapConnection); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); $ldapProvider = $this->getLDAPProvider($server); - $this->assertTrue($ldapProvider->getLDAPConnection('existing_user')); + $this->assertEquals($ldapConnection, $ldapProvider->getLDAPConnection('existing_user')); } - public function testGetGroupLDAPConnectionGroupIDNotFound() { + public function testGetGroupLDAPConnectionGroupIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Group id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() - ->getMock(); - - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists']) + $userBackend = $this->createMock(User_LDAP::class); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists']) ->disableOriginalConstructor() ->getMock(); @@ -308,13 +271,10 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getGroupLDAPConnection('nonexisting_group'); } - public function testGetGroupLDAPConnection() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() - ->getMock(); - - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists','getNewLDAPConnection']) + public function testGetGroupLDAPConnection(): void { + $userBackend = $this->createMock(User_LDAP::class); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists','getNewLDAPConnection']) ->disableOriginalConstructor() ->getMock(); @@ -322,25 +282,26 @@ class LDAPProviderTest extends \Test\TestCase { ->method('groupExists') ->willReturn(true); + $ldapConnection = ldap_connect('ldap://example.com'); $groupBackend->expects($this->any()) ->method('getNewLDAPConnection') - ->willReturn(true); + ->willReturn($ldapConnection); $server = $this->getServerMock($userBackend, $groupBackend); $ldapProvider = $this->getLDAPProvider($server); - $this->assertTrue($ldapProvider->getGroupLDAPConnection('existing_group')); + $this->assertEquals($ldapConnection, $ldapProvider->getGroupLDAPConnection('existing_group')); } - public function testGetLDAPBaseUsersUserIDNotFound() { + public function testGetLDAPBaseUsersUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -349,14 +310,16 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPBaseUsers('nonexisting_user'); } - public function testGetLDAPBaseUsers() { + public function testGetLDAPBaseUsers(): void { $bases = [ 'ou=users,ou=foobar,dc=example,dc=org', 'ou=users,ou=barfoo,dc=example,dc=org', ]; $dn = 'uid=malik,' . $bases[1]; - $connection = $this->createMock(Connection::class); + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($key) use ($bases) { @@ -378,10 +341,10 @@ class LDAPProviderTest extends \Test\TestCase { ->method('username2dn') ->willReturn($dn); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'getConnection', 'getConfiguration']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->atLeastOnce()) ->method('userExists') ->willReturn(true); @@ -396,14 +359,14 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetLDAPBaseGroupsUserIDNotFound() { + public function testGetLDAPBaseGroupsUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -412,13 +375,15 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPBaseGroups('nonexisting_user'); } - public function testGetLDAPBaseGroups() { + public function testGetLDAPBaseGroups(): void { $bases = [ 'ou=groupd,ou=foobar,dc=example,dc=org', 'ou=groups,ou=barfoo,dc=example,dc=org', ]; - $connection = $this->createMock(Connection::class); + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($key) use ($bases) { @@ -434,10 +399,10 @@ class LDAPProviderTest extends \Test\TestCase { ->method('getConnection') ->willReturn($connection); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'getConnection', 'getConfiguration']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any()) ->method('userExists') ->willReturn(true); @@ -452,14 +417,14 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testClearCacheUserIDNotFound() { + public function testClearCacheUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) - ->disableOriginalConstructor() - ->getMock(); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -468,20 +433,26 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->clearCache('nonexisting_user'); } - public function testClearCache() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'getConnection', 'clearCache']) - ->disableOriginalConstructor() - ->getMock(); - $userBackend->expects($this->at(0)) - ->method('userExists') - ->willReturn(true); - $userBackend->expects($this->at(3)) + public function testClearCache(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); + $connection->expects($this->once()) ->method('clearCache') ->willReturn(true); + $access = $this->createMock(Access::class); + $access->method('getConnection') + ->willReturn($connection); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) + ->disableOriginalConstructor() + ->getMock(); + $userBackend->expects($this->once()) + ->method('userExists') + ->willReturn(true); $userBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($access); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -491,15 +462,15 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testClearGroupCacheGroupIDNotFound() { + public function testClearGroupCacheGroupIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Group id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') + $userBackend = $this->getMockBuilder(User_LDAP::class) ->disableOriginalConstructor() ->getMock(); - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists']) + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists']) ->disableOriginalConstructor() ->getMock(); $groupBackend->expects($this->any())->method('groupExists')->willReturn(false); @@ -510,23 +481,27 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->clearGroupCache('nonexisting_group'); } - public function testClearGroupCache() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() + public function testClearGroupCache(): void { + $userBackend = $this->createMock(User_LDAP::class); + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) ->getMock(); - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists', 'getLDAPAccess', 'getConnection', 'clearCache']) + $connection->expects($this->once()) + ->method('clearCache') + ->willReturn(true); + $access = $this->createMock(Access::class); + $access->method('getConnection') + ->willReturn($connection); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists', 'getLDAPAccess']) ->disableOriginalConstructor() ->getMock(); - $groupBackend->expects($this->at(0)) + $groupBackend->expects($this->once()) ->method('groupExists') ->willReturn(true); - $groupBackend->expects($this->at(3)) - ->method('clearCache') - ->willReturn(true); $groupBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($access); $server = $this->getServerMock($userBackend, $groupBackend); @@ -535,11 +510,11 @@ class LDAPProviderTest extends \Test\TestCase { $this->addToAssertionCount(1); } - public function testDnExists() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['dn2UserName']) - ->disableOriginalConstructor() - ->getMock(); + public function testDnExists(): void { + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['dn2UserName']) + ->disableOriginalConstructor() + ->getMock(); $userBackend->expects($this->any()) ->method('dn2UserName') ->willReturn('existing_user'); @@ -550,12 +525,8 @@ class LDAPProviderTest extends \Test\TestCase { $this->assertTrue($ldapProvider->dnExists('cn=existing_user,ou=Are Sufficient To,ou=Test,dc=example,dc=org')); } - public function testFlagRecord() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods([]) - ->disableOriginalConstructor() - ->getMock(); - + public function testFlagRecord(): void { + $userBackend = $this->createMock(User_LDAP::class); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); $ldapProvider = $this->getLDAPProvider($server); @@ -563,12 +534,8 @@ class LDAPProviderTest extends \Test\TestCase { $this->addToAssertionCount(1); } - public function testUnflagRecord() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods([]) - ->disableOriginalConstructor() - ->getMock(); - + public function testUnflagRecord(): void { + $userBackend = $this->createMock(User_LDAP::class); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); $ldapProvider = $this->getLDAPProvider($server); @@ -577,12 +544,12 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetLDAPDisplayNameFieldUserIDNotFound() { + public function testGetLDAPDisplayNameFieldUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) ->disableOriginalConstructor() ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); @@ -593,20 +560,26 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPDisplayNameField('nonexisting_user'); } - public function testGetLDAPDisplayNameField() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'getConnection', 'getConfiguration']) + public function testGetLDAPDisplayNameField(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); + $connection->expects($this->once()) + ->method('getConfiguration') + ->willReturn(['ldap_display_name' => 'displayName']); + $access = $this->createMock(Access::class); + $access->method('getConnection') + ->willReturn($connection); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) ->disableOriginalConstructor() ->getMock(); - $userBackend->expects($this->at(0)) + $userBackend->expects($this->once()) ->method('userExists') ->willReturn(true); - $userBackend->expects($this->at(3)) - ->method('getConfiguration') - ->willReturn(['ldap_display_name' => 'displayName']); $userBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($access); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -615,12 +588,12 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetLDAPEmailFieldUserIDNotFound() { + public function testGetLDAPEmailFieldUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists']) + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists']) ->disableOriginalConstructor() ->getMock(); $userBackend->expects($this->any())->method('userExists')->willReturn(false); @@ -631,20 +604,26 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPEmailField('nonexisting_user'); } - public function testGetLDAPEmailField() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->setMethods(['userExists', 'getLDAPAccess', 'getConnection', 'getConfiguration']) + public function testGetLDAPEmailField(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); + $connection->expects($this->once()) + ->method('getConfiguration') + ->willReturn(['ldap_email_attr' => 'mail']); + $access = $this->createMock(Access::class); + $access->method('getConnection') + ->willReturn($connection); + $userBackend = $this->getMockBuilder(User_LDAP::class) + ->onlyMethods(['userExists', 'getLDAPAccess']) ->disableOriginalConstructor() ->getMock(); - $userBackend->expects($this->at(0)) + $userBackend->expects($this->once()) ->method('userExists') ->willReturn(true); - $userBackend->expects($this->at(3)) - ->method('getConfiguration') - ->willReturn(['ldap_email_attr' => 'mail']); $userBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($access); $server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock()); @@ -653,20 +632,19 @@ class LDAPProviderTest extends \Test\TestCase { } - public function testGetLDAPGroupMemberAssocUserIDNotFound() { + public function testGetLDAPGroupMemberAssocUserIDNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('Group id not found in LDAP'); - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() - ->getMock(); - - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists']) + $userBackend = $this->createMock(User_LDAP::class); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists']) ->disableOriginalConstructor() ->getMock(); - $groupBackend->expects($this->any())->method('groupExists')->willReturn(false); + $groupBackend->expects($this->any()) + ->method('groupExists') + ->willReturn(false); $server = $this->getServerMock($userBackend, $groupBackend); @@ -674,25 +652,29 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getLDAPGroupMemberAssoc('nonexisting_group'); } - public function testgetLDAPGroupMemberAssoc() { - $userBackend = $this->getMockBuilder('OCA\User_LDAP\User_LDAP') - ->disableOriginalConstructor() - ->getMock(); + public function testgetLDAPGroupMemberAssoc(): void { + $userBackend = $this->createMock(User_LDAP::class); - $groupBackend = $this->getMockBuilder('OCA\User_LDAP\Group_LDAP') - ->setMethods(['groupExists', 'getLDAPAccess', 'getConnection', 'getConfiguration']) + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); + $connection->expects($this->once()) + ->method('getConfiguration') + ->willReturn(['ldap_group_member_assoc_attribute' => 'assoc_type']); + $access = $this->createMock(Access::class); + $access->method('getConnection') + ->willReturn($connection); + $groupBackend = $this->getMockBuilder(Group_LDAP::class) + ->onlyMethods(['groupExists', 'getLDAPAccess']) ->disableOriginalConstructor() ->getMock(); - $groupBackend->expects($this->at(0)) + $groupBackend->expects($this->once()) ->method('groupExists') ->willReturn(true); $groupBackend->expects($this->any()) - ->method('getConfiguration') - ->willReturn(['ldap_group_member_assoc_attribute' => 'assoc_type']); - $groupBackend->expects($this->any()) - ->method($this->anything()) - ->willReturnSelf(); + ->method('getLDAPAccess') + ->willReturn($access); $server = $this->getServerMock($userBackend, $groupBackend); @@ -700,7 +682,7 @@ class LDAPProviderTest extends \Test\TestCase { $this->assertEquals('assoc_type', $ldapProvider->getLDAPGroupMemberAssoc('existing_group')); } - public function testGetMultiValueUserAttributeUserNotFound() { + public function testGetMultiValueUserAttributeUserNotFound(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('User id not found in LDAP'); @@ -716,8 +698,10 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getMultiValueUserAttribute('admin', 'mailAlias'); } - public function testGetMultiValueUserAttributeCacheHit() { - $connection = $this->createMock(Connection::class); + public function testGetMultiValueUserAttributeCacheHit(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects(self::once()) ->method('getFromCache') ->with('admin-mailAlias') @@ -741,8 +725,10 @@ class LDAPProviderTest extends \Test\TestCase { $ldapProvider->getMultiValueUserAttribute('admin', 'mailAlias'); } - public function testGetMultiValueUserAttributeLdapError() { - $connection = $this->createMock(Connection::class); + public function testGetMultiValueUserAttributeLdapError(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects(self::once()) ->method('getFromCache') ->with('admin-mailAlias') @@ -778,8 +764,10 @@ class LDAPProviderTest extends \Test\TestCase { self::assertCount(0, $values); } - public function testGetMultiValueUserAttribute() { - $connection = $this->createMock(Connection::class); + public function testGetMultiValueUserAttribute(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects(self::once()) ->method('getFromCache') ->with('admin-mailAlias') @@ -815,8 +803,10 @@ class LDAPProviderTest extends \Test\TestCase { self::assertCount(2, $values); } - public function testGetUserAttributeLdapError() { - $connection = $this->createMock(Connection::class); + public function testGetUserAttributeLdapError(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects(self::once()) ->method('getFromCache') ->with('admin-mailAlias') @@ -852,8 +842,10 @@ class LDAPProviderTest extends \Test\TestCase { self::assertNull($value); } - public function testGetUserAttribute() { - $connection = $this->createMock(Connection::class); + public function testGetUserAttribute(): void { + $connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $connection->expects(self::once()) ->method('getFromCache') ->with('admin-mailAlias') diff --git a/apps/user_ldap/tests/LDAPTest.php b/apps/user_ldap/tests/LDAPTest.php index 876ea9b1f68..6da592ad6a1 100644 --- a/apps/user_ldap/tests/LDAPTest.php +++ b/apps/user_ldap/tests/LDAPTest.php @@ -1,46 +1,27 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; use OCA\User_LDAP\LDAP; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class LDAPTest extends TestCase { - /** @var LDAP|\PHPUnit\Framework\MockObject\MockObject */ - private $ldap; + private LDAP&MockObject $ldap; protected function setUp(): void { parent::setUp(); $this->ldap = $this->getMockBuilder(LDAP::class) - ->setMethods(['invokeLDAPMethod']) + ->onlyMethods(['invokeLDAPMethod']) ->getMock(); } - public function errorProvider() { + public static function errorProvider(): array { return [ [ 'ldap_search(): Partial search results returned: Sizelimit exceeded at /srv/http/nextcloud/master/apps/user_ldap/lib/LDAP.php#292', @@ -52,14 +33,10 @@ class LDAPTest extends TestCase { ]; } - /** - * @param string $errorMessage - * @param bool $passThrough - * @dataProvider errorProvider - */ - public function testSearchWithErrorHandler(string $errorMessage, bool $passThrough) { + #[\PHPUnit\Framework\Attributes\DataProvider('errorProvider')] + public function testSearchWithErrorHandler(string $errorMessage, bool $passThrough): void { $wasErrorHandlerCalled = false; - $errorHandler = function ($number, $message, $file, $line) use (&$wasErrorHandlerCalled) { + $errorHandler = function ($number, $message, $file, $line) use (&$wasErrorHandlerCalled): void { $wasErrorHandlerCalled = true; }; @@ -69,7 +46,7 @@ class LDAPTest extends TestCase { ->expects($this->once()) ->method('invokeLDAPMethod') ->with('search', $this->anything(), $this->anything(), $this->anything(), $this->anything(), $this->anything()) - ->willReturnCallback(function () use ($errorMessage) { + ->willReturnCallback(function () use ($errorMessage): void { trigger_error($errorMessage); }); @@ -80,7 +57,7 @@ class LDAPTest extends TestCase { restore_error_handler(); } - public function testModReplace() { + public function testModReplace(): void { $link = $this->createMock(LDAP::class); $userDN = 'CN=user'; $password = 'MyPassword'; diff --git a/apps/user_ldap/tests/LDAPUserPluginDummy.php b/apps/user_ldap/tests/LDAPUserPluginDummy.php index def10820784..8d4870406ae 100644 --- a/apps/user_ldap/tests/LDAPUserPluginDummy.php +++ b/apps/user_ldap/tests/LDAPUserPluginDummy.php @@ -1,24 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; @@ -56,4 +41,12 @@ class LDAPUserPluginDummy implements ILDAPUserPlugin { public function countUsers() { return null; } + + public function canDeleteUser() { + return true; + } + + public function deleteUser($uid) { + return null; + } } diff --git a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php b/apps/user_ldap/tests/Mapping/AbstractMappingTestCase.php index 0d21172445f..8efee4e2085 100644 --- a/apps/user_ldap/tests/Mapping/AbstractMappingTest.php +++ b/apps/user_ldap/tests/Mapping/AbstractMappingTestCase.php @@ -1,41 +1,24 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Aaron Wood <aaronjwood@gmail.com> - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Stefan Weil <sw@weilnetz.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Mapping; use OCA\User_LDAP\Mapping\AbstractMapping; use OCP\IDBConnection; +use OCP\Server; -abstract class AbstractMappingTest extends \Test\TestCase { - abstract public function getMapper(\OCP\IDBConnection $dbMock); +abstract class AbstractMappingTestCase extends \Test\TestCase { + abstract public function getMapper(IDBConnection $dbMock); /** * kiss test on isColNameValid */ - public function testIsColNameValid() { + public function testIsColNameValid(): void { $dbMock = $this->createMock(IDBConnection::class); $mapper = $this->getMapper($dbMock); @@ -47,8 +30,8 @@ abstract class AbstractMappingTest extends \Test\TestCase { * returns an array of test entries with dn, name and uuid as keys * @return array */ - protected function getTestData() { - $data = [ + protected static function getTestData(): array { + return [ [ 'dn' => 'uid=foobar,dc=example,dc=org', 'name' => 'Foobar', @@ -65,16 +48,14 @@ abstract class AbstractMappingTest extends \Test\TestCase { 'uuid' => '3333-CCCC-1234-CDEF', ] ]; - - return $data; } /** * calls map() on the given mapper and asserts result for true - * @param \OCA\User_LDAP\Mapping\AbstractMapping $mapper + * @param AbstractMapping $mapper * @param array $data */ - protected function mapEntries($mapper, $data) { + protected function mapEntries(AbstractMapping $mapper, array $data): void { foreach ($data as $entry) { $done = $mapper->map($entry['dn'], $entry['name'], $entry['uuid']); $this->assertTrue($done); @@ -82,14 +63,14 @@ abstract class AbstractMappingTest extends \Test\TestCase { } /** - * initalizes environment for a test run and returns an array with + * initializes environment for a test run and returns an array with * test objects. Preparing environment means that all mappings are cleared * first and then filled with test entries. * @return array 0 = \OCA\User_LDAP\Mapping\AbstractMapping, 1 = array of - * users or groups + * users or groups */ - private function initTest() { - $dbc = \OC::$server->getDatabaseConnection(); + private function initTest(): array { + $dbc = Server::get(IDBConnection::class); $mapper = $this->getMapper($dbc); $data = $this->getTestData(); // make sure DB is pristine, then fill it with test entries @@ -103,7 +84,7 @@ abstract class AbstractMappingTest extends \Test\TestCase { * tests map() method with input that should result in not-mapping. * Hint: successful mapping is tested inherently with mapEntries(). */ - public function testMap() { + public function testMap(): void { [$mapper, $data] = $this->initTest(); // test that mapping will not happen when it shall not @@ -123,7 +104,7 @@ abstract class AbstractMappingTest extends \Test\TestCase { * tests unmap() for both successful and unsuccessful removing of * mapping entries */ - public function testUnmap() { + public function testUnmap(): void { [$mapper, $data] = $this->initTest(); foreach ($data as $entry) { @@ -143,7 +124,7 @@ abstract class AbstractMappingTest extends \Test\TestCase { * tests getDNByName(), getNameByDN() and getNameByUUID() for successful * and unsuccessful requests. */ - public function testGetMethods() { + public function testGetMethods(): void { [$mapper, $data] = $this->initTest(); foreach ($data as $entry) { @@ -171,23 +152,23 @@ abstract class AbstractMappingTest extends \Test\TestCase { /** * tests getNamesBySearch() for successful and unsuccessful requests. */ - public function testSearch() { + public function testSearch(): void { [$mapper,] = $this->initTest(); $names = $mapper->getNamesBySearch('oo', '%', '%'); - $this->assertTrue(is_array($names)); + $this->assertIsArray($names); $this->assertSame(2, count($names)); - $this->assertTrue(in_array('Foobar', $names)); - $this->assertTrue(in_array('Barfoo', $names)); + $this->assertContains('Foobar', $names); + $this->assertContains('Barfoo', $names); $names = $mapper->getNamesBySearch('nada'); - $this->assertTrue(is_array($names)); - $this->assertSame(0, count($names)); + $this->assertIsArray($names); + $this->assertCount(0, $names); } /** * tests setDNbyUUID() for successful and unsuccessful update. */ - public function testSetDNMethod() { + public function testSetDNMethod(): void { [$mapper, $data] = $this->initTest(); $newDN = 'uid=modified,dc=example,dc=org'; @@ -206,7 +187,7 @@ abstract class AbstractMappingTest extends \Test\TestCase { /** * tests setUUIDbyDN() for successful and unsuccessful update. */ - public function testSetUUIDMethod() { + public function testSetUUIDMethod(): void { /** @var AbstractMapping $mapper */ [$mapper, $data] = $this->initTest(); @@ -226,7 +207,7 @@ abstract class AbstractMappingTest extends \Test\TestCase { /** * tests clear() for successful update. */ - public function testClear() { + public function testClear(): void { [$mapper, $data] = $this->initTest(); $done = $mapper->clear(); @@ -240,13 +221,13 @@ abstract class AbstractMappingTest extends \Test\TestCase { /** * tests clear() for successful update. */ - public function testClearCb() { + public function testClearCb(): void { [$mapper, $data] = $this->initTest(); $callbackCalls = 0; $test = $this; - $callback = function (string $id) use ($test, &$callbackCalls) { + $callback = function (string $id) use ($test, &$callbackCalls): void { $test->assertTrue(trim($id) !== ''); $callbackCalls++; }; @@ -263,28 +244,28 @@ abstract class AbstractMappingTest extends \Test\TestCase { /** * tests getList() method */ - public function testList() { + public function testList(): void { [$mapper, $data] = $this->initTest(); // get all entries without specifying offset or limit $results = $mapper->getList(); - $this->assertSame(3, count($results)); + $this->assertCount(3, $results); // get all-1 entries by specifying offset, and an high limit // specifying only offset without limit will not work by underlying lib $results = $mapper->getList(1, 999); - $this->assertSame(count($data) - 1, count($results)); + $this->assertCount(count($data) - 1, $results); // get first 2 entries by limit, but not offset $results = $mapper->getList(0, 2); - $this->assertSame(2, count($results)); + $this->assertCount(2, $results); // get 2nd entry by specifying both offset and limit $results = $mapper->getList(1, 1); - $this->assertSame(1, count($results)); + $this->assertCount(1, $results); } - public function testGetListOfIdsByDn() { + public function testGetListOfIdsByDn(): void { /** @var AbstractMapping $mapper */ [$mapper,] = $this->initTest(); @@ -300,6 +281,6 @@ abstract class AbstractMappingTest extends \Test\TestCase { } $result = $mapper->getListOfIdsByDn($listOfDNs); - $this->assertSame(66640 / 20, count($result)); + $this->assertCount(66640 / 20, $result); } } diff --git a/apps/user_ldap/tests/Mapping/GroupMappingTest.php b/apps/user_ldap/tests/Mapping/GroupMappingTest.php index 2bb9445d1ee..5729058d10e 100644 --- a/apps/user_ldap/tests/Mapping/GroupMappingTest.php +++ b/apps/user_ldap/tests/Mapping/GroupMappingTest.php @@ -1,29 +1,15 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Mapping; use OCA\User_LDAP\Mapping\GroupMapping; +use OCP\IDBConnection; /** * Class GroupMappingTest @@ -32,8 +18,8 @@ use OCA\User_LDAP\Mapping\GroupMapping; * * @package OCA\User_LDAP\Tests\Mapping */ -class GroupMappingTest extends AbstractMappingTest { - public function getMapper(\OCP\IDBConnection $dbMock) { +class GroupMappingTest extends AbstractMappingTestCase { + public function getMapper(IDBConnection $dbMock) { return new GroupMapping($dbMock); } } diff --git a/apps/user_ldap/tests/Mapping/UserMappingTest.php b/apps/user_ldap/tests/Mapping/UserMappingTest.php index 081266cf3f1..4346fe1d23f 100644 --- a/apps/user_ldap/tests/Mapping/UserMappingTest.php +++ b/apps/user_ldap/tests/Mapping/UserMappingTest.php @@ -1,29 +1,16 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Joas Schilling <coding@schilljs.com> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\Mapping; use OCA\User_LDAP\Mapping\UserMapping; +use OCP\IDBConnection; +use OCP\Support\Subscription\IAssertion; /** * Class UserMappingTest @@ -32,8 +19,8 @@ use OCA\User_LDAP\Mapping\UserMapping; * * @package OCA\User_LDAP\Tests\Mapping */ -class UserMappingTest extends AbstractMappingTest { - public function getMapper(\OCP\IDBConnection $dbMock) { - return new UserMapping($dbMock); +class UserMappingTest extends AbstractMappingTestCase { + public function getMapper(IDBConnection $dbMock) { + return new UserMapping($dbMock, $this->createMock(IAssertion::class)); } } diff --git a/apps/user_ldap/tests/Migration/AbstractUUIDFixTest.php b/apps/user_ldap/tests/Migration/AbstractUUIDFixTestCase.php index 7cb666b2514..7a85b885bc1 100644 --- a/apps/user_ldap/tests/Migration/AbstractUUIDFixTest.php +++ b/apps/user_ldap/tests/Migration/AbstractUUIDFixTestCase.php @@ -1,63 +1,33 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Migration; use OCA\User_LDAP\Access; use OCA\User_LDAP\Helper; use OCA\User_LDAP\LDAP; -use OCA\User_LDAP\Mapping\GroupMapping; -use OCA\User_LDAP\Mapping\UserMapping; -use OCA\User_LDAP\Migration\UUIDFixUser; -use OCA\User_LDAP\User_Proxy; +use OCA\User_LDAP\Mapping\AbstractMapping; +use OCA\User_LDAP\Migration\UUIDFix; +use OCA\User_LDAP\Proxy; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\IConfig; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; -abstract class AbstractUUIDFixTest extends TestCase { - /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */ - protected $helper; - - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - - /** @var LDAP|\PHPUnit\Framework\MockObject\MockObject */ - protected $ldap; - - /** @var UserMapping|GroupMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $mapper; - - /** @var UUIDFixUser */ - protected $job; - - /** @var User_Proxy|\PHPUnit\Framework\MockObject\MockObject */ - protected $proxy; - - /** @var Access|\PHPUnit\Framework\MockObject\MockObject */ - protected $access; - - /** @var bool */ - protected $isUser = true; +abstract class AbstractUUIDFixTestCase extends TestCase { + protected Helper&MockObject $helper; + protected IConfig&MockObject $config; + protected LDAP&MockObject $ldap; + protected AbstractMapping $mapper; + protected UUIDFix $job; + protected Proxy $proxy; + protected Access&MockObject $access; + protected ITimeFactory&MockObject $time; + protected bool $isUser = true; protected function setUp(): void { parent::setUp(); @@ -65,6 +35,7 @@ abstract class AbstractUUIDFixTest extends TestCase { $this->ldap = $this->createMock(LDAP::class); $this->config = $this->createMock(IConfig::class); $this->access = $this->createMock(Access::class); + $this->time = $this->createMock(ITimeFactory::class); $this->helper = $this->createMock(Helper::class); $this->helper->expects($this->any()) @@ -74,13 +45,13 @@ abstract class AbstractUUIDFixTest extends TestCase { } protected function instantiateJob($className) { - $this->job = new $className($this->mapper, $this->proxy); + $this->job = new $className($this->time, $this->mapper, $this->proxy); $this->proxy->expects($this->any()) ->method('getLDAPAccess') ->willReturn($this->access); } - public function testRunSingleRecord() { + public function testRunSingleRecord(): void { $args = [ 'records' => [ 0 => [ @@ -104,7 +75,7 @@ abstract class AbstractUUIDFixTest extends TestCase { $this->job->run($args); } - public function testRunValidRecord() { + public function testRunValidRecord(): void { $correctUUID = '4355-AED3-9D73-03AD'; $args = [ 'records' => [ @@ -127,7 +98,7 @@ abstract class AbstractUUIDFixTest extends TestCase { $this->job->run($args); } - public function testRunRemovedRecord() { + public function testRunRemovedRecord(): void { $args = [ 'records' => [ 0 => [ @@ -149,7 +120,7 @@ abstract class AbstractUUIDFixTest extends TestCase { $this->job->run($args); } - public function testRunManyRecords() { + public function testRunManyRecords(): void { $args = [ 'records' => [ 0 => [ @@ -173,19 +144,23 @@ abstract class AbstractUUIDFixTest extends TestCase { $this->access->expects($this->exactly(3)) ->method('getUUID') - ->withConsecutive( - [$args['records'][0]['dn'], $this->isUser], - [$args['records'][1]['dn'], $this->isUser], - [$args['records'][2]['dn'], $this->isUser] - ) - ->willReturnOnConsecutiveCalls($correctUUIDs[0], $correctUUIDs[1], $correctUUIDs[2]); - + ->willReturnMap([ + [$args['records'][0]['dn'], $this->isUser, null, $correctUUIDs[0]], + [$args['records'][1]['dn'], $this->isUser, null, $correctUUIDs[1]], + [$args['records'][2]['dn'], $this->isUser, null, $correctUUIDs[2]], + ]); + + $calls = [ + [$correctUUIDs[0], $args['records'][0]['dn']], + [$correctUUIDs[2], $args['records'][2]['dn']], + ]; $this->mapper->expects($this->exactly(2)) ->method('setUUIDbyDN') - ->withConsecutive( - [$correctUUIDs[0], $args['records'][0]['dn']], - [$correctUUIDs[2], $args['records'][2]['dn']] - ); + ->willReturnCallback(function ($i, $j) use (&$calls) { + $expected = array_shift($calls); + $this->assertEquals($expected, func_get_args()); + return true; + }); $this->job->run($args); } diff --git a/apps/user_ldap/tests/Migration/UUIDFixGroupTest.php b/apps/user_ldap/tests/Migration/UUIDFixGroupTest.php index 0144a259318..89d880f4acb 100644 --- a/apps/user_ldap/tests/Migration/UUIDFixGroupTest.php +++ b/apps/user_ldap/tests/Migration/UUIDFixGroupTest.php @@ -1,32 +1,15 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\Group_LDAP\Tests\Migration; +namespace OCA\User_LDAP\Tests\Migration; use OCA\User_LDAP\Group_Proxy; use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\Migration\UUIDFixGroup; -use OCA\User_LDAP\Tests\Migration\AbstractUUIDFixTest; /** * Class UUIDFixGroupTest @@ -34,7 +17,7 @@ use OCA\User_LDAP\Tests\Migration\AbstractUUIDFixTest; * @package OCA\Group_LDAP\Tests\Migration * @group DB */ -class UUIDFixGroupTest extends AbstractUUIDFixTest { +class UUIDFixGroupTest extends AbstractUUIDFixTestCase { protected function setUp(): void { $this->isUser = false; parent::setUp(); diff --git a/apps/user_ldap/tests/Migration/UUIDFixInsertTest.php b/apps/user_ldap/tests/Migration/UUIDFixInsertTest.php index b13efa14e5c..6215ffcb6a1 100644 --- a/apps/user_ldap/tests/Migration/UUIDFixInsertTest.php +++ b/apps/user_ldap/tests/Migration/UUIDFixInsertTest.php @@ -1,26 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Migration; @@ -30,23 +13,15 @@ use OCA\User_LDAP\Migration\UUIDFixInsert; use OCP\BackgroundJob\IJobList; use OCP\IConfig; use OCP\Migration\IOutput; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class UUIDFixInsertTest extends TestCase { - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $userMapper; - - /** @var GroupMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $groupMapper; - - /** @var IJobList|\PHPUnit\Framework\MockObject\MockObject */ - protected $jobList; - - /** @var UUIDFixInsert */ - protected $job; + protected IConfig&MockObject $config; + protected UserMapping&MockObject $userMapper; + protected GroupMapping&MockObject $groupMapper; + protected IJobList&MockObject $jobList; + protected UUIDFixInsert $job; protected function setUp(): void { parent::setUp(); @@ -63,22 +38,21 @@ class UUIDFixInsertTest extends TestCase { ); } - public function testGetName() { + public function testGetName(): void { $this->assertSame('Insert UUIDFix background job for user and group in batches', $this->job->getName()); } - public function recordProvider() { + public static function recordProvider(): array { $record = [ 'dn' => 'cn=somerecord,dc=somewhere', 'name' => 'Something', 'uuid' => 'AB12-3456-CDEF7-8GH9' ]; - array_fill(0, 50, $record); $userBatches = [ 0 => array_fill(0, 50, $record), 1 => array_fill(0, 50, $record), - 2 => array_fill(0, 13, $record), + 2 => array_fill(0, 13, $record), ]; $groupBatches = [ @@ -90,13 +64,12 @@ class UUIDFixInsertTest extends TestCase { ]; } - public function recordProviderTooLongAndNone() { + public static function recordProviderTooLongAndNone(): array { $record = [ 'dn' => 'cn=somerecord,dc=somewhere', 'name' => 'Something', 'uuid' => 'AB12-3456-CDEF7-8GH9' ]; - array_fill(0, 50, $record); $userBatches = [ 0 => array_fill(0, 50, $record), @@ -113,10 +86,8 @@ class UUIDFixInsertTest extends TestCase { ]; } - /** - * @dataProvider recordProvider - */ - public function testRun($userBatches, $groupBatches) { + #[\PHPUnit\Framework\Attributes\DataProvider('recordProvider')] + public function testRun(array $userBatches, array $groupBatches): void { $this->config->expects($this->once()) ->method('getAppValue') ->with('user_ldap', 'installed_version', '1.2.1') @@ -124,8 +95,11 @@ class UUIDFixInsertTest extends TestCase { $this->userMapper->expects($this->exactly(3)) ->method('getList') - ->withConsecutive([0, 50], [50, 50], [100, 50]) - ->willReturnOnConsecutiveCalls($userBatches[0], $userBatches[1], $userBatches[2]); + ->willReturnMap([ + [0, 50, false, $userBatches[0]], + [50, 50, false, $userBatches[1]], + [100, 50, false, $userBatches[2]], + ]); $this->groupMapper->expects($this->exactly(1)) ->method('getList') @@ -140,10 +114,8 @@ class UUIDFixInsertTest extends TestCase { $this->job->run($out); } - /** - * @dataProvider recordProviderTooLongAndNone - */ - public function testRunWithManyAndNone($userBatches, $groupBatches) { + #[\PHPUnit\Framework\Attributes\DataProvider('recordProviderTooLongAndNone')] + public function testRunWithManyAndNone(array $userBatches, array $groupBatches): void { $this->config->expects($this->once()) ->method('getAppValue') ->with('user_ldap', 'installed_version', '1.2.1') @@ -151,33 +123,35 @@ class UUIDFixInsertTest extends TestCase { $this->userMapper->expects($this->exactly(5)) ->method('getList') - ->withConsecutive([0, 50], [0, 40], [0, 32], [32, 32], [64, 32]) - ->willReturnOnConsecutiveCalls($userBatches[0], $userBatches[1], $userBatches[2], $userBatches[3], $userBatches[4]); + ->willReturnMap([ + [0, 50, false, $userBatches[0]], + [0, 40, false, $userBatches[1]], + [0, 32, false, $userBatches[2]], + [32, 32, false, $userBatches[3]], + [64, 32, false, $userBatches[4]], + ]); $this->groupMapper->expects($this->once()) ->method('getList') ->with(0, 50) ->willReturn($groupBatches[0]); - $this->jobList->expects($this->at(0)) + $this->jobList->expects($this->exactly(5)) ->method('add') - ->willThrowException(new \InvalidArgumentException('Background job arguments can\'t exceed 4000 etc')); - $this->jobList->expects($this->at(1)) - ->method('add') - ->willThrowException(new \InvalidArgumentException('Background job arguments can\'t exceed 4000 etc')); - $this->jobList->expects($this->at(2)) - ->method('add'); - $this->jobList->expects($this->at(3)) - ->method('add'); - $this->jobList->expects($this->at(4)) - ->method('add'); + ->willReturnOnConsecutiveCalls( + $this->throwException(new \InvalidArgumentException('Background job arguments can\'t exceed 4000 etc')), + $this->throwException(new \InvalidArgumentException('Background job arguments can\'t exceed 4000 etc')), + null, + null, + null, + ); /** @var IOutput $out */ $out = $this->createMock(IOutput::class); $this->job->run($out); } - public function testDonNotRun() { + public function testDonNotRun(): void { $this->config->expects($this->once()) ->method('getAppValue') ->with('user_ldap', 'installed_version', '1.2.1') diff --git a/apps/user_ldap/tests/Migration/UUIDFixUserTest.php b/apps/user_ldap/tests/Migration/UUIDFixUserTest.php index 477bc66f1a9..a582fd677fa 100644 --- a/apps/user_ldap/tests/Migration/UUIDFixUserTest.php +++ b/apps/user_ldap/tests/Migration/UUIDFixUserTest.php @@ -1,25 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Migration; @@ -33,7 +17,7 @@ use OCA\User_LDAP\User_Proxy; * @package OCA\User_LDAP\Tests\Migration * @group DB */ -class UUIDFixUserTest extends AbstractUUIDFixTest { +class UUIDFixUserTest extends AbstractUUIDFixTestCase { protected function setUp(): void { $this->isUser = true; parent::setUp(); diff --git a/apps/user_ldap/tests/Service/BirthdateParserServiceTest.php b/apps/user_ldap/tests/Service/BirthdateParserServiceTest.php new file mode 100644 index 00000000000..061118f10c1 --- /dev/null +++ b/apps/user_ldap/tests/Service/BirthdateParserServiceTest.php @@ -0,0 +1,51 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\User_LDAP\Tests\Service; + +use DateTimeImmutable; +use OCA\User_LDAP\Service\BirthdateParserService; +use PHPUnit\Framework\TestCase; + +class BirthdateParserServiceTest extends TestCase { + private BirthdateParserService $service; + + protected function setUp(): void { + parent::setUp(); + + $this->service = new BirthdateParserService(); + } + + public static function parseBirthdateDataProvider(): array { + return [ + ['2024-01-01', new DateTimeImmutable('2024-01-01'), false], + ['20240101', new DateTimeImmutable('2024-01-01'), false], + ['199412161032Z', new DateTimeImmutable('1994-12-16'), false], // LDAP generalized time + ['199412160532-0500', new DateTimeImmutable('1994-12-16'), false], // LDAP generalized time + ['2023-07-31T00:60:59.000Z', null, true], + ['01.01.2024', null, true], + ['01/01/2024', null, true], + ['01 01 2024', null, true], + ['foobar', null, true], + ]; + } + + #[\PHPUnit\Framework\Attributes\DataProvider('parseBirthdateDataProvider')] + public function testParseBirthdate( + string $value, + ?DateTimeImmutable $expected, + bool $shouldThrow, + ): void { + if ($shouldThrow) { + $this->expectException(\InvalidArgumentException::class); + } + + $actual = $this->service->parseBirthdate($value); + $this->assertEquals($expected, $actual); + } +} diff --git a/apps/user_ldap/tests/Service/UpdateGroupsServiceTest.php b/apps/user_ldap/tests/Service/UpdateGroupsServiceTest.php new file mode 100644 index 00000000000..601aee86602 --- /dev/null +++ b/apps/user_ldap/tests/Service/UpdateGroupsServiceTest.php @@ -0,0 +1,137 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\User_LDAP\Tests\Service; + +use OCA\User_LDAP\Db\GroupMembership; +use OCA\User_LDAP\Db\GroupMembershipMapper; +use OCA\User_LDAP\Group_Proxy; +use OCA\User_LDAP\Service\UpdateGroupsService; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\UserAddedEvent; +use OCP\Group\Events\UserRemovedEvent; +use OCP\IGroup; +use OCP\IGroupManager; +use OCP\IUser; +use OCP\IUserManager; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; +use Test\TestCase; + +class UpdateGroupsServiceTest extends TestCase { + protected Group_Proxy&MockObject $groupBackend; + protected IEventDispatcher&MockObject $dispatcher; + protected IGroupManager&MockObject $groupManager; + protected IUserManager&MockObject $userManager; + protected LoggerInterface&MockObject $logger; + protected GroupMembershipMapper&MockObject $groupMembershipMapper; + protected UpdateGroupsService $updateGroupsService; + + public function setUp(): void { + $this->groupBackend = $this->createMock(Group_Proxy::class); + $this->dispatcher = $this->createMock(IEventDispatcher::class); + $this->groupManager = $this->createMock(IGroupManager::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->groupMembershipMapper = $this->createMock(GroupMembershipMapper::class); + + $this->updateGroupsService = new UpdateGroupsService( + $this->groupBackend, + $this->dispatcher, + $this->groupManager, + $this->userManager, + $this->logger, + $this->groupMembershipMapper, + ); + } + + public function testHandleKnownGroups(): void { + $knownGroups = [ + 'emptyGroup' => [], + 'stableGroup' => ['userA', 'userC', 'userE'], + 'groupWithAdditions' => ['userA', 'userC', 'userE'], + 'groupWithRemovals' => ['userA', 'userC', 'userDeleted', 'userE'], + 'groupWithAdditionsAndRemovals' => ['userA', 'userC', 'userE'], + 'vanishedGroup' => ['userB', 'userDeleted'], + ]; + $knownGroupsDB = []; + foreach ($knownGroups as $gid => $members) { + $knownGroupsDB[] = [ + 'owncloudname' => $gid, + 'owncloudusers' => $members + ]; + } + $actualGroups = [ + 'emptyGroup' => [], + 'stableGroup' => ['userA', 'userC', 'userE'], + 'groupWithAdditions' => ['userA', 'userC', 'userE', 'userF'], + 'groupWithRemovals' => ['userA', 'userE'], + 'groupWithAdditionsAndRemovals' => ['userC', 'userE', 'userF'], + 'newGroup' => ['userB', 'userF'], + ]; + $groups = array_intersect(array_keys($knownGroups), array_keys($actualGroups)); + + $this->groupMembershipMapper->expects($this->never()) + ->method('getKnownGroups'); + $this->groupMembershipMapper->expects($this->exactly(5)) + ->method('findGroupMemberships') + ->willReturnCallback( + fn ($group) => array_map( + fn ($userid) => GroupMembership::fromParams(['groupid' => $group,'userid' => $userid]), + $knownGroups[$group] + ) + ); + $this->groupMembershipMapper->expects($this->exactly(3)) + ->method('delete'); + $this->groupMembershipMapper->expects($this->exactly(2)) + ->method('insert'); + + $this->groupBackend->expects($this->any()) + ->method('usersInGroup') + ->willReturnCallback(function ($groupID) use ($actualGroups) { + return $actualGroups[$groupID] ?? []; + }); + + $this->groupManager->expects($this->any()) + ->method('get') + ->willReturnCallback(function (string $groupId): ?IGroup { + if ($groupId === 'vanishedGroup') { + return null; + } + return $this->createMock(IGroup::class); + }); + + $this->userManager->expects($this->exactly(5)) + ->method('get') + ->willReturnCallback(function (string $userId) { + if ($userId === 'userDeleted') { + // user already deleted + return null; + } + return $this->createMock(IUser::class); + }); + + $addedEvents = 0; + $removedEvents = 0; + $this->dispatcher->expects($this->exactly(4)) + ->method('dispatchTyped') + ->willReturnCallback(function ($event) use (&$addedEvents, &$removedEvents): void { + if ($event instanceof UserRemovedEvent) { + $removedEvents++; + } elseif ($event instanceof UserAddedEvent) { + $addedEvents++; + } + }); + + $this->updateGroupsService->handleKnownGroups($groups); + + $this->assertSame(2, $removedEvents); + $this->assertSame(2, $addedEvents); + // and no event for the user that is already deleted, the DB is nevertheless updated, hence 5 + } +} diff --git a/apps/user_ldap/tests/Settings/AdminTest.php b/apps/user_ldap/tests/Settings/AdminTest.php index 44f253ad598..b17e96c1a68 100644 --- a/apps/user_ldap/tests/Settings/AdminTest.php +++ b/apps/user_ldap/tests/Settings/AdminTest.php @@ -1,28 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Settings; @@ -30,7 +11,9 @@ use OCA\User_LDAP\Configuration; use OCA\User_LDAP\Settings\Admin; use OCP\AppFramework\Http\TemplateResponse; use OCP\IL10N; -use OCP\Template; +use OCP\Server; +use OCP\Template\ITemplateManager; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; /** @@ -38,32 +21,31 @@ use Test\TestCase; * @package OCA\User_LDAP\Tests\Settings */ class AdminTest extends TestCase { - /** @var Admin */ - private $admin; - /** @var IL10N */ - private $l10n; + private IL10N&MockObject $l10n; + private ITemplateManager $templateManager; + private Admin $admin; protected function setUp(): void { parent::setUp(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); + $this->l10n = $this->createMock(IL10N::class); + $this->templateManager = Server::get(ITemplateManager::class); $this->admin = new Admin( - $this->l10n + $this->l10n, + $this->templateManager, ); } - /** - * @UseDB - */ - public function testGetForm() { + public function testGetForm(): void { $prefixes = ['s01']; $hosts = ['s01' => '']; - $wControls = new Template('user_ldap', 'part.wizardcontrols'); + $wControls = $this->templateManager->getTemplate('user_ldap', 'part.wizardcontrols'); $wControls = $wControls->fetchPage(); - $sControls = new Template('user_ldap', 'part.settingcontrols'); + $sControls = $this->templateManager->getTemplate('user_ldap', 'part.settingcontrols'); $sControls = $sControls->fetchPage(); + $parameters = []; $parameters['serverConfigurationPrefixes'] = $prefixes; $parameters['serverConfigurationHosts'] = $hosts; $parameters['settingControls'] = $sControls; @@ -73,18 +55,18 @@ class AdminTest extends TestCase { $config = new Configuration('', false); $defaults = $config->getDefaults(); foreach ($defaults as $key => $default) { - $parameters[$key.'_default'] = $default; + $parameters[$key . '_default'] = $default; } $expected = new TemplateResponse('user_ldap', 'settings', $parameters); $this->assertEquals($expected, $this->admin->getForm()); } - public function testGetSection() { + public function testGetSection(): void { $this->assertSame('ldap', $this->admin->getSection()); } - public function testGetPriority() { + public function testGetPriority(): void { $this->assertSame(5, $this->admin->getPriority()); } } diff --git a/apps/user_ldap/tests/Settings/SectionTest.php b/apps/user_ldap/tests/Settings/SectionTest.php index 21de15118c8..3f9ae1e56d4 100644 --- a/apps/user_ldap/tests/Settings/SectionTest.php +++ b/apps/user_ldap/tests/Settings/SectionTest.php @@ -1,43 +1,22 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch> - * - * @author Joas Schilling <coding@schilljs.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Valdnet <47037905+Valdnet@users.noreply.github.com> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\Settings; use OCA\User_LDAP\Settings\Section; use OCP\IL10N; use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class SectionTest extends TestCase { - /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */ - private $url; - /** @var IL10N|\PHPUnit\Framework\MockObject\MockObject */ - private $l; - /** @var Section */ - private $section; + private IURLGenerator&MockObject $url; + private IL10N&MockObject $l; + private Section $section; protected function setUp(): void { parent::setUp(); @@ -50,11 +29,11 @@ class SectionTest extends TestCase { ); } - public function testGetID() { + public function testGetID(): void { $this->assertSame('ldap', $this->section->getID()); } - public function testGetName() { + public function testGetName(): void { $this->l ->expects($this->once()) ->method('t') @@ -64,11 +43,11 @@ class SectionTest extends TestCase { $this->assertSame('LDAP/AD integration', $this->section->getName()); } - public function testGetPriority() { + public function testGetPriority(): void { $this->assertSame(25, $this->section->getPriority()); } - public function testGetIcon() { + public function testGetIcon(): void { $this->url->expects($this->once()) ->method('imagePath') ->with('user_ldap', 'app-dark.svg') diff --git a/apps/user_ldap/tests/User/DeletedUsersIndexTest.php b/apps/user_ldap/tests/User/DeletedUsersIndexTest.php index 7d0b49b21c8..b245e52fe6e 100644 --- a/apps/user_ldap/tests/User/DeletedUsersIndexTest.php +++ b/apps/user_ldap/tests/User/DeletedUsersIndexTest.php @@ -1,27 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\User; @@ -29,7 +11,9 @@ use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\DeletedUsersIndex; use OCP\IConfig; use OCP\IDBConnection; +use OCP\Server; use OCP\Share\IManager; +use PHPUnit\Framework\MockObject\MockObject; /** * Class DeletedUsersIndexTest @@ -39,26 +23,18 @@ use OCP\Share\IManager; * @package OCA\User_LDAP\Tests\User */ class DeletedUsersIndexTest extends \Test\TestCase { - /** @var DeletedUsersIndex */ - protected $dui; - - /** @var IConfig */ - protected $config; - - /** @var IDBConnection */ - protected $db; - - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $mapping; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $shareManager; + protected DeletedUsersIndex $dui; + protected IConfig $config; + protected IDBConnection $db; + protected UserMapping&MockObject $mapping; + protected IManager&MockObject $shareManager; protected function setUp(): void { parent::setUp(); // no mocks for those as tests go against DB - $this->config = \OC::$server->getConfig(); - $this->db = \OC::$server->getDatabaseConnection(); + $this->config = Server::get(IConfig::class); + $this->db = Server::get(IDBConnection::class); // ensure a clean database $this->config->deleteAppFromAllUsers('user_ldap'); @@ -74,7 +50,7 @@ class DeletedUsersIndexTest extends \Test\TestCase { parent::tearDown(); } - public function testMarkAndFetchUser() { + public function testMarkAndFetchUser(): void { $uids = [ 'cef3775c-71d2-48eb-8984-39a4051b0b95', '8c4bbb40-33ed-42d0-9b14-85b0ab76c1cc', @@ -102,7 +78,7 @@ class DeletedUsersIndexTest extends \Test\TestCase { $this->assertEmpty($uids); } - public function testUnmarkUser() { + public function testUnmarkUser(): void { $uids = [ '22a162c7-a9ee-487c-9f33-0563795583fb', '1fb4e0da-4a75-47f3-8fa7-becc7e35c9c5', diff --git a/apps/user_ldap/tests/User/ManagerTest.php b/apps/user_ldap/tests/User/ManagerTest.php index adeabea73e9..bf9d1f5746f 100644 --- a/apps/user_ldap/tests/User/ManagerTest.php +++ b/apps/user_ldap/tests/User/ManagerTest.php @@ -1,36 +1,15 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Philippe Jung <phil.jung@free.fr> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\User; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; -use OCA\User_LDAP\FilesystemHelper; use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\User; @@ -41,6 +20,7 @@ use OCP\Image; use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; use OCP\Share\IManager; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; /** @@ -51,50 +31,24 @@ use Psr\Log\LoggerInterface; * @package OCA\User_LDAP\Tests\User */ class ManagerTest extends \Test\TestCase { - /** @var Access|\PHPUnit\Framework\MockObject\MockObject */ - protected $access; - - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - - /** @var FilesystemHelper|\PHPUnit\Framework\MockObject\MockObject */ - protected $fileSystemHelper; - - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - protected $logger; - - /** @var IAvatarManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $avatarManager; - - /** @var Image|\PHPUnit\Framework\MockObject\MockObject */ - protected $image; - - /** @var IDBConnection|\PHPUnit\Framework\MockObject\MockObject */ - protected $dbc; - - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $ncUserManager; - - /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $notificationManager; - - /** @var ILDAPWrapper|\PHPUnit\Framework\MockObject\MockObject */ - protected $ldapWrapper; - - /** @var Connection */ - protected $connection; - - /** @var Manager */ - protected $manager; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $shareManager; + protected Access&MockObject $access; + protected IConfig&MockObject $config; + protected LoggerInterface&MockObject $logger; + protected IAvatarManager&MockObject $avatarManager; + protected Image&MockObject $image; + protected IDBConnection&MockObject $dbc; + protected IUserManager&MockObject $ncUserManager; + protected INotificationManager&MockObject $notificationManager; + protected ILDAPWrapper&MockObject $ldapWrapper; + protected Connection $connection; + protected IManager&MockObject $shareManager; + protected Manager $manager; protected function setUp(): void { parent::setUp(); $this->access = $this->createMock(Access::class); $this->config = $this->createMock(IConfig::class); - $this->fileSystemHelper = $this->createMock(FilesystemHelper::class); $this->logger = $this->createMock(LoggerInterface::class); $this->avatarManager = $this->createMock(IAvatarManager::class); $this->image = $this->createMock(Image::class); @@ -112,7 +66,6 @@ class ManagerTest extends \Test\TestCase { /** @noinspection PhpUnhandledExceptionInspection */ $this->manager = new Manager( $this->config, - $this->fileSystemHelper, $this->logger, $this->avatarManager, $this->image, @@ -124,7 +77,7 @@ class ManagerTest extends \Test\TestCase { $this->manager->setLdapAccess($this->access); } - public function dnProvider() { + public static function dnProvider(): array { return [ ['cn=foo,dc=foobar,dc=bar'], ['uid=foo,o=foobar,c=bar'], @@ -132,10 +85,8 @@ class ManagerTest extends \Test\TestCase { ]; } - /** - * @dataProvider dnProvider - */ - public function testGetByDNExisting(string $inputDN) { + #[\PHPUnit\Framework\Attributes\DataProvider('dnProvider')] + public function testGetByDNExisting(string $inputDN): void { $uid = '563418fc-423b-1033-8d1c-ad5f418ee02e'; $this->access->expects($this->once()) @@ -160,7 +111,7 @@ class ManagerTest extends \Test\TestCase { $this->assertInstanceOf(User::class, $user); } - public function testGetByDNNotExisting() { + public function testGetByDNNotExisting(): void { $inputDN = 'cn=gone,dc=foobar,dc=bar'; $this->access->expects($this->once()) @@ -182,7 +133,7 @@ class ManagerTest extends \Test\TestCase { $this->assertNull($user); } - public function testGetByUidExisting() { + public function testGetByUidExisting(): void { $dn = 'cn=foo,dc=foobar,dc=bar'; $uid = '563418fc-423b-1033-8d1c-ad5f418ee02e'; @@ -208,7 +159,7 @@ class ManagerTest extends \Test\TestCase { $this->assertInstanceOf(User::class, $user); } - public function testGetByUidNotExisting() { + public function testGetByUidNotExisting(): void { $uid = 'gone'; $this->access->expects($this->never()) @@ -224,17 +175,15 @@ class ManagerTest extends \Test\TestCase { $this->assertNull($user); } - public function attributeRequestProvider() { + public static function attributeRequestProvider(): array { return [ [false], [true], ]; } - /** - * @dataProvider attributeRequestProvider - */ - public function testGetAttributes($minimal) { + #[\PHPUnit\Framework\Attributes\DataProvider('attributeRequestProvider')] + public function testGetAttributes($minimal): void { $this->connection->setConfiguration([ 'ldapEmailAttribute' => 'MAIL', 'ldapUserAvatarRule' => 'default', @@ -244,10 +193,10 @@ class ManagerTest extends \Test\TestCase { $attributes = $this->manager->getAttributes($minimal); - $this->assertTrue(in_array('dn', $attributes)); - $this->assertTrue(in_array(strtolower($this->access->getConnection()->ldapEmailAttribute), $attributes)); - $this->assertTrue(!in_array($this->access->getConnection()->ldapEmailAttribute, $attributes)); #cases check - $this->assertFalse(in_array('', $attributes)); + $this->assertContains('dn', $attributes); + $this->assertContains(strtolower($this->access->getConnection()->ldapEmailAttribute), $attributes); + $this->assertNotContains($this->access->getConnection()->ldapEmailAttribute, $attributes); #cases check + $this->assertNotContains('', $attributes); $this->assertSame(!$minimal, in_array('jpegphoto', $attributes)); $this->assertSame(!$minimal, in_array('thumbnailphoto', $attributes)); $valueCounts = array_count_values($attributes); diff --git a/apps/user_ldap/tests/User/OfflineUserTest.php b/apps/user_ldap/tests/User/OfflineUserTest.php index e1fda3f16ca..223e63421ad 100644 --- a/apps/user_ldap/tests/User/OfflineUserTest.php +++ b/apps/user_ldap/tests/User/OfflineUserTest.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests\User; @@ -30,20 +13,15 @@ use OCA\User_LDAP\User\OfflineUser; use OCP\IConfig; use OCP\Share\IManager; use OCP\Share\IShare; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class OfflineUserTest extends TestCase { - - /** @var OfflineUser */ - protected $offlineUser; - /** @var UserMapping|\PHPUnit\Framework\MockObject\MockObject */ - protected $mapping; - /** @var string */ - protected $uid; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $shareManager; + protected UserMapping&MockObject $mapping; + protected string $uid; + protected IConfig&MockObject $config; + protected IManager&MockObject $shareManager; + protected OfflineUser $offlineUser; public function setUp(): void { $this->uid = 'deborah'; @@ -59,7 +37,7 @@ class OfflineUserTest extends TestCase { ); } - public function shareOwnerProvider(): array { + public static function shareOwnerProvider(): array { return [ [[], false], [[IShare::TYPE_USER], true], @@ -69,10 +47,8 @@ class OfflineUserTest extends TestCase { ]; } - /** - * @dataProvider shareOwnerProvider - */ - public function testHasActiveShares(array $existingShareTypes, bool $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('shareOwnerProvider')] + public function testHasActiveShares(array $existingShareTypes, bool $expected): void { $shareMock = $this->createMock(IShare::class); $this->shareManager->expects($this->atLeastOnce()) diff --git a/apps/user_ldap/tests/User/UserTest.php b/apps/user_ldap/tests/User/UserTest.php index e86eb5e9e2e..00edd8b3f9b 100644 --- a/apps/user_ldap/tests/User/UserTest.php +++ b/apps/user_ldap/tests/User/UserTest.php @@ -1,36 +1,16 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Juan Pablo Villafáñez <jvillafanez@solidgear.es> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests\User; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; -use OCA\User_LDAP\FilesystemHelper; +use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\User\User; use OCP\IAvatar; use OCP\IAvatarManager; @@ -40,6 +20,8 @@ use OCP\IUser; use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; use OCP\Notification\INotification; +use OCP\Util; +use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; /** @@ -50,35 +32,24 @@ use Psr\Log\LoggerInterface; * @package OCA\User_LDAP\Tests\User */ class UserTest extends \Test\TestCase { - /** @var Access|\PHPUnit\Framework\MockObject\MockObject */ - protected $access; - /** @var Connection|\PHPUnit\Framework\MockObject\MockObject */ - protected $connection; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - /** @var FilesystemHelper|\PHPUnit\Framework\MockObject\MockObject */ - protected $filesystemhelper; - /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $notificationManager; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $userManager; - /** @var Image|\PHPUnit\Framework\MockObject\MockObject */ - protected $image; - /** @var IAvatarManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $avatarManager; - /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */ - protected $logger; - /** @var string */ - protected $uid = 'alice'; - /** @var string */ - protected $dn = 'uid=alice,dc=foo,dc=bar'; - /** @var User */ - protected $user; + protected Access&MockObject $access; + protected Connection&MockObject $connection; + protected IConfig&MockObject $config; + protected INotificationManager&MockObject $notificationManager; + protected IUserManager&MockObject $userManager; + protected Image&MockObject $image; + protected IAvatarManager&MockObject $avatarManager; + protected LoggerInterface&MockObject $logger; + protected string $uid = 'alice'; + protected string $dn = 'uid=alice,dc=foo,dc=bar'; + protected User $user; protected function setUp(): void { parent::setUp(); - $this->connection = $this->createMock(Connection::class); + $this->connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $this->access = $this->createMock(Access::class); $this->access->connection = $this->connection; @@ -87,7 +58,6 @@ class UserTest extends \Test\TestCase { ->willReturn($this->connection); $this->config = $this->createMock(IConfig::class); - $this->filesystemhelper = $this->createMock(FilesystemHelper::class); $this->logger = $this->createMock(LoggerInterface::class); $this->avatarManager = $this->createMock(IAvatarManager::class); $this->image = $this->createMock(Image::class); @@ -99,7 +69,6 @@ class UserTest extends \Test\TestCase { $this->dn, $this->access, $this->config, - $this->filesystemhelper, $this->image, $this->logger, $this->avatarManager, @@ -108,12 +77,12 @@ class UserTest extends \Test\TestCase { ); } - public function testGetDNandUsername() { + public function testGetDNandUsername(): void { $this->assertSame($this->dn, $this->user->getDN()); $this->assertSame($this->uid, $this->user->getUsername()); } - public function testUpdateEmailProvided() { + public function testUpdateEmailProvided(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) @@ -125,11 +94,9 @@ class UserTest extends \Test\TestCase { $this->equalTo('email')) ->willReturn(['alice@foo.bar']); - $coreUser = $this->getMockBuilder(IUser::class) - ->disableOriginalConstructor() - ->getMock(); + $coreUser = $this->createMock(IUser::class); $coreUser->expects($this->once()) - ->method('setEMailAddress') + ->method('setSystemEMailAddress') ->with('alice@foo.bar'); $this->userManager->expects($this->any()) @@ -139,7 +106,7 @@ class UserTest extends \Test\TestCase { $this->user->updateEmail(); } - public function testUpdateEmailNotProvided() { + public function testUpdateEmailNotProvided(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) @@ -157,7 +124,7 @@ class UserTest extends \Test\TestCase { $this->user->updateEmail(); } - public function testUpdateEmailNotConfigured() { + public function testUpdateEmailNotConfigured(): void { $this->connection->expects($this->once()) ->method('__get') ->with($this->equalTo('ldapEmailAttribute')) @@ -172,7 +139,7 @@ class UserTest extends \Test\TestCase { $this->user->updateEmail(); } - public function testUpdateQuotaAllProvided() { + public function testUpdateQuotaAllProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -199,7 +166,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaToDefaultAllProvided() { + public function testUpdateQuotaToDefaultAllProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -226,7 +193,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaToNoneAllProvided() { + public function testUpdateQuotaToNoneAllProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -253,17 +220,13 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaDefaultProvided() { - $this->connection->expects($this->at(0)) - ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->willReturn('myquota'); - $this->connection->expects($this->at(1)) - ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->willReturn('25 GB'); + public function testUpdateQuotaDefaultProvided(): void { $this->connection->expects($this->exactly(2)) - ->method('__get'); + ->method('__get') + ->willReturnMap([ + ['ldapQuotaAttribute', 'myquota'], + ['ldapQuotaDefault', '25 GB'], + ]); $this->access->expects($this->once()) ->method('readAttribute') @@ -284,7 +247,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaIndividualProvided() { + public function testUpdateQuotaIndividualProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -311,7 +274,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaNoneProvided() { + public function testUpdateQuotaNoneProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -339,7 +302,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaNoneConfigured() { + public function testUpdateQuotaNoneConfigured(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -363,7 +326,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - public function testUpdateQuotaFromValue() { + public function testUpdateQuotaFromValue(): void { $readQuota = '19 GB'; $this->connection->expects($this->exactly(2)) @@ -392,7 +355,7 @@ class UserTest extends \Test\TestCase { /** * Unparseable quota will fallback to use the LDAP default */ - public function testUpdateWrongQuotaAllProvided() { + public function testUpdateWrongQuotaAllProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -422,7 +385,7 @@ class UserTest extends \Test\TestCase { /** * No user quota and wrong default will set 'default' as quota */ - public function testUpdateWrongDefaultQuotaProvided() { + public function testUpdateWrongDefaultQuotaProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -449,7 +412,7 @@ class UserTest extends \Test\TestCase { /** * Wrong user quota and wrong default will set 'default' as quota */ - public function testUpdateWrongQuotaAndDefaultAllProvided() { + public function testUpdateWrongQuotaAndDefaultAllProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -476,7 +439,7 @@ class UserTest extends \Test\TestCase { /** * No quota attribute set and wrong default will set 'default' as quota */ - public function testUpdateWrongDefaultQuotaNotProvided() { + public function testUpdateWrongDefaultQuotaNotProvided(): void { $this->connection->expects($this->exactly(2)) ->method('__get') ->willReturnMap([ @@ -497,7 +460,7 @@ class UserTest extends \Test\TestCase { $this->user->updateQuota(); } - //the testUpdateAvatar series also implicitely tests getAvatarImage + //the testUpdateAvatar series also implicitly tests getAvatarImage public function XtestUpdateAvatarJpegPhotoProvided() { $this->access->expects($this->once()) ->method('readAttribute') @@ -532,14 +495,10 @@ class UserTest extends \Test\TestCase { ->method('setUserValue') ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo')); - $this->filesystemhelper->expects($this->once()) - ->method('isLoaded') - ->willReturn(true); - $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->once()) ->method('set') - ->with($this->isInstanceOf($this->image)); + ->with($this->image); $this->avatarManager->expects($this->once()) ->method('getAvatar') @@ -554,7 +513,7 @@ class UserTest extends \Test\TestCase { $this->user->updateAvatar(); } - public function testUpdateAvatarKnownJpegPhotoProvided() { + public function testUpdateAvatarKnownJpegPhotoProvided(): void { $this->access->expects($this->once()) ->method('readAttribute') ->with($this->equalTo($this->dn), @@ -583,15 +542,20 @@ class UserTest extends \Test\TestCase { $this->config->expects($this->never()) ->method('setUserValue'); - $this->filesystemhelper->expects($this->never()) - ->method('isLoaded'); - $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->never()) ->method('set'); + $avatar->expects($this->any()) + ->method('exists') + ->willReturn(true); + $avatar->expects($this->any()) + ->method('isCustomAvatar') + ->willReturn(true); - $this->avatarManager->expects($this->never()) - ->method('getAvatar'); + $this->avatarManager->expects($this->any()) + ->method('getAvatar') + ->with($this->uid) + ->willReturn($avatar); $this->connection->expects($this->any()) ->method('resolveRule') @@ -642,14 +606,10 @@ class UserTest extends \Test\TestCase { ->method('setUserValue') ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo')); - $this->filesystemhelper->expects($this->once()) - ->method('isLoaded') - ->willReturn(true); - $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->once()) ->method('set') - ->with($this->isInstanceOf($this->image)); + ->with($this->image); $this->avatarManager->expects($this->once()) ->method('getAvatar') @@ -664,7 +624,7 @@ class UserTest extends \Test\TestCase { $this->user->updateAvatar(); } - public function testUpdateAvatarCorruptPhotoProvided() { + public function testUpdateAvatarCorruptPhotoProvided(): void { $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn, $attr) { @@ -697,9 +657,6 @@ class UserTest extends \Test\TestCase { $this->config->expects($this->never()) ->method('setUserValue'); - $this->filesystemhelper->expects($this->never()) - ->method('isLoaded'); - $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->never()) ->method('set'); @@ -755,14 +712,10 @@ class UserTest extends \Test\TestCase { $this->config->expects($this->never()) ->method('setUserValue'); - $this->filesystemhelper->expects($this->once()) - ->method('isLoaded') - ->willReturn(true); - $avatar = $this->createMock(IAvatar::class); $avatar->expects($this->once()) ->method('set') - ->with($this->isInstanceOf($this->image)) + ->with($this->image) ->willThrowException(new \Exception()); $this->avatarManager->expects($this->once()) @@ -778,7 +731,7 @@ class UserTest extends \Test\TestCase { $this->assertFalse($this->user->updateAvatar()); } - public function testUpdateAvatarNotProvided() { + public function testUpdateAvatarNotProvided(): void { $this->access->expects($this->any()) ->method('readAttribute') ->willReturnCallback(function ($dn, $attr) { @@ -808,9 +761,6 @@ class UserTest extends \Test\TestCase { $this->config->expects($this->never()) ->method('setUserValue'); - $this->filesystemhelper->expects($this->never()) - ->method('isLoaded'); - $this->avatarManager->expects($this->never()) ->method('getAvatar'); @@ -822,7 +772,7 @@ class UserTest extends \Test\TestCase { $this->user->updateAvatar(); } - public function extStorageHomeDataProvider() { + public static function extStorageHomeDataProvider(): array { return [ [ 'myFolder', null ], [ '', null, false ], @@ -830,10 +780,8 @@ class UserTest extends \Test\TestCase { ]; } - /** - * @dataProvider extStorageHomeDataProvider - */ - public function testUpdateExtStorageHome(string $expected, string $valueFromLDAP = null, bool $isSet = true) { + #[\PHPUnit\Framework\Attributes\DataProvider('extStorageHomeDataProvider')] + public function testUpdateExtStorageHome(string $expected, ?string $valueFromLDAP = null, bool $isSet = true): void { if ($valueFromLDAP === null) { $this->connection->expects($this->once()) ->method('__get') @@ -865,7 +813,7 @@ class UserTest extends \Test\TestCase { $this->assertSame($expected, $actual); } - public function testMarkLogin() { + public function testMarkLogin(): void { $this->config->expects($this->once()) ->method('setUserValue') ->with($this->equalTo($this->uid), @@ -877,7 +825,7 @@ class UserTest extends \Test\TestCase { $this->user->markLogin(); } - public function testGetAvatarImageProvided() { + public function testGetAvatarImageProvided(): void { $this->access->expects($this->once()) ->method('readAttribute') ->with($this->equalTo($this->dn), @@ -895,7 +843,7 @@ class UserTest extends \Test\TestCase { $this->user->getAvatarImage(); } - public function testGetAvatarImageDisabled() { + public function testGetAvatarImageDisabled(): void { $this->access->expects($this->never()) ->method('readAttribute') ->with($this->equalTo($this->dn), $this->anything()); @@ -907,7 +855,7 @@ class UserTest extends \Test\TestCase { $this->assertFalse($this->user->getAvatarImage()); } - public function imageDataProvider() { + public static function imageDataProvider(): array { return [ [ false, false ], [ 'corruptData', false ], @@ -915,7 +863,7 @@ class UserTest extends \Test\TestCase { ]; } - public function testProcessAttributes() { + public function testProcessAttributes(): void { $requiredMethods = [ 'updateQuota', 'updateEmail', @@ -926,21 +874,20 @@ class UserTest extends \Test\TestCase { 'updateExtStorageHome', ]; - /** @var User|\PHPUnit\Framework\MockObject\MockObject $userMock */ + /** @var User&MockObject $userMock */ $userMock = $this->getMockBuilder(User::class) ->setConstructorArgs([ $this->uid, $this->dn, $this->access, $this->config, - $this->filesystemhelper, $this->image, $this->logger, $this->avatarManager, $this->userManager, $this->notificationManager ]) - ->setMethods($requiredMethods) + ->onlyMethods($requiredMethods) ->getMock(); $this->connection->setConfiguration([ @@ -980,17 +927,15 @@ class UserTest extends \Test\TestCase { \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } - public function emptyHomeFolderAttributeValueProvider() { + public static function emptyHomeFolderAttributeValueProvider(): array { return [ 'empty' => [''], 'prefixOnly' => ['attr:'], ]; } - /** - * @dataProvider emptyHomeFolderAttributeValueProvider - */ - public function testGetHomePathNotConfigured($attributeValue) { + #[\PHPUnit\Framework\Attributes\DataProvider('emptyHomeFolderAttributeValueProvider')] + public function testGetHomePathNotConfigured(string $attributeValue): void { $this->connection->expects($this->any()) ->method('__get') ->with($this->equalTo('homeFolderNamingRule')) @@ -1006,7 +951,7 @@ class UserTest extends \Test\TestCase { $this->assertFalse($this->user->getHomePath()); } - public function testGetHomePathConfiguredNotAvailableAllowed() { + public function testGetHomePathConfiguredNotAvailableAllowed(): void { $this->connection->expects($this->any()) ->method('__get') ->with($this->equalTo('homeFolderNamingRule')) @@ -1030,7 +975,7 @@ class UserTest extends \Test\TestCase { } - public function testGetHomePathConfiguredNotAvailableNotAllowed() { + public function testGetHomePathConfiguredNotAvailableNotAllowed(): void { $this->expectException(\Exception::class); $this->connection->expects($this->any()) @@ -1054,20 +999,17 @@ class UserTest extends \Test\TestCase { $this->user->getHomePath(); } - public function displayNameProvider() { + public static function displayNameProvider(): array { return [ ['Roland Deschain', '', 'Roland Deschain', false], ['Roland Deschain', '', 'Roland Deschain', true], - ['Roland Deschain', null, 'Roland Deschain', false], ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', false], ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', true], ]; } - /** - * @dataProvider displayNameProvider - */ - public function testComposeAndStoreDisplayName($part1, $part2, $expected, $expectTriggerChange) { + #[\PHPUnit\Framework\Attributes\DataProvider('displayNameProvider')] + public function testComposeAndStoreDisplayName(string $part1, string $part2, string $expected, bool $expectTriggerChange): void { $this->config->expects($this->once()) ->method('setUserValue'); $oldName = $expectTriggerChange ? 'xxGunslingerxx' : null; @@ -1093,7 +1035,7 @@ class UserTest extends \Test\TestCase { $this->assertSame($expected, $displayName); } - public function testComposeAndStoreDisplayNameNoOverwrite() { + public function testComposeAndStoreDisplayNameNoOverwrite(): void { $displayName = 'Randall Flagg'; $this->config->expects($this->never()) ->method('setUserValue'); @@ -1108,7 +1050,7 @@ class UserTest extends \Test\TestCase { $this->assertSame($composedDisplayName, $displayName); } - public function testHandlePasswordExpiryWarningDefaultPolicy() { + public function testHandlePasswordExpiryWarningDefaultPolicy(): void { $this->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { @@ -1127,7 +1069,7 @@ class UserTest extends \Test\TestCase { if ($base === $this->dn) { return [ [ - 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis').'Z'], + 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'], 'pwdgraceusetime' => [], ], ]; @@ -1166,12 +1108,12 @@ class UserTest extends \Test\TestCase { ->method('notify'); \OC_Hook::clear();//disconnect irrelevant hooks - \OCP\Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); + Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); /** @noinspection PhpUnhandledExceptionInspection */ \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } - public function testHandlePasswordExpiryWarningCustomPolicy() { + public function testHandlePasswordExpiryWarningCustomPolicy(): void { $this->connection->expects($this->any()) ->method('__get') ->willReturnCallback(function ($name) { @@ -1191,7 +1133,7 @@ class UserTest extends \Test\TestCase { return [ [ 'pwdpolicysubentry' => ['cn=custom,ou=policies,dc=foo,dc=bar'], - 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis').'Z'], + 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'], 'pwdgraceusetime' => [], ] ]; @@ -1230,7 +1172,7 @@ class UserTest extends \Test\TestCase { ->method('notify'); \OC_Hook::clear();//disconnect irrelevant hooks - \OCP\Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); + Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry'); /** @noinspection PhpUnhandledExceptionInspection */ \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]); } diff --git a/apps/user_ldap/tests/UserLDAPPluginTest.php b/apps/user_ldap/tests/UserLDAPPluginTest.php index 98d9c409027..8a065374e61 100644 --- a/apps/user_ldap/tests/UserLDAPPluginTest.php +++ b/apps/user_ldap/tests/UserLDAPPluginTest.php @@ -1,26 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2017 EITA Cooperative (eita.org.br) - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; @@ -28,27 +11,23 @@ use OC\User\Backend; use OCA\User_LDAP\UserPluginManager; class UserLDAPPluginTest extends \Test\TestCase { - - /** - * @return UserPluginManager - */ - private function getUserPluginManager() { + private function getUserPluginManager(): UserPluginManager { return new UserPluginManager(); } - public function testImplementsActions() { + public function testImplementsActions(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions']) ->getMock(); $plugin->expects($this->any()) ->method('respondToActions') ->willReturn(Backend::CREATE_USER); - $plugin2 = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions']) + $plugin2 = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions']) ->getMock(); $plugin2->expects($this->any()) @@ -63,11 +42,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $this->assertTrue($pluginManager->implementsActions(Backend::PROVIDE_AVATAR)); } - public function testCreateUser() { + public function testCreateUser(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'createUser']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'createUser']) ->getMock(); $plugin->expects($this->any()) @@ -85,20 +64,20 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->createUser('user', 'password'); } - - public function testCreateUserNotRegistered() { + + public function testCreateUserNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements createUser in this LDAP Backend.'); $pluginManager = $this->getUserPluginManager(); - $pluginManager->createUser('foo','bar'); + $pluginManager->createUser('foo', 'bar'); } - public function testSetPassword() { + public function testSetPassword(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'setPassword']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'setPassword']) ->getMock(); $plugin->expects($this->any()) @@ -116,20 +95,20 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->setPassword('user', 'password'); } - - public function testSetPasswordNotRegistered() { + + public function testSetPasswordNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements setPassword in this LDAP Backend.'); $pluginManager = $this->getUserPluginManager(); - $pluginManager->setPassword('foo','bar'); + $pluginManager->setPassword('foo', 'bar'); } - public function testGetHome() { + public function testGetHome(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'getHome']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'getHome']) ->getMock(); $plugin->expects($this->any()) @@ -146,8 +125,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->getHome('uid'); } - - public function testGetHomeNotRegistered() { + + public function testGetHomeNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements getHome in this LDAP Backend.'); @@ -155,11 +134,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->getHome('foo'); } - public function testGetDisplayName() { + public function testGetDisplayName(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'getDisplayName']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'getDisplayName']) ->getMock(); $plugin->expects($this->any()) @@ -176,8 +155,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->getDisplayName('uid'); } - - public function testGetDisplayNameNotRegistered() { + + public function testGetDisplayNameNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements getDisplayName in this LDAP Backend.'); @@ -185,11 +164,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->getDisplayName('foo'); } - public function testSetDisplayName() { + public function testSetDisplayName(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'setDisplayName']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'setDisplayName']) ->getMock(); $plugin->expects($this->any()) @@ -207,8 +186,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->setDisplayName('user', 'password'); } - - public function testSetDisplayNameNotRegistered() { + + public function testSetDisplayNameNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements setDisplayName in this LDAP Backend.'); @@ -216,11 +195,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->setDisplayName('foo', 'bar'); } - public function testCanChangeAvatar() { + public function testCanChangeAvatar(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'canChangeAvatar']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'canChangeAvatar']) ->getMock(); $plugin->expects($this->any()) @@ -237,8 +216,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->canChangeAvatar('uid'); } - - public function testCanChangeAvatarNotRegistered() { + + public function testCanChangeAvatarNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements canChangeAvatar in this LDAP Backend.'); @@ -246,11 +225,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->canChangeAvatar('foo'); } - public function testCountUsers() { + public function testCountUsers(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'countUsers']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'countUsers']) ->getMock(); $plugin->expects($this->any()) @@ -264,8 +243,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->countUsers(); } - - public function testCountUsersNotRegistered() { + + public function testCountUsersNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements countUsers in this LDAP Backend.'); @@ -273,11 +252,11 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->countUsers(); } - public function testDeleteUser() { + public function testDeleteUser(): void { $pluginManager = $this->getUserPluginManager(); - $plugin = $this->getMockBuilder('OCA\User_LDAP\Tests\LDAPUserPluginDummy') - ->setMethods(['respondToActions', 'canDeleteUser','deleteUser']) + $plugin = $this->getMockBuilder(LDAPUserPluginDummy::class) + ->onlyMethods(['respondToActions', 'canDeleteUser','deleteUser']) ->getMock(); $plugin->expects($this->any()) @@ -300,8 +279,8 @@ class UserLDAPPluginTest extends \Test\TestCase { $pluginManager->deleteUser('uid'); } - - public function testDeleteUserNotRegistered() { + + public function testDeleteUserNotRegistered(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('No plugin implements deleteUser in this LDAP Backend.'); diff --git a/apps/user_ldap/tests/User_LDAPTest.php b/apps/user_ldap/tests/User_LDAPTest.php index b00c93e79f0..f8900c3cca4 100644 --- a/apps/user_ldap/tests/User_LDAPTest.php +++ b/apps/user_ldap/tests/User_LDAPTest.php @@ -1,42 +1,20 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin McCorkell <robin@mccorkell.me.uk> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; use OC\User\Backend; -use OC\User\Session; use OCA\User_LDAP\Access; use OCA\User_LDAP\Connection; +use OCA\User_LDAP\ILDAPWrapper; use OCA\User_LDAP\Mapping\AbstractMapping; use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User\Manager; use OCA\User_LDAP\User\OfflineUser; use OCA\User_LDAP\User\User; @@ -45,8 +23,13 @@ use OCA\User_LDAP\User_LDAP as UserLDAP; use OCA\User_LDAP\UserPluginManager; use OCP\HintException; use OCP\IConfig; +use OCP\IGroupManager; use OCP\IUser; +use OCP\IUserManager; use OCP\Notification\IManager as INotificationManager; +use OCP\Server; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; /** @@ -57,74 +40,68 @@ use Test\TestCase; * @package OCA\User_LDAP\Tests */ class User_LDAPTest extends TestCase { - /** @var User_LDAP */ - protected $backend; - /** @var Access|\PHPUnit\Framework\MockObject\MockObject */ - protected $access; - /** @var OfflineUser|\PHPUnit\Framework\MockObject\MockObject */ - protected $offlineUser; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - protected $config; - /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $notificationManager; - /** @var Session|\PHPUnit\Framework\MockObject\MockObject */ - protected $session; - /** @var UserPluginManager|\PHPUnit\Framework\MockObject\MockObject */ - protected $pluginManager; - /** @var Connection|\PHPUnit\Framework\MockObject\MockObject */ - protected $connection; - /** @var Manager|\PHPUnit\Framework\MockObject\MockObject */ - protected $userManager; + protected Access&MockObject $access; + protected OfflineUser&MockObject $offlineUser; + protected INotificationManager&MockObject $notificationManager; + protected UserPluginManager&MockObject $pluginManager; + protected Connection&MockObject $connection; + protected Manager&MockObject $userManager; + protected LoggerInterface&MockObject $logger; + protected DeletedUsersIndex&MockObject $deletedUsersIndex; + protected User_LDAP $backend; protected function setUp(): void { parent::setUp(); - \OC_User::clearBackends(); - \OC::$server->getGroupManager()->clearBackends(); + Server::get(IUserManager::class)->clearBackends(); + Server::get(IGroupManager::class)->clearBackends(); - $this->connection = $this->createMock(Connection::class); + $this->connection = $this->getMockBuilder(Connection::class) + ->setConstructorArgs([$this->createMock(ILDAPWrapper::class)]) + ->getMock(); $this->userManager = $this->createMock(Manager::class); $this->access = $this->createMock(Access::class); $this->access->connection = $this->connection; $this->access->userManager = $this->userManager; - $this->config = $this->createMock(IConfig::class); $this->notificationManager = $this->createMock(INotificationManager::class); - // Cannot use IUserSession because of private listen() methods - $this->session = $this->createMock(Session::class); $this->pluginManager = $this->createMock(UserPluginManager::class); + $this->logger = $this->createMock(LoggerInterface::class); + + $this->deletedUsersIndex = $this->createMock(DeletedUsersIndex::class); + $this->backend = new User_LDAP( $this->access, - $this->config, $this->notificationManager, - $this->session, - $this->pluginManager + $this->pluginManager, + $this->logger, + $this->deletedUsersIndex, ); } - private function prepareMockForUserExists() { + private function prepareMockForUserExists(): void { $this->access->expects($this->any()) - ->method('username2dn') - ->willReturnCallback(function ($uid) { - switch ($uid) { - case 'gunslinger': - return 'dnOfRoland,dc=test'; - break; - case 'formerUser': - return 'dnOfFormerUser,dc=test'; - break; - case 'newyorker': - return 'dnOfNewYorker,dc=test'; - break; - case 'ladyofshadows': - return 'dnOfLadyOfShadows,dc=test'; - break; - default: - return false; - } - }); + ->method('username2dn') + ->willReturnCallback(function ($uid) { + switch ($uid) { + case 'gunslinger': + return 'dnOfRoland,dc=test'; + break; + case 'formerUser': + return 'dnOfFormerUser,dc=test'; + break; + case 'newyorker': + return 'dnOfNewYorker,dc=test'; + break; + case 'ladyofshadows': + return 'dnOfLadyOfShadows,dc=test'; + break; + default: + return false; + } + }); $this->access->method('fetchUsersByLoginName') ->willReturn([]); @@ -132,27 +109,25 @@ class User_LDAPTest extends TestCase { /** * Prepares the Access mock for checkPassword tests - * @param bool $noDisplayName - * @return void */ - private function prepareAccessForCheckPassword($noDisplayName = false) { + private function prepareAccessForCheckPassword(bool $noDisplayName = false): void { $this->connection->expects($this->any()) - ->method('__get') - ->willReturnCallback(function ($name) { - if ($name === 'ldapLoginFilter') { - return '%uid'; - } - return null; - }); + ->method('__get') + ->willReturnCallback(function ($name) { + if ($name === 'ldapLoginFilter') { + return '%uid'; + } + return null; + }); $this->access->expects($this->any()) - ->method('fetchListOfUsers') - ->willReturnCallback(function ($filter) { - if ($filter === 'roland') { - return [['dn' => ['dnOfRoland,dc=test']]]; - } - return []; - }); + ->method('fetchListOfUsers') + ->willReturnCallback(function ($filter) { + if ($filter === 'roland') { + return [['dn' => ['dnOfRoland,dc=test']]]; + } + return []; + }); $this->access->expects($this->any()) ->method('fetchUsersByLoginName') ->willReturnCallback(function ($uid) { @@ -167,28 +142,32 @@ class User_LDAPTest extends TestCase { $retVal = false; } $this->access->expects($this->any()) - ->method('dn2username') - ->with($this->equalTo('dnOfRoland,dc=test')) - ->willReturn($retVal); + ->method('dn2username') + ->with($this->equalTo('dnOfRoland,dc=test')) + ->willReturn($retVal); + $this->access->expects($this->any()) + ->method('username2dn') + ->with($this->equalTo('gunslinger')) + ->willReturn('dnOfRoland,dc=test'); $this->access->expects($this->any()) - ->method('stringResemblesDN') - ->with($this->equalTo('dnOfRoland,dc=test')) - ->willReturn(true); + ->method('stringResemblesDN') + ->with($this->equalTo('dnOfRoland,dc=test')) + ->willReturn(true); $this->access->expects($this->any()) - ->method('areCredentialsValid') - ->willReturnCallback(function ($dn, $pwd) { - if ($pwd === 'dt19') { - return true; - } - return false; - }); + ->method('areCredentialsValid') + ->willReturnCallback(function ($dn, $pwd) { + if ($pwd === 'dt19') { + return true; + } + return false; + }); $this->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['dn', 'uid', 'mail', 'displayname']); } - public function testCheckPasswordUidReturn() { + public function testCheckPasswordUidReturn(): void { $user = $this->createMock(User::class); $user->expects($this->any()) ->method('getUsername') @@ -199,33 +178,33 @@ class User_LDAPTest extends TestCase { ->method('get') ->willReturn($user); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); - \OC_User::useBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); $result = $backend->checkPassword('roland', 'dt19'); $this->assertEquals('gunslinger', $result); } - public function testCheckPasswordWrongPassword() { + public function testCheckPasswordWrongPassword(): void { $this->prepareAccessForCheckPassword(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $backend->checkPassword('roland', 'wrong'); $this->assertFalse($result); } - public function testCheckPasswordWrongUser() { + public function testCheckPasswordWrongUser(): void { $this->prepareAccessForCheckPassword(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $backend->checkPassword('mallory', 'evil'); $this->assertFalse($result); } - public function testCheckPasswordNoDisplayName() { + public function testCheckPasswordNoDisplayName(): void { $this->prepareAccessForCheckPassword(true); $this->prepareAccessForCheckPassword(); @@ -233,14 +212,14 @@ class User_LDAPTest extends TestCase { ->method('get') ->willReturn(null); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $backend->checkPassword('roland', 'dt19'); $this->assertFalse($result); } - public function testCheckPasswordPublicAPI() { + public function testCheckPasswordPublicAPI(): void { $user = $this->createMock(User::class); $user->expects($this->any()) ->method('getUsername') @@ -251,10 +230,10 @@ class User_LDAPTest extends TestCase { ->method('get') ->willReturn($user); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); - $user = \OC::$server->getUserManager()->checkPassword('roland', 'dt19'); + $user = Server::get(IUserManager::class)->checkPassword('roland', 'dt19'); $result = false; if ($user !== false) { $result = $user->getUID(); @@ -262,12 +241,12 @@ class User_LDAPTest extends TestCase { $this->assertEquals('gunslinger', $result); } - public function testCheckPasswordPublicAPIWrongPassword() { + public function testCheckPasswordPublicAPIWrongPassword(): void { $this->prepareAccessForCheckPassword(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); - $user = \OC::$server->getUserManager()->checkPassword('roland', 'wrong'); + $user = Server::get(IUserManager::class)->checkPassword('roland', 'wrong'); $result = false; if ($user !== false) { $result = $user->getUID(); @@ -275,12 +254,12 @@ class User_LDAPTest extends TestCase { $this->assertFalse($result); } - public function testCheckPasswordPublicAPIWrongUser() { + public function testCheckPasswordPublicAPIWrongUser(): void { $this->prepareAccessForCheckPassword(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); - $user = \OC::$server->getUserManager()->checkPassword('mallory', 'evil'); + $user = Server::get(IUserManager::class)->checkPassword('mallory', 'evil'); $result = false; if ($user !== false) { $result = $user->getUID(); @@ -288,13 +267,13 @@ class User_LDAPTest extends TestCase { $this->assertFalse($result); } - public function testDeleteUserCancel() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testDeleteUserCancel(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->deleteUser('notme'); $this->assertFalse($result); } - public function testDeleteUserSuccess() { + public function testDeleteUserSuccess(): void { $uid = 'jeremy'; $home = '/var/vhome/jdings/'; @@ -307,12 +286,12 @@ class User_LDAPTest extends TestCase { ->willReturn($mapping); $this->connection->expects($this->any()) ->method('getConnectionResource') - ->willReturn('this is an ldap link'); + ->willReturn(ldap_connect('ldap://example.com')); - $this->config->expects($this->any()) - ->method('getUserValue') - ->with($uid, 'user_ldap', 'isDeleted') - ->willReturn('1'); + $this->deletedUsersIndex->expects($this->once()) + ->method('isUserMarked') + ->with($uid) + ->willReturn(true); $offlineUser = $this->createMock(OfflineUser::class); $offlineUser->expects($this->once()) @@ -321,8 +300,12 @@ class User_LDAPTest extends TestCase { $this->userManager->expects($this->atLeastOnce()) ->method('get') ->willReturn($offlineUser); + $this->userManager->expects($this->once()) + ->method('exists') + ->with($uid) + ->willReturn(true); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->deleteUser($uid); $this->assertTrue($result); @@ -330,7 +313,7 @@ class User_LDAPTest extends TestCase { $this->assertSame($backend->getHome($uid), $home); } - public function testDeleteUserWithPlugin() { + public function testDeleteUserWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('canDeleteUser') ->willReturn(true); @@ -339,10 +322,10 @@ class User_LDAPTest extends TestCase { ->with('uid') ->willReturn(true); - $this->config->expects($this->once()) - ->method('getUserValue') - ->with('uid', 'user_ldap', 'isDeleted', 0) - ->willReturn(1); + $this->deletedUsersIndex->expects($this->once()) + ->method('isUserMarked') + ->with('uid') + ->willReturn(true); $mapper = $this->createMock(UserMapping::class); $mapper->expects($this->once()) @@ -357,7 +340,7 @@ class User_LDAPTest extends TestCase { ->method('invalidate') ->with('uid'); - $this->assertEquals(true, $this->backend->deleteUser('uid')); + $this->assertTrue($this->backend->deleteUser('uid')); } /** @@ -365,42 +348,42 @@ class User_LDAPTest extends TestCase { */ private function prepareAccessForGetUsers() { $this->access->expects($this->once()) - ->method('escapeFilterPart') - ->willReturnCallback(function ($search) { - return $search; - }); + ->method('escapeFilterPart') + ->willReturnCallback(function ($search) { + return $search; + }); $this->access->expects($this->any()) - ->method('getFilterPartForUserSearch') - ->willReturnCallback(function ($search) { - return $search; - }); + ->method('getFilterPartForUserSearch') + ->willReturnCallback(function ($search) { + return $search; + }); $this->access->expects($this->any()) - ->method('combineFilterWithAnd') - ->willReturnCallback(function ($param) { - return $param[2]; - }); + ->method('combineFilterWithAnd') + ->willReturnCallback(function ($param) { + return $param[2]; + }); $this->access->expects($this->any()) - ->method('fetchListOfUsers') - ->willReturnCallback(function ($search, $a, $l, $o) { - $users = ['gunslinger', 'newyorker', 'ladyofshadows']; - if (empty($search)) { - $result = $users; - } else { - $result = []; - foreach ($users as $user) { - if (stripos($user, $search) !== false) { - $result[] = $user; - } - } - } - if (!is_null($l) || !is_null($o)) { - $result = array_slice($result, $o, $l); - } - return $result; - }); + ->method('fetchListOfUsers') + ->willReturnCallback(function ($search, $a, $l, $o) { + $users = ['gunslinger', 'newyorker', 'ladyofshadows']; + if (empty($search)) { + $result = $users; + } else { + $result = []; + foreach ($users as $user) { + if (stripos($user, $search) !== false) { + $result[] = $user; + } + } + } + if (!is_null($l) || !is_null($o)) { + $result = array_slice($result, $o, $l); + } + return $result; + }); $this->access->expects($this->any()) - ->method('nextcloudUserNames') - ->willReturnArgument(0); + ->method('nextcloudUserNames') + ->willReturnArgument(0); $this->access->method('fetchUsersByLoginName') ->willReturn([]); @@ -409,108 +392,109 @@ class User_LDAPTest extends TestCase { ->willReturn(['dn', 'uid', 'mail', 'displayname']); } - public function testGetUsersNoParam() { + public function testGetUsersNoParam(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->getUsers(); - $this->assertEquals(3, count($result)); + $this->assertCount(3, $result); } - public function testGetUsersLimitOffset() { + public function testGetUsersLimitOffset(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->getUsers('', 1, 2); - $this->assertEquals(1, count($result)); + $this->assertCount(1, $result); } - public function testGetUsersLimitOffset2() { + public function testGetUsersLimitOffset2(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->getUsers('', 2, 1); - $this->assertEquals(2, count($result)); + $this->assertCount(2, $result); } - public function testGetUsersSearchWithResult() { + public function testGetUsersSearchWithResult(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->getUsers('yo'); - $this->assertEquals(2, count($result)); + $this->assertCount(2, $result); } - public function testGetUsersSearchEmptyResult() { + public function testGetUsersSearchEmptyResult(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->getUsers('nix'); - $this->assertEquals(0, count($result)); + $this->assertCount(0, $result); } private function getUsers($search = '', $limit = null, $offset = null) { - $users = \OC::$server->getUserManager()->search($search, $limit, $offset); + $users = Server::get(IUserManager::class)->search($search, $limit, $offset); $uids = array_map(function (IUser $user) { return $user->getUID(); }, $users); return $uids; } - public function testGetUsersViaAPINoParam() { + public function testGetUsersViaAPINoParam(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $this->getUsers(); - $this->assertEquals(3, count($result)); + $this->assertCount(3, $result); } - public function testGetUsersViaAPILimitOffset() { + public function testGetUsersViaAPILimitOffset(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $this->getUsers('', 1, 2); - $this->assertEquals(1, count($result)); + $this->assertCount(1, $result); } - public function testGetUsersViaAPILimitOffset2() { + public function testGetUsersViaAPILimitOffset2(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $this->getUsers('', 2, 1); - $this->assertEquals(2, count($result)); + $this->assertCount(2, $result); } - public function testGetUsersViaAPISearchWithResult() { + public function testGetUsersViaAPISearchWithResult(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $this->getUsers('yo'); - $this->assertEquals(2, count($result)); + $this->assertCount(2, $result); } - public function testGetUsersViaAPISearchEmptyResult() { + public function testGetUsersViaAPISearchEmptyResult(): void { $this->prepareAccessForGetUsers(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $result = $this->getUsers('nix'); - $this->assertEquals(0, count($result)); + $this->assertCount(0, $result); } - public function testUserExists() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testUserExists(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); - $user = $this->createMock(User::class); - - $this->userManager->expects($this->atLeastOnce()) - ->method('get') - ->willReturn($user); + $this->userManager->expects($this->never()) + ->method('get'); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('gunslinger') + ->willReturn(true); $this->access->expects($this->any()) ->method('getUserMapper') ->willReturn($this->createMock(UserMapping::class)); @@ -521,8 +505,8 @@ class User_LDAPTest extends TestCase { $this->assertTrue($result); } - public function testUserExistsForDeleted() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testUserExistsForDeleted(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $mapper = $this->createMock(UserMapping::class); @@ -535,18 +519,19 @@ class User_LDAPTest extends TestCase { ->method('getUserMapper') ->willReturn($mapper); - $user = $this->createMock(User::class); - - $this->userManager->expects($this->atLeastOnce()) - ->method('get') - ->willReturn($user); + $this->userManager->expects($this->never()) + ->method('get'); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('formerUser') + ->willReturn(true); //test for deleted user – always returns true as long as we have the user in DB $this->assertTrue($backend->userExists('formerUser')); } - public function testUserExistsForNeverExisting() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testUserExistsForNeverExisting(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->access->expects($this->any()) @@ -564,10 +549,10 @@ class User_LDAPTest extends TestCase { $this->assertFalse($result); } - public function testUserExistsPublicAPI() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testUserExistsPublicAPI(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); - \OC_User::useBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); $user = $this->createMock(User::class); $user->expects($this->any()) @@ -582,28 +567,31 @@ class User_LDAPTest extends TestCase { } return false; }); - $this->userManager->expects($this->atLeastOnce()) - ->method('get') - ->willReturn($user); + $this->userManager->expects($this->never()) + ->method('get'); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('gunslinger') + ->willReturn(true); $this->access->expects($this->any()) ->method('getUserMapper') ->willReturn($this->createMock(UserMapping::class)); //test for existing user - $result = \OC::$server->getUserManager()->userExists('gunslinger'); + $result = Server::get(IUserManager::class)->userExists('gunslinger'); $this->assertTrue($result); } - public function testDeleteUserExisting() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testDeleteUserExisting(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); //we do not support deleting existing users at all $result = $backend->deleteUser('gunslinger'); $this->assertFalse($result); } - public function testGetHomeAbsolutePath() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testGetHomeAbsolutePath(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->connection->expects($this->any()) @@ -643,7 +631,12 @@ class User_LDAPTest extends TestCase { $this->userManager->expects($this->atLeastOnce()) ->method('get') + ->with('gunslinger') ->willReturn($user); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('gunslinger') + ->willReturn(true); //absolute path /** @noinspection PhpUnhandledExceptionInspection */ @@ -651,12 +644,12 @@ class User_LDAPTest extends TestCase { $this->assertEquals('/tmp/rolandshome/', $result); } - public function testGetHomeRelative() { - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + public function testGetHomeRelative(): void { + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); - $dataDir = \OC::$server->getConfig()->getSystemValue( - 'datadirectory', \OC::$SERVERROOT.'/data'); + $dataDir = Server::get(IConfig::class)->getSystemValue( + 'datadirectory', \OC::$SERVERROOT . '/data'); $this->connection->expects($this->any()) ->method('__get') @@ -691,22 +684,26 @@ class User_LDAPTest extends TestCase { ->willReturn('dnOfLadyOfShadows,dc=test'); $user->expects($this->any()) ->method('getHomePath') - ->willReturn($dataDir.'/susannah/'); + ->willReturn($dataDir . '/susannah/'); $this->userManager->expects($this->atLeastOnce()) ->method('get') ->willReturn($user); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('ladyofshadows') + ->willReturn(true); /** @noinspection PhpUnhandledExceptionInspection */ $result = $backend->getHome('ladyofshadows'); - $this->assertEquals($dataDir.'/susannah/', $result); + $this->assertEquals($dataDir . '/susannah/', $result); } - public function testGetHomeNoPath() { + public function testGetHomeNoPath(): void { $this->expectException(\Exception::class); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->connection->expects($this->any()) @@ -725,14 +722,6 @@ class User_LDAPTest extends TestCase { return false; } }); - $this->access->connection->expects($this->any()) - ->method('getFromCache') - ->willReturnCallback(function ($key) { - if ($key === 'userExistsnewyorker') { - return true; - } - return null; - }); $user = $this->createMock(User::class); $user->expects($this->any()) @@ -744,41 +733,42 @@ class User_LDAPTest extends TestCase { $this->userManager->expects($this->atLeastOnce()) ->method('get') + ->with('newyorker') ->willReturn($user); + $this->userManager->expects($this->once()) + ->method('exists') + ->with('newyorker') + ->willReturn(true); //no path at all – triggers OC default behaviour $result = $backend->getHome('newyorker'); $this->assertFalse($result); } - public function testGetHomeDeletedUser() { + public function testGetHomeDeletedUser(): void { $uid = 'newyorker'; - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->connection->expects($this->any()) - ->method('__get') - ->willReturnCallback(function ($name) { - if ($name === 'homeFolderNamingRule') { - return 'attr:testAttribute'; - } - return null; - }); + ->method('__get') + ->willReturnCallback(function ($name) { + if ($name === 'homeFolderNamingRule') { + return 'attr:testAttribute'; + } + return null; + }); $this->access->expects($this->any()) - ->method('readAttribute') - ->willReturn([]); + ->method('readAttribute') + ->willReturn([]); $userMapper = $this->createMock(UserMapping::class); $this->access->expects($this->any()) - ->method('getUserMapper') - ->willReturn($userMapper); - - $this->config->expects($this->any()) - ->method('getUserValue') - ->willReturn(true); + ->method('getUserMapper') + ->willReturn($userMapper); $offlineUser = $this->createMock(OfflineUser::class); $offlineUser->expects($this->atLeastOnce()) @@ -787,13 +777,18 @@ class User_LDAPTest extends TestCase { $this->userManager->expects($this->atLeastOnce()) ->method('get') + ->with($uid) ->willReturn($offlineUser); + $this->userManager->expects($this->once()) + ->method('exists') + ->with($uid) + ->willReturn(true); $result = $backend->getHome($uid); $this->assertFalse($result); } - public function testGetHomeWithPlugin() { + public function testGetHomeWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::GET_HOME) @@ -810,7 +805,7 @@ class User_LDAPTest extends TestCase { }); /** @noinspection PhpUnhandledExceptionInspection */ - $this->assertEquals($this->backend->getHome('uid'),'result'); + $this->assertEquals($this->backend->getHome('uid'), 'result'); } private function prepareAccessForGetDisplayName() { @@ -826,27 +821,27 @@ class User_LDAPTest extends TestCase { }); $this->access->expects($this->any()) - ->method('readAttribute') - ->willReturnCallback(function ($dn, $attr) { - switch ($dn) { - case 'dnOfRoland,dc=test': - if ($attr === 'displayname') { - return ['Roland Deschain']; - } - return []; - break; - - default: - return false; - } - }); + ->method('readAttribute') + ->willReturnCallback(function ($dn, $attr) { + switch ($dn) { + case 'dnOfRoland,dc=test': + if ($attr === 'displayname') { + return ['Roland Deschain']; + } + return []; + break; + + default: + return false; + } + }); $this->access->method('fetchUsersByLoginName') ->willReturn([]); } - public function testGetDisplayName() { + public function testGetDisplayName(): void { $this->prepareAccessForGetDisplayName(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->connection->expects($this->any()) @@ -887,6 +882,16 @@ class User_LDAPTest extends TestCase { } return null; }); + $this->userManager->expects($this->any()) + ->method('exists') + ->willReturnCallback(function ($uid) use ($user1, $user2) { + if ($uid === 'gunslinger') { + return true; + } elseif ($uid === 'newyorker') { + return true; + } + return false; + }); $this->access->expects($this->any()) ->method('getUserMapper') ->willReturn($mapper); @@ -905,7 +910,7 @@ class User_LDAPTest extends TestCase { $this->assertEquals(null, $result); } - public function testGetDisplayNamePublicAPI() { + public function testGetDisplayNamePublicAPI(): void { $this->access->expects($this->any()) ->method('username2dn') ->willReturnCallback(function ($uid) { @@ -927,7 +932,7 @@ class User_LDAPTest extends TestCase { } }); $this->prepareAccessForGetDisplayName(); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->prepareMockForUserExists(); $this->connection->expects($this->any()) @@ -936,7 +941,7 @@ class User_LDAPTest extends TestCase { return true; }); - \OC_User::useBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); $user1 = $this->createMock(User::class); $user1->expects($this->once()) @@ -970,6 +975,16 @@ class User_LDAPTest extends TestCase { } return null; }); + $this->userManager->expects($this->any()) + ->method('exists') + ->willReturnCallback(function ($uid) use ($user1, $user2) { + if ($uid === 'gunslinger') { + return true; + } elseif ($uid === 'newyorker') { + return true; + } + return false; + }); $this->access->expects($this->any()) ->method('getUserMapper') ->willReturn($mapper); @@ -980,15 +995,15 @@ class User_LDAPTest extends TestCase { }); //with displayName - $result = \OC::$server->getUserManager()->get('gunslinger')->getDisplayName(); + $result = Server::get(IUserManager::class)->get('gunslinger')?->getDisplayName(); $this->assertEquals('Roland Deschain', $result); //empty displayname retrieved - $result = \OC::$server->getUserManager()->get('newyorker') === null ? 'newyorker' : \OC::$server->getUserManager()->get('newyorker')->getDisplayName(); + $result = Server::get(IUserManager::class)->get('newyorker') === null ? 'newyorker' : Server::get(IUserManager::class)->get('newyorker')->getDisplayName(); $this->assertEquals('newyorker', $result); } - public function testGetDisplayNameWithPlugin() { + public function testGetDisplayNameWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::GET_DISPLAYNAME) @@ -998,35 +1013,35 @@ class User_LDAPTest extends TestCase { ->with('uid') ->willReturn('result'); - $this->assertEquals($this->backend->getDisplayName('uid'),'result'); + $this->assertEquals($this->backend->getDisplayName('uid'), 'result'); } //no test for getDisplayNames, because it just invokes getUsers and //getDisplayName - public function testCountUsers() { + public function testCountUsers(): void { $this->access->expects($this->once()) - ->method('countUsers') - ->willReturn(5); + ->method('countUsers') + ->willReturn(5); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->countUsers(); $this->assertEquals(5, $result); } - public function testCountUsersFailing() { + public function testCountUsersFailing(): void { $this->access->expects($this->once()) - ->method('countUsers') - ->willReturn(false); + ->method('countUsers') + ->willReturn(false); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $result = $backend->countUsers(); $this->assertFalse($result); } - public function testCountUsersWithPlugin() { + public function testCountUsersWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::COUNT_USERS) @@ -1035,10 +1050,10 @@ class User_LDAPTest extends TestCase { ->method('countUsers') ->willReturn(42); - $this->assertEquals($this->backend->countUsers(),42); + $this->assertEquals($this->backend->countUsers(), 42); } - public function testLoginName2UserNameSuccess() { + public function testLoginName2UserNameSuccess(): void { $loginName = 'Alice'; $username = 'alice'; $dn = 'uid=alice,dc=what,dc=ever'; @@ -1058,13 +1073,13 @@ class User_LDAPTest extends TestCase { $this->connection->expects($this->exactly(2)) ->method('getFromCache') - ->with($this->equalTo('loginName2UserName-'.$loginName)) + ->with($this->equalTo('loginName2UserName-' . $loginName)) ->willReturnOnConsecutiveCalls(null, $username); $this->connection->expects($this->once()) ->method('writeToCache') - ->with($this->equalTo('loginName2UserName-'.$loginName), $this->equalTo($username)); + ->with($this->equalTo('loginName2UserName-' . $loginName), $this->equalTo($username)); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $user = $this->createMock(User::class); $user->expects($this->any()) ->method('getUsername') @@ -1074,6 +1089,8 @@ class User_LDAPTest extends TestCase { ->method('get') ->with($dn) ->willReturn($user); + $this->userManager->expects($this->never()) + ->method('exists'); $this->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['dn', 'uid', 'mail', 'displayname']); @@ -1085,7 +1102,7 @@ class User_LDAPTest extends TestCase { $backend->loginName2UserName($loginName); } - public function testLoginName2UserNameNoUsersOnLDAP() { + public function testLoginName2UserNameNoUsersOnLDAP(): void { $loginName = 'Loki'; $this->access->expects($this->once()) @@ -1099,17 +1116,17 @@ class User_LDAPTest extends TestCase { $this->connection->expects($this->exactly(2)) ->method('getFromCache') - ->with($this->equalTo('loginName2UserName-'.$loginName)) + ->with($this->equalTo('loginName2UserName-' . $loginName)) ->willReturnOnConsecutiveCalls(null, false); $this->connection->expects($this->once()) ->method('writeToCache') - ->with($this->equalTo('loginName2UserName-'.$loginName), false); + ->with($this->equalTo('loginName2UserName-' . $loginName), false); $this->userManager->expects($this->any()) ->method('getAttributes') ->willReturn(['dn', 'uid', 'mail', 'displayname']); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $name = $backend->loginName2UserName($loginName); $this->assertSame(false, $name); @@ -1117,7 +1134,7 @@ class User_LDAPTest extends TestCase { $backend->loginName2UserName($loginName); } - public function testLoginName2UserNameOfflineUser() { + public function testLoginName2UserNameOfflineUser(): void { $loginName = 'Alice'; $dn = 'uid=alice,dc=what,dc=ever'; @@ -1132,11 +1149,11 @@ class User_LDAPTest extends TestCase { $this->connection->expects($this->exactly(2)) ->method('getFromCache') - ->with($this->equalTo('loginName2UserName-'.$loginName)) + ->with($this->equalTo('loginName2UserName-' . $loginName)) ->willReturnOnConsecutiveCalls(null, false); $this->connection->expects($this->once()) ->method('writeToCache') - ->with($this->equalTo('loginName2UserName-'.$loginName), $this->equalTo(false)); + ->with($this->equalTo('loginName2UserName-' . $loginName), $this->equalTo(false)); $this->userManager->expects($this->any()) ->method('get') @@ -1146,7 +1163,7 @@ class User_LDAPTest extends TestCase { ->method('getAttributes') ->willReturn(['dn', 'uid', 'mail', 'displayname']); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $name = $backend->loginName2UserName($loginName); $this->assertSame(false, $name); @@ -1156,38 +1173,36 @@ class User_LDAPTest extends TestCase { /** * Prepares the Access mock for setPassword tests - * - * @param bool $enablePasswordChange */ private function prepareAccessForSetPassword($enablePasswordChange = true) { $this->connection->expects($this->any()) - ->method('__get') - ->willReturnCallback(function ($name) use (&$enablePasswordChange) { - if ($name === 'ldapLoginFilter') { - return '%uid'; - } - if ($name === 'turnOnPasswordChange') { - return $enablePasswordChange?1:0; - } - return null; - }); + ->method('__get') + ->willReturnCallback(function ($name) use (&$enablePasswordChange) { + if ($name === 'ldapLoginFilter') { + return '%uid'; + } + if ($name === 'turnOnPasswordChange') { + return $enablePasswordChange?1:0; + } + return null; + }); $this->connection->expects($this->any()) - ->method('getFromCache') - ->willReturnCallback(function ($uid) { - if ($uid === 'userExists'.'roland') { - return true; - } - return null; - }); + ->method('getFromCache') + ->willReturnCallback(function ($uid) { + if ($uid === 'userExists' . 'roland') { + return true; + } + return null; + }); $this->access->expects($this->any()) - ->method('fetchListOfUsers') - ->willReturnCallback(function ($filter) { - if ($filter === 'roland') { - return [['dn' => ['dnOfRoland,dc=test']]]; - } - return []; - }); + ->method('fetchListOfUsers') + ->willReturnCallback(function ($filter) { + if ($filter === 'roland') { + return [['dn' => ['dnOfRoland,dc=test']]]; + } + return []; + }); $this->access->expects($this->any()) ->method('fetchUsersByLoginName') ->willReturnCallback(function ($uid) { @@ -1197,69 +1212,69 @@ class User_LDAPTest extends TestCase { return []; }); $this->access->expects($this->any()) - ->method('dn2username') - ->with($this->equalTo('dnOfRoland,dc=test')) - ->willReturn('roland'); + ->method('dn2username') + ->with($this->equalTo('dnOfRoland,dc=test')) + ->willReturn('roland'); $this->access->expects($this->any()) - ->method('stringResemblesDN') - ->with($this->equalTo('dnOfRoland,dc=test')) - ->willReturn(true); + ->method('stringResemblesDN') + ->with($this->equalTo('dnOfRoland,dc=test')) + ->willReturn(true); $this->access->expects($this->any()) - ->method('setPassword') - ->willReturnCallback(function ($uid, $password) { - if (strlen($password) <= 5) { - throw new HintException('Password fails quality checking policy', '', 19); - } - return true; - }); + ->method('setPassword') + ->willReturnCallback(function ($uid, $password) { + if (strlen($password) <= 5) { + throw new HintException('Password fails quality checking policy', '', 19); + } + return true; + }); } - public function testSetPasswordInvalid() { - $this->expectException(\OCP\HintException::class); + public function testSetPasswordInvalid(): void { + $this->expectException(HintException::class); $this->expectExceptionMessage('Password fails quality checking policy'); $this->prepareAccessForSetPassword($this->access); $this->userManager->expects($this->atLeastOnce()) ->method('get') ->willReturn($this->createMock(User::class)); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $this->assertTrue(\OC_User::setPassword('roland', 'dt')); } - public function testSetPasswordValid() { + public function testSetPasswordValid(): void { $this->prepareAccessForSetPassword($this->access); $this->userManager->expects($this->any()) ->method('get') ->willReturn($this->createMock(User::class)); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); $this->userManager->expects($this->any()) ->method('get') ->willReturn($this->createMock(User::class)); - \OC_User::useBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); $this->assertTrue(\OC_User::setPassword('roland', 'dt12234$')); } - public function testSetPasswordValidDisabled() { + public function testSetPasswordValidDisabled(): void { $this->userManager->expects($this->any()) ->method('get') ->willReturn($this->createMock(User::class)); $this->prepareAccessForSetPassword(false); - $backend = new UserLDAP($this->access, $this->config, $this->notificationManager, $this->session, $this->pluginManager); - \OC_User::useBackend($backend); + $backend = new UserLDAP($this->access, $this->notificationManager, $this->pluginManager, $this->logger, $this->deletedUsersIndex); + Server::get(IUserManager::class)->registerBackend($backend); $this->assertFalse(\OC_User::setPassword('roland', 'dt12234$')); } - public function testSetPasswordWithInvalidUser() { + public function testSetPasswordWithInvalidUser(): void { $this->expectException(\Exception::class); $this->expectExceptionMessage('LDAP setPassword: Could not get user object for uid NotExistingUser. Maybe the LDAP entry has no set display name attribute?'); @@ -1272,7 +1287,7 @@ class User_LDAPTest extends TestCase { $this->backend->setPassword('NotExistingUser', 'Password'); } - public function testSetPasswordWithUsernameFalse() { + public function testSetPasswordWithUsernameFalse(): void { $user = $this->createMock(User::class); $user ->expects($this->once()) @@ -1288,21 +1303,21 @@ class User_LDAPTest extends TestCase { $this->assertFalse($this->backend->setPassword('NotExistingUser', 'Password')); } - public function testSetPasswordWithPlugin() { + public function testSetPasswordWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::SET_PASSWORD) ->willReturn(true); $this->pluginManager->expects($this->once()) ->method('setPassword') - ->with('uid','password') + ->with('uid', 'password') ->willReturn('result'); /** @noinspection PhpUnhandledExceptionInspection */ - $this->assertEquals($this->backend->setPassword('uid', 'password'),'result'); + $this->assertEquals($this->backend->setPassword('uid', 'password'), 'result'); } - public function avatarDataProvider() { + public static function avatarDataProvider(): array { return [ [ 'validImageData', false ], [ 'corruptImageData', true ], @@ -1310,9 +1325,9 @@ class User_LDAPTest extends TestCase { ]; } - /** @dataProvider avatarDataProvider */ - public function testCanChangeAvatar($imageData, $expected) { - $isValidImage = strpos((string)$imageData, 'valid') === 0; + #[\PHPUnit\Framework\Attributes\DataProvider('avatarDataProvider')] + public function testCanChangeAvatar(string|bool $imageData, bool $expected): void { + $isValidImage = str_starts_with((string)$imageData, 'valid'); $user = $this->createMock(User::class); $user->expects($this->once()) @@ -1330,7 +1345,7 @@ class User_LDAPTest extends TestCase { $this->assertSame($expected, $this->backend->canChangeAvatar('uid')); } - public function testCanChangeAvatarWithPlugin() { + public function testCanChangeAvatarWithPlugin(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::PROVIDE_AVATAR) @@ -1340,10 +1355,10 @@ class User_LDAPTest extends TestCase { ->with('uid') ->willReturn('result'); - $this->assertEquals($this->backend->canChangeAvatar('uid'),'result'); + $this->assertEquals($this->backend->canChangeAvatar('uid'), 'result'); } - public function testSetDisplayNameWithPlugin() { + public function testSetDisplayNameWithPlugin(): void { $newDisplayName = 'J. Baker'; $this->pluginManager->expects($this->once()) ->method('implementsActions') @@ -1360,8 +1375,8 @@ class User_LDAPTest extends TestCase { } - public function testSetDisplayNameErrorWithPlugin() { - $this->expectException(\OCP\HintException::class); + public function testSetDisplayNameErrorWithPlugin(): void { + $this->expectException(HintException::class); $newDisplayName = 'J. Baker'; $this->pluginManager->expects($this->once()) @@ -1378,7 +1393,7 @@ class User_LDAPTest extends TestCase { $this->backend->setDisplayName('uid', $newDisplayName); } - public function testSetDisplayNameFailing() { + public function testSetDisplayNameFailing(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::SET_DISPLAYNAME) @@ -1389,7 +1404,7 @@ class User_LDAPTest extends TestCase { $this->assertFalse($this->backend->setDisplayName('uid', 'displayName')); } - public function testCreateUserWithPlugin() { + public function testCreateUserWithPlugin(): void { $uid = 'alien6372'; $uuid = '123-2345-36756-123-2345234-4431'; $pwd = 'passwørd'; @@ -1413,10 +1428,10 @@ class User_LDAPTest extends TestCase { ->method('getUserMapper') ->willReturn($this->createMock(UserMapping::class)); - $this->assertEquals($this->backend->createUser($uid, $pwd),true); + $this->assertEquals($this->backend->createUser($uid, $pwd), true); } - public function testCreateUserFailing() { + public function testCreateUserFailing(): void { $this->pluginManager->expects($this->once()) ->method('implementsActions') ->with(Backend::CREATE_USER) @@ -1425,9 +1440,9 @@ class User_LDAPTest extends TestCase { $this->assertFalse($this->backend->createUser('uid', 'password')); } - public function actionProvider() { + public static function actionProvider(): array { return [ - [ 'ldapUserAvatarRule', 'default', Backend::PROVIDE_AVATAR, true] , + [ 'ldapUserAvatarRule', 'default', Backend::PROVIDE_AVATAR, true], [ 'ldapUserAvatarRule', 'data:selfiePhoto', Backend::PROVIDE_AVATAR, true], [ 'ldapUserAvatarRule', 'none', Backend::PROVIDE_AVATAR, false], [ 'turnOnPasswordChange', 0, Backend::SET_PASSWORD, false], @@ -1435,10 +1450,8 @@ class User_LDAPTest extends TestCase { ]; } - /** - * @dataProvider actionProvider - */ - public function testImplementsAction($configurable, $value, $actionCode, $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('actionProvider')] + public function testImplementsAction(string $configurable, string|int $value, int $actionCode, bool $expected): void { $this->pluginManager->expects($this->once()) ->method('getImplementedActions') ->willReturn(0); diff --git a/apps/user_ldap/tests/User_ProxyTest.php b/apps/user_ldap/tests/User_ProxyTest.php index ed95344f115..38f94af33a7 100644 --- a/apps/user_ldap/tests/User_ProxyTest.php +++ b/apps/user_ldap/tests/User_ProxyTest.php @@ -1,81 +1,58 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Roger Szabo <roger.szabo@web.de> - * @author Vinicius Cubas Brand <vinicius@eita.org.br> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\User_LDAP\Tests; +use OCA\User_LDAP\AccessFactory; use OCA\User_LDAP\Helper; use OCA\User_LDAP\ILDAPWrapper; +use OCA\User_LDAP\User\DeletedUsersIndex; use OCA\User_LDAP\User_Proxy; use OCA\User_LDAP\UserPluginManager; -use OCP\IConfig; -use OCP\IUserSession; use OCP\Notification\IManager as INotificationManager; +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class User_ProxyTest extends TestCase { - /** @var Helper|\PHPUnit\Framework\MockObject\MockObject */ - protected $helper; - /** @var ILDAPWrapper|\PHPUnit\Framework\MockObject\MockObject */ - private $ldapWrapper; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ - private $config; - /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */ - private $notificationManager; - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - /** @var User_Proxy|\PHPUnit\Framework\MockObject\MockObject */ - private $proxy; - /** @var UserPluginManager|\PHPUnit\Framework\MockObject\MockObject */ - private $userPluginManager; + protected Helper&MockObject $helper; + private ILDAPWrapper&MockObject $ldapWrapper; + private AccessFactory&MockObject $accessFactory; + private INotificationManager&MockObject $notificationManager; + private User_Proxy&MockObject $proxy; + private UserPluginManager&MockObject $userPluginManager; + protected LoggerInterface&MockObject $logger; + protected DeletedUsersIndex&MockObject $deletedUsersIndex; protected function setUp(): void { parent::setUp(); $this->helper = $this->createMock(Helper::class); $this->ldapWrapper = $this->createMock(ILDAPWrapper::class); - $this->config = $this->createMock(IConfig::class); + $this->accessFactory = $this->createMock(AccessFactory::class); $this->notificationManager = $this->createMock(INotificationManager::class); - $this->userSession = $this->createMock(IUserSession::class); $this->userPluginManager = $this->createMock(UserPluginManager::class); + $this->logger = $this->createMock(LoggerInterface::class); + $this->deletedUsersIndex = $this->createMock(DeletedUsersIndex::class); $this->proxy = $this->getMockBuilder(User_Proxy::class) ->setConstructorArgs([ $this->helper, $this->ldapWrapper, - $this->config, + $this->accessFactory, $this->notificationManager, - $this->userSession, - $this->userPluginManager + $this->userPluginManager, + $this->logger, + $this->deletedUsersIndex, ]) - ->setMethods(['handleRequest']) + ->onlyMethods(['handleRequest']) ->getMock(); } - public function testSetPassword() { + public function testSetPassword(): void { $this->proxy ->expects($this->once()) ->method('handleRequest') @@ -85,7 +62,7 @@ class User_ProxyTest extends TestCase { $this->assertTrue($this->proxy->setPassword('MyUid', 'MyPassword')); } - public function testSetDisplayName() { + public function testSetDisplayName(): void { $this->proxy ->expects($this->once()) ->method('handleRequest') @@ -95,7 +72,7 @@ class User_ProxyTest extends TestCase { $this->assertTrue($this->proxy->setDisplayName('MyUid', 'MyPassword')); } - public function testCreateUser() { + public function testCreateUser(): void { $this->proxy ->expects($this->once()) ->method('handleRequest') diff --git a/apps/user_ldap/tests/WizardTest.php b/apps/user_ldap/tests/WizardTest.php index 5382a0c7f6f..3ae9a409e88 100644 --- a/apps/user_ldap/tests/WizardTest.php +++ b/apps/user_ldap/tests/WizardTest.php @@ -1,30 +1,10 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * @author Viktor Szépe <viktor@szepe.net> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\User_LDAP\Tests; @@ -56,36 +36,32 @@ class WizardTest extends TestCase { } } - private function getWizardAndMocks() { + private function getWizardAndMocks(): array { static $confMethods; - static $connMethods; - static $accMethods; if (is_null($confMethods)) { $confMethods = get_class_methods('\OCA\User_LDAP\Configuration'); - $connMethods = get_class_methods('\OCA\User_LDAP\Connection'); - $accMethods = get_class_methods('\OCA\User_LDAP\Access'); } - /** @var ILDAPWrapper|\PHPUnit\Framework\MockObject\MockObject $lw */ + /** @var ILDAPWrapper&MockObject $lw */ $lw = $this->createMock(ILDAPWrapper::class); - /** @var Configuration|\PHPUnit\Framework\MockObject\MockObject $conf */ + /** @var Configuration&MockObject $conf */ $conf = $this->getMockBuilder(Configuration::class) - ->setMethods($confMethods) + ->onlyMethods($confMethods) ->setConstructorArgs(['', true]) ->getMock(); - /** @var Access|\PHPUnit\Framework\MockObject\MockObject $access */ + /** @var Access&MockObject $access */ $access = $this->createMock(Access::class); return [new Wizard($conf, $lw, $access), $conf, $lw, $access]; } - private function prepareLdapWrapperForConnections(MockObject &$ldap) { + private function prepareLdapWrapperForConnections(MockObject $ldap) { $ldap->expects($this->once()) ->method('connect') - //dummy value, usually invalid - ->willReturn(true); + //dummy value + ->willReturn(ldap_connect('ldap://example.com')); $ldap->expects($this->exactly(3)) ->method('setOption') @@ -96,7 +72,7 @@ class WizardTest extends TestCase { ->willReturn(true); } - public function testCumulativeSearchOnAttributeLimited() { + public function testCumulativeSearchOnAttributeLimited(): void { [$wizard, $configuration, $ldap] = $this->getWizardAndMocks(); $configuration->expects($this->any()) @@ -156,7 +132,7 @@ class WizardTest extends TestCase { unset($uidnumber); } - public function testCumulativeSearchOnAttributeUnlimited() { + public function testCumulativeSearchOnAttributeUnlimited(): void { [$wizard, $configuration, $ldap] = $this->getWizardAndMocks(); $configuration->expects($this->any()) @@ -173,7 +149,7 @@ class WizardTest extends TestCase { $ldap->expects($this->any()) ->method('isResource') ->willReturnCallback(function ($r) { - if ($r === true) { + if ($r instanceof \LDAP\Connection) { return true; } if ($r % 24 === 0) { @@ -232,7 +208,7 @@ class WizardTest extends TestCase { unset($uidnumber); } - public function testDetectEmailAttributeAlreadySet() { + public function testDetectEmailAttributeAlreadySet(): void { [$wizard, $configuration, $ldap, $access] = $this->getWizardAndMocks(); @@ -254,7 +230,7 @@ class WizardTest extends TestCase { $wizard->detectEmailAttribute(); } - public function testDetectEmailAttributeOverrideSet() { + public function testDetectEmailAttributeOverrideSet(): void { [$wizard, $configuration, $ldap, $access] = $this->getWizardAndMocks(); @@ -293,7 +269,7 @@ class WizardTest extends TestCase { $result['changes']['ldap_email_attr']); } - public function testDetectEmailAttributeFind() { + public function testDetectEmailAttributeFind(): void { [$wizard, $configuration, $ldap, $access] = $this->getWizardAndMocks(); @@ -332,7 +308,7 @@ class WizardTest extends TestCase { $result['changes']['ldap_email_attr']); } - public function testDetectEmailAttributeFindNothing() { + public function testDetectEmailAttributeFindNothing(): void { [$wizard, $configuration, $ldap, $access] = $this->getWizardAndMocks(); @@ -367,10 +343,10 @@ class WizardTest extends TestCase { }); $result = $wizard->detectEmailAttribute(); - $this->assertSame(false, $result->hasChanges()); + $this->assertFalse($result->hasChanges()); } - public function testCumulativeSearchOnAttributeSkipReadDN() { + public function testCumulativeSearchOnAttributeSkipReadDN(): void { // tests that there is no infinite loop, when skipping already processed // DNs (they can be returned multiple times for multiple filters ) [$wizard, $configuration, $ldap] = $this->getWizardAndMocks(); @@ -444,7 +420,7 @@ class WizardTest extends TestCase { // The following expectations are the real test $filters = ['f1', 'f2', '*']; $resultArray = $wizard->cumulativeSearchOnAttribute($filters, 'cn', 0); - $this->assertSame(6, count($resultArray)); + $this->assertCount(6, $resultArray); unset($mark); } } |