diff options
527 files changed, 8362 insertions, 2579 deletions
diff --git a/.gitignore b/.gitignore index 3fb848dbb44..7d42be773b1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,8 @@ !/apps/files_versions !/apps/user_ldap !/apps/user_webdavauth -!apps/provisioning_api +!/apps/provisioning_api +!/apps/systemtags /apps/files_external/3rdparty/irodsphp/PHPUnitTest /apps/files_external/3rdparty/irodsphp/web /apps/files_external/3rdparty/irodsphp/prods/test diff --git a/3rdparty b/3rdparty -Subproject fecb1f9715a594831111b64c0c092b863b95e45 +Subproject 177daad35de835dafacc6e84f09e6335cc229a7 diff --git a/apps/dav/appinfo/app.php b/apps/dav/appinfo/app.php index 5ba7278e88e..b5bf9bd0e73 100644 --- a/apps/dav/appinfo/app.php +++ b/apps/dav/appinfo/app.php @@ -19,21 +19,18 @@ * */ -use OCA\DAV\CardDAV\CardDavBackend; -use OCA\DAV\CardDAV\SyncService; +use OCA\Dav\AppInfo\Application; -\OC::$server->registerService('CardDAVSyncService', function() { +$app = new Application(); +$app->registerHooks(); - $app = new \OCA\Dav\AppInfo\Application(); - /** @var CardDavBackend */ - $backend = $app->getContainer()->query('CardDavBackend'); +\OC::$server->registerService('CardDAVSyncService', function() use ($app) { - return new SyncService($backend); + return $app->getSyncService(); }); $cm = \OC::$server->getContactsManager(); -$cm->register(function() use ($cm) { +$cm->register(function() use ($cm, $app) { $userId = \OC::$server->getUserSession()->getUser()->getUID(); - $app = new \OCA\Dav\AppInfo\Application(); $app->setupContactsProvider($cm, $userId); }); diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php index 71236a3325e..2a27dbeb016 100644 --- a/apps/dav/appinfo/application.php +++ b/apps/dav/appinfo/application.php @@ -20,7 +20,11 @@ */ namespace OCA\Dav\AppInfo; +use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\CardDAV\ContactsManager; +use OCA\DAV\CardDAV\SyncJob; +use OCA\DAV\CardDAV\SyncService; +use OCA\DAV\HookManager; use \OCP\AppFramework\App; use OCP\AppFramework\IAppContainer; use OCP\Contacts\IManager; @@ -43,12 +47,29 @@ class Application extends App { ); }); + $container->registerService('HookManager', function($c) { + /** @var IAppContainer $c */ + return new HookManager( + $c->getServer()->getUserManager(), + $c->query('SyncService') + ); + }); + + $container->registerService('SyncService', function($c) { + /** @var IAppContainer $c */ + return new SyncService( + $c->query('CardDavBackend'), + $c->getServer()->getUserManager() + ); + }); + $container->registerService('CardDavBackend', function($c) { /** @var IAppContainer $c */ $db = $c->getServer()->getDatabaseConnection(); $logger = $c->getServer()->getLogger(); $principal = new \OCA\DAV\Connector\Sabre\Principal( - $c->getServer()->getUserManager() + $c->getServer()->getUserManager(), + $c->getServer()->getGroupManager() ); return new \OCA\DAV\CardDAV\CardDavBackend($db, $principal, $logger); }); @@ -65,4 +86,19 @@ class Application extends App { $cm->setupContactsProvider($contactsManager, $userID); } + public function registerHooks() { + /** @var HookManager $hm */ + $hm = $this->getContainer()->query('HookManager'); + $hm->setup(); + } + + public function getSyncService() { + return $this->getContainer()->query('SyncService'); + } + + public function setupCron() { + $jl = $this->getContainer()->getServer()->getJobList(); + $jl->add(new SyncJob()); + } + } diff --git a/apps/dav/appinfo/install.php b/apps/dav/appinfo/install.php new file mode 100644 index 00000000000..aaa36052cd2 --- /dev/null +++ b/apps/dav/appinfo/install.php @@ -0,0 +1,25 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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/> + * + */ + +use OCA\Dav\AppInfo\Application; + +$app = new Application(); +$app->setupCron(); diff --git a/apps/dav/appinfo/register_command.php b/apps/dav/appinfo/register_command.php index 10f68768751..8ef1979aa08 100644 --- a/apps/dav/appinfo/register_command.php +++ b/apps/dav/appinfo/register_command.php @@ -19,6 +19,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ +use OCA\Dav\AppInfo\Application; use OCA\DAV\Command\CreateAddressBook; use OCA\DAV\Command\CreateCalendar; use OCA\DAV\Command\SyncSystemAddressBook; @@ -26,10 +27,13 @@ use OCA\DAV\Command\SyncSystemAddressBook; $config = \OC::$server->getConfig(); $dbConnection = \OC::$server->getDatabaseConnection(); $userManager = OC::$server->getUserManager(); +$groupManager = OC::$server->getGroupManager(); $config = \OC::$server->getConfig(); $logger = \OC::$server->getLogger(); +$app = new Application(); + /** @var Symfony\Component\Console\Application $application */ -$application->add(new CreateAddressBook($userManager, $dbConnection, $config, $logger)); +$application->add(new CreateAddressBook($userManager, $groupManager, $dbConnection, $logger)); $application->add(new CreateCalendar($userManager, $dbConnection)); -$application->add(new SyncSystemAddressBook($userManager, $dbConnection, $config)); +$application->add(new SyncSystemAddressBook($app->getSyncService())); diff --git a/apps/dav/appinfo/update.php b/apps/dav/appinfo/update.php new file mode 100644 index 00000000000..aaa36052cd2 --- /dev/null +++ b/apps/dav/appinfo/update.php @@ -0,0 +1,25 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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/> + * + */ + +use OCA\Dav\AppInfo\Application; + +$app = new Application(); +$app->setupCron(); diff --git a/apps/dav/command/createaddressbook.php b/apps/dav/command/createaddressbook.php index 0e396074704..201101d17f4 100644 --- a/apps/dav/command/createaddressbook.php +++ b/apps/dav/command/createaddressbook.php @@ -25,6 +25,7 @@ use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\Connector\Sabre\Principal; use OCP\IConfig; use OCP\IDBConnection; +use OCP\IGroupManager; use OCP\ILogger; use OCP\IUserManager; use Symfony\Component\Console\Command\Command; @@ -40,12 +41,12 @@ class CreateAddressBook extends Command { /** @var \OCP\IDBConnection */ protected $dbConnection; - /** @var IConfig */ - private $config; - /** @var ILogger */ private $logger; + /** @var IGroupManager $groupManager */ + private $groupManager; + /** * @param IUserManager $userManager * @param IDBConnection $dbConnection @@ -53,14 +54,14 @@ class CreateAddressBook extends Command { * @param ILogger $logger */ function __construct(IUserManager $userManager, + IGroupManager $groupManager, IDBConnection $dbConnection, - IConfig $config, ILogger $logger ) { parent::__construct(); $this->userManager = $userManager; + $this->groupManager = $groupManager; $this->dbConnection = $dbConnection; - $this->config = $config; $this->logger = $logger; } @@ -82,7 +83,8 @@ class CreateAddressBook extends Command { throw new \InvalidArgumentException("User <$user> in unknown."); } $principalBackend = new Principal( - $this->userManager + $this->userManager, + $this->groupManager ); $name = $input->getArgument('name'); diff --git a/apps/dav/command/syncsystemaddressbook.php b/apps/dav/command/syncsystemaddressbook.php index 338529c1952..50f570ec93e 100644 --- a/apps/dav/command/syncsystemaddressbook.php +++ b/apps/dav/command/syncsystemaddressbook.php @@ -20,17 +20,8 @@ */ namespace OCA\DAV\Command; -use OCA\DAV\CardDAV\CardDavBackend; -use OCA\DAV\CardDAV\Converter; -use OCA\DAV\Connector\Sabre\Principal; -use OCP\IConfig; -use OCP\IDBConnection; -use OCP\IUser; +use OCA\DAV\CardDAV\SyncService; use OCP\IUserManager; -use Sabre\CardDAV\Plugin; -use Sabre\VObject\Component\VCard; -use Sabre\VObject\Property\Text; -use Sabre\VObject\Reader; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Input\InputArgument; @@ -39,28 +30,16 @@ use Symfony\Component\Console\Output\OutputInterface; class SyncSystemAddressBook extends Command { - /** @var IUserManager */ - protected $userManager; - - /** @var \OCP\IDBConnection */ - protected $dbConnection; - - /** @var IConfig */ - protected $config; - - /** @var CardDavBackend */ - private $backend; + /** @var SyncService */ + private $syncService; /** * @param IUserManager $userManager - * @param IDBConnection $dbConnection - * @param IConfig $config + * @param SyncService $syncService */ - function __construct(IUserManager $userManager, IDBConnection $dbConnection, IConfig $config) { + function __construct(SyncService $syncService) { parent::__construct(); - $this->userManager = $userManager; - $this->dbConnection = $dbConnection; - $this->config = $config; + $this->syncService = $syncService; } protected function configure() { @@ -74,63 +53,15 @@ class SyncSystemAddressBook extends Command { * @param OutputInterface $output */ protected function execute(InputInterface $input, OutputInterface $output) { - $principalBackend = new Principal( - $this->userManager - ); - - $this->backend = new CardDavBackend($this->dbConnection, $principalBackend); - - // ensure system addressbook exists - $systemAddressBook = $this->ensureSystemAddressBookExists(); - $converter = new Converter(); $output->writeln('Syncing users ...'); $progress = new ProgressBar($output); $progress->start(); - $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) { - /** @var IUser $user */ - $name = $user->getBackendClassName(); - $userId = $user->getUID(); - - $cardId = "$name:$userId.vcf"; - $card = $this->backend->getCard($systemAddressBook['id'], $cardId); - if ($card === false) { - $vCard = $converter->createCardFromUser($user); - $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize()); - } else { - $vCard = Reader::read($card['carddata']); - if ($converter->updateCard($vCard, $user)) { - $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize()); - } - } + $this->syncService->syncInstance(function() use ($progress) { $progress->advance(); }); - // remove no longer existing - $allCards = $this->backend->getCards($systemAddressBook['id']); - foreach($allCards as $card) { - $vCard = Reader::read($card['carddata']); - $uid = $vCard->UID->getValue(); - // load backend and see if user exists - if (!$this->userManager->userExists($uid)) { - $this->backend->deleteCard($systemAddressBook['id'], $card['uri']); - } - } - $progress->finish(); $output->writeln(''); } - - protected function ensureSystemAddressBookExists() { - $book = $this->backend->getAddressBooksByUri('system'); - if (!is_null($book)) { - return $book; - } - $systemPrincipal = "principals/system/system"; - $this->backend->createAddressBook($systemPrincipal, 'system', [ - '{' . Plugin::NS_CARDDAV . '}addressbook-description' => 'System addressbook which holds all users of this instance' - ]); - - return $this->backend->getAddressBooksByUri('system'); - } } diff --git a/apps/dav/lib/carddav/addressbook.php b/apps/dav/lib/carddav/addressbook.php index 3e3e751828e..2cfaa7b708c 100644 --- a/apps/dav/lib/carddav/addressbook.php +++ b/apps/dav/lib/carddav/addressbook.php @@ -50,7 +50,7 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres function updateShares(array $add, array $remove) { /** @var CardDavBackend $carddavBackend */ $carddavBackend = $this->carddavBackend; - $carddavBackend->updateShares($this->getName(), $add, $remove); + $carddavBackend->updateShares($this, $add, $remove); } /** @@ -68,7 +68,7 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres function getShares() { /** @var CardDavBackend $carddavBackend */ $carddavBackend = $this->carddavBackend; - $carddavBackend->getShares($this->getName()); + return $carddavBackend->getShares($this->getBookId()); } function getACL() { @@ -81,7 +81,26 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres ]; } - return $acl; + // add the current user + if (isset($this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal'])) { + $owner = $this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal']; + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => $owner, + 'protected' => true, + ]; + if ($this->addressBookInfo['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only']) { + $acl[] = [ + 'privilege' => '{DAV:}write', + 'principal' => $owner, + 'protected' => true, + ]; + } + } + + /** @var CardDavBackend $carddavBackend */ + $carddavBackend = $this->carddavBackend; + return $carddavBackend->applyShareAcl($this->getBookId(), $acl); } function getChildACL() { @@ -94,15 +113,24 @@ class AddressBook extends \Sabre\CardDAV\AddressBook implements IShareableAddres ]; } - return $acl; + /** @var CardDavBackend $carddavBackend */ + $carddavBackend = $this->carddavBackend; + return $carddavBackend->applyShareAcl($this->getBookId(), $acl); } function getChild($name) { - $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name); + $obj = $this->carddavBackend->getCard($this->getBookId(), $name); if (!$obj) { throw new NotFound('Card not found'); } return new Card($this->carddavBackend, $this->addressBookInfo, $obj); } + /** + * @return int + */ + public function getBookId() { + return $this->addressBookInfo['id']; + } + } diff --git a/apps/dav/lib/carddav/card.php b/apps/dav/lib/carddav/card.php index 5ec9a7e93a9..d848f2e28ec 100644 --- a/apps/dav/lib/carddav/card.php +++ b/apps/dav/lib/carddav/card.php @@ -33,7 +33,13 @@ class Card extends \Sabre\CardDAV\Card { ]; } - return $acl; + /** @var CardDavBackend $carddavBackend */ + $carddavBackend = $this->carddavBackend; + return $carddavBackend->applyShareAcl($this->getBookId(), $acl); + } + + private function getBookId() { + return $this->addressBookInfo['id']; } } diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php index 7deda07497f..97067abb7c3 100644 --- a/apps/dav/lib/carddav/carddavbackend.php +++ b/apps/dav/lib/carddav/carddavbackend.php @@ -26,7 +26,6 @@ namespace OCA\DAV\CardDAV; use OCA\DAV\Connector\Sabre\Principal; use OCP\IDBConnection; -use OCP\ILogger; use Sabre\CardDAV\Backend\BackendInterface; use Sabre\CardDAV\Backend\SyncSupport; use Sabre\CardDAV\Plugin; @@ -53,6 +52,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { 'BDAY', 'UID', 'N', 'FN', 'TITLE', 'ROLE', 'NOTE', 'NICKNAME', 'ORG', 'CATEGORIES', 'EMAIL', 'TEL', 'IMPP', 'ADR', 'URL', 'GEO', 'CLOUD'); + const ACCESS_OWNER = 1; + const ACCESS_READ_WRITE = 2; + const ACCESS_READ = 3; + /** * CardDavBackend constructor. * @@ -65,7 +68,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { } /** - * Returns the list of addressbooks for a specific user. + * Returns the list of address books for a specific user. * * Every addressbook should have the following properties: * id - an arbitrary unique id @@ -105,28 +108,30 @@ class CardDavBackend implements BackendInterface, SyncSupport { $result->closeCursor(); // query for shared calendars + $principals = $this->principalBackend->getGroupMembership($principalUri); + $principals[]= $principalUri; + $query = $this->db->getQueryBuilder(); - $query2 = $this->db->getQueryBuilder(); - $query2->select(['resourceid']) - ->from('dav_shares') - ->where($query2->expr()->eq('principaluri', $query2->createParameter('principaluri'))) - ->andWhere($query2->expr()->eq('type', $query2->createParameter('type'))); - $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) - ->from('addressbooks') - ->where($query->expr()->in('id', $query->createFunction($query2->getSQL()))) + $result = $query->select(['a.id', 'a.uri', 'a.displayname', 'a.principaluri', 'a.description', 'a.synctoken', 's.uri', 's.access']) + ->from('dav_shares', 's') + ->join('s', 'addressbooks', 'a', $query->expr()->eq('s.resourceid', 'a.id')) + ->where($query->expr()->in('s.principaluri', $query->createParameter('principaluri'))) + ->andWhere($query->expr()->eq('s.type', $query->createParameter('type'))) ->setParameter('type', 'addressbook') - ->setParameter('principaluri', $principalUri) + ->setParameter('principaluri', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY) ->execute(); while($row = $result->fetch()) { $addressBooks[] = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], + 'principaluri' => $principalUri, '{DAV:}displayname' => $row['displayname'], '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + '{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'], + '{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => $row['access'] === self::ACCESS_READ, ]; } $result->closeCursor(); @@ -134,11 +139,43 @@ class CardDavBackend implements BackendInterface, SyncSupport { return $addressBooks; } - public function getAddressBooksByUri($addressBookUri) { + /** + * @param int $addressBookId + */ + public function getAddressBookById($addressBookId) { + $query = $this->db->getQueryBuilder(); + $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) + ->from('addressbooks') + ->where($query->expr()->eq('id', $query->createNamedParameter($addressBookId))) + ->execute(); + + $row = $result->fetch(); + $result->closeCursor(); + if ($row === false) { + return null; + } + + return [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{DAV:}displayname' => $row['displayname'], + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], + '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], + '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + ]; + } + + /** + * @param $addressBookUri + * @return array|null + */ + public function getAddressBooksByUri($principal, $addressBookUri) { $query = $this->db->getQueryBuilder(); $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) ->from('addressbooks') ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri))) + ->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($principal))) ->setMaxResults(1) ->execute(); @@ -217,6 +254,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { * @param string $principalUri * @param string $url Just the 'basename' of the url. * @param array $properties + * @return int * @throws BadRequest */ function createAddressBook($principalUri, $url, array $properties) { @@ -260,6 +298,8 @@ class CardDavBackend implements BackendInterface, SyncSupport { ]) ->setParameters($values) ->execute(); + + return $query->getLastInsertId(); } /** @@ -496,7 +536,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { * @return bool */ function deleteCard($addressBookId, $cardUri) { - $cardId = $this->getCardId($cardUri); + try { + $cardId = $this->getCardId($cardUri); + } catch (\InvalidArgumentException $e) { + $cardId = null; + } $query = $this->db->getQueryBuilder(); $ret = $query->delete('cards') ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId))) @@ -506,7 +550,9 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 3); if ($ret === 1) { - $this->purgeProperties($addressBookId, $cardId); + if ($cardId !== null) { + $this->purgeProperties($addressBookId, $cardId); + } return true; } @@ -663,16 +709,16 @@ class CardDavBackend implements BackendInterface, SyncSupport { } /** - * @param string $path + * @param AddressBook $book * @param string[] $add * @param string[] $remove */ - public function updateShares($path, $add, $remove) { + public function updateShares($book, $add, $remove) { foreach($add as $element) { - $this->shareWith($path, $element); + $this->shareWith($book, $element); } foreach($remove as $element) { - $this->unshare($path, $element); + $this->unshare($book->getBookId(), $element); } } @@ -758,10 +804,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { /** - * @param string $addressBookUri + * @param AddressBook $addressBook * @param string $element */ - private function shareWith($addressBookUri, $element) { + private function shareWith($addressBook, $element) { $user = $element['href']; $parts = explode(':', $user, 2); if ($parts[0] !== 'principal') { @@ -772,31 +818,31 @@ class CardDavBackend implements BackendInterface, SyncSupport { return; } - $addressBook = $this->getAddressBooksByUri($addressBookUri); - if (is_null($addressBook)) { - return; - } - // remove the share if it already exists - $this->unshare($addressBookUri, $element['href']); + $this->unshare($addressBook->getBookId(), $element['href']); + $access = self::ACCESS_READ; + if (isset($element['readOnly'])) { + $access = $element['readOnly'] ? self::ACCESS_READ : self::ACCESS_READ_WRITE; + } + $newUri = sha1($addressBook->getName() . $addressBook->getOwner()); $query = $this->db->getQueryBuilder(); $query->insert('dav_shares') ->values([ 'principaluri' => $query->createNamedParameter($parts[1]), - 'uri' => $query->createNamedParameter($addressBookUri), + 'uri' => $query->createNamedParameter($newUri), 'type' => $query->createNamedParameter('addressbook'), - 'access' => $query->createNamedParameter(0), - 'resourceid' => $query->createNamedParameter($addressBook['id']) + 'access' => $query->createNamedParameter($access), + 'resourceid' => $query->createNamedParameter($addressBook->getBookId()) ]); $query->execute(); } /** - * @param string $addressBookUri + * @param int $addressBookId * @param string $element */ - private function unshare($addressBookUri, $element) { + private function unshare($addressBookId, $element) { $parts = explode(':', $element, 2); if ($parts[0] !== 'principal') { return; @@ -806,14 +852,9 @@ class CardDavBackend implements BackendInterface, SyncSupport { return; } - $addressBook = $this->getAddressBooksByUri($addressBookUri); - if (is_null($addressBook)) { - return; - } - $query = $this->db->getQueryBuilder(); $query->delete('dav_shares') - ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBook['id']))) + ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId))) ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook'))) ->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($parts[1]))) ; @@ -832,11 +873,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { * * @return array */ - public function getShares($addressBookUri) { + public function getShares($addressBookId) { $query = $this->db->getQueryBuilder(); $result = $query->select(['principaluri', 'access']) ->from('dav_shares') - ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri))) + ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId))) ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook'))) ->execute(); @@ -847,7 +888,8 @@ class CardDavBackend implements BackendInterface, SyncSupport { 'href' => "principal:${p['uri']}", 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '', 'status' => 1, - 'readOnly' => ($row['access'] === 1) + 'readOnly' => ($row['access'] === self::ACCESS_READ), + '{'.\OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $p['uri'] ]; } @@ -942,4 +984,30 @@ class CardDavBackend implements BackendInterface, SyncSupport { return (int)$cardIds['id']; } + + /** + * For shared address books the sharee is set in the ACL of the address book + * @param $addressBookId + * @param $acl + * @return array + */ + public function applyShareAcl($addressBookId, $acl) { + + $shares = $this->getShares($addressBookId); + foreach ($shares as $share) { + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => $share['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}principal'], + 'protected' => true, + ]; + if (!$share['readOnly']) { + $acl[] = [ + 'privilege' => '{DAV:}write', + 'principal' => $share['{' . \OCA\DAV\CardDAV\Sharing\Plugin::NS_OWNCLOUD . '}principal'], + 'protected' => true, + ]; + } + } + return $acl; + } } diff --git a/apps/dav/lib/carddav/sharing/plugin.php b/apps/dav/lib/carddav/sharing/plugin.php index 7ad3f43dca8..d25b84d01f3 100644 --- a/apps/dav/lib/carddav/sharing/plugin.php +++ b/apps/dav/lib/carddav/sharing/plugin.php @@ -34,6 +34,8 @@ use Sabre\HTTP\ResponseInterface; class Plugin extends ServerPlugin { + const NS_OWNCLOUD = 'http://owncloud.org/ns'; + /** @var Auth */ private $auth; @@ -100,7 +102,7 @@ class Plugin extends ServerPlugin { function initialize(Server $server) { $this->server = $server; $server->resourceTypeMapping['OCA\\DAV\CardDAV\\ISharedAddressbook'] = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}shared'; - $this->server->xml->elementMap['{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share'] = 'OCA\\DAV\\CardDAV\\Sharing\\Xml\\ShareRequest'; + $this->server->xml->elementMap['{' . Plugin::NS_OWNCLOUD . '}share'] = 'OCA\\DAV\\CardDAV\\Sharing\\Xml\\ShareRequest'; $this->server->on('method:POST', [$this, 'httpPost']); } @@ -148,7 +150,7 @@ class Plugin extends ServerPlugin { // Dealing with the 'share' document, which modified invitees on a // calendar. - case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share' : + case '{' . self::NS_OWNCLOUD . '}share' : // We can only deal with IShareableCalendar objects if (!$node instanceof IShareableAddressBook) { diff --git a/apps/dav/lib/carddav/sharing/xml/sharerequest.php b/apps/dav/lib/carddav/sharing/xml/sharerequest.php index 6be6bd795a1..bd55dd4073e 100644 --- a/apps/dav/lib/carddav/sharing/xml/sharerequest.php +++ b/apps/dav/lib/carddav/sharing/xml/sharerequest.php @@ -20,6 +20,7 @@ */ namespace OCA\DAV\CardDAV\Sharing\Xml; +use OCA\DAV\CardDAV\Sharing\Plugin; use Sabre\Xml\Reader; use Sabre\Xml\XmlDeserializable; @@ -44,32 +45,32 @@ class ShareRequest implements XmlDeserializable { static function xmlDeserialize(Reader $reader) { - $elems = $reader->parseInnerTree([ - '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV. '}set' => 'Sabre\\Xml\\Element\\KeyValue', - '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}remove' => 'Sabre\\Xml\\Element\\KeyValue', + $elements = $reader->parseInnerTree([ + '{' . Plugin::NS_OWNCLOUD. '}set' => 'Sabre\\Xml\\Element\\KeyValue', + '{' . Plugin::NS_OWNCLOUD . '}remove' => 'Sabre\\Xml\\Element\\KeyValue', ]); $set = []; $remove = []; - foreach ($elems as $elem) { + foreach ($elements as $elem) { switch ($elem['name']) { - case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}set' : + case '{' . Plugin::NS_OWNCLOUD . '}set' : $sharee = $elem['value']; - $sumElem = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}summary'; - $commonName = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}common-name'; + $sumElem = '{' . Plugin::NS_OWNCLOUD . '}summary'; + $commonName = '{' . Plugin::NS_OWNCLOUD . '}common-name'; $set[] = [ 'href' => $sharee['{DAV:}href'], 'commonName' => isset($sharee[$commonName]) ? $sharee[$commonName] : null, 'summary' => isset($sharee[$sumElem]) ? $sharee[$sumElem] : null, - 'readOnly' => !array_key_exists('{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}read-write', $sharee), + 'readOnly' => !array_key_exists('{' . Plugin::NS_OWNCLOUD . '}read-write', $sharee), ]; break; - case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}remove' : + case '{' . Plugin::NS_OWNCLOUD . '}remove' : $remove[] = $elem['value']['{DAV:}href']; break; diff --git a/apps/dav/lib/carddav/syncjob.php b/apps/dav/lib/carddav/syncjob.php new file mode 100644 index 00000000000..0554af6fbf1 --- /dev/null +++ b/apps/dav/lib/carddav/syncjob.php @@ -0,0 +1,40 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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\DAV\CardDAV; + +use OC\BackgroundJob\TimedJob; +use OCA\Dav\AppInfo\Application; + +class SyncJob extends TimedJob { + + public function __construct() { + // Run once a day + $this->setInterval(24 * 60 * 60); + } + + protected function run($argument) { + $app = new Application(); + /** @var SyncService $ss */ + $ss = $app->getSyncService(); + $ss->syncInstance(); + } +} diff --git a/apps/dav/lib/carddav/syncservice.php b/apps/dav/lib/carddav/syncservice.php index 30dc78c4877..4b5907620e6 100644 --- a/apps/dav/lib/carddav/syncservice.php +++ b/apps/dav/lib/carddav/syncservice.php @@ -21,18 +21,27 @@ namespace OCA\DAV\CardDAV; +use OCP\IUser; +use OCP\IUserManager; use Sabre\DAV\Client; use Sabre\DAV\Xml\Response\MultiStatus; use Sabre\DAV\Xml\Service; -use Sabre\HTTP\ClientException; +use Sabre\VObject\Reader; class SyncService { /** @var CardDavBackend */ private $backend; - public function __construct(CardDavBackend $backend) { + /** @var IUserManager */ + private $userManager; + + /** @var array */ + private $localSystemAddressBook; + + public function __construct(CardDavBackend $backend, IUserManager $userManager) { $this->backend = $backend; + $this->userManager = $userManager; } /** @@ -80,14 +89,14 @@ class SyncService { * @return array|null * @throws \Sabre\DAV\Exception\BadRequest */ - protected function ensureSystemAddressBookExists($principal, $id, $properties) { - $book = $this->backend->getAddressBooksByUri($id); + public function ensureSystemAddressBookExists($principal, $id, $properties) { + $book = $this->backend->getAddressBooksByUri($principal, $id); if (!is_null($book)) { return $book; } $this->backend->createAddressBook($principal, $id, $properties); - return $this->backend->getAddressBooksByUri($id); + return $this->backend->getAddressBooksByUri($principal, $id); } /** @@ -180,5 +189,77 @@ class SyncService { return ['response' => $result, 'token' => $multiStatus->getSyncToken()]; } + /** + * @param IUser $user + */ + public function updateUser($user) { + $systemAddressBook = $this->getLocalSystemAddressBook(); + $addressBookId = $systemAddressBook['id']; + $converter = new Converter(); + $name = $user->getBackendClassName(); + $userId = $user->getUID(); + + $cardId = "$name:$userId.vcf"; + $card = $this->backend->getCard($addressBookId, $cardId); + if ($card === false) { + $vCard = $converter->createCardFromUser($user); + $this->backend->createCard($addressBookId, $cardId, $vCard->serialize()); + } else { + $vCard = Reader::read($card['carddata']); + if ($converter->updateCard($vCard, $user)) { + $this->backend->updateCard($addressBookId, $cardId, $vCard->serialize()); + } + } + } + + /** + * @param IUser|string $userOrCardId + */ + public function deleteUser($userOrCardId) { + $systemAddressBook = $this->getLocalSystemAddressBook(); + if ($userOrCardId instanceof IUser){ + $name = $userOrCardId->getBackendClassName(); + $userId = $userOrCardId->getUID(); + + $userOrCardId = "$name:$userId.vcf"; + } + $this->backend->deleteCard($systemAddressBook['id'], $userOrCardId); + } + + /** + * @return array|null + */ + public function getLocalSystemAddressBook() { + if (is_null($this->localSystemAddressBook)) { + $systemPrincipal = "principals/system/system"; + $this->localSystemAddressBook = $this->ensureSystemAddressBookExists($systemPrincipal, 'system', [ + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => 'System addressbook which holds all users of this instance' + ]); + } + + return $this->localSystemAddressBook; + } + + public function syncInstance(\Closure $progressCallback = null) { + $systemAddressBook = $this->getLocalSystemAddressBook(); + $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $progressCallback) { + $this->updateUser($user); + if (!is_null($progressCallback)) { + $progressCallback(); + } + }); + + // remove no longer existing + $allCards = $this->backend->getCards($systemAddressBook['id']); + foreach($allCards as $card) { + $vCard = Reader::read($card['carddata']); + $uid = $vCard->UID->getValue(); + // load backend and see if user exists + if (!$this->userManager->userExists($uid)) { + $this->deleteUser($card['uri']); + } + } + } + } diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php index ece799c7019..5f02d1271df 100644 --- a/apps/dav/lib/connector/sabre/principal.php +++ b/apps/dav/lib/connector/sabre/principal.php @@ -29,9 +29,10 @@ namespace OCA\DAV\Connector\Sabre; +use OCP\IGroup; +use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; -use OCP\IConfig; use Sabre\DAV\Exception; use \Sabre\DAV\PropPatch; use Sabre\DAVACL\PrincipalBackend\BackendInterface; @@ -42,11 +43,15 @@ class Principal implements BackendInterface { /** @var IUserManager */ private $userManager; + /** @var IGroupManager */ + private $groupManager; + /** * @param IUserManager $userManager */ - public function __construct(IUserManager $userManager) { + public function __construct(IUserManager $userManager, IGroupManager $groupManager) { $this->userManager = $userManager; + $this->groupManager = $groupManager; } /** @@ -127,24 +132,23 @@ class Principal implements BackendInterface { public function getGroupMembership($principal) { list($prefix, $name) = URLUtil::splitPath($principal); - $group_membership = array(); if ($prefix === 'principals/users') { - $principal = $this->getPrincipalByPath($principal); - if (!$principal) { + $user = $this->userManager->get($name); + if (!$user) { throw new Exception('Principal not found'); } - // TODO: for now the user principal has only its own groups - return array( - 'principals/users/'.$name.'/calendar-proxy-read', - 'principals/users/'.$name.'/calendar-proxy-write', - // The addressbook groups are not supported in Sabre, - // see http://groups.google.com/group/sabredav-discuss/browse_thread/thread/ef2fa9759d55f8c#msg_5720afc11602e753 - //'principals/'.$name.'/addressbook-proxy-read', - //'principals/'.$name.'/addressbook-proxy-write', - ); + $groups = $this->groupManager->getUserGroups($user); + $groups = array_map(function($group) { + /** @var IGroup $group */ + return 'principals/groups/' . $group->getGID(); + }, $groups); + + $groups[]= 'principals/users/'.$name.'/calendar-proxy-read'; + $groups[]= 'principals/users/'.$name.'/calendar-proxy-write'; + return $groups; } - return $group_membership; + return []; } /** @@ -207,4 +211,5 @@ class Principal implements BackendInterface { } return $principal; } + } diff --git a/apps/dav/lib/files/custompropertiesbackend.php b/apps/dav/lib/files/custompropertiesbackend.php index 96082331cff..aa541f88dad 100644 --- a/apps/dav/lib/files/custompropertiesbackend.php +++ b/apps/dav/lib/files/custompropertiesbackend.php @@ -41,7 +41,6 @@ class CustomPropertiesBackend implements BackendInterface { '{DAV:}getetag', '{DAV:}quota-used-bytes', '{DAV:}quota-available-bytes', - '{DAV:}quota-available-bytes', '{http://owncloud.org/ns}permissions', '{http://owncloud.org/ns}downloadURL', '{http://owncloud.org/ns}dDC', diff --git a/apps/dav/lib/hookmanager.php b/apps/dav/lib/hookmanager.php new file mode 100644 index 00000000000..d2199bec598 --- /dev/null +++ b/apps/dav/lib/hookmanager.php @@ -0,0 +1,83 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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\DAV; + +use OCA\DAV\CardDAV\SyncService; +use OCP\IUser; +use OCP\IUserManager; +use OCP\Util; + +class HookManager { + + /** @var IUserManager */ + private $userManager; + + /** @var SyncService */ + private $syncService; + + /** @var IUser[] */ + private $usersToDelete; + + public function __construct(IUserManager $userManager, SyncService $syncService) { + $this->userManager = $userManager; + $this->syncService = $syncService; + } + + public function setup() { + Util::connectHook('OC_User', + 'post_createUser', + $this, + 'postCreateUser'); + Util::connectHook('OC_User', + 'pre_deleteUser', + $this, + 'preDeleteUser'); + Util::connectHook('OC_User', + 'post_deleteUser', + $this, + 'postDeleteUser'); + Util::connectHook('OC_User', + 'changeUser', + $this, + 'changeUser'); + } + + public function postCreateUser($params) { + $user = $this->userManager->get($params['uid']); + $this->syncService->updateUser($user); + } + + public function preDeleteUser($params) { + $this->usersToDelete[$params['uid']] = $this->userManager->get($params['uid']); + } + + public function postDeleteUser($params) { + $uid = $params['uid']; + if (isset($this->usersToDelete[$uid])){ + $this->syncService->deleteUser($this->usersToDelete[$uid]); + } + } + + public function changeUser($params) { + $user = $params['user']; + $this->syncService->updateUser($user); + } +} diff --git a/apps/dav/lib/rootcollection.php b/apps/dav/lib/rootcollection.php index 8e0e0c6b86f..0afde97a9e7 100644 --- a/apps/dav/lib/rootcollection.php +++ b/apps/dav/lib/rootcollection.php @@ -37,7 +37,8 @@ class RootCollection extends SimpleCollection { $config = \OC::$server->getConfig(); $db = \OC::$server->getDatabaseConnection(); $userPrincipalBackend = new Principal( - \OC::$server->getUserManager() + \OC::$server->getUserManager(), + \OC::$server->getGroupManager() ); $groupPrincipalBackend = new GroupPrincipalBackend( \OC::$server->getGroupManager() diff --git a/apps/dav/lib/systemtag/systemtagplugin.php b/apps/dav/lib/systemtag/systemtagplugin.php index 2cab9ba8d50..e104bb8dac4 100644 --- a/apps/dav/lib/systemtag/systemtagplugin.php +++ b/apps/dav/lib/systemtag/systemtagplugin.php @@ -127,7 +127,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { $url .= '/'; } - $response->setHeader('Location', $url . $tag->getId()); + $response->setHeader('Content-Location', $url . $tag->getId()); // created $response->setStatus(201); @@ -147,7 +147,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { * @throws UnsupportedMediaType if the content type is not supported */ private function createTag($data, $contentType = 'application/json') { - if ($contentType === 'application/json') { + if (explode(';', $contentType)[0] === 'application/json') { $data = json_decode($data, true); } else { throw new UnsupportedMediaType(); diff --git a/apps/dav/tests/travis/caldav/script.sh b/apps/dav/tests/travis/caldav/script.sh index 9a818b553f7..fe3391d5a06 100644 --- a/apps/dav/tests/travis/caldav/script.sh +++ b/apps/dav/tests/travis/caldav/script.sh @@ -9,8 +9,11 @@ sleep 30 # run the tests cd "$SCRIPTPATH/CalDAVTester" -PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/../caldavtest/config/serverinfo.xml" -o cdt.txt \ - "$SCRIPTPATH/../caldavtest/tests/CalDAV/current-user-principal.xml" +PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \ + "CalDAV/current-user-principal.xml" \ + "CalDAV/sync-report.xml" + + RESULT=$? tail "$/../../../../../data-autotest/owncloud.log" diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/current-user-principal/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/current-user-principal/1.xml new file mode 100644 index 00000000000..77a67c110df --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/current-user-principal/1.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:propfind xmlns:D="DAV:"> + <D:prop> + <D:current-user-principal/> + </D:prop> +</D:propfind> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.txt new file mode 100644 index 00000000000..2d0a3641ac4 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.txt @@ -0,0 +1,32 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T205953Z +CREATED:20060101T150000Z +DTSTART;TZID=US/Eastern:$now.year.1:0101T100000 +DURATION:PT1H +SUMMARY:event 1 +UID:54E181BC7CCC373042B28842@ninevah.local +CATEGORIES:cool +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.xml new file mode 100644 index 00000000000..676679bdd85 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/1.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:mkcol xmlns:D="DAV:" + xmlns:E="urn:ietf:params:xml:ns:caldav"> + <D:set> + <D:prop> + <D:resourcetype> + <D:collection/> + <E:calendar/> + </D:resourcetype> + <D:displayname>Special Resource</D:displayname> + </D:prop> + </D:set> +</D:mkcol> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/2.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/2.txt new file mode 100644 index 00000000000..67de0524ec3 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/2.txt @@ -0,0 +1,33 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Mountain +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:MDT +TZOFFSETFROM:-0700 +TZOFFSETTO:-0600 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:MST +TZOFFSETFROM:-0600 +TZOFFSETTO:-0700 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T210052Z +CREATED:20060101T160000Z +DTSTART;TZID=US/Mountain:$now.year.1:0101T110000 +DURATION:PT1H +SUMMARY:event 2 +DESCRIPTION:Some notes +UID:9A6519F71822CD45840C3440@ninevah.local +CATEGORIES:cool,hot +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/3.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/3.txt new file mode 100644 index 00000000000..bfdc0dbd116 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/3.txt @@ -0,0 +1,34 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Pacific +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:PDT +TZOFFSETFROM:-0800 +TZOFFSETTO:-0700 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:PST +TZOFFSETFROM:-0700 +TZOFFSETTO:-0800 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T210146Z +CREATED:20060101T210000Z +DTSTART;TZID=US/Pacific:$now.year.1:0101T130000 +DURATION:PT1H +LAST-MODIFIED:20051222T210203Z +SEQUENCE:1 +SUMMARY:event 3 +UID:DB3F97EF10A051730E2F752E@ninevah.local +CATEGORIES:hot +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/4.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/4.txt new file mode 100644 index 00000000000..be223854641 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/4.txt @@ -0,0 +1,39 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T210310Z +CREATED:20060101T230000Z +DTSTART;TZID=US/Eastern:$now.year.1:0101T180000 +DURATION:PT1H +SUMMARY:event 4 +UID:A3217B429B4D2FF2DC2EEE66@ninevah.local +CATEGORIES:cool +CATEGORIES:hot +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT1H +REPEAT:5 +DURATION:PT10M +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/5.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/5.txt new file mode 100644 index 00000000000..e1d701e2698 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/5.txt @@ -0,0 +1,38 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T210412Z +CREATED:20060102T150000Z +DTSTART;TZID=US/Eastern:$now.year.1:0102T100000 +DURATION:PT1H +RRULE:FREQ=DAILY;COUNT=5 +SUMMARY:event 5 +UID:945113826375CBB89184DC36@ninevah.local +CATEGORIES:cool,hot +CATEGORIES:warm +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/6.txt b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/6.txt new file mode 100644 index 00000000000..ecabe13a707 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/put/6.txt @@ -0,0 +1,48 @@ +BEGIN:VCALENDAR +CALSCALE:GREGORIAN +PRODID:-//Example Inc.//Example Calendar//EN +VERSION:2.0 +BEGIN:VTIMEZONE +LAST-MODIFIED:20040110T032845Z +TZID:US/Eastern +BEGIN:DAYLIGHT +DTSTART:20000404T020000 +RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 +TZNAME:EDT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:20001026T020000 +RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 +TZNAME:EST +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTAMP:20051222T210507Z +CREATED:20060102T190000Z +DTSTART;TZID=US/Eastern:$now.year.1:0102T140000 +DURATION:PT1H +RRULE:FREQ=DAILY;COUNT=5 +SUMMARY:event 6 +UID:F5B811E00073B22BA6B87551@ninevah.local +CATEGORIES:warm,hot +CATEGORIES:cool +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20051222T210507Z +UID:F5B811E00073B22BA6B87551@ninevah.local +RECURRENCE-ID;TZID=US/Eastern:$now.year.1:0104T140000 +CREATED:20060102T190000Z +DTSTART;TZID=US/Eastern:$now.year.1:0104T160000 +DURATION:PT1H +SUMMARY:event 6 changed +DESCRIPTION:Some notes +BEGIN:VALARM +ACTION:AUDIO +TRIGGER;RELATED=START:-PT10M +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/1.xml new file mode 100644 index 00000000000..4c54b88fd0c --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/1.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:propfind xmlns:D="DAV:"> + <D:prop> + <D:supported-report-set/> + <D:sync-token/> + </D:prop> +</D:propfind> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/10.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/10.xml new file mode 100644 index 00000000000..b20b6d645a5 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/10.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:sync-level>bogus</D:sync-level> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/11.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/11.xml new file mode 100644 index 00000000000..c7706328d5a --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/11.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token>null</D:sync-token> +<D:prop> +<D:getetag/> +</D:prop> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/2.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/2.xml new file mode 100644 index 00000000000..99ee3dbb0e0 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/2.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/21.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/21.xml new file mode 100644 index 00000000000..7a851c80c9a --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/21.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:sync-level>0</D:sync-level> +<D:limit><D:nresults>10</D:nresults></D:limit> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/3.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/3.xml new file mode 100644 index 00000000000..9cb886b8133 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/3.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token>$synctoken1:</D:sync-token> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/4.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/4.xml new file mode 100644 index 00000000000..e0d0baf4a7f --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/4.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token>$synctoken2:</D:sync-token> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/5.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/5.xml new file mode 100644 index 00000000000..4469bb434fc --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/5.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:prop> +<D:getcontenttype/> +<D:getetag/> +</D:prop> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/6.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/6.xml new file mode 100644 index 00000000000..05b7198eb6e --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/6.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token>$synctoken1:</D:sync-token> +<D:prop> +<D:getcontenttype/> +<D:getetag/> +</D:prop> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/7.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/7.xml new file mode 100644 index 00000000000..575b2f673d7 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/7.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token>$synctoken2:</D:sync-token> +<D:prop> +<D:getcontenttype/> +<D:getetag/> +</D:prop> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/8.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/8.xml new file mode 100644 index 00000000000..6badc4143cf --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CalDAV/reports/sync/8.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:sync-level>1</D:sync-level> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/1.xml new file mode 100644 index 00000000000..20d2ebf4cfc --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/1.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<CS:share xmlns:D="DAV:" xmlns:CS="http://owncloud.org/ns"> + <CS:set> + <D:href>principal:principals/users/user02</D:href> + <CS:summary>My Shared Calendar</CS:summary> + <CS:read-write/> + </CS:set> +</CS:share> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/4.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/4.xml new file mode 100644 index 00000000000..fd0f248bb31 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/4.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:propfind xmlns:D="DAV:"> +<D:prop> +<D:resourcetype/> +<D:owner/> +<D:current-user-privilege-set/> +</D:prop> +</D:propfind> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/6.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/6.vcf new file mode 100644 index 00000000000..6b53f8ba3bf --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/6.vcf @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +N:Thompson;Default;;; +FN:Default Thompson +EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com +TEL;TYPE=WORK,pref:1-555-555-5555 +TEL;TYPE=CELL:1-555-555-5555 +ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA +ITEM1.X-ABADR:us +UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/7.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/7.vcf new file mode 100644 index 00000000000..27fdb9fae5f --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/7.vcf @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +N:Thompson;Default;;; +FN:Default Thompson +EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.net +TEL;TYPE=WORK,pref:1-555-555-5555 +TEL;TYPE=CELL:1-555-555-6666 +ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA +ITEM1.X-ABADR:us +UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/8.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/8.vcf new file mode 100644 index 00000000000..9188fdd913c --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/8.vcf @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +N:Miller;Default;;; +FN:Default Miller +EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com +TEL;TYPE=WORK,pref:1-555-555-5555 +TEL;TYPE=CELL:1-555-555-5555 +ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA +ITEM1.X-ABADR:us +UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/9.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/9.vcf new file mode 100644 index 00000000000..1ca0a36ca4c --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/sharing/read-write/9.vcf @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +N:Smith;Default;;; +FN:Default Smith +EMAIL;TYPE=INTERNET,WORK,pref:lthompson@example.com +TEL;TYPE=WORK,pref:1-555-555-5555 +TEL;TYPE=CELL:1-555-555-5555 +ITEM1.ADR;TYPE=WORK,pref:;;2 Lag;Elk Forest;California;99999;USA +ITEM1.X-ABADR:us +UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vcurrent-user-principal/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vcurrent-user-principal/1.xml new file mode 100644 index 00000000000..dffedc6880d --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vcurrent-user-principal/1.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:propfind xmlns:D="DAV:"> +<D:prop> +<D:current-user-principal/> +</D:prop> +</D:propfind> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/1.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/1.vcf new file mode 100644 index 00000000000..2121c65f1f4 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/1.vcf @@ -0,0 +1,11 @@ +BEGIN:VCARD +VERSION:3.0 +N:Thompson;Default;;; +FN:Default Thompson +EMAIL;type=INTERNET;type=WORK;type=pref:lthompson@example.com +TEL;type=WORK;type=pref:1-555-555-5555 +TEL;type=CELL:1-555-555-5555 +item1.ADR;type=WORK;type=pref:;;2 Lag;Elk Forest;California;99999;USA +item1.X-ABADR:us +UID:ED7A5AEC-AB19-4CE0-AD6A-2923A3E5C4E1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/2.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/2.vcf new file mode 100644 index 00000000000..390a3d8ae69 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/2.vcf @@ -0,0 +1,17 @@ +BEGIN:VCARD +VERSION:3.0 +N:Contact;Mulberry;;; +FN:Mulberry Contact +NICKNAME:mulberry +ORG:Apple Inc.; +EMAIL;type=INTERNET;type=WORK;type=pref:mulberry_contact@example.com +TEL;type=HOME;type=pref:555-555-5555 +TEL;type=WORK:555-555-5555 +TEL;type=WORK;type=FAX:555-555-5555 +item1.ADR;type=WORK;type=pref:;;1 Infinite Circle;Exampletino\, CA 99999;USA;; +item1.X-ABADR:us +NOTE:This is a contact created in Mulberry. +item2.URL;type=pref:http://www.example.com/~magic +item2.X-ABLabel:_$!<HomePage>!$_ +UID:782DAAF92CB1ED1BC155CDB3@D76FAF7B10D9E8D2D41F779D +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/3.vcf b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/3.vcf new file mode 100644 index 00000000000..37c3b81bdcf --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/put/3.vcf @@ -0,0 +1,12 @@ +BEGIN:VCARD +VERSION:3.0 +N:Kawado;Saeko;;; +FN:Snow Leopard +ORG:Snow Leopard; +EMAIL;type=INTERNET;type=WORK;type=pref:snowleopard_apple@example.com +TEL;type=WORK;type=pref:555-555-5555 +item1.ADR;type=WORK;type=pref:;;2 Fidel Ave. Suite 1;Mountain Top;CA;99999;USA +item1.X-ABADR:us +X-ABShowAs:COMPANY +UID:FCBA0FA3-00B2-4C95-B4EC-4CCC4843F8B1:ABPerson +END:VCARD diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/1.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/1.xml new file mode 100644 index 00000000000..7f454b38900 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/1.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:propfind xmlns:D="DAV:"> +<D:prop> +<D:supported-report-set/> +<D:sync-token/> +</D:prop> +</D:propfind> diff --git a/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/2.xml b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/2.xml new file mode 100644 index 00000000000..99ee3dbb0e0 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/data/Resource/CardDAV/vreports/sync/2.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" ?> +<D:sync-collection xmlns:D="DAV:"> +<D:sync-token/> +<D:prop/> +</D:sync-collection> diff --git a/apps/dav/tests/travis/caldavtest/config/serverinfo.dtd b/apps/dav/tests/travis/caldavtest/serverinfo.dtd index d642f4f90cd..d642f4f90cd 100644 --- a/apps/dav/tests/travis/caldavtest/config/serverinfo.dtd +++ b/apps/dav/tests/travis/caldavtest/serverinfo.dtd diff --git a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml b/apps/dav/tests/travis/caldavtest/serverinfo.xml index c80e47f9481..c3ba99ee03d 100644 --- a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml +++ b/apps/dav/tests/travis/caldavtest/serverinfo.xml @@ -1,7 +1,7 @@ <?xml version="1.0" standalone="no"?> <!DOCTYPE serverinfo SYSTEM - "/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/config/serverinfo.dtd"> + "/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/serverinfo.dtd"> <!-- Copyright (c) 2006-2015 Apple Inc. All rights reserved. @@ -64,7 +64,7 @@ <feature>resource-id</feature> <!-- WebDAV BIND DAV:resource-id property --> <feature>sync-report</feature> <!-- WebDAV collection sync REPORT --> <!-- <feature>sync-report-limit</feature> --> <!-- WebDAV collection sync REPORT DAV:limit support --> - <feature>sync-report-home</feature> <!-- WebDAV collection sync REPORT on Homes --> + <!--<feature>sync-report-home</feature> <!– WebDAV collection sync REPORT on Homes –>--> <feature>sync-report-config-token</feature> <!-- Sync REPORT token includes configuration component --> <feature>well-known</feature> <!-- well-known feature --> @@ -180,7 +180,7 @@ <!-- relative path to main principal collection--> <substitution> <key>$principalcollection:</key> - <value>$root:principals/users/</value> + <value>$root:principals/</value> </substitution> <!-- the core recored type collections--> @@ -482,7 +482,7 @@ </substitution> <substitution> <key>$principaluri%d:</key> - <value>$principalcollection:$userid%d:/</value> + <value>$principals_users:$userid%d:/</value> </substitution> <substitution> <key>$principal%dnoslash:</key> @@ -492,7 +492,7 @@ <!-- relative path to user calendar home--> <substitution> <key>$calendarhome%d:</key> - <value>$calendars_uids:$userguid%d:</value> + <value>$calendars:$userid%d:</value> </substitution> <!-- relative path to user alternate calendar home--> <substitution> diff --git a/apps/dav/tests/travis/caldavtest/tests/CalDAV/sync-report.xml b/apps/dav/tests/travis/caldavtest/tests/CalDAV/sync-report.xml index c675af82065..cf4fcde251f 100644 --- a/apps/dav/tests/travis/caldavtest/tests/CalDAV/sync-report.xml +++ b/apps/dav/tests/travis/caldavtest/tests/CalDAV/sync-report.xml @@ -26,8 +26,12 @@ <start> <request end-delete="yes"> - <method>MKCALENDAR</method> + <method>MKCOL</method> <ruri>$calendarhome1:/synccalendar1/</ruri> + <data> + <content-type>application/xml; charset="utf-8"</content-type> + <filepath>Resource/CalDAV/reports/put/1.xml</filepath> + </data> </request> <request> <method>PUT</method> @@ -46,8 +50,12 @@ </data> </request> <request end-delete="yes"> - <method>MKCALENDAR</method> + <method>MKCOL</method> <ruri>$calendarhome1:/synccalendar2/</ruri> + <data> + <content-type>application/xml; charset="utf-8"</content-type> + <filepath>Resource/CalDAV/reports/put/1.xml</filepath> + </data> </request> <request> <method>PUT</method> @@ -101,67 +109,6 @@ </verify> </request> </test> - <test name='2'> - <description>On calendar-home</description> - <request> - <method>PROPFIND</method> - <ruri>$calendarhome1:/</ruri> - <header> - <name>Depth</name> - <value>0</value> - </header> - <data> - <content-type>text/xml; charset=utf-8</content-type> - <filepath>Resource/CalDAV/reports/sync/1.xml</filepath> - </data> - <verify> - <require-feature> - <feature>sync-report-home</feature> - </require-feature> - <callback>xmlElementMatch</callback> - <arg> - <name>exists</name> - <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value> - <value>$verify-property-prefix:/{DAV:}sync-token[+data:,]</value> - </arg> - </verify> - <verify> - <require-feature> - <feature>sync-report-home</feature> - </require-feature> - <callback>propfindItems</callback> - <arg> - <name>okprops</name> - <value>{DAV:}supported-report-set</value> - <value>{DAV:}sync-token</value> - </arg> - </verify> - <verify> - <exclude-feature> - <feature>sync-report-home</feature> - </exclude-feature> - <callback>xmlElementMatch</callback> - <arg> - <name>notexists</name> - <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value> - </arg> - </verify> - <verify> - <exclude-feature> - <feature>sync-report-home</feature> - </exclude-feature> - <callback>propfindItems</callback> - <arg> - <name>okprops</name> - <value>{DAV:}supported-report-set</value> - </arg> - <arg> - <name>badprops</name> - <value>{DAV:}sync-token</value> - </arg> - </verify> - </request> - </test> <test name='3'> <description>On calendar</description> <request> @@ -180,37 +127,7 @@ <arg> <name>exists</name> <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value> - <value>$verify-property-prefix:/{DAV:}sync-token[+data:,]</value> - </arg> - </verify> - <verify> - <callback>propfindItems</callback> - <arg> - <name>okprops</name> - <value>{DAV:}supported-report-set</value> - <value>{DAV:}sync-token</value> - </arg> - </verify> - </request> - </test> - <test name='4'> - <description>On inbox</description> - <request> - <method>PROPFIND</method> - <ruri>$inboxpath1:/</ruri> - <header> - <name>Depth</name> - <value>0</value> - </header> - <data> - <content-type>text/xml; charset=utf-8</content-type> - <filepath>Resource/CalDAV/reports/sync/1.xml</filepath> - </data> - <verify> - <callback>xmlElementMatch</callback> - <arg> - <name>exists</name> - <value>$verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection</value> + <!--<value>$verify-property-prefix:/{DAV:}sync-token[+data:,]</value>--> </arg> </verify> <verify> @@ -223,23 +140,6 @@ </verify> </request> </test> - <test name='5'> - <require-feature> - <feature>sync-report-home</feature> - </require-feature> - <description>Look for options header tag on principal</description> - <request> - <method>OPTIONS</method> - <ruri>$principal1:</ruri> - <verify> - <callback>header</callback> - <arg> - <name>header</name> - <value>*DAV$.*calendarserver-home-sync[^-]*</value> - </arg> - </verify> - </request> - </test> </test-suite> <test-suite name='simple reports - sync-level'> @@ -458,7 +358,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -600,28 +499,6 @@ </verify> </request> </test> - <test name='13'> - <description>Bad sync-level</description> - <request> - <method>REPORT</method> - <ruri>$calendarhome1:/synccalendar1/</ruri> - <header> - <name>Depth</name> - <value>0</value> - </header> - <data> - <content-type>text/xml; charset=utf-8</content-type> - <filepath>Resource/CalDAV/reports/sync/10.xml</filepath> - </data> - <verify> - <callback>statusCode</callback> - <arg> - <name>status</name> - <value>400</value> - </arg> - </verify> - </request> - </test> </test-suite> <test-suite name='simple reports - empty token - no props'> @@ -642,7 +519,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -746,7 +622,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> <value>3.ics</value> @@ -848,7 +723,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -952,7 +826,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -1045,7 +918,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -1227,7 +1099,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -1270,7 +1141,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> <value>3.ics</value> @@ -1310,7 +1180,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -1353,7 +1222,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -1388,7 +1256,6 @@ <callback>multistatusItems</callback> <arg> <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> <value>1.ics</value> <value>2.ics</value> </arg> @@ -2827,31 +2694,6 @@ </test> </test-suite> - <test-suite name='simple reports - empty inbox'> - <test name='1'> - <description>initial query</description> - <request> - <method>REPORT</method> - <ruri>$inboxpath1:/</ruri> - <header> - <name>Depth</name> - <value>1</value> - </header> - <data> - <content-type>text/xml; charset=utf-8</content-type> - <filepath>Resource/CalDAV/reports/sync/2.xml</filepath> - </data> - <verify> - <callback>multistatusItems</callback> - <arg> - <name>okhrefs</name> - <value>$calendar_sync_extra_items:</value> - </arg> - </verify> - </request> - </test> - </test-suite> - <test-suite name='simple reports - valid token'> <test name='1'> <description>initial query</description> @@ -2872,6 +2714,10 @@ <name>error</name> <value>{DAV:}valid-sync-token</value> </arg> + <arg> + <name>ignoreextras</name> + <value>{http://sabredav.org/ns}message</value> + </arg> </verify> </request> </test> @@ -3478,35 +3324,6 @@ </test> </test-suite> - - <test-suite name='limited reports'> - <test name='1'> - <exclude-feature> - <feature>sync-report-limit</feature> - </exclude-feature> - <description>Limit not allowed</description> - <request> - <method>REPORT</method> - <ruri>$calendarhome1:/</ruri> - <header> - <name>Depth</name> - <value>0</value> - </header> - <data> - <content-type>text/xml; charset=utf-8</content-type> - <filepath>Resource/CalDAV/reports/sync/21.xml</filepath> - </data> - <verify> - <callback>prepostcondition</callback> - <arg> - <name>error</name> - <value>{DAV:}number-of-matches-within-limits</value> - </arg> - </verify> - </request> - </test> - </test-suite> - <end/> </caldavtest> diff --git a/apps/dav/tests/travis/caldavtest/tests/CardDAV/sharing-addressbooks.xml b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sharing-addressbooks.xml new file mode 100644 index 00000000000..046c3d59dbd --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sharing-addressbooks.xml @@ -0,0 +1,246 @@ +<?xml version="1.0" standalone="no"?> + +<!DOCTYPE caldavtest SYSTEM "caldavtest.dtd"> + +<caldavtest> + <description>Test addressbook sharing</description> + + <require-feature> + <feature>carddav</feature> + </require-feature> + + <start> + </start> + + <test-suite name='Read-write addressbook'> + <test name='1'> + <description>POST invitation</description> + <request> + <method>POST</method> + <ruri>$addressbookpath1:</ruri> + <data> + <content-type>text/xml; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/1.xml</filepath> + </data> + <verify> + <callback>statusCode</callback> + </verify> + </request> + </test> + <test name='4'> + <description>Shared addressbook exists</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>PROPFIND</method> + <ruri>$addressbookpath1:/</ruri> + <header> + <name>Depth</name> + <value>0</value> + </header> + <data> + <content-type>text/xml; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath> + </data> + <verify> + <callback>xmlElementMatch</callback> + <arg> + <name>exists</name> + <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value> + <value>$verify-property-prefix:/{DAV:}resourcetype/{DAV:}collection</value> + <value>$verify-property-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:carddav}addressbook</value> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value> + </arg> + <arg> + <name>notexists</name> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value> + <value>$verify-property-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value> + </arg> + </verify> + </request> + </test> + + <test name='4a'> + <description>Shared calendar exists Depth:1</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>PROPFIND</method> + <ruri>$addressbookhome2:/</ruri> + <header> + <name>Depth</name> + <value>1</value> + </header> + <data> + <content-type>text/xml; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath> + </data> + <verify> + <callback>xmlElementMatch</callback> + <arg> + <name>parent</name> + <value>$multistatus-response-prefix:[^{DAV:}href=$addressbookhome2:/ade1a55d408167e8ff77611c0eebe8f80579b549/]</value> + </arg> + <arg> + <name>exists</name> + <!--<value>$verify-response-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value>--> + <value>$verify-response-prefix:/{DAV:}resourcetype/{DAV:}collection</value> + <value>$verify-response-prefix:/{DAV:}resourcetype/{urn:ietf:params:xml:ns:carddav}addressbook</value> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}read</value> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}write</value> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}bind</value> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}unbind</value> + </arg> + <arg> + <name>notexists</name> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}admin</value> + <value>$verify-response-prefix:/{DAV:}current-user-privilege-set/{DAV:}privilege/{DAV:}all</value> + </arg> + </verify> + </request> + </test> + + <test name='5'> + <description>Original calendar unchanged</description> + <request> + <method>PROPFIND</method> + <ruri>$addressbookpath1:</ruri> + <header> + <name>Depth</name> + <value>0</value> + </header> + <data> + <content-type>text/xml; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/4.xml</filepath> + </data> + <verify> + <callback>xmlElementMatch</callback> + <arg> + <name>exists</name> + <value>$verify-property-prefix:/{DAV:}owner/{DAV:}href[=$principaluri1:]</value> + </arg> + </verify> + </request> + </test> + + <test name='6'> + <description>Sharee creates contact</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>PUT</method> + <ruri>$addressbookpath1:/1.vcf</ruri> + <data> + <content-type>text/vcard; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/6.vcf</filepath> + </data> + <verify> + <callback>statusCode</callback> + </verify> + </request> + </test> + + <test name='7'> + <description>Sharer sees contact</description> + <request> + <method>GET</method> + <ruri>$addressbookpath1:/1.vcf</ruri> + <verify> + <callback>addressDataMatch</callback> + <arg> + <name>filepath</name> + <value>Resource/CardDAV/sharing/read-write/6.vcf</value> + </arg> + </verify> + </request> + </test> + + <test name='8'> + <description>Sharer changes contact</description> + <request> + <method>PUT</method> + <ruri>$addressbookpath1:/1.vcf</ruri> + <data> + <content-type>text/vcard; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/7.vcf</filepath> + </data> + <verify> + <callback>statusCode</callback> + </verify> + </request> + </test> + + <test name='9'> + <description>Sharee sees changed contact</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>GET</method> + <ruri>$addressbookpath1:/1.vcf</ruri> + <verify> + <callback>addressDataMatch</callback> + <arg> + <name>filepath</name> + <value>Resource/CardDAV/sharing/read-write/7.vcf</value> + </arg> + </verify> + </request> + </test> + + <test name='10'> + <description>Sharer creates event</description> + <request> + <method>PUT</method> + <ruri>$addressbookpath1:/2.vcf</ruri> + <data> + <content-type>text/vcard; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/8.vcf</filepath> + </data> + <verify> + <callback>statusCode</callback> + </verify> + </request> + </test> + <test name='11'> + <description>Sharee sees new event</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>GET</method> + <ruri>$addressbookpath1:/2.vcf</ruri> + <verify> + <callback>addressDataMatch</callback> + <arg> + <name>filepath</name> + <value>Resource/CardDAV/sharing/read-write/8.vcf</value> + </arg> + </verify> + </request> + </test> + <test name='12'> + <description>Sharee changes event</description> + <request user="$userid2:" pswd="$pswd2:"> + <method>PUT</method> + <ruri>$addressbookpath1:/2.vcf</ruri> + <data> + <content-type>text/vcard; charset=utf-8</content-type> + <filepath>Resource/CardDAV/sharing/read-write/9.vcf</filepath> + </data> + <verify> + <callback>statusCode</callback> + </verify> + </request> + </test> + <test name='13'> + <description>Sharer sees changed event</description> + <request> + <method>GET</method> + <ruri>$addressbookpath1:/2.vcf</ruri> + <verify> + <callback>addressDataMatch</callback> + <arg> + <name>filepath</name> + <value>Resource/CardDAV/sharing/read-write/9.vcf</value> + </arg> + </verify> + </request> + </test> + </test-suite> + + <end> + </end> + +</caldavtest> diff --git a/apps/dav/tests/travis/carddav/script.sh b/apps/dav/tests/travis/carddav/script.sh index 46a6a98e273..a8bd9f11b38 100644 --- a/apps/dav/tests/travis/carddav/script.sh +++ b/apps/dav/tests/travis/carddav/script.sh @@ -9,9 +9,12 @@ sleep 30 # run the tests cd "$SCRIPTPATH/CalDAVTester" -PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/../caldavtest/config/serverinfo.xml" -o cdt.txt \ - "$SCRIPTPATH/../caldavtest/tests/CardDAV/current-user-principal.xml" \ - "$SCRIPTPATH/../caldavtest/tests/CardDAV/sync-report.xml" +PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \ + "CardDAV/current-user-principal.xml" \ + "CardDAV/sync-report.xml" \ + "CardDAV/sharing-addressbooks.xml" + + RESULT=$? tail "$/../../../../../data-autotest/owncloud.log" diff --git a/apps/dav/tests/unit/carddav/carddavbackendtest.php b/apps/dav/tests/unit/carddav/carddavbackendtest.php index 3841d1904ab..1a0d32c186c 100644 --- a/apps/dav/tests/unit/carddav/carddavbackendtest.php +++ b/apps/dav/tests/unit/carddav/carddavbackendtest.php @@ -23,6 +23,7 @@ namespace OCA\DAV\Tests\Unit\CardDAV; use InvalidArgumentException; +use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\Connector\Sabre\Principal; use OCP\IDBConnection; @@ -217,6 +218,47 @@ class CardDavBackendTest extends TestCase { $this->assertEquals(0, count($cards)); } + public function testDeleteWithoutCard() { + + $this->backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') + ->setConstructorArgs([$this->db, $this->principal]) + ->setMethods([ + 'getCardId', + 'addChange', + 'purgeProperties', + 'updateProperties', + ]) + ->getMock(); + + // create a new address book + $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); + $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($books)); + + $bookId = $books[0]['id']; + $uri = $this->getUniqueID('card'); + + // create a new address book + $this->backend->expects($this->once()) + ->method('getCardId') + ->with($uri) + ->willThrowException(new \InvalidArgumentException()); + $this->backend->expects($this->exactly(2)) + ->method('addChange') + ->withConsecutive( + [$bookId, $uri, 1], + [$bookId, $uri, 3] + ); + $this->backend->expects($this->never()) + ->method('purgeProperties'); + + // create a card + $this->backend->createCard($bookId, $uri, ''); + + // delete the card + $this->assertTrue($this->backend->deleteCard($bookId, $uri)); + } + public function testSyncSupport() { $this->backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend') @@ -247,23 +289,24 @@ class CardDavBackendTest extends TestCase { $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); - $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []); + $exampleBook = new AddressBook($this->backend, $books[0]); + $this->backend->updateShares($exampleBook, [['href' => 'principal:principals/best-friend']], []); - $shares = $this->backend->getShares('Example'); + $shares = $this->backend->getShares($exampleBook->getBookId()); $this->assertEquals(1, count($shares)); // adding the same sharee again has no effect - $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []); + $this->backend->updateShares($exampleBook, [['href' => 'principal:principals/best-friend']], []); - $shares = $this->backend->getShares('Example'); + $shares = $this->backend->getShares($exampleBook->getBookId()); $this->assertEquals(1, count($shares)); $books = $this->backend->getAddressBooksForUser('principals/best-friend'); $this->assertEquals(1, count($books)); - $this->backend->updateShares('Example', [], ['principal:principals/best-friend']); + $this->backend->updateShares($exampleBook, [], ['principal:principals/best-friend']); - $shares = $this->backend->getShares('Example'); + $shares = $this->backend->getShares($exampleBook->getBookId()); $this->assertEquals(0, count($shares)); $books = $this->backend->getAddressBooksForUser('principals/best-friend'); diff --git a/apps/dav/tests/unit/carddav/sharing/plugintest.php b/apps/dav/tests/unit/carddav/sharing/plugintest.php index 3dce0fb6083..19ee075fb4f 100644 --- a/apps/dav/tests/unit/carddav/sharing/plugintest.php +++ b/apps/dav/tests/unit/carddav/sharing/plugintest.php @@ -74,7 +74,7 @@ class PluginTest extends TestCase { $request = new Request(); $request->addHeader('Content-Type', 'application/xml'); $request->setUrl('addressbook1.vcf'); - $request->setBody('<?xml version="1.0" encoding="utf-8" ?><CS:share xmlns:D="DAV:" xmlns:CS="urn:ietf:params:xml:ns:carddav"><CS:set><D:href>principal:principals/admin</D:href><CS:read-write/></CS:set> <CS:remove><D:href>mailto:wilfredo@example.com</D:href></CS:remove></CS:share>'); + $request->setBody('<?xml version="1.0" encoding="utf-8" ?><CS:share xmlns:D="DAV:" xmlns:CS="http://owncloud.org/ns"><CS:set><D:href>principal:principals/admin</D:href><CS:read-write/></CS:set> <CS:remove><D:href>mailto:wilfredo@example.com</D:href></CS:remove></CS:share>'); $response = new Response(); $this->plugin->httpPost($request, $response); } diff --git a/apps/dav/tests/unit/carddav/syncservicetest.php b/apps/dav/tests/unit/carddav/syncservicetest.php index a6a773babc2..a6af98f7e8c 100644 --- a/apps/dav/tests/unit/carddav/syncservicetest.php +++ b/apps/dav/tests/unit/carddav/syncservicetest.php @@ -20,6 +20,8 @@ */ namespace OCA\DAV\CardDAV; +use OCP\IUser; +use OCP\IUserManager; use Test\TestCase; class SyncServiceTest extends TestCase { @@ -57,6 +59,49 @@ class SyncServiceTest extends TestCase { $this->assertEquals('sync-token-1', $return); } + public function testEnsureSystemAddressBookExists() { + /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ + $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + $backend->expects($this->exactly(1))->method('createAddressBook'); + $backend->expects($this->at(0))->method('getAddressBooksByUri')->willReturn(null); + $backend->expects($this->at(1))->method('getAddressBooksByUri')->willReturn([]); + + /** @var IUserManager $userManager */ + $userManager = $this->getMockBuilder('OCP\IUserManager')->disableOriginalConstructor()->getMock(); + $ss = new SyncService($backend, $userManager); + $book = $ss->ensureSystemAddressBookExists('principals/users/adam', 'contacts', []); + } + + public function testUpdateAndDeleteUser() { + /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ + $backend = $this->getMockBuilder('OCA\DAV\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock(); + + $backend->expects($this->once())->method('createCard'); + $backend->expects($this->once())->method('updateCard'); + $backend->expects($this->once())->method('deleteCard'); + + $backend->method('getCard')->willReturnOnConsecutiveCalls(false, [ + 'carddata' => "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:test-user\r\nFN:test-user\r\nN:test-user;;;;\r\nEND:VCARD\r\n\r\n" + ]); + + /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */ + $userManager = $this->getMockBuilder('OCP\IUserManager')->disableOriginalConstructor()->getMock(); + + /** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */ + $user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); + $user->method('getBackendClassName')->willReturn('unittest'); + $user->method('getUID')->willReturn('test-user'); + + $ss = new SyncService($backend, $userManager); + $ss->updateUser($user); + + $user->method('getDisplayName')->willReturn('A test user for unit testing'); + + $ss->updateUser($user); + + $ss->deleteUser($user); + } + /** * @param int $createCount * @param int $updateCount @@ -77,8 +122,9 @@ class SyncServiceTest extends TestCase { * @return SyncService|\PHPUnit_Framework_MockObject_MockObject */ private function getSyncServiceMock($backend, $response) { + $userManager = $this->getMockBuilder('OCP\IUserManager')->disableOriginalConstructor()->getMock(); /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $ss */ - $ss = $this->getMock('OCA\DAV\CardDAV\SyncService', ['ensureSystemAddressBookExists', 'requestSyncReport', 'download'], [$backend]); + $ss = $this->getMock('OCA\DAV\CardDAV\SyncService', ['ensureSystemAddressBookExists', 'requestSyncReport', 'download'], [$backend, $userManager]); $ss->method('requestSyncReport')->withAnyParameters()->willReturn(['response' => $response, 'token' => 'sync-token-1']); $ss->method('ensureSystemAddressBookExists')->willReturn(['id' => 1]); $ss->method('download')->willReturn([ diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php index e0b459495b6..d6bc7cd405f 100644 --- a/apps/dav/tests/unit/connector/sabre/principal.php +++ b/apps/dav/tests/unit/connector/sabre/principal.php @@ -23,21 +23,28 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; +use OCP\IGroupManager; use \Sabre\DAV\PropPatch; use OCP\IUserManager; -use OCP\IConfig; +use Test\TestCase; -class Principal extends \Test\TestCase { - /** @var IUserManager */ +class Principal extends TestCase { + /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */ private $userManager; /** @var \OCA\DAV\Connector\Sabre\Principal */ private $connector; + /** @var IGroupManager | \PHPUnit_Framework_MockObject_MockObject */ + private $groupManager; public function setUp() { $this->userManager = $this->getMockBuilder('\OCP\IUserManager') ->disableOriginalConstructor()->getMock(); + $this->groupManager = $this->getMockBuilder('\OCP\IGroupManager') + ->disableOriginalConstructor()->getMock(); - $this->connector = new \OCA\DAV\Connector\Sabre\Principal($this->userManager); + $this->connector = new \OCA\DAV\Connector\Sabre\Principal( + $this->userManager, + $this->groupManager); parent::setUp(); } @@ -195,15 +202,14 @@ class Principal extends \Test\TestCase { public function testGetGroupMembership() { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); - $fooUser - ->expects($this->exactly(1)) - ->method('getUID') - ->will($this->returnValue('foo')); $this->userManager ->expects($this->once()) ->method('get') ->with('foo') - ->will($this->returnValue($fooUser)); + ->willReturn($fooUser); + $this->groupManager + ->method('getUserGroups') + ->willReturn([]); $expectedResponse = [ 'principals/users/foo/calendar-proxy-read', diff --git a/apps/dav/tests/unit/systemtag/systemtagplugin.php b/apps/dav/tests/unit/systemtag/systemtagplugin.php index e0fbd40f5b9..1d22af75188 100644 --- a/apps/dav/tests/unit/systemtag/systemtagplugin.php +++ b/apps/dav/tests/unit/systemtag/systemtagplugin.php @@ -201,7 +201,7 @@ class SystemTagPlugin extends \Test\TestCase { $response->expects($this->once()) ->method('setHeader') - ->with('Location', 'http://example.com/dav/systemtags/1'); + ->with('Content-Location', 'http://example.com/dav/systemtags/1'); $this->plugin->httpPost($request, $response); } @@ -266,7 +266,7 @@ class SystemTagPlugin extends \Test\TestCase { $response->expects($this->once()) ->method('setHeader') - ->with('Location', 'http://example.com/dav/systemtags/1'); + ->with('Content-Location', 'http://example.com/dav/systemtags/1'); $this->plugin->httpPost($request, $response); } diff --git a/apps/encryption/l10n/pt_PT.js b/apps/encryption/l10n/pt_PT.js index a9e3c8bbbb4..c30f81065fa 100644 --- a/apps/encryption/l10n/pt_PT.js +++ b/apps/encryption/l10n/pt_PT.js @@ -25,11 +25,15 @@ OC.L10N.register( "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente", "Encryption App is enabled and ready" : "A aplicação de encriptação está ativa e pronta", + "one-time password for server-side-encryption" : "palavra-passe de uso único para encriptação do lado do servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n", "The share will expire on %s." : "Esta partilha irá expirar em %s.", "Cheers!" : "Parabéns!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.<br><br>", "Encrypt the home storage" : "Encriptar o armazenamento do início", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo", "Enable recovery key" : "Ativar a chave de recuperação", "Disable recovery key" : "Desativar a chave de recuperação", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar os ficheiros. Esta permite a recuperação dos ficheiros do utilizador se este esquecer a sua senha.", diff --git a/apps/encryption/l10n/pt_PT.json b/apps/encryption/l10n/pt_PT.json index e744a7bac6f..34086acf56c 100644 --- a/apps/encryption/l10n/pt_PT.json +++ b/apps/encryption/l10n/pt_PT.json @@ -23,11 +23,15 @@ "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente", "Encryption App is enabled and ready" : "A aplicação de encriptação está ativa e pronta", + "one-time password for server-side-encryption" : "palavra-passe de uso único para encriptação do lado do servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n", "The share will expire on %s." : "Esta partilha irá expirar em %s.", "Cheers!" : "Parabéns!", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica ownCloud' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.<br><br>", "Encrypt the home storage" : "Encriptar o armazenamento do início", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo", "Enable recovery key" : "Ativar a chave de recuperação", "Disable recovery key" : "Desativar a chave de recuperação", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar os ficheiros. Esta permite a recuperação dos ficheiros do utilizador se este esquecer a sua senha.", diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 9588faebc3b..61148428f79 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -682,8 +682,6 @@ table tr.summary td { margin-left: 90px; } -#scanning-message{ top:40%; left:40%; position:absolute; display:none; } - table.dragshadow { width:auto; } diff --git a/apps/files/l10n/af_ZA.js b/apps/files/l10n/af_ZA.js index ddc06b6c11f..7e5e98ed493 100644 --- a/apps/files/l10n/af_ZA.js +++ b/apps/files/l10n/af_ZA.js @@ -1,6 +1,7 @@ OC.L10N.register( "files", { + "Unshare" : "Deel terug neem", "Folder" : "Omslag", "Settings" : "Instellings" }, diff --git a/apps/files/l10n/af_ZA.json b/apps/files/l10n/af_ZA.json index bad49a673e0..1f27a43719c 100644 --- a/apps/files/l10n/af_ZA.json +++ b/apps/files/l10n/af_ZA.json @@ -1,4 +1,5 @@ { "translations": { + "Unshare" : "Deel terug neem", "Folder" : "Omslag", "Settings" : "Instellings" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 021c6b52b32..a2329a0b57d 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -90,8 +90,6 @@ OC.L10N.register( "Select all" : "تحديد الكل ", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", - "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", - "Currently scanning" : "حالياً يقوم بالفحص", "No favorites" : "لا يوجد مفضلات ", "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ", "Text file" : "ملف نصي", diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 53385598c24..fbc3f2e21d5 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -88,8 +88,6 @@ "Select all" : "تحديد الكل ", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", - "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", - "Currently scanning" : "حالياً يقوم بالفحص", "No favorites" : "لا يوجد مفضلات ", "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ", "Text file" : "ملف نصي", diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index 637adcebc75..2262d23345e 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -100,8 +100,6 @@ OC.L10N.register( "Select all" : "Esbillar too", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", - "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", - "Currently scanning" : "Anguaño escaneando", "No favorites" : "Nengún favoritu", "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí", "Text file" : "Ficheru de testu", diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 352fbd9fac3..53a2c6f8d86 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -98,8 +98,6 @@ "Select all" : "Esbillar too", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", - "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", - "Currently scanning" : "Anguaño escaneando", "No favorites" : "Nengún favoritu", "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí", "Text file" : "Ficheru de testu", diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js index 302bb051407..57db9be81be 100644 --- a/apps/files/l10n/az.js +++ b/apps/files/l10n/az.js @@ -97,8 +97,6 @@ OC.L10N.register( "Select all" : "Hamısıı seç", "Upload too large" : "Yüklənmə şox böyükdür", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.", - "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", - "Currently scanning" : "Hal-hazırda skan edilir", "No favorites" : "Seçilmiş yoxdur", "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək", "Text file" : "Tekst faylı", diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json index b213c86cb2f..e1539015a83 100644 --- a/apps/files/l10n/az.json +++ b/apps/files/l10n/az.json @@ -95,8 +95,6 @@ "Select all" : "Hamısıı seç", "Upload too large" : "Yüklənmə şox böyükdür", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.", - "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", - "Currently scanning" : "Hal-hazırda skan edilir", "No favorites" : "Seçilmiş yoxdur", "Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək", "Text file" : "Tekst faylı", diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index b30f670e310..dcc4508e2e2 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Изтегли", "Rename" : "Преименуване", "Delete" : "Изтрий", + "Disconnect storage" : "Извади дисковото устройство.", + "Unshare" : "Премахване на споделяне", "Details" : "Подробности", "Select" : "Избери", "Pending" : "Чакащо", @@ -87,8 +89,6 @@ OC.L10N.register( "Select all" : "Избери всички", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", - "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", - "Currently scanning" : "В момента се търси", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", "Text file" : "Текстов файл" diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index e676d27fcba..88370db84f7 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -32,6 +32,8 @@ "Download" : "Изтегли", "Rename" : "Преименуване", "Delete" : "Изтрий", + "Disconnect storage" : "Извади дисковото устройство.", + "Unshare" : "Премахване на споделяне", "Details" : "Подробности", "Select" : "Избери", "Pending" : "Чакащо", @@ -85,8 +87,6 @@ "Select all" : "Избери всички", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", - "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", - "Currently scanning" : "В момента се търси", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", "Text file" : "Текстов файл" diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js index 0ee56888df0..e9020ade843 100644 --- a/apps/files/l10n/bn_BD.js +++ b/apps/files/l10n/bn_BD.js @@ -60,7 +60,6 @@ OC.L10N.register( "Cancel upload" : "আপলোড বাতিল কর", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", - "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।", "Text file" : "টেক্সট ফাইল" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json index 15ec2b4b826..1cd65349314 100644 --- a/apps/files/l10n/bn_BD.json +++ b/apps/files/l10n/bn_BD.json @@ -58,7 +58,6 @@ "Cancel upload" : "আপলোড বাতিল কর", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", - "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।", "Text file" : "টেক্সট ফাইল" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js index 278b6371771..a164132aeff 100644 --- a/apps/files/l10n/bs.js +++ b/apps/files/l10n/bs.js @@ -70,8 +70,6 @@ OC.L10N.register( "Select all" : "Označi sve", "Upload too large" : "Učitavanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", - "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", - "Currently scanning" : "Provjera u toku", "No favorites" : "Nema favorita", "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje", "Text file" : "Tekstualna datoteka" diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json index 678bedcbe36..3e7bb70cee8 100644 --- a/apps/files/l10n/bs.json +++ b/apps/files/l10n/bs.json @@ -68,8 +68,6 @@ "Select all" : "Označi sve", "Upload too large" : "Učitavanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", - "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", - "Currently scanning" : "Provjera u toku", "No favorites" : "Nema favorita", "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje", "Text file" : "Tekstualna datoteka" diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index 88ad7224161..70626bb1ffa 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Baixa", "Rename" : "Reanomena", "Delete" : "Esborra", + "Disconnect storage" : "Desonnecta l'emmagatzematge", + "Unshare" : "Deixa de compartir", "Details" : "Detalls", "Select" : "Selecciona", "Pending" : "Pendent", @@ -90,8 +92,6 @@ OC.L10N.register( "Select all" : "Seleccionar tot", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", - "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", - "Currently scanning" : "Actualment escanejant", "No favorites" : "No hi ha favorits", "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", "Text file" : "Fitxer de text" diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 4eee482e835..3a9dae4e75e 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -32,6 +32,8 @@ "Download" : "Baixa", "Rename" : "Reanomena", "Delete" : "Esborra", + "Disconnect storage" : "Desonnecta l'emmagatzematge", + "Unshare" : "Deixa de compartir", "Details" : "Detalls", "Select" : "Selecciona", "Pending" : "Pendent", @@ -88,8 +90,6 @@ "Select all" : "Seleccionar tot", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", - "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", - "Currently scanning" : "Actualment escanejant", "No favorites" : "No hi ha favorits", "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", "Text file" : "Fitxer de text" diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js index aa0a8515517..bf7eb4c895a 100644 --- a/apps/files/l10n/cs_CZ.js +++ b/apps/files/l10n/cs_CZ.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Vybrat vše", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", - "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", - "Currently scanning" : "Prohledává se", "No favorites" : "Žádné oblíbené", "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde", "Text file" : "Textový soubor", diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json index e2acc3b8abc..97444abc876 100644 --- a/apps/files/l10n/cs_CZ.json +++ b/apps/files/l10n/cs_CZ.json @@ -111,8 +111,6 @@ "Select all" : "Vybrat vše", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", - "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", - "Currently scanning" : "Prohledává se", "No favorites" : "Žádné oblíbené", "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde", "Text file" : "Textový soubor", diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js index 983df98f350..e3879890b86 100644 --- a/apps/files/l10n/cy_GB.js +++ b/apps/files/l10n/cy_GB.js @@ -20,6 +20,7 @@ OC.L10N.register( "Download" : "Llwytho i lawr", "Rename" : "Ailenwi", "Delete" : "Dileu", + "Unshare" : "Dad-rannu", "Details" : "Manylion", "Pending" : "I ddod", "Name" : "Enw", @@ -39,7 +40,6 @@ OC.L10N.register( "Cancel upload" : "Diddymu llwytho i fyny", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", - "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.", "Text file" : "Ffeil destun" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json index b8b87b31dea..7d217d631ae 100644 --- a/apps/files/l10n/cy_GB.json +++ b/apps/files/l10n/cy_GB.json @@ -18,6 +18,7 @@ "Download" : "Llwytho i lawr", "Rename" : "Ailenwi", "Delete" : "Dileu", + "Unshare" : "Dad-rannu", "Details" : "Manylion", "Pending" : "I ddod", "Name" : "Enw", @@ -37,7 +38,6 @@ "Cancel upload" : "Diddymu llwytho i fyny", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", - "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.", "Text file" : "Ffeil destun" },"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/files/l10n/da.js b/apps/files/l10n/da.js index 2c27835f917..6b406fed534 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Download", "Rename" : "Omdøb", "Delete" : "Slet", + "Disconnect storage" : "Frakobl lager", + "Unshare" : "Fjern deling", "Details" : "Detaljer", "Select" : "Vælg", "Pending" : "Afventer", @@ -98,8 +100,6 @@ OC.L10N.register( "Select all" : "Vælg alle", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", - "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", - "Currently scanning" : "Skanning er i gang", "No favorites" : "Ingen foretrukne", "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her", "Text file" : "Tekstfil", diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index 33663829721..e186674656c 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -32,6 +32,8 @@ "Download" : "Download", "Rename" : "Omdøb", "Delete" : "Slet", + "Disconnect storage" : "Frakobl lager", + "Unshare" : "Fjern deling", "Details" : "Detaljer", "Select" : "Vælg", "Pending" : "Afventer", @@ -96,8 +98,6 @@ "Select all" : "Vælg alle", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", - "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", - "Currently scanning" : "Skanning er i gang", "No favorites" : "Ingen foretrukne", "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her", "Text file" : "Tekstfil", diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index 966c94e182c..960edf5b718 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -111,8 +111,6 @@ OC.L10N.register( "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen", "Text file" : "Textdatei", diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 9d40e2dc31b..3d1e061781e 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -109,8 +109,6 @@ "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen", "Text file" : "Textdatei", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 517799c1bcb..15b82e0f181 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -109,8 +109,6 @@ OC.L10N.register( "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen", "Text file" : "Textdatei", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 90e499bec2f..87e47454b62 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -107,8 +107,6 @@ "Select all" : "Alle auswählen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen", "Text file" : "Textdatei", diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index 265381cd670..20b57e415b0 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -109,8 +109,6 @@ OC.L10N.register( "Select all" : "Επιλογή όλων", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", - "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", - "Currently scanning" : "Σάρωση σε εξέλιξη", "No favorites" : "Δεν υπάρχουν αγαπημένα", "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ", "Text file" : "Αρχείο κειμένου", diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 1f0d997b3da..849b0ee8a09 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -107,8 +107,6 @@ "Select all" : "Επιλογή όλων", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", - "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", - "Currently scanning" : "Σάρωση σε εξέλιξη", "No favorites" : "Δεν υπάρχουν αγαπημένα", "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ", "Text file" : "Αρχείο κειμένου", diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index 96c5acf9170..03358df97a7 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -90,8 +90,6 @@ OC.L10N.register( "Select all" : "Select all", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", - "Files are being scanned, please wait." : "Files are being scanned, please wait.", - "Currently scanning" : "Currently scanning", "No favorites" : "No favourites", "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here", "Text file" : "Text file" diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index 4b0762f8b70..f7b5e5e76f8 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -88,8 +88,6 @@ "Select all" : "Select all", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", - "Files are being scanned, please wait." : "Files are being scanned, please wait.", - "Currently scanning" : "Currently scanning", "No favorites" : "No favourites", "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here", "Text file" : "Text file" diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index 398d2f669b0..4d52e391112 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -68,7 +68,6 @@ OC.L10N.register( "Select all" : "Elekti ĉion", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", - "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.", "Text file" : "Tekstodosiero" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index 2a76d0ab2c9..844da285e2b 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -66,7 +66,6 @@ "Select all" : "Elekti ĉion", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", - "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.", "Text file" : "Tekstodosiero" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 449334e7cc5..9b8b43ad5a1 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Seleccionar todo", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", - "Currently scanning" : "Escaneando en este momento", "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", "Text file" : "Archivo de texto", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 7d0d2be207c..f0649db14b2 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -111,8 +111,6 @@ "Select all" : "Seleccionar todo", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", - "Currently scanning" : "Escaneando en este momento", "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", "Text file" : "Archivo de texto", diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js index 6c6b0d49853..bd4504592f1 100644 --- a/apps/files/l10n/es_AR.js +++ b/apps/files/l10n/es_AR.js @@ -34,6 +34,7 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Cambiar nombre", "Delete" : "Borrar", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", @@ -73,7 +74,6 @@ OC.L10N.register( "Cancel upload" : "Cancelar subida", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", - "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.", "Text file" : "Archivo de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json index ad492b4048a..81898bf489d 100644 --- a/apps/files/l10n/es_AR.json +++ b/apps/files/l10n/es_AR.json @@ -32,6 +32,7 @@ "Download" : "Descargar", "Rename" : "Cambiar nombre", "Delete" : "Borrar", + "Unshare" : "Dejar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", @@ -71,7 +72,6 @@ "Cancel upload" : "Cancelar subida", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", - "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.", "Text file" : "Archivo de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 9d4924d1d50..780c206c622 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -60,7 +60,6 @@ OC.L10N.register( "Cancel upload" : "Cancelar subida", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", "Text file" : "Archivo de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 9abf30f0c7c..17d5cb74e87 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -58,7 +58,6 @@ "Cancel upload" : "Cancelar subida", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", "Text file" : "Archivo de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index f577fa663fc..5c59cf614b7 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -100,8 +100,6 @@ OC.L10N.register( "Select all" : "Vali kõik", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", - "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", - "Currently scanning" : "Praegu skännimisel", "No favorites" : "Lemmikuid pole", "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks", "Text file" : "Tekstifail", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index 078b8d2d6d7..f438d07cdc8 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -98,8 +98,6 @@ "Select all" : "Vali kõik", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", - "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", - "Currently scanning" : "Praegu skännimisel", "No favorites" : "Lemmikuid pole", "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks", "Text file" : "Tekstifail", diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index d7b9935ac5e..16d681ebeab 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -86,8 +86,6 @@ OC.L10N.register( "Select all" : "Hautatu dena", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", - "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", - "Currently scanning" : "Eskaneatzen une honetan", "No favorites" : "Gogokorik ez", "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira", "Text file" : "Testu fitxategia" diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index 71dc13b5741..f23d06bb5db 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -84,8 +84,6 @@ "Select all" : "Hautatu dena", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", - "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", - "Currently scanning" : "Eskaneatzen une honetan", "No favorites" : "Gogokorik ez", "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira", "Text file" : "Testu fitxategia" diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 5f6c49e742a..0d6086e0900 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -98,8 +98,6 @@ OC.L10N.register( "Select all" : "انتخاب همه", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", - "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", - "Currently scanning" : "در حال اسکن", "No favorites" : "هیچ برگزیده", "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود", "Text file" : "فایل متنی" diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index a4d0add25ba..109dfbdb585 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -96,8 +96,6 @@ "Select all" : "انتخاب همه", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", - "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", - "Currently scanning" : "در حال اسکن", "No favorites" : "هیچ برگزیده", "Files and folders you mark as favorite will show up here" : "فایلها و پوشههای انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده میشود", "Text file" : "فایل متنی" diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index 5e1327f7556..62386eb781d 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Valitse kaikki", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", - "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", - "Currently scanning" : "Tutkitaan parhaillaan", "No favorites" : "Ei suosikkeja", "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", "Text file" : "Tekstitiedosto", diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index baf6c5d4499..0484e85edd2 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -111,8 +111,6 @@ "Select all" : "Valitse kaikki", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", - "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", - "Currently scanning" : "Tutkitaan parhaillaan", "No favorites" : "Ei suosikkeja", "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", "Text file" : "Tekstitiedosto", diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 16f95572933..7521e95d3cd 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Tout sélectionner", "Upload too large" : "Téléversement trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", - "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", - "Currently scanning" : "Analyse en cours", "No favorites" : "Aucun favori", "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici", "Text file" : "Fichier texte", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 3f8cdf95538..79e8cd78fe6 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -111,8 +111,6 @@ "Select all" : "Tout sélectionner", "Upload too large" : "Téléversement trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", - "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", - "Currently scanning" : "Analyse en cours", "No favorites" : "Aucun favori", "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici", "Text file" : "Fichier texte", diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index 3b71b1669e7..e463ef16b3d 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Renomear", "Delete" : "Eliminar", + "Disconnect storage" : "Desconectar o almacenamento", + "Unshare" : "Deixar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendentes", @@ -94,8 +96,6 @@ OC.L10N.register( "Select all" : "Seleccionar todo", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", - "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", - "Currently scanning" : "Análise actual", "No favorites" : "Non hai favoritos", "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí", "Text file" : "Ficheiro de texto" diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index 73e6e523e44..418767c5167 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -32,6 +32,8 @@ "Download" : "Descargar", "Rename" : "Renomear", "Delete" : "Eliminar", + "Disconnect storage" : "Desconectar o almacenamento", + "Unshare" : "Deixar de compartir", "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendentes", @@ -92,8 +94,6 @@ "Select all" : "Seleccionar todo", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", - "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", - "Currently scanning" : "Análise actual", "No favorites" : "Non hai favoritos", "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí", "Text file" : "Ficheiro de texto" diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index a13de0027cf..ceb7ae68032 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -112,8 +112,6 @@ OC.L10N.register( "Select all" : "לבחור הכול", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", - "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.", - "Currently scanning" : "בסריקה כרגע", "No favorites" : "אין מועדפים", "Files and folders you mark as favorite will show up here" : "קבצים ותיקיות שסומנו על ידך כמועדפים יוצגו כאן", "Text file" : "קובץ טקסט", diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index dc470432c51..5279886e423 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -110,8 +110,6 @@ "Select all" : "לבחור הכול", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", - "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.", - "Currently scanning" : "בסריקה כרגע", "No favorites" : "אין מועדפים", "Files and folders you mark as favorite will show up here" : "קבצים ותיקיות שסומנו על ידך כמועדפים יוצגו כאן", "Text file" : "קובץ טקסט", diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index 6f27879f125..746ee8ded91 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Preuzimanje", "Rename" : "Preimenujte", "Delete" : "Izbrišite", + "Disconnect storage" : "Isključite pohranu", + "Unshare" : "Prestanite dijeliti", "Details" : "Detalji", "Select" : "Selektiraj", "Pending" : "Na čekanju", @@ -84,8 +86,6 @@ OC.L10N.register( "Select all" : "Selektiraj sve", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", - "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", - "Currently scanning" : "Provjera u tijeku", "No favorites" : "Nema favorita", "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje", "Text file" : "Tekstualna datoteka" diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index 9377b55ef6f..35bc43df7e0 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -32,6 +32,8 @@ "Download" : "Preuzimanje", "Rename" : "Preimenujte", "Delete" : "Izbrišite", + "Disconnect storage" : "Isključite pohranu", + "Unshare" : "Prestanite dijeliti", "Details" : "Detalji", "Select" : "Selektiraj", "Pending" : "Na čekanju", @@ -82,8 +84,6 @@ "Select all" : "Selektiraj sve", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", - "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", - "Currently scanning" : "Provjera u tijeku", "No favorites" : "Nema favorita", "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje", "Text file" : "Tekstualna datoteka" diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js index 321a02235b2..399c70932b7 100644 --- a/apps/files/l10n/hu_HU.js +++ b/apps/files/l10n/hu_HU.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Összes kijelölése", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", - "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", - "Currently scanning" : "Mappaellenőrzés: ", "No favorites" : "Nincsenek kedvencek", "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", "Text file" : "Szövegfájl", diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json index d54eb151ae1..fdad8332499 100644 --- a/apps/files/l10n/hu_HU.json +++ b/apps/files/l10n/hu_HU.json @@ -111,8 +111,6 @@ "Select all" : "Összes kijelölése", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", - "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", - "Currently scanning" : "Mappaellenőrzés: ", "No favorites" : "Nincsenek kedvencek", "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", "Text file" : "Szövegfájl", diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index 07b33195d48..c67a74e43da 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -100,8 +100,6 @@ OC.L10N.register( "Select all" : "Pilih Semua", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", - "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", - "Currently scanning" : "Pemindaian terbaru", "No favorites" : "Tidak ada favorit", "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.", "Text file" : "Berkas teks", diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index efe7c4559e7..68f01e0393a 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -98,8 +98,6 @@ "Select all" : "Pilih Semua", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", - "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", - "Currently scanning" : "Pemindaian terbaru", "No favorites" : "Tidak ada favorit", "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.", "Text file" : "Berkas teks", diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index b768e0dfc75..ed1fce950b7 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -41,7 +41,6 @@ OC.L10N.register( "Select all" : "Velja allt", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", - "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.", "Text file" : "Texta skrá" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index b8f53405847..266a4f054bc 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -39,7 +39,6 @@ "Select all" : "Velja allt", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", - "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.", "Text file" : "Texta skrá" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index d3a567e1d18..57e78597c54 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Seleziona tutto", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", - "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", - "Currently scanning" : "Scansione in corso", "No favorites" : "Nessun preferito", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Text file" : "File di testo", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 611de295147..cdd7366fcc5 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -111,8 +111,6 @@ "Select all" : "Seleziona tutto", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", - "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", - "Currently scanning" : "Scansione in corso", "No favorites" : "Nessun preferito", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Text file" : "File di testo", diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index cd6f45f27b9..deb3a35b635 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "ダウンロード", "Rename" : "名前の変更", "Delete" : "削除", + "Disconnect storage" : "ストレージを切断する", + "Unshare" : "共有解除", "Details" : "詳細", "Select" : "選択", "Pending" : "中断", @@ -111,8 +113,6 @@ OC.L10N.register( "Select all" : "すべて選択", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", - "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", - "Currently scanning" : "現在スキャン中", "No favorites" : "お気に入りなし", "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", "Text file" : "テキストファイル", diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index 01d93403c20..aa3c45dcaa3 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -32,6 +32,8 @@ "Download" : "ダウンロード", "Rename" : "名前の変更", "Delete" : "削除", + "Disconnect storage" : "ストレージを切断する", + "Unshare" : "共有解除", "Details" : "詳細", "Select" : "選択", "Pending" : "中断", @@ -109,8 +111,6 @@ "Select all" : "すべて選択", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", - "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", - "Currently scanning" : "現在スキャン中", "No favorites" : "お気に入りなし", "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", "Text file" : "テキストファイル", diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js index f5a57f44266..c54da5a206d 100644 --- a/apps/files/l10n/ka_GE.js +++ b/apps/files/l10n/ka_GE.js @@ -22,6 +22,7 @@ OC.L10N.register( "Download" : "ჩამოტვირთვა", "Rename" : "გადარქმევა", "Delete" : "წაშლა", + "Unshare" : "გაუზიარებადი", "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", "Name" : "სახელი", @@ -44,7 +45,6 @@ OC.L10N.register( "Cancel upload" : "ატვირთვის გაუქმება", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", - "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.", "Text file" : "ტექსტური ფაილი" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json index cb8f6dce6fd..cdc9cd03126 100644 --- a/apps/files/l10n/ka_GE.json +++ b/apps/files/l10n/ka_GE.json @@ -20,6 +20,7 @@ "Download" : "ჩამოტვირთვა", "Rename" : "გადარქმევა", "Delete" : "წაშლა", + "Unshare" : "გაუზიარებადი", "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", "Name" : "სახელი", @@ -42,7 +43,6 @@ "Cancel upload" : "ატვირთვის გაუქმება", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", - "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.", "Text file" : "ტექსტური ფაილი" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js index f9fb8977f93..1e97d7ffa79 100644 --- a/apps/files/l10n/kn.js +++ b/apps/files/l10n/kn.js @@ -55,8 +55,6 @@ OC.L10N.register( "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", - "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", - "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ", "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ" diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json index 12446a3f8b4..9ebd3cb619b 100644 --- a/apps/files/l10n/kn.json +++ b/apps/files/l10n/kn.json @@ -53,8 +53,6 @@ "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", - "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", - "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ", "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ" diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index e6d0f0a1b89..3bac96b5eb8 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -100,8 +100,6 @@ OC.L10N.register( "Select all" : "모두 선택", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", - "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", - "Currently scanning" : "현재 검사 중", "No favorites" : "책갈피 없음", "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", "Text file" : "텍스트 파일", diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index e695b9cd42c..e42745fc8b4 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -98,8 +98,6 @@ "Select all" : "모두 선택", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", - "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", - "Currently scanning" : "현재 검사 중", "No favorites" : "책갈피 없음", "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", "Text file" : "텍스트 파일", diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 39e12b763cd..c6ee76819ec 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -17,6 +17,7 @@ OC.L10N.register( "Download" : "Download", "Rename" : "Ëmbenennen", "Delete" : "Läschen", + "Unshare" : "Net méi deelen", "Details" : "Detailer", "Select" : "Auswielen", "Name" : "Numm", @@ -36,7 +37,6 @@ OC.L10N.register( "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.", "Text file" : "Text Fichier" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index 95148452566..59289599719 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -15,6 +15,7 @@ "Download" : "Download", "Rename" : "Ëmbenennen", "Delete" : "Läschen", + "Unshare" : "Net méi deelen", "Details" : "Detailer", "Select" : "Auswielen", "Name" : "Numm", @@ -34,7 +35,6 @@ "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.", "Text file" : "Text Fichier" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index e93fb079d56..6e33b1ac7cc 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Atsisiųsti", "Rename" : "Pervadinti", "Delete" : "Ištrinti", + "Disconnect storage" : "Atjungti saugyklą", + "Unshare" : "Nebesidalinti", "Details" : "Informacija", "Select" : "Pasirinkiti", "Pending" : "Laukiantis", @@ -111,8 +113,6 @@ OC.L10N.register( "Select all" : "Pažymėti viską", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", - "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", - "Currently scanning" : "Šiuo metu skenuojama", "No favorites" : "Nėra mėgstamiausių", "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia", "Text file" : "Teksto failas", diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index e6724be98cf..0d32d1dbb2a 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -32,6 +32,8 @@ "Download" : "Atsisiųsti", "Rename" : "Pervadinti", "Delete" : "Ištrinti", + "Disconnect storage" : "Atjungti saugyklą", + "Unshare" : "Nebesidalinti", "Details" : "Informacija", "Select" : "Pasirinkiti", "Pending" : "Laukiantis", @@ -109,8 +111,6 @@ "Select all" : "Pažymėti viską", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", - "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", - "Currently scanning" : "Šiuo metu skenuojama", "No favorites" : "Nėra mėgstamiausių", "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia", "Text file" : "Teksto failas", diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index d615c8e5d28..f5533fd8995 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Lejupielādēt", "Rename" : "Pārsaukt", "Delete" : "Dzēst", + "Disconnect storage" : "Atvienot krātuvi", + "Unshare" : "Pārtraukt dalīšanos", "Details" : "Detaļas", "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", @@ -86,8 +88,6 @@ OC.L10N.register( "Select all" : "Atzīmēt visu", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", - "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", - "Currently scanning" : "Pašlaik skenē", "No favorites" : "Nav favorītu", "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit", "Text file" : "Teksta datne" diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index 0888d81ad64..18189049ed8 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -32,6 +32,8 @@ "Download" : "Lejupielādēt", "Rename" : "Pārsaukt", "Delete" : "Dzēst", + "Disconnect storage" : "Atvienot krātuvi", + "Unshare" : "Pārtraukt dalīšanos", "Details" : "Detaļas", "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", @@ -84,8 +86,6 @@ "Select all" : "Atzīmēt visu", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", - "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", - "Currently scanning" : "Pašlaik skenē", "No favorites" : "Nav favorītu", "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit", "Text file" : "Teksta datne" diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index 726938c57cd..ec8387af0f6 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -73,7 +73,6 @@ OC.L10N.register( "Select all" : "Избери се", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", - "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука", "Text file" : "Текстуална датотека", "New text file.txt" : "Нова текстуална датотека file.txt" diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index 2c5b3a4d23d..e587f4883ef 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -71,7 +71,6 @@ "Select all" : "Избери се", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", - "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", "Files and folders you mark as favorite will show up here" : "Датотеките и папките кои ќе ги означите како чести, ќе се појават тука", "Text file" : "Текстуална датотека", "New text file.txt" : "Нова текстуална датотека file.txt" diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js index b60faff6bd9..dcd0c8e15e8 100644 --- a/apps/files/l10n/ms_MY.js +++ b/apps/files/l10n/ms_MY.js @@ -33,7 +33,6 @@ OC.L10N.register( "Cancel upload" : "Batal muat naik", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", - "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.", "Text file" : "Fail teks" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json index fa78e9446b7..6f7b93d6ef1 100644 --- a/apps/files/l10n/ms_MY.json +++ b/apps/files/l10n/ms_MY.json @@ -31,7 +31,6 @@ "Cancel upload" : "Batal muat naik", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", - "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.", "Text file" : "Fail teks" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index 6152d599866..a49c7b1a3d8 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Velg alle", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.", - "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", - "Currently scanning" : "Skanner nå", "No favorites" : "Ingen favoritter", "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her", "Text file" : "Tekstfil", diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index 9279b560f8e..860ac1633ab 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -111,8 +111,6 @@ "Select all" : "Velg alle", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store til å laste opp til denne serveren.", - "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", - "Currently scanning" : "Skanner nå", "No favorites" : "Ingen favoritter", "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her", "Text file" : "Tekstfil", diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index d64dc68c474..41e1343f47e 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -112,8 +112,6 @@ OC.L10N.register( "Select all" : "Alles selecteren", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", - "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", - "Currently scanning" : "Nu aan het scannen", "No favorites" : "Geen favorieten", "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont", "Text file" : "Tekstbestand", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 1268cc10863..5c6891d2d92 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -110,8 +110,6 @@ "Select all" : "Alles selecteren", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", - "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", - "Currently scanning" : "Nu aan het scannen", "No favorites" : "Geen favorieten", "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont", "Text file" : "Tekstbestand", diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js index 519387d6baf..1e138d91b85 100644 --- a/apps/files/l10n/nn_NO.js +++ b/apps/files/l10n/nn_NO.js @@ -65,7 +65,6 @@ OC.L10N.register( "Cancel upload" : "Avbryt opplasting", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", - "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.", "Text file" : "Tekst fil" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json index a29e272ebac..5645a61b6bc 100644 --- a/apps/files/l10n/nn_NO.json +++ b/apps/files/l10n/nn_NO.json @@ -63,7 +63,6 @@ "Cancel upload" : "Avbryt opplasting", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", - "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.", "Text file" : "Tekst fil" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js index a6f59679a18..6fde5981b12 100644 --- a/apps/files/l10n/oc.js +++ b/apps/files/l10n/oc.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Seleccionar tot", "Upload too large" : "Mandadís tròp voluminós", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.", - "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", - "Currently scanning" : "Analisi en cors", "No favorites" : "Pas cap de favorit", "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí", "Text file" : "Fichièr tèxte", diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json index 61caa1724b5..37b2fc5f452 100644 --- a/apps/files/l10n/oc.json +++ b/apps/files/l10n/oc.json @@ -111,8 +111,6 @@ "Select all" : "Seleccionar tot", "Upload too large" : "Mandadís tròp voluminós", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs qu'ensajatz de mandar depassan la talha maximala de mandadís permesa per aqueste servidor.", - "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", - "Currently scanning" : "Analisi en cors", "No favorites" : "Pas cap de favorit", "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí", "Text file" : "Fichièr tèxte", diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index de1d8581243..e28b7bc2581 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -87,8 +87,6 @@ OC.L10N.register( "Select all" : "Wybierz wszystko", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", - "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", - "Currently scanning" : "Aktualnie skanowane", "Text file" : "Plik tekstowy" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 491991c6f61..314caeb807a 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -85,8 +85,6 @@ "Select all" : "Wybierz wszystko", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", - "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", - "Currently scanning" : "Aktualnie skanowane", "Text file" : "Plik tekstowy" },"pluralForm" :"nplurals=3; plural=(n==1 ? 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/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 2cf4a3dbc80..aaa655baf5f 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Selecionar tudo", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", - "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", - "Currently scanning" : "Atualmente escaneando", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favoritos são mostrados aqui", "Text file" : "Arquivo texto", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index be96373df6a..111695612ce 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -111,8 +111,6 @@ "Select all" : "Selecionar tudo", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", - "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", - "Currently scanning" : "Atualmente escaneando", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favoritos são mostrados aqui", "Text file" : "Arquivo texto", diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js index 6ef00a8f672..0e6c7d2b355 100644 --- a/apps/files/l10n/pt_PT.js +++ b/apps/files/l10n/pt_PT.js @@ -42,8 +42,17 @@ OC.L10N.register( "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", alvo já existe", "Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"", "{newName} already exists" : "{newName} já existe", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", pois já não existe", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em uso na pasta \"{dir}\". Por favor escolha um nome diferente.", + "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", + "Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe", + "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe", + "Error deleting file \"{fileName}\"." : "Erro ao apagar o ficheiro \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -92,6 +101,8 @@ OC.L10N.register( "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", "Save" : "Guardar", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM pode demorar 5 minutos até que as alterações sejam aplicadas.", + "Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.", "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>", @@ -102,8 +113,6 @@ OC.L10N.register( "Select all" : "Seleccionar todos", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", - "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", - "Currently scanning" : "A analisar", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui", "Text file" : "Ficheiro de Texto", diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json index 4c40db8c3a9..1879f7b1ecf 100644 --- a/apps/files/l10n/pt_PT.json +++ b/apps/files/l10n/pt_PT.json @@ -40,8 +40,17 @@ "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover \"{file}\", alvo já existe", "Could not move \"{file}\"" : "Não foi possivel mover o ficheiro \"{file}\"", "{newName} already exists" : "{newName} já existe", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", pois já não existe", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está em uso na pasta \"{dir}\". Por favor escolha um nome diferente.", + "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", + "Could not create file \"{file}\"" : "Não foi possível criar o ficheiro \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o ficheiro \"{file}\", porque este já existe", + "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\", porque esta já existe", + "Error deleting file \"{fileName}\"." : "Erro ao apagar o ficheiro \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -90,6 +99,8 @@ "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", "Save" : "Guardar", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM pode demorar 5 minutos até que as alterações sejam aplicadas.", + "Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.", "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>", @@ -100,8 +111,6 @@ "Select all" : "Seleccionar todos", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", - "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", - "Currently scanning" : "A analisar", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui", "Text file" : "Ficheiro de Texto", diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index e9114f5531e..bd869ce56d6 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -81,8 +81,6 @@ OC.L10N.register( "Select all" : "Selectează tot", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", - "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", - "Currently scanning" : "Acum scanează", "Text file" : "Fișier text" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index ed4bf8e3851..b842342a09a 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -79,8 +79,6 @@ "Select all" : "Selectează tot", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", - "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", - "Currently scanning" : "Acum scanează", "Text file" : "Fișier text" },"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/files/l10n/ru.js b/apps/files/l10n/ru.js index f262957fe55..510e8d8f08b 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Выбрать все", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", - "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", - "Currently scanning" : "В настоящее время сканируется", "No favorites" : "Нет избранного", "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные", "Text file" : "Текстовый файл", diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 5c99a793ecd..f62125fa614 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -111,8 +111,6 @@ "Select all" : "Выбрать все", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", - "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", - "Currently scanning" : "В настоящее время сканируется", "No favorites" : "Нет избранного", "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные", "Text file" : "Текстовый файл", diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js index 44e96c49fc6..4c26c421076 100644 --- a/apps/files/l10n/si_LK.js +++ b/apps/files/l10n/si_LK.js @@ -16,6 +16,7 @@ OC.L10N.register( "Download" : "බාන්න", "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", + "Unshare" : "නොබෙදු", "Select" : "තෝරන්න", "Name" : "නම", "Size" : "ප්රමාණය", @@ -35,7 +36,6 @@ OC.L10N.register( "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", - "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න", "Text file" : "පෙළ ගොනුව" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json index 92bcea71587..2db6c10b75c 100644 --- a/apps/files/l10n/si_LK.json +++ b/apps/files/l10n/si_LK.json @@ -14,6 +14,7 @@ "Download" : "බාන්න", "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", + "Unshare" : "නොබෙදු", "Select" : "තෝරන්න", "Name" : "නම", "Size" : "ප්රමාණය", @@ -33,7 +34,6 @@ "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", - "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න", "Text file" : "පෙළ ගොනුව" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js index ca7e107d1ca..52711dd9c7b 100644 --- a/apps/files/l10n/sk_SK.js +++ b/apps/files/l10n/sk_SK.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "Sťahovanie", "Rename" : "Premenovať", "Delete" : "Zmazať", + "Disconnect storage" : "Odpojiť úložisko", + "Unshare" : "Zrušiť zdieľanie", "Details" : "Podrobnosti", "Select" : "Vybrať", "Pending" : "Čaká", @@ -95,8 +97,6 @@ OC.L10N.register( "Select all" : "Vybrať všetko", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", - "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", - "Currently scanning" : "Prehľadáva sa", "No favorites" : "Žiadne obľúbené", "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu", "Text file" : "Textový súbor", diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json index 4d03e18556a..ca371eb189c 100644 --- a/apps/files/l10n/sk_SK.json +++ b/apps/files/l10n/sk_SK.json @@ -32,6 +32,8 @@ "Download" : "Sťahovanie", "Rename" : "Premenovať", "Delete" : "Zmazať", + "Disconnect storage" : "Odpojiť úložisko", + "Unshare" : "Zrušiť zdieľanie", "Details" : "Podrobnosti", "Select" : "Vybrať", "Pending" : "Čaká", @@ -93,8 +95,6 @@ "Select all" : "Vybrať všetko", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", - "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", - "Currently scanning" : "Prehľadáva sa", "No favorites" : "Žiadne obľúbené", "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu", "Text file" : "Textový súbor", diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 103b4861206..36cd3ba4f1b 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -40,6 +40,15 @@ OC.L10N.register( "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", + "Could not move \"{file}\"" : "Ni mogoče premakniti \"{file}\"", + "{newName} already exists" : "{newName} že obstaja", + "Could not rename \"{fileName}\", it does not exist any more" : "Ni mogoče preimenovati \"{fileName}\", ker datoteka ne obstaja več", + "Could not rename \"{fileName}\"" : "Ni mogoče preimenovati \"{fileName}\"", + "Could not create file \"{file}\"" : "Ni mogoče ustvariti datoteke \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Ni mogoče ustvariti datoteke \"{file}\", ker že obstaja", + "Could not create folder \"{dir}\"" : "Ni mogoče ustvariti mape \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape \"{dir}\", ker že obstaja", + "Error deleting file \"{fileName}\"." : "Napaka brisanja datoteke \"{fileName}\".", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", "Name" : "Ime", "Size" : "Velikost", @@ -57,10 +66,13 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Shramba uporabnika {owner} je polna ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)" : "Prostor za shranjevanje je skoraj do konca zaseden ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"], + "Path" : "Pot", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", "Folder" : "Mapa", "New folder" : "Nova mapa", + "{newname} already exists" : "{newname} že obstaja", "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", @@ -92,8 +104,6 @@ OC.L10N.register( "Select all" : "izberi vse", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", - "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", - "Currently scanning" : "Poteka preverjanje", "No favorites" : "Ni priljubljenih", "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.", "Text file" : "Besedilna datoteka" diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index ef5720b8be3..ea468b4e94d 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -38,6 +38,15 @@ "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", + "Could not move \"{file}\"" : "Ni mogoče premakniti \"{file}\"", + "{newName} already exists" : "{newName} že obstaja", + "Could not rename \"{fileName}\", it does not exist any more" : "Ni mogoče preimenovati \"{fileName}\", ker datoteka ne obstaja več", + "Could not rename \"{fileName}\"" : "Ni mogoče preimenovati \"{fileName}\"", + "Could not create file \"{file}\"" : "Ni mogoče ustvariti datoteke \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Ni mogoče ustvariti datoteke \"{file}\", ker že obstaja", + "Could not create folder \"{dir}\"" : "Ni mogoče ustvariti mape \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Ni mogoče ustvariti mape \"{dir}\", ker že obstaja", + "Error deleting file \"{fileName}\"." : "Napaka brisanja datoteke \"{fileName}\".", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", "Name" : "Ime", "Size" : "Velikost", @@ -55,10 +64,13 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Shramba uporabnika {owner} je polna ({usedSpacePercent}%).", "Your storage is almost full ({usedSpacePercent}%)" : "Prostor za shranjevanje je skoraj do konca zaseden ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"], + "Path" : "Pot", + "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", "Folder" : "Mapa", "New folder" : "Nova mapa", + "{newname} already exists" : "{newname} že obstaja", "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", @@ -90,8 +102,6 @@ "Select all" : "izberi vse", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", - "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", - "Currently scanning" : "Poteka preverjanje", "No favorites" : "Ni priljubljenih", "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.", "Text file" : "Besedilna datoteka" diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js index 023c06eb24b..f86f0af4937 100644 --- a/apps/files/l10n/sq.js +++ b/apps/files/l10n/sq.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "Përzgjidhe krejt", "Upload too large" : "Ngarkim shumë i madh", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.", - "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", - "Currently scanning" : "Po kontrollohet", "No favorites" : "Pa të parapëlqyera", "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera", "Text file" : "Kartelë tekst", diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json index 8b15b6202c0..90f1af5b67f 100644 --- a/apps/files/l10n/sq.json +++ b/apps/files/l10n/sq.json @@ -111,8 +111,6 @@ "Select all" : "Përzgjidhe krejt", "Upload too large" : "Ngarkim shumë i madh", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Kartelat që po rrekeni të ngarkoni e tejkalojnë madhësinë maksimale për ngarkime kartelash në këtë shërbyes.", - "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", - "Currently scanning" : "Po kontrollohet", "No favorites" : "Pa të parapëlqyera", "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera", "Text file" : "Kartelë tekst", diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 6a97b5f282f..fbfa08ecf86 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -100,8 +100,6 @@ OC.L10N.register( "Select all" : "Означи све", "Upload too large" : "Отпремање је превелико", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.", - "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", - "Currently scanning" : "Тренутно скенирам", "No favorites" : "Нема омиљених", "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", "Text file" : "текстуални фајл", diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index 7f319f6ab48..d231c5416c8 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -98,8 +98,6 @@ "Select all" : "Означи све", "Upload too large" : "Отпремање је превелико", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Фајлови које желите да отпремите превазилазе ограничење отпремања на овом серверу.", - "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", - "Currently scanning" : "Тренутно скенирам", "No favorites" : "Нема омиљених", "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", "Text file" : "текстуални фајл", diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js index ed166f5ee87..7c62a464494 100644 --- a/apps/files/l10n/sr@latin.js +++ b/apps/files/l10n/sr@latin.js @@ -89,8 +89,6 @@ OC.L10N.register( "Select all" : "Označi sve", "Upload too large" : "Otpremanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.", - "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", - "Currently scanning" : "Trenutno skeniram", "No favorites" : "Nema omiljenih", "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde", "Text file" : "tekstualni fajl" diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json index a58df8712a7..506ae677ca4 100644 --- a/apps/files/l10n/sr@latin.json +++ b/apps/files/l10n/sr@latin.json @@ -87,8 +87,6 @@ "Select all" : "Označi sve", "Upload too large" : "Otpremanje je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da otpremite prevazilaze ograničenje otpremanja na ovom serveru.", - "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", - "Currently scanning" : "Trenutno skeniram", "No favorites" : "Nema omiljenih", "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde", "Text file" : "tekstualni fajl" diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index f6df4ee16d0..a541fa8b9d5 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -97,8 +97,6 @@ OC.L10N.register( "Select all" : "Välj allt", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", - "Files are being scanned, please wait." : "Filer skannas, var god vänta", - "Currently scanning" : "sökning pågår", "No favorites" : "Inga favoriter", "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här", "Text file" : "Textfil", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 143e35a1e0a..09da48516a2 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -95,8 +95,6 @@ "Select all" : "Välj allt", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", - "Files are being scanned, please wait." : "Filer skannas, var god vänta", - "Currently scanning" : "sökning pågår", "No favorites" : "Inga favoriter", "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här", "Text file" : "Textfil", diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js index 39a3eda73fe..8b731d1f64b 100644 --- a/apps/files/l10n/ta_LK.js +++ b/apps/files/l10n/ta_LK.js @@ -18,6 +18,7 @@ OC.L10N.register( "Download" : "பதிவிறக்குக", "Rename" : "பெயர்மாற்றம்", "Delete" : "நீக்குக", + "Unshare" : "பகிரப்படாதது", "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", @@ -36,7 +37,6 @@ OC.L10N.register( "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", - "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.", "Text file" : "கோப்பு உரை" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json index 009ef6c7a8e..67cc6f18d88 100644 --- a/apps/files/l10n/ta_LK.json +++ b/apps/files/l10n/ta_LK.json @@ -16,6 +16,7 @@ "Download" : "பதிவிறக்குக", "Rename" : "பெயர்மாற்றம்", "Delete" : "நீக்குக", + "Unshare" : "பகிரப்படாதது", "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", @@ -34,7 +35,6 @@ "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", - "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.", "Text file" : "கோப்பு உரை" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js index d371d5a39c4..d4bd37cb1e7 100644 --- a/apps/files/l10n/th_TH.js +++ b/apps/files/l10n/th_TH.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "ดาวน์โหลด", "Rename" : "เปลี่ยนชื่อ", "Delete" : "ลบ", + "Disconnect storage" : "ยกเลิกการเชื่อมต่อการจัดเก็บข้อมูล", + "Unshare" : "ยกเลิกการแชร์", "Details" : "รายละเอียด", "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", @@ -111,8 +113,6 @@ OC.L10N.register( "Select all" : "เลือกทั้งหมด", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", - "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", - "Currently scanning" : "ปัจจุบันกำลังสแกน", "No favorites" : "ไม่มีรายการโปรด", "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่", "Text file" : "ไฟล์ข้อความ", diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json index 5e8086ad9d9..03d6c6adb76 100644 --- a/apps/files/l10n/th_TH.json +++ b/apps/files/l10n/th_TH.json @@ -32,6 +32,8 @@ "Download" : "ดาวน์โหลด", "Rename" : "เปลี่ยนชื่อ", "Delete" : "ลบ", + "Disconnect storage" : "ยกเลิกการเชื่อมต่อการจัดเก็บข้อมูล", + "Unshare" : "ยกเลิกการแชร์", "Details" : "รายละเอียด", "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", @@ -109,8 +111,6 @@ "Select all" : "เลือกทั้งหมด", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", - "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", - "Currently scanning" : "ปัจจุบันกำลังสแกน", "No favorites" : "ไม่มีรายการโปรด", "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่", "Text file" : "ไฟล์ข้อความ", diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index d0c68861518..2fbb71b373c 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "İndir", "Rename" : "Yeniden adlandır", "Delete" : "Sil", + "Disconnect storage" : "Depolama bağlantısını kes", + "Unshare" : "Paylaşmayı Kaldır", "Details" : "Ayrıntılar", "Select" : "Seç", "Pending" : "Bekliyor", @@ -100,8 +102,6 @@ OC.L10N.register( "Select all" : "Tümünü seç", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", - "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", - "Currently scanning" : "Şu anda taranan", "No favorites" : "Sık kullanılan öge yok.", "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek", "Text file" : "Metin dosyası", diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index 7bc756530dc..b2fd691a6a1 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -32,6 +32,8 @@ "Download" : "İndir", "Rename" : "Yeniden adlandır", "Delete" : "Sil", + "Disconnect storage" : "Depolama bağlantısını kes", + "Unshare" : "Paylaşmayı Kaldır", "Details" : "Ayrıntılar", "Select" : "Seç", "Pending" : "Bekliyor", @@ -98,8 +100,6 @@ "Select all" : "Tümünü seç", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", - "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", - "Currently scanning" : "Şu anda taranan", "No favorites" : "Sık kullanılan öge yok.", "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek", "Text file" : "Metin dosyası", diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index 7da8b160afd..bda024599f5 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -91,8 +91,6 @@ OC.L10N.register( "Select all" : "Вибрати всі", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", - "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", - "Currently scanning" : "Триває перевірка", "No favorites" : "Немає улюблених", "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут", "Text file" : "Текстовий файл" diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index 15dabf456f8..17c055d5539 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -89,8 +89,6 @@ "Select all" : "Вибрати всі", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь вивантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", - "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", - "Currently scanning" : "Триває перевірка", "No favorites" : "Немає улюблених", "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут", "Text file" : "Текстовий файл" diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 83dd03f48f8..953604a945d 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -61,7 +61,6 @@ OC.L10N.register( "Select all" : "Chọn tất cả", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", - "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.", "Text file" : "Tập tin văn bản" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index abc83963873..40c64f01ff4 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -59,7 +59,6 @@ "Select all" : "Chọn tất cả", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", - "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.", "Text file" : "Tập tin văn bản" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index cadbeee3fc3..c9a07a0199c 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -34,6 +34,8 @@ OC.L10N.register( "Download" : "下载", "Rename" : "重命名", "Delete" : "删除", + "Disconnect storage" : "断开储存连接", + "Unshare" : "取消共享", "Details" : "详细信息", "Select" : "选择", "Pending" : "等待", @@ -111,8 +113,6 @@ OC.L10N.register( "Select all" : "全部选择", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", - "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", - "Currently scanning" : "正在扫描", "No favorites" : "无收藏", "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示", "Text file" : "文本文件", diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index b2883e5ea1d..1ae61d0119b 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -32,6 +32,8 @@ "Download" : "下载", "Rename" : "重命名", "Delete" : "删除", + "Disconnect storage" : "断开储存连接", + "Unshare" : "取消共享", "Details" : "详细信息", "Select" : "选择", "Pending" : "等待", @@ -109,8 +111,6 @@ "Select all" : "全部选择", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", - "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", - "Currently scanning" : "正在扫描", "No favorites" : "无收藏", "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示", "Text file" : "文本文件", diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 30b7e75a732..8ecae84be99 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -9,6 +9,7 @@ OC.L10N.register( "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", + "Unshare" : "取消分享", "Name" : "名稱", "Size" : "大小", "{dirs} and {files}" : "{dirs} 和 {files}", diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index 213997044af..798dbe13abe 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -7,6 +7,7 @@ "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", + "Unshare" : "取消分享", "Name" : "名稱", "Size" : "大小", "{dirs} and {files}" : "{dirs} 和 {files}", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 64a24bbd0c1..0f013be694f 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -113,8 +113,6 @@ OC.L10N.register( "Select all" : "全選", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制", - "Files are being scanned, please wait." : "正在掃描檔案,請稍等", - "Currently scanning" : "正在掃描", "No favorites" : "沒有最愛", "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡", "Text file" : "文字檔", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index c3c1443e0bc..1258145c71f 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -111,8 +111,6 @@ "Select all" : "全選", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制", - "Files are being scanned, please wait." : "正在掃描檔案,請稍等", - "Currently scanning" : "正在掃描", "No favorites" : "沒有最愛", "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡", "Text file" : "文字檔", diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php index 04550f945b6..7906dfc64eb 100644 --- a/apps/files/templates/list.php +++ b/apps/files/templates/list.php @@ -88,11 +88,3 @@ <?php p($l->t('The files you are trying to upload exceed the maximum size for file uploads on this server.'));?> </p> </div> -<div id="scanning-message"> - <h3> - <?php p($l->t('Files are being scanned, please wait.'));?> <span id='scan-count'></span> - </h3> - <p> - <?php p($l->t('Currently scanning'));?> <span id='scan-current'></span> - </p> -</div> diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js index 8a0d6b01952..0483d4649d4 100644 --- a/apps/files/tests/js/fileUploadSpec.js +++ b/apps/files/tests/js/fileUploadSpec.js @@ -102,7 +102,7 @@ describe('OC.Upload tests', function() { expect(failStub.calledOnce).toEqual(true); expect(failStub.getCall(0).args[1].textStatus).toEqual('sizeexceedlimit'); expect(failStub.getCall(0).args[1].errorThrown).toEqual( - 'Total file size 5 kB exceeds upload limit 1000 B' + 'Total file size 5 KB exceeds upload limit 1000 B' ); }); it('does not add file if it exceeds free space', function() { @@ -115,7 +115,7 @@ describe('OC.Upload tests', function() { expect(failStub.calledOnce).toEqual(true); expect(failStub.getCall(0).args[1].textStatus).toEqual('notenoughspace'); expect(failStub.getCall(0).args[1].errorThrown).toEqual( - 'Not enough free space, you are uploading 5 kB but only 1000 B is left' + 'Not enough free space, you are uploading 5 KB but only 1000 B is left' ); }); }); diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index e6046f2197e..9cd6bc90e88 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -213,7 +213,7 @@ describe('OCA.Files.FileList tests', function() { .toEqual(OC.webroot + '/remote.php/webdav/subdir/testName.txt'); expect($tr.find('.nametext').text().trim()).toEqual('testName.txt'); - expect($tr.find('.filesize').text()).toEqual('1 kB'); + expect($tr.find('.filesize').text()).toEqual('1 KB'); expect($tr.find('.date').text()).not.toEqual('?'); expect(fileList.findFileEl('testName.txt')[0]).toEqual($tr[0]); }); @@ -239,7 +239,7 @@ describe('OCA.Files.FileList tests', function() { expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); expect($tr.attr('data-mtime')).toEqual('123456'); - expect($tr.find('.filesize').text()).toEqual('1 kB'); + expect($tr.find('.filesize').text()).toEqual('1 KB'); expect($tr.find('.date').text()).not.toEqual('?'); expect(fileList.findFileEl('testFolder')[0]).toEqual($tr[0]); @@ -296,7 +296,7 @@ describe('OCA.Files.FileList tests', function() { size: '0' }; var $tr = fileList.add(fileData); - expect($tr.find('.filesize').text()).toEqual('0 kB'); + expect($tr.find('.filesize').text()).toEqual('0 KB'); }); it('generates file element with unknown date when mtime invalid', function() { var fileData = { @@ -424,7 +424,7 @@ describe('OCA.Files.FileList tests', function() { expect($summary.find('.info').text()).toEqual('1 folder and 2 files'); expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(false); expect($summary.find('.fileinfo').hasClass('hidden')).toEqual(false); - expect($summary.find('.filesize').text()).toEqual('69 kB'); + expect($summary.find('.filesize').text()).toEqual('69 KB'); expect(fileList.isEmpty).toEqual(false); }); it('Shows empty content when removing last file', function() { @@ -479,7 +479,7 @@ describe('OCA.Files.FileList tests', function() { expect($summary.find('.info').text()).toEqual('1 folder and 1 file'); expect($summary.find('.dirinfo').hasClass('hidden')).toEqual(false); expect($summary.find('.fileinfo').hasClass('hidden')).toEqual(false); - expect($summary.find('.filesize').text()).toEqual('57 kB'); + expect($summary.find('.filesize').text()).toEqual('57 KB'); expect(fileList.isEmpty).toEqual(false); expect($('#filestable thead th').hasClass('hidden')).toEqual(false); expect($('#emptycontent').hasClass('hidden')).toEqual(true); @@ -777,7 +777,7 @@ describe('OCA.Files.FileList tests', function() { // folder size has increased expect(fileList.findFileEl('somedir').data('size')).toEqual(12311); - expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('12 kB'); + expect(fileList.findFileEl('somedir').find('.filesize').text()).toEqual('12 KB'); expect(notificationStub.notCalled).toEqual(true); }); @@ -843,7 +843,7 @@ describe('OCA.Files.FileList tests', function() { $summary = $('#filestable .summary'); expect($summary.hasClass('hidden')).toEqual(false); expect($summary.find('.info').text()).toEqual('1 folder and 3 files'); - expect($summary.find('.filesize').text()).toEqual('69 kB'); + expect($summary.find('.filesize').text()).toEqual('69 KB'); }); it('shows headers, summary and hide empty content message after setting files', function(){ fileList.setFiles(testFiles); diff --git a/apps/files/tests/js/filesummarySpec.js b/apps/files/tests/js/filesummarySpec.js index ae5ff95fc0c..ec94c28acb6 100644 --- a/apps/files/tests/js/filesummarySpec.js +++ b/apps/files/tests/js/filesummarySpec.js @@ -40,7 +40,7 @@ describe('OCA.Files.FileSummary tests', function() { }); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('5 folders and 2 files'); - expect($container.find('.filesize').text()).toEqual('250 kB'); + expect($container.find('.filesize').text()).toEqual('250 KB'); }); it('hides summary when no files or folders', function() { var s = new FileSummary($container); @@ -63,7 +63,7 @@ describe('OCA.Files.FileSummary tests', function() { s.update(); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('6 folders and 3 files'); - expect($container.find('.filesize').text()).toEqual('500 kB'); + expect($container.find('.filesize').text()).toEqual('500 KB'); expect(s.summary.totalDirs).toEqual(6); expect(s.summary.totalFiles).toEqual(3); expect(s.summary.totalSize).toEqual(512100); @@ -80,7 +80,7 @@ describe('OCA.Files.FileSummary tests', function() { s.update(); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('4 folders and 1 file'); - expect($container.find('.filesize').text()).toEqual('125 kB'); + expect($container.find('.filesize').text()).toEqual('125 KB'); expect(s.summary.totalDirs).toEqual(4); expect(s.summary.totalFiles).toEqual(1); expect(s.summary.totalSize).toEqual(127900); @@ -96,7 +96,7 @@ describe('OCA.Files.FileSummary tests', function() { }); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('5 folders and 2 files match \'foo\''); - expect($container.find('.filesize').text()).toEqual('250 kB'); + expect($container.find('.filesize').text()).toEqual('250 KB'); }); it('hides filtered summary when no files or folders', function() { var s = new FileSummary($container); @@ -123,7 +123,7 @@ describe('OCA.Files.FileSummary tests', function() { s.update(); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('6 folders and 3 files match \'foo\''); - expect($container.find('.filesize').text()).toEqual('500 kB'); + expect($container.find('.filesize').text()).toEqual('500 KB'); expect(s.summary.totalDirs).toEqual(6); expect(s.summary.totalFiles).toEqual(3); expect(s.summary.totalSize).toEqual(512103); @@ -143,7 +143,7 @@ describe('OCA.Files.FileSummary tests', function() { s.update(); expect($container.hasClass('hidden')).toEqual(false); expect($container.find('.info').text()).toEqual('4 folders and 1 file match \'foo\''); - expect($container.find('.filesize').text()).toEqual('125 kB'); + expect($container.find('.filesize').text()).toEqual('125 KB'); expect(s.summary.totalDirs).toEqual(4); expect(s.summary.totalFiles).toEqual(1); expect(s.summary.totalSize).toEqual(127903); diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index 86c58a45d5c..1571178596b 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -26,6 +26,7 @@ namespace OCA\Files_External\AppInfo; use \OCP\AppFramework\App; +use OCP\AppFramework\IAppContainer; use \OCP\IContainer; use \OCA\Files_External\Service\BackendService; @@ -33,9 +34,13 @@ use \OCA\Files_External\Service\BackendService; * @package OCA\Files_External\Appinfo */ class Application extends App { - public function __construct(array $urlParams=array()) { + public function __construct(array $urlParams = array()) { parent::__construct('files_external', $urlParams); + $this->getContainer()->registerService('OCP\Files\Config\IUserMountCache', function (IAppContainer $c) { + return $c->getServer()->query('UserMountCache'); + }); + $this->loadBackends(); $this->loadAuthMechanisms(); diff --git a/apps/files_external/appinfo/register_command.php b/apps/files_external/appinfo/register_command.php index 12bf6a45df3..be32cd410f8 100644 --- a/apps/files_external/appinfo/register_command.php +++ b/apps/files_external/appinfo/register_command.php @@ -23,7 +23,8 @@ use OCA\Files_External\Command\ListCommand; use OCA\Files_External\Command\Config; use OCA\Files_External\Command\Option; -use \OCA\Files_External\Command\Import; +use OCA\Files_External\Command\Import; +use OCA\Files_External\Command\Export; $userManager = OC::$server->getUserManager(); $userSession = OC::$server->getUserSession(); @@ -40,3 +41,4 @@ $application->add(new ListCommand($globalStorageService, $userStorageService, $u $application->add(new Config($globalStorageService)); $application->add(new Option($globalStorageService)); $application->add(new Import($globalStorageService, $userStorageService, $userSession, $userManager, $importLegacyStorageService, $backendService)); +$application->add(new Export($globalStorageService, $userStorageService, $userSession, $userManager)); diff --git a/apps/files_external/command/export.php b/apps/files_external/command/export.php new file mode 100644 index 00000000000..371061ba626 --- /dev/null +++ b/apps/files_external/command/export.php @@ -0,0 +1,56 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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\Files_External\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Helper\TableHelper; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Input\Input; +use Symfony\Component\Console\Output\OutputInterface; + +class Export extends ListCommand { + + protected function configure() { + $this + ->setName('files_external:export') + ->setDescription('Export mount configurations') + ->addArgument( + 'user_id', + InputArgument::OPTIONAL, + 'user id to export the personal mounts for, if no user is provided admin mounts will be exported' + ); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); + $listInput = new ArrayInput([], $listCommand->getDefinition()); + $listInput->setArgument('user_id', $input->getArgument('user_id')); + $listInput->setOption('output', 'json_pretty'); + $listInput->setOption('show-password', true); + $listInput->setOption('full', true); + $listCommand->execute($listInput, $output); + } +} diff --git a/apps/files_external/command/listcommand.php b/apps/files_external/command/listcommand.php index f55fb464c83..c978ae5cfcb 100644 --- a/apps/files_external/command/listcommand.php +++ b/apps/files_external/command/listcommand.php @@ -22,6 +22,7 @@ namespace OCA\Files_External\Command; use OC\Core\Command\Base; +use OC\User\NoUserException; use OCA\Files_external\Lib\StorageConfig; use OCA\Files_external\Service\GlobalStoragesService; use OCA\Files_external\Service\UserStoragesService; @@ -38,22 +39,22 @@ class ListCommand extends Base { /** * @var GlobalStoragesService */ - private $globalService; + protected $globalService; /** * @var UserStoragesService */ - private $userService; + protected $userService; /** * @var IUserSession */ - private $userSession; + protected $userSession; /** * @var IUserManager */ - private $userManager; + protected $userManager; function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) { parent::__construct(); @@ -87,17 +88,7 @@ class ListCommand extends Base { protected function execute(InputInterface $input, OutputInterface $output) { $userId = $input->getArgument('user_id'); - if (!empty($userId)) { - $user = $this->userManager->get($userId); - if (is_null($user)) { - $output->writeln("<error>user $userId not found</error>"); - return; - } - $this->userSession->setUser($user); - $storageService = $this->userService; - } else { - $storageService = $this->globalService; - } + $storageService = $this->getStorageService($userId); /** @var $mounts StorageConfig[] */ $mounts = $storageService->getAllStorages(); @@ -112,11 +103,16 @@ class ListCommand extends Base { * @param OutputInterface $output */ public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output){ + $outputType = $input->getOption('output'); if (count($mounts) === 0) { - if ($userId) { - $output->writeln("<info>No mounts configured by $userId</info>"); + if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { + $output->writeln('[]'); } else { - $output->writeln("<info>No admin mounts configured</info>"); + if ($userId) { + $output->writeln("<info>No mounts configured by $userId</info>"); + } else { + $output->writeln("<info>No admin mounts configured</info>"); + } } return; } @@ -140,7 +136,6 @@ class ListCommand extends Base { } } - $outputType = $input->getOption('output'); if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { $keys = array_map(function ($header) { return strtolower(str_replace(' ', '_', $header)); @@ -237,4 +232,17 @@ class ListCommand extends Base { $table->render(); } } + + protected function getStorageService($userId) { + if (!empty($userId)) { + $user = $this->userManager->get($userId); + if (is_null($user)) { + throw new NoUserException("user $userId not found"); + } + $this->userSession->setUser($user); + return $this->userService; + } else { + return $this->globalService; + } + } } diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js index f2ed1e3abab..cfeec36706b 100644 --- a/apps/files_external/l10n/pt_PT.js +++ b/apps/files_external/l10n/pt_PT.js @@ -10,9 +10,11 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"", "Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos", "Invalid mount point" : "Ponto de montagem inválido", + "Objectstore forbidden" : "Objectstore proibido", "Invalid storage backend \"%s\"" : "Backend de armazenamento inválido \"%s\"", "Not permitted to use backend \"%s\"" : "Não é permitido utilizar a interface \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido utilizar o mecanismo de autenticação \"%s\"", + "Unsatisfied backend parameters" : "Parâmetros backend insatisfeitos", "Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -31,7 +33,16 @@ OC.L10N.register( "Once every direct access" : "Uma vez em cada acesso direto", "All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.", "(group)" : "(grupo)", + "Admin defined" : "Administrador definido", "Saved" : "Guardado", + "Empty response from the server" : "Resposta vazia a partir do servidor", + "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível aceder. Por favor, faça logout e login para ativar este ponto de montagem", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível recolher a informação do servidor ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}", + "There was an error with message: " : "Houve um erro com a mensagem:", + "External mount error" : "Erro de montagem externa", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação", "Access key" : "Código de acesso", "Secret key" : "Código secreto", "Builtin" : "Integrado", @@ -42,8 +53,12 @@ OC.L10N.register( "OAuth2" : "OAuth2", "Client ID" : "Id. do Cliente", "Client secret" : "Segredo do cliente\\\\", + "OpenStack" : "OpenStack", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", + "Tenant name" : "Nome do locatário", + "Identity endpoint URL" : "Identidade URL endpoint", + "Rackspace" : "Rackspace", "API key" : "Chave API", "Username and password" : "Nome de utilizador e palavra-passe", "Session credentials" : "Credenciais da sessão", @@ -70,6 +85,7 @@ OC.L10N.register( "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP com login por chave secreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", "Domain" : "Domínio", @@ -95,6 +111,7 @@ OC.L10N.register( "Add storage" : "Adicionar armazenamento", "Advanced settings" : "Definições avançadas", "Delete" : "Apagar", + "Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo", "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json index 816a61e5b3f..8f275cb62be 100644 --- a/apps/files_external/l10n/pt_PT.json +++ b/apps/files_external/l10n/pt_PT.json @@ -8,9 +8,11 @@ "Storage with id \"%i\" not found" : "Não foi encontrado o armazenamento com a id. \"%i\"", "Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos", "Invalid mount point" : "Ponto de montagem inválido", + "Objectstore forbidden" : "Objectstore proibido", "Invalid storage backend \"%s\"" : "Backend de armazenamento inválido \"%s\"", "Not permitted to use backend \"%s\"" : "Não é permitido utilizar a interface \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido utilizar o mecanismo de autenticação \"%s\"", + "Unsatisfied backend parameters" : "Parâmetros backend insatisfeitos", "Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -29,7 +31,16 @@ "Once every direct access" : "Uma vez em cada acesso direto", "All users. Type to select user or group." : "Todos os utilizadores. Digite para selecionar o utilizador ou grupo.", "(group)" : "(grupo)", + "Admin defined" : "Administrador definido", "Saved" : "Guardado", + "Empty response from the server" : "Resposta vazia a partir do servidor", + "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível aceder. Por favor, faça logout e login para ativar este ponto de montagem", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Não foi possível recolher a informação do servidor ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}", + "There was an error with message: " : "Houve um erro com a mensagem:", + "External mount error" : "Erro de montagem externa", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível conseguir a lista de pontos de montagem Windows na rede: resposta vazia do servidor", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação", "Access key" : "Código de acesso", "Secret key" : "Código secreto", "Builtin" : "Integrado", @@ -40,8 +51,12 @@ "OAuth2" : "OAuth2", "Client ID" : "Id. do Cliente", "Client secret" : "Segredo do cliente\\\\", + "OpenStack" : "OpenStack", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", + "Tenant name" : "Nome do locatário", + "Identity endpoint URL" : "Identidade URL endpoint", + "Rackspace" : "Rackspace", "API key" : "Chave API", "Username and password" : "Nome de utilizador e palavra-passe", "Session credentials" : "Credenciais da sessão", @@ -68,6 +83,7 @@ "ownCloud" : "ownCloud", "SFTP" : "SFTP", "Root" : "Root", + "SFTP with secret key login" : "SFTP com login por chave secreta", "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartilhar", "Domain" : "Domínio", @@ -93,6 +109,7 @@ "Add storage" : "Adicionar armazenamento", "Advanced settings" : "Definições avançadas", "Delete" : "Apagar", + "Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo", "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 72ebd4e821d..8a9ffaf7d37 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -426,13 +426,23 @@ class Google extends \OC\Files\Storage\Common { } if (isset($downloadUrl)) { $request = new \Google_Http_Request($downloadUrl, 'GET', null, null); - $httpRequest = $this->client->getAuth()->authenticatedRequest($request); - if ($httpRequest->getResponseHttpCode() == 200) { - $tmpFile = \OCP\Files::tmpFile($ext); - $data = $httpRequest->getResponseBody(); - file_put_contents($tmpFile, $data); - return fopen($tmpFile, $mode); + $httpRequest = $this->client->getAuth()->sign($request); + // the library's service doesn't support streaming, so we use Guzzle instead + $client = \OC::$server->getHTTPClientService()->newClient(); + try { + $response = $client->get($downloadUrl, [ + 'headers' => $httpRequest->getRequestHeaders(), + 'stream' => true + ]); + } catch (RequestException $e) { + if ($e->getResponse()->getStatusCode() === 404) { + return false; + } else { + throw $e; + } } + + return $response->getBody(); } } return false; diff --git a/apps/files_external/migration/storagemigrator.php b/apps/files_external/migration/storagemigrator.php index 2da47decf9f..ba81810a4fd 100644 --- a/apps/files_external/migration/storagemigrator.php +++ b/apps/files_external/migration/storagemigrator.php @@ -29,6 +29,7 @@ use OCA\Files_external\Service\LegacyStoragesService; use OCA\Files_external\Service\StoragesService; use OCA\Files_external\Service\UserLegacyStoragesService; use OCA\Files_external\Service\UserStoragesService; +use OCP\Files\Config\IUserMountCache; use OCP\IConfig; use OCP\IDBConnection; use OCP\ILogger; @@ -64,6 +65,9 @@ class StorageMigrator { */ private $logger; + /** @var IUserMountCache */ + private $userMountCache; + /** * StorageMigrator constructor. * @@ -72,19 +76,22 @@ class StorageMigrator { * @param IConfig $config * @param IDBConnection $connection * @param ILogger $logger + * @param IUserMountCache $userMountCache */ public function __construct( BackendService $backendService, DBConfigService $dbConfig, IConfig $config, IDBConnection $connection, - ILogger $logger + ILogger $logger, + IUserMountCache $userMountCache ) { $this->backendService = $backendService; $this->dbConfig = $dbConfig; $this->config = $config; $this->connection = $connection; $this->logger = $logger; + $this->userMountCache = $userMountCache; } private function migrate(LegacyStoragesService $legacyService, StoragesService $storageService) { @@ -107,7 +114,7 @@ class StorageMigrator { */ public function migrateGlobal() { $legacyService = new GlobalLegacyStoragesService($this->backendService); - $storageService = new GlobalStoragesService($this->backendService, $this->dbConfig); + $storageService = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->userMountCache); $this->migrate($legacyService, $storageService); } @@ -125,7 +132,7 @@ class StorageMigrator { if (version_compare($userVersion, '0.5.0', '<')) { $this->config->setUserValue($userId, 'files_external', 'config_version', '0.5.0'); $legacyService = new UserLegacyStoragesService($this->backendService, $dummySession); - $storageService = new UserStoragesService($this->backendService, $this->dbConfig, $dummySession); + $storageService = new UserStoragesService($this->backendService, $this->dbConfig, $dummySession, $this->userMountCache); $this->migrate($legacyService, $storageService); } diff --git a/apps/files_external/service/dbconfigservice.php b/apps/files_external/service/dbconfigservice.php index 94debcd7ebe..d52bf51e4aa 100644 --- a/apps/files_external/service/dbconfigservice.php +++ b/apps/files_external/service/dbconfigservice.php @@ -294,8 +294,14 @@ class DBConfigService { $builder = $this->connection->getQueryBuilder(); $query = $builder->delete('external_applicable') ->where($builder->expr()->eq('mount_id', $builder->createNamedParameter($mountId, \PDO::PARAM_INT))) - ->andWhere($builder->expr()->eq('type', $builder->createNamedParameter($type, \PDO::PARAM_INT))) - ->andWhere($builder->expr()->eq('value', $builder->createNamedParameter($value, \PDO::PARAM_STR))); + ->andWhere($builder->expr()->eq('type', $builder->createNamedParameter($type, \PDO::PARAM_INT))); + + if (is_null($value)) { + $query = $query->andWhere($builder->expr()->isNull('value')); + } else { + $query = $query->andWhere($builder->expr()->eq('value', $builder->createNamedParameter($value, \PDO::PARAM_STR))); + } + $query->execute(); } diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php index c0dd263ed66..678b91c0109 100644 --- a/apps/files_external/service/storagesservice.php +++ b/apps/files_external/service/storagesservice.php @@ -31,6 +31,7 @@ use \OCA\Files_external\Lib\StorageConfig; use \OCA\Files_external\NotFoundException; use \OCA\Files_External\Lib\Backend\Backend; use \OCA\Files_External\Lib\Auth\AuthMechanism; +use OCP\Files\Config\IUserMountCache; use \OCP\Files\StorageNotAvailableException; /** @@ -47,12 +48,19 @@ abstract class StoragesService { protected $dbConfig; /** + * @var IUserMountCache + */ + protected $userMountCache; + + /** * @param BackendService $backendService * @param DBConfigService $dbConfigService + * @param IUserMountCache $userMountCache */ - public function __construct(BackendService $backendService, DBConfigService $dbConfigService) { + public function __construct(BackendService $backendService, DBConfigService $dbConfigService, IUserMountCache $userMountCache) { $this->backendService = $backendService; $this->dbConfig = $dbConfigService; + $this->userMountCache = $userMountCache; } protected function readDBConfig() { @@ -416,6 +424,15 @@ abstract class StoragesService { $this->triggerChangeHooks($oldStorage, $updatedStorage); + if (($wasGlobal && !$isGlobal) || count($removedGroups) > 0) { // to expensive to properly handle these on the fly + $this->userMountCache->remoteStorageMounts($this->getStorageId($updatedStorage)); + } else { + $storageId = $this->getStorageId($updatedStorage); + foreach ($removedUsers as $userId) { + $this->userMountCache->removeUserStorageMount($storageId, $userId); + } + } + return $this->getStorage($id); } @@ -480,4 +497,25 @@ abstract class StoragesService { return $storageImpl->getId(); } + /** + * Construct the storage implementation + * + * @param StorageConfig $storageConfig + * @return int + */ + private function getStorageId(StorageConfig $storageConfig) { + try { + $class = $storageConfig->getBackend()->getStorageClass(); + /** @var \OC\Files\Storage\Storage $storage */ + $storage = new $class($storageConfig->getBackendOptions()); + + // auth mechanism should fire first + $storage = $storageConfig->getBackend()->wrapStorage($storage); + $storage = $storageConfig->getAuthMechanism()->wrapStorage($storage); + + return $storage->getStorageCache()->getNumericId(); + } catch (\Exception $e) { + return -1; + } + } } diff --git a/apps/files_external/service/userglobalstoragesservice.php b/apps/files_external/service/userglobalstoragesservice.php index 6407db2dd54..03c831fe971 100644 --- a/apps/files_external/service/userglobalstoragesservice.php +++ b/apps/files_external/service/userglobalstoragesservice.php @@ -25,6 +25,7 @@ namespace OCA\Files_External\Service; use \OCA\Files_external\Service\GlobalStoragesService; use \OCA\Files_External\Service\BackendService; +use OCP\Files\Config\IUserMountCache; use \OCP\IUserSession; use \OCP\IGroupManager; use \OCA\Files_External\Service\UserTrait; @@ -46,14 +47,16 @@ class UserGlobalStoragesService extends GlobalStoragesService { * @param DBConfigService $dbConfig * @param IUserSession $userSession * @param IGroupManager $groupManager + * @param IUserMountCache $userMountCache */ public function __construct( BackendService $backendService, DBConfigService $dbConfig, IUserSession $userSession, - IGroupManager $groupManager + IGroupManager $groupManager, + IUserMountCache $userMountCache ) { - parent::__construct($backendService, $dbConfig); + parent::__construct($backendService, $dbConfig, $userMountCache); $this->userSession = $userSession; $this->groupManager = $groupManager; } diff --git a/apps/files_external/service/userstoragesservice.php b/apps/files_external/service/userstoragesservice.php index 2805d9e6935..d4b04de609d 100644 --- a/apps/files_external/service/userstoragesservice.php +++ b/apps/files_external/service/userstoragesservice.php @@ -23,6 +23,7 @@ namespace OCA\Files_external\Service; +use OCP\Files\Config\IUserMountCache; use \OCP\IUserSession; use \OC\Files\Filesystem; @@ -44,14 +45,16 @@ class UserStoragesService extends StoragesService { * @param BackendService $backendService * @param DBConfigService $dbConfig * @param IUserSession $userSession user session + * @param IUserMountCache $userMountCache */ public function __construct( BackendService $backendService, DBConfigService $dbConfig, - IUserSession $userSession + IUserSession $userSession, + IUserMountCache $userMountCache ) { $this->userSession = $userSession; - parent::__construct($backendService, $dbConfig); + parent::__construct($backendService, $dbConfig, $userMountCache); } protected function readDBConfig() { diff --git a/apps/files_external/tests/service/dbconfigservicetest.php b/apps/files_external/tests/service/dbconfigservicetest.php index 2ee4c232c0d..41b5df73613 100644 --- a/apps/files_external/tests/service/dbconfigservicetest.php +++ b/apps/files_external/tests/service/dbconfigservicetest.php @@ -124,6 +124,18 @@ class DBConfigServiceTest extends TestCase { $this->assertEquals([], $mount['applicable']); } + public function testRemoveApplicableGlobal() { + $id = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN); + $this->dbConfig->addApplicable($id, DBConfigService::APPLICABLE_TYPE_GLOBAL, null); + $this->dbConfig->removeApplicable($id, DBConfigService::APPLICABLE_TYPE_GLOBAL, null); + $this->dbConfig->addApplicable($id, DBConfigService::APPLICABLE_TYPE_USER, 'test'); + + $mount = $this->dbConfig->getMountById($id); + $this->assertEquals([ + ['type' => DBConfigService::APPLICABLE_TYPE_USER, 'value' => 'test', 'mount_id' => $id] + ], $mount['applicable']); + } + public function testSetConfig() { $id = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN); $this->dbConfig->setConfig($id, 'foo', 'bar'); diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php index 7fc60efca08..6cdfbef82d4 100644 --- a/apps/files_external/tests/service/globalstoragesservicetest.php +++ b/apps/files_external/tests/service/globalstoragesservicetest.php @@ -34,7 +34,7 @@ use \OCA\Files_external\Lib\StorageConfig; class GlobalStoragesServiceTest extends StoragesServiceTest { public function setUp() { parent::setUp(); - $this->service = new GlobalStoragesService($this->backendService, $this->dbConfig); + $this->service = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache); } public function tearDown() { diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php index 710d804fd39..68671b599bd 100644 --- a/apps/files_external/tests/service/storagesservicetest.php +++ b/apps/files_external/tests/service/storagesservicetest.php @@ -76,6 +76,11 @@ abstract class StoragesServiceTest extends \Test\TestCase { */ protected static $hookCalls; + /** + * @var \PHPUnit_Framework_MockObject_MockObject|\OCP\Files\Config\IUserMountCache + */ + protected $mountCache; + public function setUp() { parent::setUp(); $this->dbConfig = new CleaningDBConfig(\OC::$server->getDatabaseConnection()); @@ -87,6 +92,8 @@ abstract class StoragesServiceTest extends \Test\TestCase { ); \OC_Mount_Config::$skipTest = true; + $this->mountCache = $this->getMock('OCP\Files\Config\IUserMountCache'); + // prepare BackendService mock $this->backendService = $this->getMockBuilder('\OCA\Files_External\Service\BackendService') diff --git a/apps/files_external/tests/service/userglobalstoragesservicetest.php b/apps/files_external/tests/service/userglobalstoragesservicetest.php index a22e2874073..baecf143c66 100644 --- a/apps/files_external/tests/service/userglobalstoragesservicetest.php +++ b/apps/files_external/tests/service/userglobalstoragesservicetest.php @@ -94,7 +94,8 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest { $this->backendService, $this->dbConfig, $userSession, - $this->groupManager + $this->groupManager, + $this->mountCache ); } diff --git a/apps/files_external/tests/service/userstoragesservicetest.php b/apps/files_external/tests/service/userstoragesservicetest.php index bf0efc13cf5..37423cb8d74 100644 --- a/apps/files_external/tests/service/userstoragesservicetest.php +++ b/apps/files_external/tests/service/userstoragesservicetest.php @@ -49,7 +49,7 @@ class UserStoragesServiceTest extends StoragesServiceTest { public function setUp() { parent::setUp(); - $this->globalStoragesService = new GlobalStoragesService($this->backendService, $this->dbConfig); + $this->globalStoragesService = new GlobalStoragesService($this->backendService, $this->dbConfig, $this->mountCache); $this->userId = $this->getUniqueID('user_'); $this->createUser($this->userId, $this->userId); @@ -62,7 +62,7 @@ class UserStoragesServiceTest extends StoragesServiceTest { ->method('getUser') ->will($this->returnValue($this->user)); - $this->service = new UserStoragesService($this->backendService, $this->dbConfig, $userSession); + $this->service = new UserStoragesService($this->backendService, $this->dbConfig, $userSession, $this->mountCache); } private function makeTestStorageData() { diff --git a/apps/files_sharing/api/ocssharewrapper.php b/apps/files_sharing/api/ocssharewrapper.php index a186a34cf6a..cc52d478615 100644 --- a/apps/files_sharing/api/ocssharewrapper.php +++ b/apps/files_sharing/api/ocssharewrapper.php @@ -37,7 +37,7 @@ class OCSShareWrapper { } public function getAllShares($params) { - return \OCA\Files_Sharing\API\Local::getAllShares($params); + return $this->getShare20OCS()->getShares(); } public function createShare() { diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php index c698dccefb8..c2ff94db790 100644 --- a/apps/files_sharing/api/share20ocs.php +++ b/apps/files_sharing/api/share20ocs.php @@ -87,6 +87,8 @@ class Share20OCS { 'parent' => $share->getParent(), 'expiration' => null, 'token' => null, + 'uid_file_owner' => $share->getShareOwner()->getUID(), + 'displayname_file_owner' => $share->getShareOwner()->getDisplayName(), ]; $path = $share->getPath(); @@ -325,6 +327,104 @@ class Share20OCS { return new \OC_OCS_Result($share); } + private function getSharedWithMe() { + $userShares = $this->shareManager->getSharedWith($this->currentUser, \OCP\Share::SHARE_TYPE_USER, -1, 0); + $groupShares = $this->shareManager->getSharedWith($this->currentUser, \OCP\Share::SHARE_TYPE_GROUP, -1, 0); + + $shares = array_merge($userShares, $groupShares); + + $formatted = []; + foreach ($shares as $share) { + $formatted[] = $this->formatShare($share); + } + + return new \OC_OCS_Result($formatted); + } + + /** + * @param \OCP\Files\Folder $folder + * @return \OC_OCS_Result + */ + private function getSharesInDir($folder) { + if (!($folder instanceof \OCP\Files\Folder)) { + return new \OC_OCS_Result(null, 400, "not a directory"); + } + + $nodes = $folder->getDirectoryListing(); + /** @var IShare[] $shares */ + $shares = []; + foreach ($nodes as $node) { + $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_USER, $node, false, -1, 0)); + $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_GROUP, $node, false, -1, 0)); + $shares = array_merge($shares, $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_LINK, $node, false, -1, 0)); + //TODO: Add federated shares + + } + + $formatted = []; + foreach ($shares as $share) { + $formatted[] = $this->formatShare($share); + } + + return new \OC_OCS_Result($formatted); + } + + /** + * The getShares function. + * + * - Get shares by the current user + * - Get shares by the current user and reshares (?reshares=true) + * - Get shares with the current user (?shared_with_me=true) + * - Get shares for a specific path (?path=...) + * - Get all shares in a folder (?subfiles=true&path=..) + * + * @return \OC_OCS_Result + */ + public function getShares() { + $sharedWithMe = $this->request->getParam('shared_with_me', null); + $reshares = $this->request->getParam('reshares', null); + $subfiles = $this->request->getParam('subfiles'); + $path = $this->request->getParam('path', null); + + if ($sharedWithMe === 'true') { + return $this->getSharedWithMe(); + } + + if ($path !== null) { + $userFolder = $this->rootFolder->getUserFolder($this->currentUser->getUID()); + try { + $path = $userFolder->get($path); + } catch (\OCP\Files\NotFoundException $e) { + return new \OC_OCS_Result(null, 404, 'wrong path, file/folder doesn\'t exist'); + } + } + + if ($subfiles === 'true') { + return $this->getSharesInDir($path); + } + + if ($reshares === 'true') { + $reshares = true; + } else { + $reshares = false; + } + + // Get all shares + $userShares = $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_USER, $path, $reshares, -1, 0); + $groupShares = $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_GROUP, $path, $reshares, -1, 0); + $linkShares = $this->shareManager->getSharesBy($this->currentUser, \OCP\Share::SHARE_TYPE_LINK, $path, $reshares, -1, 0); + //TODO: Add federated shares + + $shares = array_merge($userShares, $groupShares, $linkShares); + + $formatted = []; + foreach ($shares as $share) { + $formatted[] = $this->formatShare($share); + } + + return new \OC_OCS_Result($formatted); + } + /** * @param IShare $share * @return bool diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php index 4f47027953a..e4a2262fece 100644 --- a/apps/files_sharing/appinfo/application.php +++ b/apps/files_sharing/appinfo/application.php @@ -47,13 +47,15 @@ class Application extends App { return new ShareController( $c->query('AppName'), $c->query('Request'), - $c->query('UserSession'), - $server->getAppConfig(), $server->getConfig(), - $c->query('URLGenerator'), - $c->query('UserManager'), + $server->getURLGenerator(), + $server->getUserManager(), $server->getLogger(), - $server->getActivityManager() + $server->getActivityManager(), + $server->getShareManager(), + $server->getSession(), + $server->getPreviewManager(), + $server->getRootFolder() ); }); $container->registerService('ExternalSharesController', function (SimpleContainer $c) { @@ -68,15 +70,6 @@ class Application extends App { /** * Core class wrappers */ - $container->registerService('UserSession', function (SimpleContainer $c) use ($server) { - return $server->getUserSession(); - }); - $container->registerService('URLGenerator', function (SimpleContainer $c) use ($server) { - return $server->getUrlGenerator(); - }); - $container->registerService('UserManager', function (SimpleContainer $c) use ($server) { - return $server->getUserManager(); - }); $container->registerService('HttpClientService', function (SimpleContainer $c) use ($server) { return $server->getHTTPClientService(); }); diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js index c0a79ac58fa..afe04a57b90 100644 --- a/apps/files_sharing/l10n/pt_PT.js +++ b/apps/files_sharing/l10n/pt_PT.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível neste servidor", "The mountpoint name contains invalid characters." : "O nome do ponto de montagem contém carateres inválidos.", + "Not allowed to create a federated share with the same user server" : "Não é possível criar uma partilha federada com o mesmo servidor de utilizador", "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável", "Could not authenticate to remote share, password might be wrong" : "Não foi possível autenticar para a partilha remota, a palavra-passe poderá estar errada", "Storage not valid" : "Armazenamento inválido", diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json index f57f939e5cb..190187b1500 100644 --- a/apps/files_sharing/l10n/pt_PT.json +++ b/apps/files_sharing/l10n/pt_PT.json @@ -1,6 +1,7 @@ { "translations": { "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível neste servidor", "The mountpoint name contains invalid characters." : "O nome do ponto de montagem contém carateres inválidos.", + "Not allowed to create a federated share with the same user server" : "Não é possível criar uma partilha federada com o mesmo servidor de utilizador", "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável", "Could not authenticate to remote share, password might be wrong" : "Não foi possível autenticar para a partilha remota, a palavra-passe poderá estar errada", "Storage not valid" : "Armazenamento inválido", diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php index 63ab49b4df3..6f9a8d742cc 100644 --- a/apps/files_sharing/lib/controllers/sharecontroller.php +++ b/apps/files_sharing/lib/controllers/sharecontroller.php @@ -41,14 +41,18 @@ use OCP\IRequest; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\NotFoundResponse; -use OC\URLGenerator; -use OC\AppConfig; +use OCP\IURLGenerator; +use OCP\IConfig; use OCP\ILogger; +use OCP\IUserManager; +use OCP\ISession; +use OCP\IPreview; use OCA\Files_Sharing\Helper; -use OCP\User; use OCP\Util; use OCA\Files_Sharing\Activity; use \OCP\Files\NotFoundException; +use \OC\Share20\IShare; +use OCP\Files\IRootFolder; /** * Class ShareController @@ -57,50 +61,60 @@ use \OCP\Files\NotFoundException; */ class ShareController extends Controller { - /** @var \OC\User\Session */ - protected $userSession; - /** @var \OC\AppConfig */ - protected $appConfig; - /** @var \OCP\IConfig */ + /** @var IConfig */ protected $config; - /** @var \OC\URLGenerator */ + /** @var IURLGenerator */ protected $urlGenerator; - /** @var \OC\User\Manager */ + /** @var IUserManager */ protected $userManager; - /** @var \OCP\ILogger */ + /** @var ILogger */ protected $logger; /** @var OCP\Activity\IManager */ protected $activityManager; + /** @var OC\Share20\Manager */ + protected $shareManager; + /** @var ISession */ + protected $session; + /** @var IPreview */ + protected $previewManager; + /** @var IRootFolder */ + protected $rootFolder; /** * @param string $appName * @param IRequest $request - * @param OC\User\Session $userSession - * @param AppConfig $appConfig - * @param OCP\IConfig $config - * @param URLGenerator $urlGenerator - * @param OCP\IUserManager $userManager + * @param IConfig $config + * @param IURLGenerator $urlGenerator + * @param IUserManager $userManager * @param ILogger $logger * @param OCP\Activity\IManager $activityManager + * @param \OC\Share20\Manager $shareManager + * @param ISession $session + * @param IPreview $previewManager + * @param IRootFolder $rootFolder */ public function __construct($appName, IRequest $request, - OC\User\Session $userSession, - AppConfig $appConfig, - OCP\IConfig $config, - URLGenerator $urlGenerator, - OCP\IUserManager $userManager, + IConfig $config, + IURLGenerator $urlGenerator, + IUserManager $userManager, ILogger $logger, - OCP\Activity\IManager $activityManager) { + \OCP\Activity\IManager $activityManager, + \OC\Share20\Manager $shareManager, + ISession $session, + IPreview $previewManager, + IRootFolder $rootFolder) { parent::__construct($appName, $request); - $this->userSession = $userSession; - $this->appConfig = $appConfig; $this->config = $config; $this->urlGenerator = $urlGenerator; $this->userManager = $userManager; $this->logger = $logger; $this->activityManager = $activityManager; + $this->shareManager = $shareManager; + $this->session = $session; + $this->previewManager = $previewManager; + $this->rootFolder = $rootFolder; } /** @@ -111,9 +125,9 @@ class ShareController extends Controller { * @return TemplateResponse|RedirectResponse */ public function showAuthenticate($token) { - $linkItem = Share::getShareByToken($token, false); + $share = $this->shareManager->getShareByToken($token); - if(Helper::authenticate($linkItem)) { + if($this->linkShareAuth($share)) { return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $token))); } @@ -130,12 +144,15 @@ class ShareController extends Controller { * @return RedirectResponse|TemplateResponse */ public function authenticate($token, $password = '') { - $linkItem = Share::getShareByToken($token, false); - if($linkItem === false) { + + // Check whether share exists + try { + $share = $this->shareManager->getShareByToken($token); + } catch (\OC\Share20\Exception\ShareNotFound $e) { return new NotFoundResponse(); } - $authenticate = Helper::authenticate($linkItem, $password); + $authenticate = $this->linkShareAuth($share, $password); if($authenticate === true) { return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $token))); @@ -145,6 +162,34 @@ class ShareController extends Controller { } /** + * Authenticate a link item with the given password. + * Or use the session if no password is provided. + * + * This is a modified version of Helper::authenticate + * TODO: Try to merge back eventually with Helper::authenticate + * + * @param IShare $share + * @param string|null $password + * @return bool + */ + private function linkShareAuth(IShare $share, $password = null) { + if ($password !== null) { + if ($this->shareManager->checkPassword($share, $password)) { + $this->session->set('public_link_authenticated', (string)$share->getId()); + } else { + return false; + } + } else { + // not authenticated ? + if ( ! $this->session->exists('public_link_authenticated') + || $this->session->get('public_link_authenticated') !== (string)$share->getId()) { + return false; + } + } + return true; + } + + /** * @PublicPage * @NoCSRFRequired * @@ -157,54 +202,70 @@ class ShareController extends Controller { \OC_User::setIncognitoMode(true); // Check whether share exists - $linkItem = Share::getShareByToken($token, false); - if($linkItem === false) { + try { + $share = $this->shareManager->getShareByToken($token); + } catch (\OC\Share20\Exception\ShareNotFound $e) { return new NotFoundResponse(); } - $shareOwner = $linkItem['uid_owner']; - $originalSharePath = $this->getPath($token); - // Share is password protected - check whether the user is permitted to access the share - if (isset($linkItem['share_with']) && !Helper::authenticate($linkItem)) { + if ($share->getPassword() !== null && !$this->linkShareAuth($share)) { return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', array('token' => $token))); } - if (Filesystem::isReadable($originalSharePath . $path)) { - $getPath = Filesystem::normalizePath($path); - $originalSharePath .= $path; - } else { + // We can't get the path of a file share + if ($share->getPath() instanceof \OCP\Files\File && $path !== '') { throw new NotFoundException(); } - $file = basename($originalSharePath); + $rootFolder = null; + if ($share->getPath() instanceof \OCP\Files\Folder) { + /** @var \OCP\Files\Folder $rootFolder */ + $rootFolder = $share->getPath(); + + try { + $path = $rootFolder->get($path); + } catch (\OCP\Files\NotFoundException $e) { + throw new NotFoundException(); + } + } $shareTmpl = []; - $shareTmpl['displayName'] = User::getDisplayName($shareOwner); - $shareTmpl['owner'] = $shareOwner; - $shareTmpl['filename'] = $file; - $shareTmpl['directory_path'] = $linkItem['file_target']; - $shareTmpl['mimetype'] = Filesystem::getMimeType($originalSharePath); - $shareTmpl['previewSupported'] = \OC::$server->getPreviewManager()->isMimeSupported($shareTmpl['mimetype']); - $shareTmpl['dirToken'] = $linkItem['token']; + $shareTmpl['displayName'] = $share->getShareOwner()->getDisplayName(); + $shareTmpl['owner'] = $share->getShareOwner()->getUID(); + $shareTmpl['filename'] = $share->getPath()->getName(); + $shareTmpl['directory_path'] = $share->getTarget(); + $shareTmpl['mimetype'] = $share->getPath()->getMimetype(); + $shareTmpl['previewSupported'] = $this->previewManager->isMimeSupported($share->getPath()->getMimetype()); + $shareTmpl['dirToken'] = $token; $shareTmpl['sharingToken'] = $token; $shareTmpl['server2serversharing'] = Helper::isOutgoingServer2serverShareEnabled(); - $shareTmpl['protected'] = isset($linkItem['share_with']) ? 'true' : 'false'; + $shareTmpl['protected'] = $share->getPassword() !== null ? 'true' : 'false'; $shareTmpl['dir'] = ''; - $nonHumanFileSize = \OC\Files\Filesystem::filesize($originalSharePath); - $shareTmpl['nonHumanFileSize'] = $nonHumanFileSize; - $shareTmpl['fileSize'] = \OCP\Util::humanFileSize($nonHumanFileSize); + $shareTmpl['nonHumanFileSize'] = $share->getPath()->getSize(); + $shareTmpl['fileSize'] = \OCP\Util::humanFileSize($share->getPath()->getSize()); // Show file list - if (Filesystem::is_dir($originalSharePath)) { - $shareTmpl['dir'] = $getPath; - $maxUploadFilesize = Util::maxUploadFilesize($originalSharePath); - $freeSpace = Util::freeSpace($originalSharePath); + if ($share->getPath() instanceof \OCP\Files\Folder) { + $shareTmpl['dir'] = $rootFolder->getRelativePath($path->getPath()); + + /* + * The OC_Util methods require a view. This just uses the node API + */ + $freeSpace = $share->getPath()->getStorage()->free_space($share->getPath()->getInternalPath()); + if ($freeSpace !== \OCP\Files\FileInfo::SPACE_UNKNOWN) { + $freeSpace = max($freeSpace, 0); + } else { + $freeSpace = (INF > 0) ? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188 + } + $uploadLimit = Util::uploadLimit(); + $maxUploadFilesize = min($freeSpace, $uploadLimit); + $folder = new Template('files', 'list', ''); - $folder->assign('dir', $getPath); - $folder->assign('dirToken', $linkItem['token']); + $folder->assign('dir', $rootFolder->getRelativePath($path->getPath())); + $folder->assign('dirToken', $token); $folder->assign('permissions', \OCP\Constants::PERMISSION_READ); $folder->assign('isPublic', true); $folder->assign('publicUploadEnabled', 'no'); @@ -242,14 +303,12 @@ class ShareController extends Controller { public function downloadShare($token, $files = null, $path = '', $downloadStartSecret = '') { \OC_User::setIncognitoMode(true); - $linkItem = OCP\Share::getShareByToken($token, false); + $share = $this->shareManager->getShareByToken($token); // Share is password protected - check whether the user is permitted to access the share - if (isset($linkItem['share_with'])) { - if(!Helper::authenticate($linkItem)) { - return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', - array('token' => $token))); - } + if ($share->getPassword() !== null && !$this->linkShareAuth($share)) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', + ['token' => $token])); } $files_list = null; @@ -257,41 +316,86 @@ class ShareController extends Controller { $files_list = json_decode($files); // in case we get only a single file if ($files_list === null) { - $files_list = array($files); + $files_list = [$files]; } } - $originalSharePath = self::getPath($token); - - // Create the activities - if (isset($originalSharePath) && Filesystem::isReadable($originalSharePath . $path)) { - $originalSharePath = Filesystem::normalizePath($originalSharePath . $path); - $isDir = \OC\Files\Filesystem::is_dir($originalSharePath); + $userFolder = $this->rootFolder->getUserFolder($share->getShareOwner()->getUID()); + $originalSharePath = $userFolder->getRelativePath($share->getPath()->getPath()); + + // Single file share + if ($share->getPath() instanceof \OCP\Files\File) { + // Single file download + $event = $this->activityManager->generateEvent(); + $event->setApp('files_sharing') + ->setType(Activity::TYPE_PUBLIC_LINKS) + ->setSubject(Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED, [$userFolder->getRelativePath($share->getPath()->getPath())]) + ->setAffectedUser($share->getShareOwner()->getUID()) + ->setObject('files', $share->getPath()->getId(), $userFolder->getRelativePath($share->getPath()->getPath())); + $this->activityManager->publish($event); + } + // Directory share + else { + /** @var \OCP\Files\Folder $node */ + $node = $share->getPath(); + + // Try to get the path + if ($path !== '') { + try { + $node = $node->get($path); + } catch (NotFoundException $e) { + return new NotFoundResponse(); + } + } - $activities = []; - if (!$isDir) { - // Single file public share - $activities[$originalSharePath] = Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED; + $originalSharePath = $userFolder->getRelativePath($node->getPath()); + + if ($node instanceof \OCP\Files\File) { + // Single file download + $event = $this->activityManager->generateEvent(); + $event->setApp('files_sharing') + ->setType(Activity::TYPE_PUBLIC_LINKS) + ->setSubject(Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED, [$userFolder->getRelativePath($node->getPath())]) + ->setAffectedUser($share->getShareOwner()->getUID()) + ->setObject('files', $node->getId(), $userFolder->getRelativePath($node->getPath())); + $this->activityManager->publish($event); } else if (!empty($files_list)) { - // Only some files are downloaded + /** @var \OCP\Files\Folder $node */ + + // Subset of files is downloaded foreach ($files_list as $file) { - $filePath = Filesystem::normalizePath($originalSharePath . '/' . $file); - $isDir = \OC\Files\Filesystem::is_dir($filePath); - $activities[$filePath] = ($isDir) ? Activity::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED : Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED; + $subNode = $node->get($file); + + $event = $this->activityManager->generateEvent(); + $event->setApp('files_sharing') + ->setType(Activity::TYPE_PUBLIC_LINKS) + ->setAffectedUser($share->getShareOwner()->getUID()) + ->setObject('files', $subNode->getId(), $userFolder->getRelativePath($subNode->getPath())); + + if ($subNode instanceof \OCP\Files\File) { + $event->setSubject(Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED, [$userFolder->getRelativePath($subNode->getPath())]); + } else { + $event->setSubject(Activity::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED, [$userFolder->getRelativePath($subNode->getPath())]); + } + + $this->activityManager->publish($event); } } else { // The folder is downloaded - $activities[$originalSharePath] = Activity::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED; - } - - foreach ($activities as $filePath => $subject) { - $this->activityManager->publishActivity( - 'files_sharing', $subject, array($filePath), '', array(), - $filePath, '', $linkItem['uid_owner'], Activity::TYPE_PUBLIC_LINKS, Activity::PRIORITY_MEDIUM - ); + $event = $this->activityManager->generateEvent(); + $event->setApp('files_sharing') + ->setType(Activity::TYPE_PUBLIC_LINKS) + ->setSubject(Activity::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED, [$userFolder->getRelativePath($node->getPath())]) + ->setAffectedUser($share->getShareOwner()->getUID()) + ->setObject('files', $node->getId(), $userFolder->getRelativePath($node->getPath())); + $this->activityManager->publish($event); } } + /* FIXME: We should do this all nicely in OCP */ + OC_Util::tearDownFS(); + OC_Util::setupFS($share->getShareOwner()->getUID()); + /** * this sets a cookie to be able to recognize the start of the download * the content must not be longer than 32 characters and must only contain @@ -318,30 +422,4 @@ class ShareController extends Controller { exit(); } } - - /** - * @param string $token - * @return string Resolved file path of the token - * @throws NotFoundException In case share could not get properly resolved - */ - private function getPath($token) { - $linkItem = Share::getShareByToken($token, false); - if (is_array($linkItem) && isset($linkItem['uid_owner'])) { - // seems to be a valid share - $rootLinkItem = Share::resolveReShare($linkItem); - if (isset($rootLinkItem['uid_owner'])) { - if(!$this->userManager->userExists($rootLinkItem['uid_owner'])) { - throw new NotFoundException('Owner of the share does not exist anymore'); - } - OC_Util::tearDownFS(); - OC_Util::setupFS($rootLinkItem['uid_owner']); - $path = Filesystem::getPath($linkItem['file_source']); - if(Filesystem::isReadable($path)) { - return $path; - } - } - } - - throw new NotFoundException('No file found belonging to file.'); - } } diff --git a/apps/files_sharing/lib/scanner.php b/apps/files_sharing/lib/scanner.php index bd6a28a4934..e9cc40ae42c 100644 --- a/apps/files_sharing/lib/scanner.php +++ b/apps/files_sharing/lib/scanner.php @@ -22,10 +22,14 @@ namespace OC\Files\Cache; +use OC\Files\ObjectStore\NoopScanner; +use OC\Files\Storage\Shared; + /** * Scanner for SharedStorage */ class SharedScanner extends Scanner { + private $sourceScanner; /** * Returns metadata from the shared storage, but @@ -35,12 +39,35 @@ class SharedScanner extends Scanner { * * @return array an array of metadata of the file */ - protected function getData($path){ + public function getData($path) { $data = parent::getData($path); $sourcePath = $this->storage->getSourcePath($path); list($sourceStorage, $internalPath) = \OC\Files\Filesystem::resolvePath($sourcePath); $data['permissions'] = $sourceStorage->getPermissions($internalPath); return $data; } + + private function getSourceScanner() { + if ($this->sourceScanner) { + return $this->sourceScanner; + } + if ($this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) { + /** @var \OC\Files\Storage\Storage $storage */ + list($storage) = $this->storage->resolvePath(''); + $this->sourceScanner = $storage->getScanner(); + return $this->sourceScanner; + } else { + return null; + } + } + + public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) { + $sourceScanner = $this->getSourceScanner(); + if ($sourceScanner instanceof NoopScanner) { + return []; + } else { + return parent::scanFile($file, $reuseExisting, $parentId, $cacheData, $lock); + } + } } diff --git a/apps/files_sharing/lib/sharedpropagator.php b/apps/files_sharing/lib/sharedpropagator.php index fd3e14b28f8..29735934499 100644 --- a/apps/files_sharing/lib/sharedpropagator.php +++ b/apps/files_sharing/lib/sharedpropagator.php @@ -32,12 +32,13 @@ class SharedPropagator extends Propagator { /** * @param string $internalPath * @param int $time - * @return array[] all propagated entries + * @param int $sizeDifference + * @return \array[] all propagated entries */ - public function propagateChange($internalPath, $time) { + public function propagateChange($internalPath, $time, $sizeDifference = 0) { $source = $this->storage->getSourcePath($internalPath); /** @var \OC\Files\Storage\Storage $storage */ list($storage, $sourceInternalPath) = \OC\Files\Filesystem::resolvePath($source); - return $storage->getPropagator()->propagateChange($sourceInternalPath, $time); + return $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference); } } diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 697856e1de5..542d0e9e48c 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -609,7 +609,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { * @param string $path * @return array */ - private function resolvePath($path) { + public function resolvePath($path) { $source = $this->getSourcePath($path); return \OC\Files\Filesystem::resolvePath($source); } diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index aa1f926ea35..e6c4f57009f 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -26,7 +26,7 @@ $thumbSize = 1024; ?> <?php if ($_['previewSupported']): /* This enables preview images for links (e.g. on Facebook, Google+, ...)*/?> - <link rel="image_src" href="<?php p(OCP\Util::linkToRoute( 'core_ajax_public_preview', array('x' => $thumbSize, 'y' => $thumbSize, 'file' => $_['directory_path'], 't' => $_['dirToken']))); ?>" /> + <link rel="image_src" href="<?php p(\OC::$server->getURLGenerator()->linkToRoute( 'core_ajax_public_preview', array('x' => $thumbSize, 'y' => $thumbSize, 'file' => $_['directory_path'], 't' => $_['dirToken']))); ?>" /> <?php endif; ?> <div id="notification-container"> diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php index 81166b9e3c4..f38af988155 100644 --- a/apps/files_sharing/tests/api/share20ocstest.php +++ b/apps/files_sharing/tests/api/share20ocstest.php @@ -171,6 +171,10 @@ class Share20OCSTest extends \Test\TestCase { public function dataGetShare() { $data = []; + $initiator = $this->getMock('OCP\IUser'); + $initiator->method('getUID')->willReturn('initiatorId'); + $initiator->method('getDisplayName')->willReturn('initiatorDisplay'); + $owner = $this->getMock('OCP\IUser'); $owner->method('getUID')->willReturn('ownerId'); $owner->method('getDisplayName')->willReturn('ownerDisplay'); @@ -193,8 +197,6 @@ class Share20OCSTest extends \Test\TestCase { $storage->method('getId')->willReturn('STORAGE'); $storage->method('getCache')->willReturn($cache); - - $parentFolder = $this->getMock('OCP\Files\Folder'); $parentFolder->method('getId')->willReturn(3); @@ -215,7 +217,7 @@ class Share20OCSTest extends \Test\TestCase { 100, \OCP\Share::SHARE_TYPE_USER, $user, - $owner, + $initiator, $owner, $file, 4, @@ -230,8 +232,8 @@ class Share20OCSTest extends \Test\TestCase { 'share_type' => \OCP\Share::SHARE_TYPE_USER, 'share_with' => 'userId', 'share_with_displayname' => 'userDisplay', - 'uid_owner' => 'ownerId', - 'displayname_owner' => 'ownerDisplay', + 'uid_owner' => 'initiatorId', + 'displayname_owner' => 'initiatorDisplay', 'item_type' => 'file', 'item_source' => 1, 'file_source' => 1, @@ -246,6 +248,8 @@ class Share20OCSTest extends \Test\TestCase { 'path' => 'file', 'storage' => 101, 'mail_send' => 0, + 'uid_file_owner' => 'ownerId', + 'displayname_file_owner' => 'ownerDisplay' ]; $data[] = [$share, $expected]; @@ -254,7 +258,7 @@ class Share20OCSTest extends \Test\TestCase { 101, \OCP\Share::SHARE_TYPE_GROUP, $group, - $owner, + $initiator, $owner, $folder, 4, @@ -269,8 +273,8 @@ class Share20OCSTest extends \Test\TestCase { 'share_type' => \OCP\Share::SHARE_TYPE_GROUP, 'share_with' => 'groupId', 'share_with_displayname' => 'groupId', - 'uid_owner' => 'ownerId', - 'displayname_owner' => 'ownerDisplay', + 'uid_owner' => 'initiatorId', + 'displayname_owner' => 'initiatorDisplay', 'item_type' => 'folder', 'item_source' => 2, 'file_source' => 2, @@ -285,6 +289,8 @@ class Share20OCSTest extends \Test\TestCase { 'path' => 'folder', 'storage' => 101, 'mail_send' => 0, + 'uid_file_owner' => 'ownerId', + 'displayname_file_owner' => 'ownerDisplay' ]; $data[] = [$share, $expected]; @@ -294,7 +300,7 @@ class Share20OCSTest extends \Test\TestCase { 101, \OCP\Share::SHARE_TYPE_LINK, null, - $owner, + $initiator, $owner, $folder, 4, @@ -311,8 +317,8 @@ class Share20OCSTest extends \Test\TestCase { 'share_type' => \OCP\Share::SHARE_TYPE_LINK, 'share_with' => 'password', 'share_with_displayname' => 'password', - 'uid_owner' => 'ownerId', - 'displayname_owner' => 'ownerDisplay', + 'uid_owner' => 'initiatorId', + 'displayname_owner' => 'initiatorDisplay', 'item_type' => 'folder', 'item_source' => 2, 'file_source' => 2, @@ -328,6 +334,8 @@ class Share20OCSTest extends \Test\TestCase { 'storage' => 101, 'mail_send' => 0, 'url' => 'url', + 'uid_file_owner' => 'ownerId', + 'displayname_file_owner' => 'ownerDisplay' ]; $data[] = [$share, $expected]; diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php index 914c98d9470..43db17f5abc 100644 --- a/apps/files_sharing/tests/controller/sharecontroller.php +++ b/apps/files_sharing/tests/controller/sharecontroller.php @@ -30,15 +30,13 @@ namespace OCA\Files_Sharing\Controllers; use OC\Files\Filesystem; -use OCA\Files_Sharing\AppInfo\Application; +use OC\Share20\Exception\ShareNotFound; use OCP\AppFramework\Http\NotFoundResponse; -use OCP\AppFramework\IAppContainer; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; +use OCP\ISession; use OCP\Security\ISecureRandom; -use OC\Files\View; -use OCP\Share; -use OC\URLGenerator; +use OCP\IURLGenerator; /** * @group DB @@ -47,33 +45,49 @@ use OC\URLGenerator; */ class ShareControllerTest extends \Test\TestCase { - /** @var IAppContainer */ - private $container; /** @var string */ private $user; /** @var string */ - private $token; - /** @var string */ private $oldUser; + + /** @var string */ + private $appName = 'files_sharing'; /** @var ShareController */ private $shareController; - /** @var URLGenerator */ + /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; + /** @var ISession | \PHPUnit_Framework_MockObject_MockObject */ + private $session; + /** @var \OCP\IPreview | \PHPUnit_Framework_MockObject_MockObject */ + private $previewManager; + /** @var \OCP\IConfig | \PHPUnit_Framework_MockObject_MockObject */ + private $config; + /** @var \OC\Share20\Manager | \PHPUnit_Framework_MockObject_MockObject */ + private $shareManager; protected function setUp() { - $app = new Application(); - $this->container = $app->getContainer(); - $this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') - ->disableOriginalConstructor()->getMock(); - $this->container['AppName'] = 'files_sharing'; - $this->container['UserSession'] = $this->getMockBuilder('\OC\User\Session') - ->disableOriginalConstructor()->getMock(); - $this->container['URLGenerator'] = $this->getMockBuilder('\OC\URLGenerator') - ->disableOriginalConstructor()->getMock(); - $this->container['UserManager'] = $this->getMockBuilder('\OCP\IUserManager') - ->disableOriginalConstructor()->getMock(); - $this->urlGenerator = $this->container['URLGenerator']; - $this->shareController = $this->container['ShareController']; + $this->appName = 'files_sharing'; + + $this->shareManager = $this->getMockBuilder('\OC\Share20\Manager')->disableOriginalConstructor()->getMock(); + $this->urlGenerator = $this->getMock('\OCP\IURLGenerator'); + $this->session = $this->getMock('\OCP\ISession'); + $this->previewManager = $this->getMock('\OCP\IPreview'); + $this->config = $this->getMock('\OCP\IConfig'); + + $this->shareController = new \OCA\Files_Sharing\Controllers\ShareController( + $this->appName, + $this->getMock('\OCP\IRequest'), + $this->config, + $this->urlGenerator, + $this->getMock('\OCP\IUserManager'), + $this->getMock('\OCP\ILogger'), + $this->getMock('\OCP\Activity\IManager'), + $this->shareManager, + $this->session, + $this->previewManager, + $this->getMock('\OCP\Files\IRootFolder') + ); + // Store current user $this->oldUser = \OC_User::getUser(); @@ -84,17 +98,6 @@ class ShareControllerTest extends \Test\TestCase { \OC::$server->getUserManager()->createUser($this->user, $this->user); \OC_Util::tearDownFS(); $this->loginAsUser($this->user); - - // Create a dummy shared file - $view = new View('/'. $this->user . '/files'); - $view->file_put_contents('file1.txt', 'I am such an awesome shared file!'); - $this->token = \OCP\Share::shareItem( - Filesystem::getFileInfo('file1.txt')->getType(), - Filesystem::getFileInfo('file1.txt')->getId(), - \OCP\Share::SHARE_TYPE_LINK, - 'IAmPasswordProtected!', - 1 - ); } protected function tearDown() { @@ -112,72 +115,211 @@ class ShareControllerTest extends \Test\TestCase { \OC_Util::setupFS($this->oldUser); } - public function testShowAuthenticate() { - $linkItem = \OCP\Share::getShareByToken($this->token, false); + public function testShowAuthenticateNotAuthenticated() { + $share = $this->getMock('\OC\Share20\IShare'); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); - // Test without being authenticated - $response = $this->shareController->showAuthenticate($this->token); - $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array(), 'guest'); + $response = $this->shareController->showAuthenticate('token'); + $expectedResponse = new TemplateResponse($this->appName, 'authenticate', [], 'guest'); $this->assertEquals($expectedResponse, $response); + } + + public function testShowAuthenticateAuthenticatedForDifferentShare() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getId')->willReturn(1); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); - // Test with being authenticated for another file - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']-1); - $response = $this->shareController->showAuthenticate($this->token); - $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array(), 'guest'); + $this->session->method('exists')->with('public_link_authenticated')->willReturn(true); + $this->session->method('get')->with('public_link_authenticated')->willReturn('2'); + + $response = $this->shareController->showAuthenticate('token'); + $expectedResponse = new TemplateResponse($this->appName, 'authenticate', [], 'guest'); $this->assertEquals($expectedResponse, $response); + } + + public function testShowAuthenticateCorrectShare() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getId')->willReturn(1); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); + + $this->session->method('exists')->with('public_link_authenticated')->willReturn(true); + $this->session->method('get')->with('public_link_authenticated')->willReturn('1'); - // Test with being authenticated for the correct file - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - $response = $this->shareController->showAuthenticate($this->token); - $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $this->token))); + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('files_sharing.sharecontroller.showShare', ['token' => 'token']) + ->willReturn('redirect'); + + $response = $this->shareController->showAuthenticate('token'); + $expectedResponse = new RedirectResponse('redirect'); $this->assertEquals($expectedResponse, $response); } - public function testAuthenticate() { - // Test without a not existing token - $response = $this->shareController->authenticate('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)'); + public function testAutehnticateInvalidToken() { + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->will($this->throwException(new \OC\Share20\Exception\ShareNotFound())); + + $response = $this->shareController->authenticate('token'); $expectedResponse = new NotFoundResponse(); $this->assertEquals($expectedResponse, $response); + } - // Test with a valid password - $response = $this->shareController->authenticate($this->token, 'IAmPasswordProtected!'); - $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $this->token))); + public function testAuthenticateValidPassword() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getId')->willReturn(42); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); + + $this->shareManager + ->expects($this->once()) + ->method('checkPassword') + ->with($share, 'validpassword') + ->willReturn(true); + + $this->session + ->expects($this->once()) + ->method('set') + ->with('public_link_authenticated', '42'); + + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('files_sharing.sharecontroller.showShare', ['token'=>'token']) + ->willReturn('redirect'); + + $response = $this->shareController->authenticate('token', 'validpassword'); + $expectedResponse = new RedirectResponse('redirect'); $this->assertEquals($expectedResponse, $response); + } - // Test with a invalid password - $response = $this->shareController->authenticate($this->token, 'WrongPw!'); - $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array('wrongpw' => true), 'guest'); + public function testAuthenticateInvalidPassword() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getId')->willReturn(42); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); + + $this->shareManager + ->expects($this->once()) + ->method('checkPassword') + ->with($share, 'invalidpassword') + ->willReturn(false); + + $this->session + ->expects($this->never()) + ->method('set'); + + $response = $this->shareController->authenticate('token', 'invalidpassword'); + $expectedResponse = new TemplateResponse($this->appName, 'authenticate', array('wrongpw' => true), 'guest'); $this->assertEquals($expectedResponse, $response); } - public function testShowShare() { - $this->container['UserManager']->expects($this->exactly(2)) - ->method('userExists') - ->with($this->user) - ->will($this->returnValue(true)); + public function testShowShareInvalidToken() { + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('invalidtoken') + ->will($this->throwException(new ShareNotFound())); // Test without a not existing token - $response = $this->shareController->showShare('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)'); + $response = $this->shareController->showShare('invalidtoken'); $expectedResponse = new NotFoundResponse(); $this->assertEquals($expectedResponse, $response); + } - // Test with a password protected share and no authentication - $response = $this->shareController->showShare($this->token); - $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', array('token' => $this->token))); + public function testShowShareNotAuthenticated() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getPassword')->willReturn('password'); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('validtoken') + ->willReturn($share); + + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('files_sharing.sharecontroller.authenticate', ['token' => 'validtoken']) + ->willReturn('redirect'); + + // Test without a not existing token + $response = $this->shareController->showShare('validtoken'); + $expectedResponse = new RedirectResponse('redirect'); $this->assertEquals($expectedResponse, $response); + } + - // Test with password protected share and authentication - $linkItem = Share::getShareByToken($this->token, false); - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - $response = $this->shareController->showShare($this->token); + public function testShowShare() { + $owner = $this->getMock('OCP\IUser'); + $owner->method('getDisplayName')->willReturn('ownerDisplay'); + $owner->method('getUID')->willReturn('ownerUID'); + + $file = $this->getMock('OCP\Files\File'); + $file->method('getName')->willReturn('file1.txt'); + $file->method('getMimetype')->willReturn('text/plain'); + $file->method('getSize')->willReturn(33); + + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getId')->willReturn('42'); + $share->method('getPassword')->willReturn('password'); + $share->method('getShareOwner')->willReturn($owner); + $share->method('getPath')->willReturn($file); + $share->method('getTarget')->willReturn('/file1.txt'); + + $this->session->method('exists')->with('public_link_authenticated')->willReturn(true); + $this->session->method('get')->with('public_link_authenticated')->willReturn('42'); + + $this->previewManager->method('isMimeSupported')->with('text/plain')->willReturn(true); + + $this->config->method('getSystemValue') + ->willReturnMap( + [ + ['max_filesize_animated_gifs_public_sharing', 10, 10], + ['enable_previews', true, true], + ] + ); + $shareTmpl['maxSizeAnimateGif'] = $this->config->getSystemValue('max_filesize_animated_gifs_public_sharing', 10); + $shareTmpl['previewEnabled'] = $this->config->getSystemValue('enable_previews', true); + + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); + + $response = $this->shareController->showShare('token'); $sharedTmplParams = array( - 'displayName' => $this->user, - 'owner' => $this->user, + 'displayName' => 'ownerDisplay', + 'owner' => 'ownerUID', 'filename' => 'file1.txt', 'directory_path' => '/file1.txt', 'mimetype' => 'text/plain', - 'dirToken' => $this->token, - 'sharingToken' => $this->token, + 'dirToken' => 'token', + 'sharingToken' => 'token', 'server2serversharing' => true, 'protected' => 'true', 'dir' => '', @@ -191,65 +333,31 @@ class ShareControllerTest extends \Test\TestCase { $csp = new \OCP\AppFramework\Http\ContentSecurityPolicy(); $csp->addAllowedFrameDomain('\'self\''); - $expectedResponse = new TemplateResponse($this->container['AppName'], 'public', $sharedTmplParams, 'base'); + $expectedResponse = new TemplateResponse($this->appName, 'public', $sharedTmplParams, 'base'); $expectedResponse->setContentSecurityPolicy($csp); $this->assertEquals($expectedResponse, $response); } public function testDownloadShare() { - // Test with a password protected share and no authentication - $response = $this->shareController->downloadShare($this->token); - $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', - array('token' => $this->token))); - $this->assertEquals($expectedResponse, $response); - } + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getPassword')->willReturn('password'); - /** - * @expectedException \OCP\Files\NotFoundException - */ - public function testShowShareWithDeletedFile() { - $this->container['UserManager']->expects($this->once()) - ->method('userExists') - ->with($this->user) - ->will($this->returnValue(true)); - - $view = new View('/'. $this->user . '/files'); - $view->unlink('file1.txt'); - $linkItem = Share::getShareByToken($this->token, false); - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - $this->shareController->showShare($this->token); - } + $this->shareManager + ->expects($this->once()) + ->method('getShareByToken') + ->with('validtoken') + ->willReturn($share); - /** - * @expectedException \OCP\Files\NotFoundException - */ - public function testDownloadShareWithDeletedFile() { - $this->container['UserManager']->expects($this->once()) - ->method('userExists') - ->with($this->user) - ->will($this->returnValue(true)); - - $view = new View('/'. $this->user . '/files'); - $view->unlink('file1.txt'); - $linkItem = Share::getShareByToken($this->token, false); - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - $this->shareController->downloadShare($this->token); - } + $this->urlGenerator->expects($this->once()) + ->method('linkToRoute') + ->with('files_sharing.sharecontroller.authenticate', ['token' => 'validtoken']) + ->willReturn('redirect'); - /** - * @expectedException \Exception - * @expectedExceptionMessage Owner of the share does not exist anymore - */ - public function testShowShareWithNotExistingUser() { - $this->container['UserManager']->expects($this->once()) - ->method('userExists') - ->with($this->user) - ->will($this->returnValue(false)); - - $linkItem = Share::getShareByToken($this->token, false); - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - $this->shareController->showShare($this->token); + // Test with a password protected share and no authentication + $response = $this->shareController->downloadShare('validtoken'); + $expectedResponse = new RedirectResponse('redirect'); + $this->assertEquals($expectedResponse, $response); } } diff --git a/apps/provisioning_api/lib/users.php b/apps/provisioning_api/lib/users.php index a385f2c1180..efb10a50865 100644 --- a/apps/provisioning_api/lib/users.php +++ b/apps/provisioning_api/lib/users.php @@ -285,7 +285,7 @@ class Users { break; case 'email': if(filter_var($parameters['_put']['value'], FILTER_VALIDATE_EMAIL)) { - $this->config->setUserValue($targetUserId, 'settings', 'email', $parameters['_put']['value']); + $targetUser->setEMailAddress($parameters['_put']['value']); } else { return new OC_OCS_Result(null, 102); } diff --git a/apps/provisioning_api/tests/userstest.php b/apps/provisioning_api/tests/userstest.php index 25e723a13b4..3ce13181b8d 100644 --- a/apps/provisioning_api/tests/userstest.php +++ b/apps/provisioning_api/tests/userstest.php @@ -932,10 +932,10 @@ class UsersTest extends OriginalTest { ->method('get') ->with('UserToEdit') ->will($this->returnValue($targetUser)); - $this->config + $targetUser ->expects($this->once()) - ->method('setUserValue') - ->with('UserToEdit', 'settings', 'email', 'demo@owncloud.org'); + ->method('setEMailAddress') + ->with('demo@owncloud.org'); $expected = new \OC_OCS_Result(null, 100); $this->assertEquals($expected, $this->api->editUser(['userid' => 'UserToEdit', '_put' => ['key' => 'email', 'value' => 'demo@owncloud.org']])); diff --git a/apps/systemtags/appinfo/app.php b/apps/systemtags/appinfo/app.php new file mode 100644 index 00000000000..d07902f777f --- /dev/null +++ b/apps/systemtags/appinfo/app.php @@ -0,0 +1,40 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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/> + * + */ + +$eventDispatcher = \OC::$server->getEventDispatcher(); +$eventDispatcher->addListener( + 'OCA\Files::loadAdditionalScripts', + function() { + // FIXME: no public API for these ? + \OC_Util::addVendorScript('select2/select2'); + \OC_Util::addVendorStyle('select2/select2'); + \OCP\Util::addScript('select2-toggleselect'); + \OCP\Util::addScript('oc-backbone-webdav'); + \OCP\Util::addScript('systemtags/systemtagmodel'); + \OCP\Util::addScript('systemtags/systemtagsmappingcollection'); + \OCP\Util::addScript('systemtags/systemtagscollection'); + \OCP\Util::addScript('systemtags/systemtagsinputfield'); + \OCP\Util::addScript('systemtags', 'app'); + \OCP\Util::addScript('systemtags', 'filesplugin'); + \OCP\Util::addScript('systemtags', 'systemtagsinfoview'); + \OCP\Util::addStyle('systemtags'); + } +); diff --git a/apps/systemtags/appinfo/info.xml b/apps/systemtags/appinfo/info.xml new file mode 100644 index 00000000000..59b7fc01eb6 --- /dev/null +++ b/apps/systemtags/appinfo/info.xml @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<info> + <id>systemtags</id> + <name>System tags</name> + <description>System-wide tags user interface</description> + <licence>AGPL</licence> + <author>Vincent Petry</author> + <default_enable/> + <version>0.1</version> + <dependencies> + <owncloud min-version="9.0" /> + <owncloud max-version="9.1" /> + </dependencies> + <documentation> + <user>user-systemtags</user> + </documentation> +</info> diff --git a/apps/systemtags/js/app.js b/apps/systemtags/js/app.js new file mode 100644 index 00000000000..f55aa5c9a6e --- /dev/null +++ b/apps/systemtags/js/app.js @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function() { + if (!OCA.SystemTags) { + /** + * @namespace + */ + OCA.SystemTags = {}; + } + +})(); + diff --git a/apps/systemtags/js/filesplugin.js b/apps/systemtags/js/filesplugin.js new file mode 100644 index 00000000000..471440c2e09 --- /dev/null +++ b/apps/systemtags/js/filesplugin.js @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function() { + OCA.SystemTags = _.extend({}, OCA.SystemTags); + if (!OCA.SystemTags) { + /** + * @namespace + */ + OCA.SystemTags = {}; + } + + /** + * @namespace + */ + OCA.SystemTags.FilesPlugin = { + allowedLists: [ + 'files', + 'favorites' + ], + + attach: function(fileList) { + if (this.allowedLists.indexOf(fileList.id) < 0) { + return; + } + + fileList.registerDetailView(new OCA.SystemTags.SystemTagsInfoView()); + } + }; + +})(); + +OC.Plugins.register('OCA.Files.FileList', OCA.SystemTags.FilesPlugin); + diff --git a/apps/systemtags/js/systemtagsinfoview.js b/apps/systemtags/js/systemtagsinfoview.js new file mode 100644 index 00000000000..b1820bfcd91 --- /dev/null +++ b/apps/systemtags/js/systemtagsinfoview.js @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OCA) { + /** + * @class OCA.SystemTags.SystemTagsInfoView + * @classdesc + * + * Displays a file's system tags + * + */ + var SystemTagsInfoView = OCA.Files.DetailFileInfoView.extend( + /** @lends OCA.SystemTags.SystemTagsInfoView.prototype */ { + + _rendered: false, + + className: 'systemTagsInfoView hidden', + + /** + * @type OC.SystemTags.SystemTagsInputField + */ + _inputView: null, + + initialize: function(options) { + var self = this; + options = options || {}; + + this._inputView = new OC.SystemTags.SystemTagsInputField({ + multiple: true, + allowActions: true, + allowCreate: true, + initSelection: function(element, callback) { + callback(self.selectedTagsCollection.toJSON()); + } + }); + + this.selectedTagsCollection = new OC.SystemTags.SystemTagsMappingCollection([], {objectType: 'files'}); + + this._inputView.collection.on('change:name', this._onTagRenamedGlobally, this); + this._inputView.collection.on('remove', this._onTagDeletedGlobally, this); + + this._inputView.on('select', this._onSelectTag, this); + this._inputView.on('deselect', this._onDeselectTag, this); + }, + + /** + * Event handler whenever a tag was selected + */ + _onSelectTag: function(tag) { + // create a mapping entry for this tag + this.selectedTagsCollection.create(tag.toJSON()); + }, + + /** + * Event handler whenever a tag gets deselected. + * Removes the selected tag from the mapping collection. + * + * @param {string} tagId tag id + */ + _onDeselectTag: function(tagId) { + this.selectedTagsCollection.get(tagId).destroy(); + }, + + /** + * Event handler whenever a tag was renamed globally. + * + * This will automatically adjust the tag mapping collection to + * container the new name. + * + * @param {OC.Backbone.Model} changedTag tag model that has changed + */ + _onTagRenamedGlobally: function(changedTag) { + // also rename it in the selection, if applicable + var selectedTagMapping = this.selectedTagsCollection.get(changedTag.id); + if (selectedTagMapping) { + selectedTagMapping.set(changedTag.toJSON()); + } + }, + + /** + * Event handler whenever a tag was deleted globally. + * + * This will automatically adjust the tag mapping collection to + * container the new name. + * + * @param {OC.Backbone.Model} changedTag tag model that has changed + */ + _onTagDeletedGlobally: function(tagId) { + // also rename it in the selection, if applicable + this.selectedTagsCollection.remove(tagId); + }, + + setFileInfo: function(fileInfo) { + var self = this; + if (!this._rendered) { + this.render(); + } + + if (fileInfo) { + this.selectedTagsCollection.setObjectId(fileInfo.id); + this.selectedTagsCollection.fetch({ + success: function(collection) { + collection.fetched = true; + self._inputView.setData(collection.toJSON()); + self.$el.removeClass('hidden'); + } + }); + } + this.$el.addClass('hidden'); + }, + + /** + * Renders this details view + */ + render: function() { + this.$el.append(this._inputView.$el); + this._inputView.render(); + }, + + remove: function() { + this._inputView.remove(); + } + }); + + OCA.SystemTags.SystemTagsInfoView = SystemTagsInfoView; + +})(OCA); + diff --git a/apps/systemtags/tests/js/systemtagsinfoviewSpec.js b/apps/systemtags/tests/js/systemtagsinfoviewSpec.js new file mode 100644 index 00000000000..971ad8fc17e --- /dev/null +++ b/apps/systemtags/tests/js/systemtagsinfoviewSpec.js @@ -0,0 +1,149 @@ +/** +* ownCloud +* +* @author Vincent Petry +* @copyright 2016 Vincent Petry <pvince81@owncloud.com> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +describe('OCA.SystemTags.SystemTagsInfoView tests', function() { + var view; + + beforeEach(function() { + view = new OCA.SystemTags.SystemTagsInfoView(); + $('#testArea').append(view.$el); + }); + afterEach(function() { + view.remove(); + view = undefined; + }); + describe('rendering', function() { + it('renders input field view', function() { + view.render(); + expect(view.$el.find('input[name=tags]').length).toEqual(1); + }); + it('fetches selected tags then renders when setting file info', function() { + var fetchStub = sinon.stub(OC.SystemTags.SystemTagsMappingCollection.prototype, 'fetch'); + var setDataStub = sinon.stub(OC.SystemTags.SystemTagsInputField.prototype, 'setData'); + + expect(view.$el.hasClass('hidden')).toEqual(true); + + view.setFileInfo({id: '123'}); + expect(view.$el.find('input[name=tags]').length).toEqual(1); + + expect(fetchStub.calledOnce).toEqual(true); + expect(view.selectedTagsCollection.url()) + .toEqual(OC.linkToRemote('dav') + '/systemtags-relations/files/123'); + + view.selectedTagsCollection.add([ + {id: '1', name: 'test1'}, + {id: '3', name: 'test3'} + ]); + + fetchStub.yieldTo('success', view.selectedTagsCollection); + expect(setDataStub.calledOnce).toEqual(true); + expect(setDataStub.getCall(0).args[0]).toEqual([{ + id: '1', name: 'test1', userVisible: true, userAssignable: true + }, { + id: '3', name: 'test3', userVisible: true, userAssignable: true + }]); + + expect(view.$el.hasClass('hidden')).toEqual(false); + + fetchStub.restore(); + setDataStub.restore(); + }); + it('overrides initSelection to use the local collection', function() { + var inputViewSpy = sinon.spy(OC.SystemTags, 'SystemTagsInputField'); + var element = $('<input type="hidden" val="1,3"/>'); + view.remove(); + view = new OCA.SystemTags.SystemTagsInfoView(); + view.selectedTagsCollection.add([ + {id: '1', name: 'test1'}, + {id: '3', name: 'test3'} + ]); + + var callback = sinon.stub(); + inputViewSpy.getCall(0).args[0].initSelection(element, callback); + + expect(callback.calledOnce).toEqual(true); + expect(callback.getCall(0).args[0]).toEqual([{ + id: '1', name: 'test1', userVisible: true, userAssignable: true + }, { + id: '3', name: 'test3', userVisible: true, userAssignable: true + }]); + + inputViewSpy.restore(); + }); + }); + describe('events', function() { + var allTagsCollection; + beforeEach(function() { + allTagsCollection = view._inputView.collection; + + allTagsCollection.add([ + {id: '1', name: 'test1'}, + {id: '2', name: 'test2'}, + {id: '3', name: 'test3'} + ]); + + view.selectedTagsCollection.add([ + {id: '1', name: 'test1'}, + {id: '3', name: 'test3'} + ]); + view.render(); + }); + + it('renames model in selection collection on rename', function() { + allTagsCollection.get('3').set('name', 'test3_renamed'); + + expect(view.selectedTagsCollection.get('3').get('name')).toEqual('test3_renamed'); + }); + + it('adds tag to selection collection when selected by input', function() { + var createStub = sinon.stub(OC.SystemTags.SystemTagsMappingCollection.prototype, 'create'); + view._inputView.trigger('select', allTagsCollection.get('2')); + + expect(createStub.calledOnce).toEqual(true); + expect(createStub.getCall(0).args[0]).toEqual({ + id: '2', + name: 'test2', + userVisible: true, + userAssignable: true + }); + + createStub.restore(); + }); + it('removes tag from selection collection when deselected by input', function() { + var destroyStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'destroy'); + view._inputView.trigger('deselect', '3'); + + expect(destroyStub.calledOnce).toEqual(true); + expect(destroyStub.calledOn(view.selectedTagsCollection.get('3'))).toEqual(true); + + destroyStub.restore(); + }); + + it('removes tag from selection whenever the tag was deleted globally', function() { + expect(view.selectedTagsCollection.get('3')).not.toBeFalsy(); + + allTagsCollection.remove('3'); + + expect(view.selectedTagsCollection.get('3')).toBeFalsy(); + + }); + }); +}); diff --git a/apps/testing/appinfo/info.xml b/apps/testing/appinfo/info.xml index b11ec2f88e6..cfbe75ddadc 100644 --- a/apps/testing/appinfo/info.xml +++ b/apps/testing/appinfo/info.xml @@ -1,12 +1,12 @@ <?xml version="1.0"?> <info> <id>testing</id> - <name>QA Testing</name> + <name>QA testing</name> <description>This app is only for testing! It is dangerous to have it enabled in a live instance</description> <licence>AGPL</licence> <author>Joas Schilling</author> <version>0.1.0</version> <dependencies> - <owncloud min-version="9.0" /> + <owncloud min-version="9.0" max-version="9.0" /> </dependencies> </info> diff --git a/apps/testing/img/app.svg b/apps/testing/img/app.svg new file mode 100644 index 00000000000..b6ae35211a3 --- /dev/null +++ b/apps/testing/img/app.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <path d="m13.733 0.00064c-0.52991 0-0.93331 0.40337-0.93331 0.93333v2.6666c-1.182 0.3034-2.243 0.7934-3.2668 1.4001l-1.9334-1.9334c-0.3747-0.3747-0.9586-0.3747-1.3333 0l-3.1999 3.2c-0.37473 0.37474-0.37473 0.95859 0 1.3333l1.9334 1.9335c-0.6067 1.0239-1.0967 2.0849-1.4001 3.2669h-2.6666c-0.52994 0-0.9333 0.403-0.9333 0.933v4.5333c2e-8 0.52996 0.40336 0.93333 0.93331 0.93333h2.6666c0.30335 1.1817 0.79332 2.2426 1.4 3.2666l-1.9334 1.9349c-0.37473 0.37474-0.37473 0.95859 0 1.3333l3.1999 3.2c0.37473 0.37474 0.95857 0.37474 1.3333 0l1.9334-1.9349c1.024 0.608 2.0849 1.0965 3.2665 1.3995v2.6667c0 0.53 0.403 0.933 0.933 0.933h4.5332c0.52991 0 0.93331-0.4032 0.93331-0.9344v-2.6667c1.1816-0.30336 2.2425-0.79335 3.2665-1.4l1.9333 1.9333c0.37473 0.37474 0.95857 0.37474 1.3333 0l3.1999-3.2c0.37473-0.37474 0.37473-0.95859 0-1.3333l-1.9327-1.9328c0.60798-1.024 1.0965-2.0845 1.3994-3.2661h2.6666c0.532 0 0.935-0.403 0.935-0.933v-4.534c0-0.53-0.403-0.933-0.934-0.933h-2.667c-0.303-1.182-0.791-2.243-1.399-3.2666l1.932-1.9334c0.37473-0.37474 0.37473-0.95859 0-1.3333l-3.2-3.2c-0.37473-0.37474-0.95857-0.37474-1.3333 0l-1.9327 1.9334c-1.024-0.6067-2.084-1.0967-3.266-1.4001v-2.6667c0-0.52993-0.403-0.9333-0.933-0.9333zm2.2666 8.8689c3.9361 0 7.1309 3.1947 7.1309 7.1311 0 3.9362-3.1946 7.1311-7.1309 7.1311-3.9361 0-7.1309-3.1955-7.1309-7.1317s3.1948-7.1311 7.1309-7.1311z" display="block" fill="#fff"/> +</svg> diff --git a/apps/user_ldap/ajax/wizard.php b/apps/user_ldap/ajax/wizard.php index 21396068267..666af85e56e 100644 --- a/apps/user_ldap/ajax/wizard.php +++ b/apps/user_ldap/ajax/wizard.php @@ -54,7 +54,8 @@ $userManager = new \OCA\user_ldap\lib\user\Manager( new \OCA\user_ldap\lib\LogWrapper(), \OC::$server->getAvatarManager(), new \OCP\Image(), - \OC::$server->getDatabaseConnection()); + \OC::$server->getDatabaseConnection(), + \OC::$server->getUserManager()); $access = new \OCA\user_ldap\lib\Access($con, $ldapWrapper, $userManager); diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index 763fdc99c6b..dab47ee6e6f 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -37,7 +37,8 @@ if(count($configPrefixes) === 1) { new OCA\user_ldap\lib\LogWrapper(), \OC::$server->getAvatarManager(), new \OCP\Image(), - $dbc + $dbc, + \OC::$server->getUserManager() ); $connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]); $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper, $userManager); diff --git a/apps/user_ldap/l10n/he.js b/apps/user_ldap/l10n/he.js index 76c659f6d0c..6a69268ec8e 100644 --- a/apps/user_ldap/l10n/he.js +++ b/apps/user_ldap/l10n/he.js @@ -1,13 +1,71 @@ OC.L10N.register( "user_ldap", { + "Failed to clear the mappings." : "כשל בניקוי המיפויים.", + "Failed to delete the server configuration" : "כשל במחיקת הגדרות השרת", + "The configuration is invalid: anonymous bind is not allowed." : "התצורה אינה חוקית: חיבור אנונימי אסור", + "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", + "Action does not exist" : "פעולה לא קיימת", + "The Base DN appears to be wrong" : "בסיס DN נראה כשגוי", + "Configuration incorrect" : "הגדרה שגויה", + "Configuration incomplete" : "הגדרה לא מלאה", + "Configuration OK" : "הגדרה בסדר", "Select groups" : "בחירת קבוצות", - "Do you really want to delete the current Server Configuration?" : "האם אכן למחוק את הגדרות השרת הנוכחיות?", + "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." : "קיימים יותר מ- 1,000 רשומות ספריה.", + " entries available within the provided Base DN" : " קיימות רשומות מתוך בסיס ה- 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!" : "מיפויים נוקו בהצלחה!", + "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." : "משתמש אותר והגדרות אומתו.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "הגדרות אומתו, אך רק משתמש אחד אותר. רק הראשון יוכל להתחבר. יש לבחון שימוש בסינון צר יותר.", + "An unspecified error occurred. Please check the settings and the log." : "אירעה שגיאה לא מזוהה. יש לבדוק את ההגדרות ואת הלוג.", + "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.", + "_%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" : "מארח לא חוקי", "Server" : "שרת", "Users" : "משתמשים", + "Login Attributes" : "פרטי כניסה", "Groups" : "קבוצות", + "Test Configuration" : "בדיקת הגדרות", "Help" : "עזרה", + "Groups meeting these criteria are available in %s:" : "קבוצות העומדות בקריטריון זה זמינות ב- %s:", + "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 groups" : "מאמת הגדרות וסופר קבוצות", + "When logging in, %s will find the user based on the following attributes:" : "כאשר מתחברים, %s יחפש את המשתמש על פי המאפיינים הבאים:", "Host" : "מארח", "Port" : "פורט", "User DN" : "DN משתמש", diff --git a/apps/user_ldap/l10n/he.json b/apps/user_ldap/l10n/he.json index 842a8bedd9c..2cdc1710f2a 100644 --- a/apps/user_ldap/l10n/he.json +++ b/apps/user_ldap/l10n/he.json @@ -1,11 +1,69 @@ { "translations": { + "Failed to clear the mappings." : "כשל בניקוי המיפויים.", + "Failed to delete the server configuration" : "כשל במחיקת הגדרות השרת", + "The configuration is invalid: anonymous bind is not allowed." : "התצורה אינה חוקית: חיבור אנונימי אסור", + "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", + "Action does not exist" : "פעולה לא קיימת", + "The Base DN appears to be wrong" : "בסיס DN נראה כשגוי", + "Configuration incorrect" : "הגדרה שגויה", + "Configuration incomplete" : "הגדרה לא מלאה", + "Configuration OK" : "הגדרה בסדר", "Select groups" : "בחירת קבוצות", - "Do you really want to delete the current Server Configuration?" : "האם אכן למחוק את הגדרות השרת הנוכחיות?", + "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." : "קיימים יותר מ- 1,000 רשומות ספריה.", + " entries available within the provided Base DN" : " קיימות רשומות מתוך בסיס ה- 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!" : "מיפויים נוקו בהצלחה!", + "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." : "משתמש אותר והגדרות אומתו.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "הגדרות אומתו, אך רק משתמש אחד אותר. רק הראשון יוכל להתחבר. יש לבחון שימוש בסינון צר יותר.", + "An unspecified error occurred. Please check the settings and the log." : "אירעה שגיאה לא מזוהה. יש לבדוק את ההגדרות ואת הלוג.", + "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.", + "_%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" : "מארח לא חוקי", "Server" : "שרת", "Users" : "משתמשים", + "Login Attributes" : "פרטי כניסה", "Groups" : "קבוצות", + "Test Configuration" : "בדיקת הגדרות", "Help" : "עזרה", + "Groups meeting these criteria are available in %s:" : "קבוצות העומדות בקריטריון זה זמינות ב- %s:", + "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 groups" : "מאמת הגדרות וסופר קבוצות", + "When logging in, %s will find the user based on the following attributes:" : "כאשר מתחברים, %s יחפש את המשתמש על פי המאפיינים הבאים:", "Host" : "מארח", "Port" : "פורט", "User DN" : "DN משתמש", diff --git a/apps/user_ldap/l10n/pt_PT.js b/apps/user_ldap/l10n/pt_PT.js index 256385b6f85..d6bd1d9d515 100644 --- a/apps/user_ldap/l10n/pt_PT.js +++ b/apps/user_ldap/l10n/pt_PT.js @@ -24,6 +24,7 @@ OC.L10N.register( "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.", + "More than 1,000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", " entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido", "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.", "Do you really want to delete the current Server Configuration?" : "Deseja realmente apagar as configurações de servidor actuais?", @@ -73,6 +74,7 @@ OC.L10N.register( "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permtir entrar no sistema a partir do atributo \"email\". Neste caso os campos \"Mail\" e \"mailPrimaryAddress\" serão utilizados para verificação.", "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 se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"", + "Test Loginname" : "Testar nome de login", "Verify settings" : "Verificar definições", "1. Server" : "1. Servidor", "%s. Server:" : "%s. Servvidor", diff --git a/apps/user_ldap/l10n/pt_PT.json b/apps/user_ldap/l10n/pt_PT.json index a26aae4691b..8073db3efa6 100644 --- a/apps/user_ldap/l10n/pt_PT.json +++ b/apps/user_ldap/l10n/pt_PT.json @@ -22,6 +22,7 @@ "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.", + "More than 1,000 directory entries available." : "Mais de 1,000 entradas de diretório disponíveis.", " entries available within the provided Base DN" : "entradas disponíveis no ND de base fornecido", "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.", "Do you really want to delete the current Server Configuration?" : "Deseja realmente apagar as configurações de servidor actuais?", @@ -71,6 +72,7 @@ "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permtir entrar no sistema a partir do atributo \"email\". Neste caso os campos \"Mail\" e \"mailPrimaryAddress\" serão utilizados para verificação.", "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 se tenta uma sessão. %%uid substitui o nome de utilizador na ação de início de sessão. Exemplo: \"uid=%%uid\"", + "Test Loginname" : "Testar nome de login", "Verify settings" : "Verificar definições", "1. Server" : "1. Servidor", "%s. Server:" : "%s. Servvidor", diff --git a/apps/user_ldap/l10n/sl.js b/apps/user_ldap/l10n/sl.js index d3712c273f0..8444f09fed2 100644 --- a/apps/user_ldap/l10n/sl.js +++ b/apps/user_ldap/l10n/sl.js @@ -21,7 +21,7 @@ OC.L10N.register( "Confirm Deletion" : "Potrdi brisanje", "Mode switch" : "Preklop načina", "Select attributes" : "Izbor atributov", - "User found and settings verified." : "Uporabnik najden in nastavitve preverjene.", + "User found and settings verified." : "Uporabnik je najden in nastavitve so overjene.", "_%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"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Ni mogoče prebrati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", @@ -34,11 +34,12 @@ OC.L10N.register( "Test Configuration" : "Preizkusne nastavitve", "Help" : "Pomoč", "Groups meeting these criteria are available in %s:" : "Skupine, ki so skladne s kriterijem, so na voljo v %s:", - "Only these object classes:" : "Samo tej razredi objektov:", - "Only from these groups:" : "Samo te skupine:", - "Search groups" : "Skupine za iskanje", - "Available groups" : "Razpoložljive skupine", + "Only these object classes:" : "Le ti razredi predmetov:", + "Only from these groups:" : "Le od skupin:", + "Search groups" : "Iskanje skupin", + "Available groups" : "Skupine na voljo", "Selected groups" : "Izbrane skupine", + "Edit LDAP Query" : "Uredi poizvedbo LDAP", "LDAP Filter:" : "Filter LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filter določa, katere skupine LDAP bodo imele dostop do %s.", "Other Attributes:" : "Drugi atributi:", diff --git a/apps/user_ldap/l10n/sl.json b/apps/user_ldap/l10n/sl.json index 14e73e628a0..8dbb7111a32 100644 --- a/apps/user_ldap/l10n/sl.json +++ b/apps/user_ldap/l10n/sl.json @@ -19,7 +19,7 @@ "Confirm Deletion" : "Potrdi brisanje", "Mode switch" : "Preklop načina", "Select attributes" : "Izbor atributov", - "User found and settings verified." : "Uporabnik najden in nastavitve preverjene.", + "User found and settings verified." : "Uporabnik je najden in nastavitve so overjene.", "_%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"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Ni mogoče prebrati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", @@ -32,11 +32,12 @@ "Test Configuration" : "Preizkusne nastavitve", "Help" : "Pomoč", "Groups meeting these criteria are available in %s:" : "Skupine, ki so skladne s kriterijem, so na voljo v %s:", - "Only these object classes:" : "Samo tej razredi objektov:", - "Only from these groups:" : "Samo te skupine:", - "Search groups" : "Skupine za iskanje", - "Available groups" : "Razpoložljive skupine", + "Only these object classes:" : "Le ti razredi predmetov:", + "Only from these groups:" : "Le od skupin:", + "Search groups" : "Iskanje skupin", + "Available groups" : "Skupine na voljo", "Selected groups" : "Izbrane skupine", + "Edit LDAP Query" : "Uredi poizvedbo LDAP", "LDAP Filter:" : "Filter LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filter določa, katere skupine LDAP bodo imele dostop do %s.", "Other Attributes:" : "Drugi atributi:", diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js index 1ccfefcb7a8..eb3ee924b7a 100644 --- a/apps/user_ldap/l10n/sr.js +++ b/apps/user_ldap/l10n/sr.js @@ -24,6 +24,7 @@ OC.L10N.register( "Could not detect Base DN, please enter it manually." : "Не могу да откријем базни ДН. Унесите га ручно.", "{nthServer}. Server" : "{nthServer}. Сервер", "No object found in the given Base DN. Please revise." : "Нема објекта за дати базни ДН. Проверите.", + "More than 1,000 directory entries available." : "Више од 1000 уноса је доступно.", " entries available within the provided Base DN" : "уноса доступно за дати базни ДН", "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?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?", diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json index 658edafc77b..233df2f4e34 100644 --- a/apps/user_ldap/l10n/sr.json +++ b/apps/user_ldap/l10n/sr.json @@ -22,6 +22,7 @@ "Could not detect Base DN, please enter it manually." : "Не могу да откријем базни ДН. Унесите га ручно.", "{nthServer}. Server" : "{nthServer}. Сервер", "No object found in the given Base DN. Please revise." : "Нема објекта за дати базни ДН. Проверите.", + "More than 1,000 directory entries available." : "Више од 1000 уноса је доступно.", " entries available within the provided Base DN" : "уноса доступно за дати базни ДН", "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?" : "Да ли стварно желите да обришете тренутну конфигурацију сервера?", diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 97f795483a9..82cd342ae2f 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -709,8 +709,16 @@ class Access extends LDAPUtility implements user\IUserTools { * @param array $ldapRecords */ public function batchApplyUserAttributes(array $ldapRecords){ + $displayNameAttribute = strtolower($this->connection->ldapUserDisplayName); foreach($ldapRecords as $userRecord) { + if(!isset($userRecord[$displayNameAttribute])) { + // displayName is obligatory + continue; + } $ocName = $this->dn2ocname($userRecord['dn'][0]); + if($ocName === false) { + continue; + } $this->cacheUserExists($ocName); $user = $this->userManager->get($ocName); if($user instanceof OfflineUser) { diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index e810fb835d4..75d244255c6 100644 --- a/apps/user_ldap/lib/configuration.php +++ b/apps/user_ldap/lib/configuration.php @@ -281,7 +281,6 @@ class Configuration { * * @param string $varName name of config-key * @param array|string $value to set - * @param boolean $trim Trim value? (default: false) */ protected function setMultiLine($varName, $value) { if(empty($value)) { diff --git a/apps/user_ldap/lib/jobs.php b/apps/user_ldap/lib/jobs.php index b27f66055a3..47e28470188 100644 --- a/apps/user_ldap/lib/jobs.php +++ b/apps/user_ldap/lib/jobs.php @@ -175,7 +175,8 @@ class Jobs extends \OC\BackgroundJob\TimedJob { new LogWrapper(), \OC::$server->getAvatarManager(), new \OCP\Image(), - $dbc); + $dbc, + \OC::$server->getUserManager()); $connector = new Connection($ldapWrapper, $configPrefixes[0]); $ldapAccess = new Access($connector, $ldapWrapper, $userManager); $groupMapper = new GroupMapping($dbc); diff --git a/apps/user_ldap/lib/proxy.php b/apps/user_ldap/lib/proxy.php index 28233748790..082ba9a93d0 100644 --- a/apps/user_ldap/lib/proxy.php +++ b/apps/user_ldap/lib/proxy.php @@ -61,6 +61,7 @@ abstract class Proxy { static $userMap; static $groupMap; static $db; + static $userManager; if(is_null($fs)) { $ocConfig = \OC::$server->getConfig(); $fs = new FilesystemHelper(); @@ -69,9 +70,10 @@ abstract class Proxy { $db = \OC::$server->getDatabaseConnection(); $userMap = new UserMapping($db); $groupMap = new GroupMapping($db); + $userManager = \OC::$server->getUserManager(); } $userManager = - new user\Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image(), $db); + new user\Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image(), $db, $userManager); $connector = new Connection($this->ldap, $configPrefix); $access = new Access($connector, $this->ldap, $userManager); $access->setUserMapper($userMap); diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php index dcaf40b80c4..cfa333b06d4 100644 --- a/apps/user_ldap/lib/user/manager.php +++ b/apps/user_ldap/lib/user/manager.php @@ -29,6 +29,11 @@ use OCA\user_ldap\lib\user\User; use OCA\user_ldap\lib\LogWrapper; use OCA\user_ldap\lib\FilesystemHelper; use OCA\user_ldap\lib\user\OfflineUser; +use OCP\IAvatarManager; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\Image; +use OCP\IUserManager; /** * Manager @@ -40,10 +45,10 @@ class Manager { /** @var IUserTools */ protected $access; - /** @var \OCP\IConfig */ + /** @var IConfig */ protected $ocConfig; - /** @var \OCP\IDBConnection */ + /** @var IDBConnection */ protected $db; /** @var FilesystemHelper */ @@ -52,7 +57,7 @@ class Manager { /** @var LogWrapper */ protected $ocLog; - /** @var \OCP\Image */ + /** @var Image */ protected $image; /** @param \OCP\IAvatarManager */ @@ -69,18 +74,19 @@ class Manager { ); /** - * @param \OCP\IConfig $ocConfig + * @param IConfig $ocConfig * @param \OCA\user_ldap\lib\FilesystemHelper $ocFilesystem object that * gives access to necessary functions from the OC filesystem * @param \OCA\user_ldap\lib\LogWrapper $ocLog - * @param \OCP\IAvatarManager $avatarManager - * @param \OCP\Image $image an empty image instance - * @param \OCP\IDBConnection $db + * @param IAvatarManager $avatarManager + * @param Image $image an empty image instance + * @param IDBConnection $db * @throws \Exception when the methods mentioned above do not exist */ - public function __construct(\OCP\IConfig $ocConfig, - FilesystemHelper $ocFilesystem, LogWrapper $ocLog, - \OCP\IAvatarManager $avatarManager, \OCP\Image $image, \OCP\IDBConnection $db) { + public function __construct(IConfig $ocConfig, + FilesystemHelper $ocFilesystem, LogWrapper $ocLog, + IAvatarManager $avatarManager, Image $image, + IDBConnection $db, IUserManager $userManager) { $this->ocConfig = $ocConfig; $this->ocFilesystem = $ocFilesystem; @@ -88,6 +94,7 @@ class Manager { $this->avatarManager = $avatarManager; $this->image = $image; $this->db = $db; + $this->userManager = $userManager; } /** @@ -110,7 +117,7 @@ class Manager { $this->checkAccess(); $user = new User($uid, $dn, $this->access, $this->ocConfig, $this->ocFilesystem, clone $this->image, $this->ocLog, - $this->avatarManager); + $this->avatarManager, $this->userManager); $this->users['byDN'][$dn] = $user; $this->users['byUid'][$uid] = $user; return $user; diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php index 23fd831b62f..13f88aa6507 100644 --- a/apps/user_ldap/lib/user/user.php +++ b/apps/user_ldap/lib/user/user.php @@ -27,6 +27,9 @@ use OCA\user_ldap\lib\user\IUserTools; use OCA\user_ldap\lib\Connection; use OCA\user_ldap\lib\FilesystemHelper; use OCA\user_ldap\lib\LogWrapper; +use OCP\IAvatarManager; +use OCP\IConfig; +use OCP\IUserManager; /** * User @@ -43,7 +46,7 @@ class User { */ protected $connection; /** - * @var \OCP\IConfig + * @var IConfig */ protected $config; /** @@ -59,10 +62,13 @@ class User { */ protected $log; /** - * @var \OCP\IAvatarManager + * @var IAvatarManager */ protected $avatarManager; - + /** + * @var IUserManager + */ + protected $userManager; /** * @var string */ @@ -92,15 +98,16 @@ class User { * @param string $dn the LDAP DN * @param IUserTools $access an instance that implements IUserTools for * LDAP interaction - * @param \OCP\IConfig $config + * @param IConfig $config * @param FilesystemHelper $fs * @param \OCP\Image $image any empty instance * @param LogWrapper $log - * @param \OCP\IAvatarManager $avatarManager + * @param IAvatarManager $avatarManager + * @param IUserManager $userManager */ public function __construct($username, $dn, IUserTools $access, - \OCP\IConfig $config, FilesystemHelper $fs, \OCP\Image $image, - LogWrapper $log, \OCP\IAvatarManager $avatarManager) { + IConfig $config, FilesystemHelper $fs, \OCP\Image $image, + LogWrapper $log, IAvatarManager $avatarManager, IUserManager $userManager) { $this->access = $access; $this->connection = $access->getConnection(); @@ -111,6 +118,7 @@ class User { $this->image = $image; $this->log = $log; $this->avatarManager = $avatarManager; + $this->userManager = $userManager; } /** @@ -400,8 +408,8 @@ class User { } } if(!is_null($email)) { - $this->config->setUserValue( - $this->uid, 'settings', 'email', $email); + $user = $this->userManager->get($this->uid); + $user->setEMailAddress($email); } } diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php index d9a3919dfcd..6d35adf1694 100644 --- a/apps/user_ldap/tests/access.php +++ b/apps/user_ldap/tests/access.php @@ -58,7 +58,8 @@ class Test_Access extends \Test\TestCase { $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), $this->getMock('\OCP\Image'), - $this->getMock('\OCP\IDBConnection'))); + $this->getMock('\OCP\IDBConnection'), + $this->getMock('\OCP\IUserManager'))); return array($lw, $connector, $um); } diff --git a/apps/user_ldap/tests/integration/lib/integrationtestbatchapplyuserattributes.php b/apps/user_ldap/tests/integration/lib/integrationtestbatchapplyuserattributes.php new file mode 100644 index 00000000000..f83b0efd0cc --- /dev/null +++ b/apps/user_ldap/tests/integration/lib/integrationtestbatchapplyuserattributes.php @@ -0,0 +1,72 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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\tests\integration\lib; + +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\user_ldap\tests\integration\AbstractIntegrationTest; + +require_once __DIR__ . '/../../../../../lib/base.php'; + +class IntegrationTestBatchApplyUserAttributes extends AbstractIntegrationTest { + /** + * prepares the LDAP environment and sets up a test configuration for + * the LDAP backend. + */ + public function init() { + require(__DIR__ . '/../setup-scripts/createExplicitUsers.php'); + require(__DIR__ . '/../setup-scripts/createUsersWithoutDisplayName.php'); + parent::init(); + + $this->mapping = new UserMapping(\OC::$server->getDatabaseConnection()); + $this->mapping->clear(); + $this->access->setUserMapper($this->mapping); + } + + /** + * sets up the LDAP configuration to be used for the test + */ + protected function initConnection() { + parent::initConnection(); + $this->connection->setConfiguration([ + 'ldapUserDisplayName' => 'displayname', + ]); + } + + /** + * indirectly tests whether batchApplyUserAttributes does it job properly, + * when a user without display name is included in the result set from LDAP. + * + * @return bool + */ + protected function case1() { + $result = $this->access->fetchListOfUsers('objectclass=person', 'dn'); + // on the original issue, PHP would emit a fatal error + // – cannot catch it here, but will render the test as unsuccessful + return is_array($result) && !empty($result); + } + +} + +require_once(__DIR__ . '/../setup-scripts/config.php'); +$test = new IntegrationTestBatchApplyUserAttributes($host, $port, $adn, $apwd, $bdn); +$test->init(); +$test->run(); diff --git a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php index 9fb0ffc1b7d..4db3ca48768 100644 --- a/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php +++ b/apps/user_ldap/tests/integration/lib/user/IntegrationTestUserAvatar.php @@ -123,7 +123,8 @@ class IntegrationTestUserAvatar extends AbstractIntegrationTest { new \OCA\user_ldap\lib\LogWrapper(), \OC::$server->getAvatarManager(), new \OCP\Image(), - \OC::$server->getDatabaseConnection() + \OC::$server->getDatabaseConnection(), + \OC::$server->getUserManager() ); } diff --git a/apps/user_ldap/tests/integration/setup-scripts/createUsersWithoutDisplayName.php b/apps/user_ldap/tests/integration/setup-scripts/createUsersWithoutDisplayName.php new file mode 100644 index 00000000000..7f474aaa0e8 --- /dev/null +++ b/apps/user_ldap/tests/integration/setup-scripts/createUsersWithoutDisplayName.php @@ -0,0 +1,59 @@ +<?php +/** + * @author Arthur Schiwon <blizzz@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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/> + * + */ +if(php_sapi_name() !== 'cli') { + print('Only via CLI, please.'); + exit(1); +} + +include __DIR__ . '/config.php'; + +$cr = ldap_connect($host, $port); +ldap_set_option($cr, LDAP_OPT_PROTOCOL_VERSION, 3); +$ok = ldap_bind($cr, $adn, $apwd); + +if (!$ok) { + die(ldap_error($cr)); +} + +$ouName = 'Users'; +$ouDN = 'ou=' . $ouName . ',' . $bdn; + +$users = ['robot']; + +foreach ($users as $uid) { + $newDN = 'uid=' . $uid . ',' . $ouDN; + $fn = ucfirst($uid); + $sn = ucfirst(str_shuffle($uid)); // not so explicit but it's OK. + + $entry = []; + $entry['cn'] = ucfirst($uid); + $entry['objectclass'][] = 'inetOrgPerson'; + $entry['objectclass'][] = 'person'; + $entry['sn'] = $sn; + $entry['userPassword'] = $uid; + + $ok = ldap_add($cr, $newDN, $entry); + if ($ok) { + echo('created user ' . ': ' . $entry['cn'] . PHP_EOL); + } else { + die(ldap_error($cr)); + } +} diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php index 2ad438fcba4..c4af1009df8 100644 --- a/apps/user_ldap/tests/user/manager.php +++ b/apps/user_ldap/tests/user/manager.php @@ -44,6 +44,7 @@ class Test_User_Manager extends \Test\TestCase { $avaMgr = $this->getMock('\OCP\IAvatarManager'); $image = $this->getMock('\OCP\Image'); $dbc = $this->getMock('\OCP\IDBConnection'); + $userMgr = $this->getMock('\OCP\IUserManager'); $connection = new \OCA\user_ldap\lib\Connection( $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'), @@ -55,11 +56,11 @@ class Test_User_Manager extends \Test\TestCase { ->method('getConnection') ->will($this->returnValue($connection)); - return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc); + return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr); } public function testGetByDNExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $inputDN = 'cn=foo,dc=foobar,dc=bar'; @@ -78,7 +79,7 @@ class Test_User_Manager extends \Test\TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -90,7 +91,7 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetByEDirectoryDN() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $inputDN = 'uid=foo,o=foobar,c=bar'; @@ -109,7 +110,7 @@ class Test_User_Manager extends \Test\TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -117,7 +118,7 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetByExoticDN() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $inputDN = 'ab=cde,f=ghei,mno=pq'; @@ -136,7 +137,7 @@ class Test_User_Manager extends \Test\TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -144,7 +145,7 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetByDNNotExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $inputDN = 'cn=gone,dc=foobar,dc=bar'; @@ -164,7 +165,7 @@ class Test_User_Manager extends \Test\TestCase { ->with($this->equalTo($inputDN)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -172,7 +173,7 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetByUidExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $dn = 'cn=foo,dc=foobar,dc=bar'; @@ -191,7 +192,7 @@ class Test_User_Manager extends \Test\TestCase { ->with($this->equalTo($uid)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($uid); @@ -203,7 +204,7 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetByUidNotExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); $dn = 'cn=foo,dc=foobar,dc=bar'; @@ -217,7 +218,7 @@ class Test_User_Manager extends \Test\TestCase { ->with($this->equalTo($uid)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $user = $manager->get($uid); @@ -225,10 +226,10 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetAttributesAll() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $connection = $access->getConnection(); @@ -243,10 +244,10 @@ class Test_User_Manager extends \Test\TestCase { } public function testGetAttributesMinimal() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc, $userMgr); $manager->setLdapAccess($access); $attributes = $manager->getAttributes(true); diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php index 9b3bb4ace66..6fa7f3b6b27 100644 --- a/apps/user_ldap/tests/user/user.php +++ b/apps/user_ldap/tests/user/user.php @@ -25,6 +25,7 @@ namespace OCA\user_ldap\tests; use OCA\user_ldap\lib\user\User; +use OCP\IUserManager; /** * Class Test_User_User @@ -43,11 +44,12 @@ class Test_User_User extends \Test\TestCase { $avaMgr = $this->getMock('\OCP\IAvatarManager'); $image = $this->getMock('\OCP\Image'); $dbc = $this->getMock('\OCP\IDBConnection'); + $userMgr = $this->getMock('\OCP\IUserManager'); - return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc); + return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr); } - private function getAdvancedMocks($cfMock, $fsMock, $logMock, $avaMgr, $dbc) { + private function getAdvancedMocks($cfMock, $fsMock, $logMock, $avaMgr, $dbc, $userMgr = null) { static $conMethods; static $accMethods; static $umMethods; @@ -61,8 +63,11 @@ class Test_User_User extends \Test\TestCase { } $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'); $im = $this->getMock('\OCP\Image'); + if (is_null($userMgr)) { + $userMgr = $this->getMock('\OCP\IUserManager'); + } $um = $this->getMock('\OCA\user_ldap\lib\user\Manager', - $umMethods, array($cfMock, $fsMock, $logMock, $avaMgr, $im, $dbc)); + $umMethods, array($cfMock, $fsMock, $logMock, $avaMgr, $im, $dbc, $userMgr)); $connector = $this->getMock('\OCA\user_ldap\lib\Connection', $conMethods, array($lw, null, null)); $access = $this->getMock('\OCA\user_ldap\lib\Access', @@ -72,25 +77,25 @@ class Test_User_User extends \Test\TestCase { } public function testGetDNandUsername() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr) = $this->getTestInstances(); $uid = 'alice'; $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $this->assertSame($dn, $user->getDN()); $this->assertSame($uid, $user->getUsername()); } public function testUpdateEmailProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc, $userMgr); $connection->expects($this->once()) ->method('__get') @@ -103,24 +108,27 @@ class Test_User_User extends \Test\TestCase { $this->equalTo('email')) ->will($this->returnValue(array('alice@foo.bar'))); - $config->expects($this->once()) - ->method('setUserValue') - ->with($this->equalTo('alice'), $this->equalTo('settings'), - $this->equalTo('email'), - $this->equalTo('alice@foo.bar')) - ->will($this->returnValue(true)); - $uid = 'alice'; $dn = 'uid=alice,dc=foo,dc=bar'; + $uuser = $this->getMockBuilder('\OCP\IUser') + ->disableOriginalConstructor() + ->getMock(); + $uuser->expects($this->once()) + ->method('setEMailAddress') + ->with('alice@foo.bar'); + /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userMgr */ + $userMgr->expects($this->any()) + ->method('get') + ->willReturn($uuser); $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateEmail(); } public function testUpdateEmailNotProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -144,13 +152,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateEmail(); } public function testUpdateEmailNotConfigured() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -171,13 +179,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateEmail(); } public function testUpdateQuotaAllProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -214,13 +222,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota(); } public function testUpdateQuotaDefaultProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -257,13 +265,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota(); } public function testUpdateQuotaIndividualProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -300,13 +308,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota(); } public function testUpdateQuotaNoneProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -338,13 +346,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota(); } public function testUpdateQuotaNoneConfigured() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -373,13 +381,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota(); } public function testUpdateQuotaFromValue() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -412,14 +420,14 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateQuota($readQuota); } //the testUpdateAvatar series also implicitely tests getAvatarImage public function testUpdateAvatarJpegPhotoProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -462,13 +470,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateAvatar(); } public function testUpdateAvatarThumbnailPhotoProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -520,13 +528,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateAvatar(); } public function testUpdateAvatarNotProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -566,13 +574,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->updateAvatar(); } public function testUpdateBeforeFirstLogin() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -602,13 +610,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->update(); } public function testUpdateAfterFirstLogin() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -642,13 +650,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->update(); } public function testUpdateNoRefresh() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -678,13 +686,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->update(); } public function testMarkLogin() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr) = $this->getTestInstances(); $config->expects($this->once()) @@ -699,13 +707,13 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->markLogin(); } public function testGetAvatarImageProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $db, $userMgr) = $this->getTestInstances(); $access->expects($this->once()) @@ -718,7 +726,7 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $photo = $user->getAvatarImage(); $this->assertSame('this is a photo', $photo); @@ -728,7 +736,7 @@ class Test_User_User extends \Test\TestCase { } public function testProcessAttributes() { - list(, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list(, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -748,7 +756,7 @@ class Test_User_User extends \Test\TestCase { ); $userMock = $this->getMockBuilder('OCA\user_ldap\lib\user\User') - ->setConstructorArgs(array($uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr)) + ->setConstructorArgs(array($uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr)) ->setMethods($requiredMethods) ->getMock(); @@ -795,7 +803,7 @@ class Test_User_User extends \Test\TestCase { * @dataProvider emptyHomeFolderAttributeValueProvider */ public function testGetHomePathNotConfigured($attributeValue) { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -816,14 +824,14 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $path = $user->getHomePath(); $this->assertSame($path, false); } public function testGetHomePathConfiguredNotAvailableAllowed() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = @@ -847,7 +855,7 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $path = $user->getHomePath(); @@ -858,11 +866,11 @@ class Test_User_User extends \Test\TestCase { * @expectedException \Exception */ public function testGetHomePathConfiguredNotAvailableNotAllowed() { - list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc, $userMgr); $connection->expects($this->any()) ->method('__get') @@ -882,7 +890,7 @@ class Test_User_User extends \Test\TestCase { $dn = 'uid=alice,dc=foo,dc=bar'; $user = new User( - $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr); + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); $user->getHomePath(); } diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index 87c6fae0f5d..0ae18a2aa96 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -84,7 +84,8 @@ class Test_User_Ldap_Direct extends \Test\TestCase { $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), $this->getMock('\OCP\Image'), - $this->getMock('\OCP\IDBConnection') + $this->getMock('\OCP\IDBConnection'), + $this->getMock('\OCP\IUserManager') ]) ->getMock(); @@ -314,7 +315,7 @@ class Test_User_Ldap_Direct extends \Test\TestCase { $access->expects($this->any()) ->method('combineFilterWithAnd') ->will($this->returnCallback(function($param) { - return $param[1]; + return $param[2]; })); $access->expects($this->any()) diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index 8ebb5ab30e8..65a4bbdda77 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -152,8 +152,8 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn * Get a list of all users * * @param string $search - * @param null|int $limit - * @param null|int $offset + * @param integer $limit + * @param integer $offset * @return string[] an array of all uids */ public function getUsers($search = '', $limit = 10, $offset = 0) { @@ -173,6 +173,7 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn } $filter = $this->access->combineFilterWithAnd(array( $this->access->connection->ldapUserFilter, + $this->access->connection->ldapUserDisplayName . '=*', $this->access->getFilterPartForUserSearch($search) )); diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature index 1a184cb928c..4d4d5361647 100644 --- a/build/integration/features/provisioning-v1.feature +++ b/build/integration/features/provisioning-v1.feature @@ -288,6 +288,7 @@ Feature: provisioning | files_trashbin | | files_versions | | provisioning_api | + | systemtags | Scenario: get app info Given As an "admin" diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index 1287a2daf86..dedf2c388fc 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -231,23 +231,20 @@ Feature: sharing And User "user2" should be included in the response And User "user3" should not be included in the response -# Skip this test for now. Since the new shares do not create reshares -# TODO enable when getshares is updated -# -# Scenario: getting all shares of a file with reshares -# Given user "user0" exists -# And user "user1" exists -# And user "user2" exists -# And user "user3" exists -# And file "textfile0.txt" of user "user0" is shared with user "user1" -# And file "textfile0.txt" of user "user1" is shared with user "user2" -# And As an "user0" -# When sending "GET" to "/apps/files_sharing/api/v1/shares?reshares=true&path=textfile0.txt" -# Then the OCS status code should be "100" -# And the HTTP status code should be "200" -# And User "user1" should be included in the response -# And User "user2" should be included in the response -# And User "user3" should not be included in the response + Scenario: getting all shares of a file with reshares + Given user "user0" exists + And user "user1" exists + And user "user2" exists + And user "user3" exists + And file "textfile0.txt" of user "user0" is shared with user "user1" + And file "textfile0 (2).txt" of user "user1" is shared with user "user2" + And As an "user0" + When sending "GET" to "/apps/files_sharing/api/v1/shares?reshares=true&path=textfile0.txt" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And User "user1" should be included in the response + And User "user2" should be included in the response + And User "user3" should not be included in the response Scenario: getting share info of a share Given user "user0" exists @@ -316,6 +313,19 @@ Feature: sharing And the HTTP status code should be "200" And last share_id is included in the answer + Scenario: Sharee can see the group share + Given As an "admin" + And user "user0" exists + And user "user1" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And file "textfile0.txt" of user "user0" is shared with group "group0" + And As an "user1" + When sending "GET" to "/apps/files_sharing/api/v1/shares?shared_with_me=true" + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And last share_id is included in the answer + Scenario: User is not allowed to reshare file As an "admin" Given user "user0" exists diff --git a/build/license.php b/build/license.php index 738ace8b1ad..ce6fceb8160 100644 --- a/build/license.php +++ b/build/license.php @@ -118,6 +118,9 @@ With help from many libraries and frameworks including: echo "License updated: $path" . PHP_EOL; } + /** + * @param string $source + */ private function isMITLicensed($source) { $lines = explode(PHP_EOL, $source); while(!empty($lines)) { @@ -131,6 +134,9 @@ With help from many libraries and frameworks including: return false; } + /** + * @param string $source + */ private function eatOldLicense($source) { $lines = explode(PHP_EOL, $source); while(!empty($lines)) { diff --git a/config/config.sample.php b/config/config.sample.php index 3dc1f4818c0..3f6ae4bc3ec 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -819,6 +819,13 @@ $CONFIG = array( 'comments.managerFactory' => '\OC\Comments\ManagerFactory', /** + * Replaces the default System Tags Manager Factory. This can be utilized if an + * own or 3rdParty SystemTagsManager should be used that – for instance – uses the + * filesystem instead of the database to keep the comments. + */ +'systemtags.managerFactory' => '\OC\SystemTag\ManagerFactory', + +/** * Maintenance * * These options are for halting user activity when you are performing server diff --git a/core/application.php b/core/application.php index bfe79f89938..30376ee4f2e 100644 --- a/core/application.php +++ b/core/application.php @@ -29,9 +29,9 @@ namespace OC\Core; use OC\AppFramework\Utility\SimpleContainer; use OC\AppFramework\Utility\TimeFactory; use \OCP\AppFramework\App; -use OC\Core\LostPassword\Controller\LostController; -use OC\Core\User\UserController; -use OC\Core\Avatar\AvatarController; +use OC\Core\Controller\LostController; +use OC\Core\Controller\UserController; +use OC\Core\Controller\AvatarController; use \OCP\Util; /** diff --git a/core/command/app/disable.php b/core/command/app/disable.php index b5e776d7e03..b3157faf32e 100644 --- a/core/command/app/disable.php +++ b/core/command/app/disable.php @@ -23,12 +23,25 @@ namespace OC\Core\Command\App; +use OCP\App\IAppManager; 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 Disable extends Command { + + /** @var IAppManager */ + protected $manager; + + /** + * @param IAppManager $manager + */ + public function __construct(IAppManager $manager) { + parent::__construct(); + $this->manager = $manager; + } + protected function configure() { $this ->setName('app:disable') @@ -42,9 +55,9 @@ class Disable extends Command { protected function execute(InputInterface $input, OutputInterface $output) { $appId = $input->getArgument('app-id'); - if (\OC_App::isEnabled($appId)) { + if ($this->manager->isInstalled($appId)) { try { - \OC_App::disable($appId); + $this->manager->disableApp($appId); $output->writeln($appId . ' disabled'); } catch(\Exception $e) { $output->writeln($e->getMessage()); diff --git a/core/command/app/enable.php b/core/command/app/enable.php index d50b1c4773e..4315972bae2 100644 --- a/core/command/app/enable.php +++ b/core/command/app/enable.php @@ -23,12 +23,26 @@ namespace OC\Core\Command\App; +use OCP\App\IAppManager; 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 Enable extends Command { + + /** @var IAppManager */ + protected $manager; + + /** + * @param IAppManager $manager + */ + public function __construct(IAppManager $manager) { + parent::__construct(); + $this->manager = $manager; + } + protected function configure() { $this ->setName('app:enable') @@ -37,19 +51,36 @@ class Enable extends Command { 'app-id', InputArgument::REQUIRED, 'enable the specified app' - ); + ) + ->addOption( + 'groups', + 'g', + InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, + 'enable the app only for a list of groups' + ) + ; } protected function execute(InputInterface $input, OutputInterface $output) { $appId = $input->getArgument('app-id'); - if (\OC_App::isEnabled($appId)) { - $output->writeln($appId . ' is already enabled'); - } else if (!\OC_App::getAppPath($appId)) { + + if (!\OC_App::getAppPath($appId)) { $output->writeln($appId . ' not found'); return 1; - } else { + } + + $groups = $input->getOption('groups'); + if ($this->manager->isInstalled($appId) && empty($groups)) { + $output->writeln($appId . ' is already enabled'); + } + + if (empty($groups)) { \OC_App::enable($appId); $output->writeln($appId . ' enabled'); + } else { + \OC_App::enable($appId, $groups); + $output->writeln($appId . ' enabled for groups: ' . implode(', ', $groups)); } + return 0; } } diff --git a/core/command/app/listapps.php b/core/command/app/listapps.php index 504944dd707..d7546b3c0c7 100644 --- a/core/command/app/listapps.php +++ b/core/command/app/listapps.php @@ -25,11 +25,24 @@ namespace OC\Core\Command\App; use OC\Core\Command\Base; +use OCP\App\IAppManager; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class ListApps extends Base { + + /** @var IAppManager */ + protected $manager; + + /** + * @param IAppManager $manager + */ + public function __construct(IAppManager $manager) { + parent::__construct(); + $this->manager = $manager; + } + protected function configure() { parent::configure(); @@ -47,10 +60,9 @@ class ListApps extends Base { protected function execute(InputInterface $input, OutputInterface $output) { if ($input->getOption('shipped') === 'true' || $input->getOption('shipped') === 'false'){ - $shouldFilterShipped = true; $shippedFilter = $input->getOption('shipped') === 'true'; } else { - $shouldFilterShipped = false; + $shippedFilter = null; } $apps = \OC_App::getAllApps(); @@ -59,10 +71,10 @@ class ListApps extends Base { //sort enabled apps above disabled apps foreach ($apps as $app) { - if ($shouldFilterShipped && \OC_App::isShipped($app) !== $shippedFilter){ + if ($shippedFilter !== null && \OC_App::isShipped($app) !== $shippedFilter){ continue; } - if (\OC_App::isEnabled($app)) { + if ($this->manager->isInstalled($app)) { $enabledApps[] = $app; } else { $disabledApps[] = $app; diff --git a/core/command/integrity/signapp.php b/core/command/integrity/signapp.php index a203b9ad1da..53df9619c6d 100644 --- a/core/command/integrity/signapp.php +++ b/core/command/integrity/signapp.php @@ -23,6 +23,7 @@ namespace OC\Core\Command\Integrity; use OC\IntegrityCheck\Checker; use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCP\IURLGenerator; use phpseclib\Crypt\RSA; use phpseclib\File\X509; use Symfony\Component\Console\Command\Command; @@ -40,23 +41,28 @@ class SignApp extends Command { private $checker; /** @var FileAccessHelper */ private $fileAccessHelper; + /** @var IURLGenerator */ + private $urlGenerator; /** * @param Checker $checker * @param FileAccessHelper $fileAccessHelper + * @param IURLGenerator $urlGenerator */ public function __construct(Checker $checker, - FileAccessHelper $fileAccessHelper) { + FileAccessHelper $fileAccessHelper, + IURLGenerator $urlGenerator) { parent::__construct(null); $this->checker = $checker; $this->fileAccessHelper = $fileAccessHelper; + $this->urlGenerator = $urlGenerator; } protected function configure() { $this ->setName('integrity:sign-app') - ->setDescription('Sign app using a private key.') - ->addOption('appId', null, InputOption::VALUE_REQUIRED, 'Application to sign') + ->setDescription('Signs an app using a private key.') + ->addOption('path', null, InputOption::VALUE_REQUIRED, 'Application to sign') ->addOption('privateKey', null, InputOption::VALUE_REQUIRED, 'Path to private key to use for signing') ->addOption('certificate', null, InputOption::VALUE_REQUIRED, 'Path to certificate to use for signing'); } @@ -65,11 +71,14 @@ class SignApp extends Command { * {@inheritdoc } */ protected function execute(InputInterface $input, OutputInterface $output) { - $appId = $input->getOption('appId'); + $path = $input->getOption('path'); $privateKeyPath = $input->getOption('privateKey'); $keyBundlePath = $input->getOption('certificate'); - if(is_null($appId) || is_null($privateKeyPath) || is_null($keyBundlePath)) { - $output->writeln('--appId, --privateKey and --certificate are required.'); + if(is_null($path) || is_null($privateKeyPath) || is_null($keyBundlePath)) { + $documentationUrl = $this->urlGenerator->linkToDocs('developer-code-integrity'); + $output->writeln('This command requires the --path, --privateKey and --certificate.'); + $output->writeln('Example: ./occ integrity:sign-app --path="/Users/lukasreschke/Programming/myapp/" --privateKey="/Users/lukasreschke/private/myapp.key" --certificate="/Users/lukasreschke/public/mycert.crt"'); + $output->writeln('For more information please consult the documentation: '. $documentationUrl); return null; } @@ -91,8 +100,8 @@ class SignApp extends Command { $x509 = new X509(); $x509->loadX509($keyBundle); $x509->setPrivateKey($rsa); - $this->checker->writeAppSignature($appId, $x509, $rsa); + $this->checker->writeAppSignature($path, $x509, $rsa); - $output->writeln('Successfully signed "'.$appId.'"'); + $output->writeln('Successfully signed "'.$path.'"'); } } diff --git a/core/command/maintenance/mimetype/updatejs.php b/core/command/maintenance/mimetype/updatejs.php index e93b563d5fb..8ee06e8cdc9 100644 --- a/core/command/maintenance/mimetype/updatejs.php +++ b/core/command/maintenance/mimetype/updatejs.php @@ -71,6 +71,7 @@ class UpdateJS extends Command { //Remove duplicates $files = array_values(array_unique($files)); + sort($files); // Fetch all themes! $themes = []; @@ -100,6 +101,7 @@ class UpdateJS extends Command { //Remove Duplicates $themes[$theme] = array_values(array_unique($themes[$theme])); + sort($themes[$theme]); } //Generate the JS diff --git a/core/avatar/avatarcontroller.php b/core/controller/avatarcontroller.php index 8a9219964a5..adfe38ab2db 100644 --- a/core/avatar/avatarcontroller.php +++ b/core/controller/avatarcontroller.php @@ -24,7 +24,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Core\Avatar; +namespace OC\Core\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; @@ -42,7 +42,7 @@ use OCP\Files\Folder; /** * Class AvatarController * - * @package OC\Core\Avatar + * @package OC\Core\Controller */ class AvatarController extends Controller { diff --git a/core/lostpassword/controller/lostcontroller.php b/core/controller/lostcontroller.php index c9ee8ed2ff5..0e0932b288b 100644 --- a/core/lostpassword/controller/lostcontroller.php +++ b/core/controller/lostcontroller.php @@ -25,7 +25,7 @@ * */ -namespace OC\Core\LostPassword\Controller; +namespace OC\Core\Controller; use \OCP\AppFramework\Controller; use \OCP\AppFramework\Http\TemplateResponse; @@ -45,7 +45,7 @@ use OCP\Security\StringUtils; * * Successfully changing a password will emit the post_passwordReset hook. * - * @package OC\Core\LostPassword\Controller + * @package OC\Core\Controller */ class LostController extends Controller { @@ -122,8 +122,8 @@ class LostController extends Controller { */ public function resetform($token, $userId) { return new TemplateResponse( - 'core/lostpassword', - 'resetpassword', + 'core', + 'lostpassword/resetpassword', array( 'link' => $this->urlGenerator->linkToRouteAbsolute('core.lost.setPassword', array('userId' => $userId, 'token' => $token)), ), @@ -236,7 +236,7 @@ class LostController extends Controller { $link = $this->urlGenerator->linkToRouteAbsolute('core.lost.resetform', array('userId' => $user, 'token' => $token)); - $tmpl = new \OC_Template('core/lostpassword', 'email'); + $tmpl = new \OC_Template('core', 'lostpassword/email'); $tmpl->assign('link', $link); $msg = $tmpl->fetchPage(); diff --git a/core/setup/controller.php b/core/controller/setupcontroller.php index a64e6f08a36..f25c6f39a0b 100644 --- a/core/setup/controller.php +++ b/core/controller/setupcontroller.php @@ -25,11 +25,11 @@ * */ -namespace OC\Core\Setup; +namespace OC\Core\Controller; use OC\Setup; -class Controller { +class SetupController { /** @var Setup */ protected $setupHelper; /** @var string */ @@ -99,6 +99,7 @@ class Controller { if( file_exists( $this->autoConfigFile )) { unlink($this->autoConfigFile); } + \OC::$server->getIntegrityCodeChecker()->runInstanceVerification(); \OC_Util::redirectToDefaultPage(); } diff --git a/core/user/usercontroller.php b/core/controller/usercontroller.php index 38ecd86b459..72193761022 100644 --- a/core/user/usercontroller.php +++ b/core/controller/usercontroller.php @@ -20,7 +20,7 @@ * */ -namespace OC\Core\User; +namespace OC\Core\Controller; use \OCP\AppFramework\Controller; use \OCP\AppFramework\Http\JSONResponse; diff --git a/core/lostpassword/css/resetpassword.css b/core/css/lostpassword/resetpassword.css index 0b3c251e8d7..0b3c251e8d7 100644 --- a/core/lostpassword/css/resetpassword.css +++ b/core/css/lostpassword/resetpassword.css diff --git a/core/css/systemtags.css b/core/css/systemtags.css new file mode 100644 index 00000000000..5c667e54547 --- /dev/null +++ b/core/css/systemtags.css @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ +.systemtags-select2-dropdown .select2-selected { + display: list-item; + background-color: #f8f8f8; +} +.systemtags-select2-dropdown .select2-highlighted, +.systemtags-select2-dropdown .select2-selected.select2-highlighted { + background: #3875d7; +} + +.systemtags-select2-dropdown .select2-highlighted { + color: #000000; +} +.systemtags-select2-dropdown .select2-result-label .checkmark { + visibility: hidden; +} + +.systemtags-select2-dropdown .select2-result-label .new-item .systemtags-actions { + display: none; +} + +.systemtags-select2-dropdown .select2-selected .select2-result-label .checkmark { + visibility: visible; +} + +.systemtags-select2-dropdown .select2-result-label .icon { + display: inline-block; +} + +.systemtags-select2-dropdown .systemtags-actions { + float: right; +} + +.systemtags-select2-dropdown .systemtags-rename-form { + display: inline; + margin-left: 10px; +} + +.systemtags-select2-container { + width: 80%; +} + +.systemtags-select2-container .select2-choices { + white-space: nowrap; + text-overflow: ellipsis; + background: #fff; + color: #555; + box-sizing: content-box; + border-radius: 3px; + border: 1px solid #ddd; + margin: 3px 3px 3px 0; + padding: 7px 6px 5px; + min-height: auto; +} + +.systemtags-select2-container .select2-choices .select2-search-choice { + border: 0; + box-shadow: none; + background: none; + padding: 0; + margin: 0; + line-height: 20px; +} +.systemtags-select2-container .select2-choices .select2-search-choice-close { + display: none; +} +.systemtags-select2-container .select2-choices .select2-search-field input { + margin: 0; + padding: 0; + line-height: 20px; +} + diff --git a/core/img/default-app-icon.svg b/core/img/default-app-icon.svg new file mode 100644 index 00000000000..b6ae35211a3 --- /dev/null +++ b/core/img/default-app-icon.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <path d="m13.733 0.00064c-0.52991 0-0.93331 0.40337-0.93331 0.93333v2.6666c-1.182 0.3034-2.243 0.7934-3.2668 1.4001l-1.9334-1.9334c-0.3747-0.3747-0.9586-0.3747-1.3333 0l-3.1999 3.2c-0.37473 0.37474-0.37473 0.95859 0 1.3333l1.9334 1.9335c-0.6067 1.0239-1.0967 2.0849-1.4001 3.2669h-2.6666c-0.52994 0-0.9333 0.403-0.9333 0.933v4.5333c2e-8 0.52996 0.40336 0.93333 0.93331 0.93333h2.6666c0.30335 1.1817 0.79332 2.2426 1.4 3.2666l-1.9334 1.9349c-0.37473 0.37474-0.37473 0.95859 0 1.3333l3.1999 3.2c0.37473 0.37474 0.95857 0.37474 1.3333 0l1.9334-1.9349c1.024 0.608 2.0849 1.0965 3.2665 1.3995v2.6667c0 0.53 0.403 0.933 0.933 0.933h4.5332c0.52991 0 0.93331-0.4032 0.93331-0.9344v-2.6667c1.1816-0.30336 2.2425-0.79335 3.2665-1.4l1.9333 1.9333c0.37473 0.37474 0.95857 0.37474 1.3333 0l3.1999-3.2c0.37473-0.37474 0.37473-0.95859 0-1.3333l-1.9327-1.9328c0.60798-1.024 1.0965-2.0845 1.3994-3.2661h2.6666c0.532 0 0.935-0.403 0.935-0.933v-4.534c0-0.53-0.403-0.933-0.934-0.933h-2.667c-0.303-1.182-0.791-2.243-1.399-3.2666l1.932-1.9334c0.37473-0.37474 0.37473-0.95859 0-1.3333l-3.2-3.2c-0.37473-0.37474-0.95857-0.37474-1.3333 0l-1.9327 1.9334c-1.024-0.6067-2.084-1.0967-3.266-1.4001v-2.6667c0-0.52993-0.403-0.9333-0.933-0.9333zm2.2666 8.8689c3.9361 0 7.1309 3.1947 7.1309 7.1311 0 3.9362-3.1946 7.1311-7.1309 7.1311-3.9361 0-7.1309-3.1955-7.1309-7.1317s3.1948-7.1311 7.1309-7.1311z" display="block" fill="#fff"/> +</svg> diff --git a/core/js/core.json b/core/js/core.json index 43cb1b472f5..d894d59ca54 100644 --- a/core/js/core.json +++ b/core/js/core.json @@ -44,6 +44,11 @@ "mimetype.js", "mimetypelist.js", "files/fileinfo.js", - "files/client.js" + "files/client.js", + "systemtags/systemtags.js", + "systemtags/systemtagmodel.js", + "systemtags/systemtagscollection.js", + "systemtags/systemtagsmappingcollection.js", + "systemtags/systemtagsinputfield.js" ] } diff --git a/core/js/js.js b/core/js/js.js index 2937d3f6eb1..d24a46fc0bb 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1449,7 +1449,7 @@ $.fn.filterAttr = function(attr_name, attr_value) { * @return {string} */ function humanFileSize(size, skipSmallSizes) { - var humanList = ['B', 'kB', 'MB', 'GB', 'TB']; + var humanList = ['B', 'KB', 'MB', 'GB', 'TB']; // Calculate Log with base 1024: size = 1024 ** order var order = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0; // Stay in range of the byte sizes that are defined @@ -1458,9 +1458,9 @@ function humanFileSize(size, skipSmallSizes) { var relativeSize = (size / Math.pow(1024, order)).toFixed(1); if(skipSmallSizes === true && order === 0) { if(relativeSize !== "0.0"){ - return '< 1 kB'; + return '< 1 KB'; } else { - return '0 kB'; + return '0 KB'; } } if(order < 2){ diff --git a/core/js/mimetypelist.js b/core/js/mimetypelist.js index 43f01273f55..dea065814d1 100644 --- a/core/js/mimetypelist.js +++ b/core/js/mimetypelist.js @@ -82,26 +82,26 @@ OC.MimeTypeList={ "web": "text/code" }, files: [ - "video", + "application", + "application-pdf", + "audio", + "file", + "folder", "folder-drag-accept", - "folder-starred", + "folder-external", "folder-public", + "folder-shared", + "folder-starred", + "image", "package-x-generic", "text", - "folder-external", - "text-vcard", - "application", + "text-calendar", "text-code", - "x-office-spreadsheet", - "application-pdf", - "folder", + "text-vcard", + "video", "x-office-document", - "text-calendar", "x-office-presentation", - "file", - "folder-shared", - "image", - "audio" + "x-office-spreadsheet" ], themes: [] }; diff --git a/core/js/oc-backbone-webdav.js b/core/js/oc-backbone-webdav.js index 3ca31902c93..24a2bb50193 100644 --- a/core/js/oc-backbone-webdav.js +++ b/core/js/oc-backbone-webdav.js @@ -167,7 +167,7 @@ } function callPropPatch(client, options, model, headers) { - client.propPatch( + return client.propPatch( options.url, convertModelAttributesToDavProperties(model.changed, options.davProperties), headers diff --git a/core/js/select2-toggleselect.js b/core/js/select2-toggleselect.js new file mode 100644 index 00000000000..4fada592a3b --- /dev/null +++ b/core/js/select2-toggleselect.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +/* global Select2 */ + +/** + * Select2 extension for toggling values in a multi-select dropdown + */ +(function(Select2) { + + var Select2FindHighlightableChoices = Select2.class.multi.prototype.findHighlightableChoices; + Select2.class.multi.prototype.findHighlightableChoices = function () { + if (this.opts.toggleSelect) { + return this.results.find('.select2-result-selectable:not(.select2-disabled)'); + } + return Select2FindHighlightableChoices.apply(this, arguments); + }; + + var Select2TriggerSelect = Select2.class.multi.prototype.triggerSelect; + Select2.class.multi.prototype.triggerSelect = function (data) { + if (this.opts.toggleSelect && this.val().indexOf(this.id(data)) !== -1) { + var self = this; + var val = this.id(data); + + var selectionEls = this.container.find('.select2-search-choice').filter(function() { + return (self.id($(this).data('select2-data')) === val); + }); + + if (this.unselect(selectionEls)) { + // also unselect in dropdown + this.results.find('.select2-result.select2-selected').each(function () { + var $this = $(this); + if (self.id($this.data('select2-data')) === val) { + $this.removeClass('select2-selected'); + } + }); + this.clearSearch(); + } + + return false; + } else { + return Select2TriggerSelect.apply(this, arguments); + } + }; + +})(Select2); + diff --git a/core/js/systemtags/systemtagmodel.js b/core/js/systemtags/systemtagmodel.js new file mode 100644 index 00000000000..e6014977d2b --- /dev/null +++ b/core/js/systemtags/systemtagmodel.js @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OC) { + var NS_OWNCLOUD = 'http://owncloud.org/ns'; + /** + * @class OCA.SystemTags.SystemTagsCollection + * @classdesc + * + * System tag + * + */ + var SystemTagModel = OC.Backbone.Model.extend( + /** @lends OCA.SystemTags.SystemTagModel.prototype */ { + sync: OC.Backbone.davSync, + + defaults: { + userVisible: true, + userAssignable: true + }, + + davProperties: { + 'id': '{' + NS_OWNCLOUD + '}id', + 'name': '{' + NS_OWNCLOUD + '}display-name', + 'userVisible': '{' + NS_OWNCLOUD + '}user-visible', + 'userAssignable': '{' + NS_OWNCLOUD + '}user-assignable' + }, + + parse: function(data) { + return { + id: data.id, + name: data.name, + userVisible: data.userVisible === '1', + userAssignable: data.userAssignable === '1' + }; + } + }); + + OC.SystemTags = OC.SystemTags || {}; + OC.SystemTags.SystemTagModel = SystemTagModel; +})(OC); + diff --git a/core/js/systemtags/systemtags.js b/core/js/systemtags/systemtags.js new file mode 100644 index 00000000000..05d3ba2c7b8 --- /dev/null +++ b/core/js/systemtags/systemtags.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OC) { + /** + * @namespace + */ + OC.SystemTags = { + /** + * + * @param {OC.SystemTags.SystemTagModel|Object|String} tag + * @return {jQuery} + */ + getDescriptiveTag: function(tag) { + if (_.isUndefined(tag.name) && !_.isUndefined(tag.toJSON)) { + tag = tag.toJSON(); + } + + if (_.isUndefined(tag.name)) { + return $('<span>').addClass('non-existing-tag').text( + t('core', 'Non-existing tag #{tag}', { + tag: tag + }) + ); + } + + var $span = $('<span>'), + $tag = $('<em>').text( + t('core', '({uservisible}, {userassignable})', { + uservisible: tag.userVisible ? t('core', 'visible') : t('core', 'invisible'), + userassignable: tag.userAssignable ? t('core', 'assignable') : t('core', 'not assignable') + }) + ); + $span.append(escapeHTML(tag.name) + ' '); + $span.append($tag); + return $span; + } + }; +})(OC); + diff --git a/core/js/systemtags/systemtagscollection.js b/core/js/systemtags/systemtagscollection.js new file mode 100644 index 00000000000..0f8a7aa980e --- /dev/null +++ b/core/js/systemtags/systemtagscollection.js @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OC) { + + function filterFunction(model, term) { + return model.get('name').substr(0, term.length) === term; + } + + /** + * @class OCA.SystemTags.SystemTagsCollection + * @classdesc + * + * Collection of tags assigned to a file + * + */ + var SystemTagsCollection = OC.Backbone.Collection.extend( + /** @lends OC.SystemTags.SystemTagsCollection.prototype */ { + + sync: OC.Backbone.davSync, + + model: OC.SystemTags.SystemTagModel, + + url: function() { + return OC.linkToRemote('dav') + '/systemtags/'; + }, + + filterByName: function(name) { + return this.filter(function(model) { + return filterFunction(model, name); + }); + }, + + reset: function() { + this.fetched = false; + return OC.Backbone.Collection.prototype.reset.apply(this, arguments); + }, + + /** + * Lazy fetch. + * Only fetches once, subsequent calls will directly call the success handler. + * + * @param options + * @param [options.force] true to force fetch even if cached entries exist + * + * @see Backbone.Collection#fetch + */ + fetch: function(options) { + var self = this; + options = options || {}; + if (this.fetched || options.force) { + // directly call handler + if (options.success) { + options.success(this, null, options); + } + // trigger sync event + this.trigger('sync', this, null, options); + return Promise.resolve(); + } + + var success = options.success; + options = _.extend({}, options); + options.success = function() { + self.fetched = true; + if (success) { + return success.apply(this, arguments); + } + }; + + return OC.Backbone.Collection.prototype.fetch.call(this, options); + } + }); + + OC.SystemTags = OC.SystemTags || {}; + OC.SystemTags.SystemTagsCollection = SystemTagsCollection; + + /** + * @type OC.SystemTags.SystemTagsCollection + */ + OC.SystemTags.collection = new OC.SystemTags.SystemTagsCollection(); +})(OC); + diff --git a/core/js/systemtags/systemtagsinputfield.js b/core/js/systemtags/systemtagsinputfield.js new file mode 100644 index 00000000000..facacc50e22 --- /dev/null +++ b/core/js/systemtags/systemtagsinputfield.js @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +/* global Handlebars */ + +(function(OC) { + var TEMPLATE = + '<input class="systemTagsInputField" type="hidden" name="tags" value=""/>'; + + var RESULT_TEMPLATE = + '<span class="systemtags-item{{#if isNew}} new-item{{/if}}" data-id="{{id}}">' + + ' <span class="checkmark icon icon-checkmark"></span>' + + ' <span class="label">{{name}}</span>' + + '{{#allowActions}}' + + ' <span class="systemtags-actions">' + + ' <a href="#" class="rename icon icon-rename" title="{{renameTooltip}}"></a>' + + ' </span>' + + '{{/allowActions}}' + + '</span>'; + + var RENAME_FORM_TEMPLATE = + '<form class="systemtags-rename-form">' + + ' <label class="hidden-visually" for="{{cid}}-rename-input">{{renameLabel}}</label>' + + ' <input id="{{cid}}-rename-input" type="text" value="{{name}}">' + + ' <a href="#" class="delete icon icon-delete" title="{{deleteTooltip}}"></a>' + + '</form>'; + + /** + * @class OC.SystemTags.SystemTagsInputField + * @classdesc + * + * Displays a file's system tags + * + */ + var SystemTagsInputField = OC.Backbone.View.extend( + /** @lends OC.SystemTags.SystemTagsInputField.prototype */ { + + _rendered: false, + + _newTag: null, + + className: 'systemTagsInputFieldContainer', + + template: function(data) { + if (!this._template) { + this._template = Handlebars.compile(TEMPLATE); + } + return this._template(data); + }, + + /** + * Creates a new SystemTagsInputField + * + * @param {Object} [options] + * @param {string} [options.objectType=files] object type for which tags are assigned to + * @param {bool} [options.multiple=false] whether to allow selecting multiple tags + * @param {bool} [options.allowActions=true] whether tags can be renamed/delete within the dropdown + * @param {bool} [options.allowCreate=true] whether new tags can be created + * @param {Function} options.initSelection function to convert selection to data + */ + initialize: function(options) { + options = options || {}; + + this._multiple = !!options.multiple; + this._allowActions = _.isUndefined(options.allowActions) || !!options.allowActions; + this._allowCreate = _.isUndefined(options.allowCreate) || !!options.allowCreate; + + if (_.isFunction(options.initSelection)) { + this._initSelection = options.initSelection; + } + + this.collection = options.collection || OC.SystemTags.collection; + + var self = this; + this.collection.on('change:name remove', function() { + // refresh selection + _.defer(self._refreshSelection); + }); + + _.bindAll( + this, + '_refreshSelection', + '_onClickRenameTag', + '_onClickDeleteTag', + '_onSelectTag', + '_onDeselectTag', + '_onSubmitRenameTag' + ); + }, + + /** + * Refreshes the selection, triggering a call to + * select2's initSelection + */ + _refreshSelection: function() { + this.$tagsField.select2('val', this.$tagsField.val()); + }, + + /** + * Event handler whenever the user clicked the "rename" action. + * This will display the rename field. + */ + _onClickRenameTag: function(ev) { + var $item = $(ev.target).closest('.systemtags-item'); + var tagId = $item.attr('data-id'); + var tagModel = this.collection.get(tagId); + if (!this._renameFormTemplate) { + this._renameFormTemplate = Handlebars.compile(RENAME_FORM_TEMPLATE); + } + + var oldName = tagModel.get('name'); + var $renameForm = $(this._renameFormTemplate({ + cid: this.cid, + name: oldName, + deleteTooltip: t('core', 'Delete'), + renameLabel: t('core', 'Rename'), + })); + $item.find('.label').after($renameForm); + $item.find('.label, .systemtags-actions').addClass('hidden'); + $item.closest('.select2-result').addClass('has-form'); + + $renameForm.find('[title]').tooltip({ + placement: 'bottom', + container: 'body' + }); + $renameForm.find('input').focus().selectRange(0, oldName.length); + return false; + }, + + /** + * Event handler whenever the rename form has been submitted after + * the user entered a new tag name. + * This will submit the change to the server. + * + * @param {Object} ev event + */ + _onSubmitRenameTag: function(ev) { + ev.preventDefault(); + var $form = $(ev.target); + var $item = $form.closest('.systemtags-item'); + var tagId = $item.attr('data-id'); + var tagModel = this.collection.get(tagId); + var newName = $(ev.target).find('input').val(); + if (newName && newName !== tagModel.get('name')) { + tagModel.save({'name': newName}); + // TODO: spinner, and only change text after finished saving + $item.find('.label').text(newName); + } + $item.find('.label, .systemtags-actions').removeClass('hidden'); + $form.remove(); + $item.closest('.select2-result').removeClass('has-form'); + }, + + /** + * Event handler whenever a tag must be deleted + * + * @param {Object} ev event + */ + _onClickDeleteTag: function(ev) { + var $item = $(ev.target).closest('.systemtags-item'); + var tagId = $item.attr('data-id'); + this.collection.get(tagId).destroy(); + $item.closest('.select2-result').remove(); + // TODO: spinner + return false; + }, + + /** + * Event handler whenever a tag is selected. + * Also called whenever tag creation is requested through the dummy tag object. + * + * @param {Object} e event + */ + _onSelectTag: function(e) { + var self = this; + var tag; + if (e.object && e.object.isNew) { + // newly created tag, check if existing + // create a new tag + tag = this.collection.create({ + name: e.object.name, + userVisible: true, + userAssignable: true + }, { + success: function(model) { + var data = self.$tagsField.select2('data'); + data.push(model.toJSON()); + self.$tagsField.select2('data', data); + self.trigger('select', model); + } + }); + this.$tagsField.select2('close'); + e.preventDefault(); + return false; + } else { + tag = this.collection.get(e.object.id); + } + this._newTag = null; + this.trigger('select', tag); + }, + + /** + * Event handler whenever a tag gets deselected. + * + * @param {Object} e event + */ + _onDeselectTag: function(e) { + this.trigger('deselect', e.choice.id); + }, + + /** + * Autocomplete function for dropdown results + * + * @param {Object} query select2 query object + */ + _queryTagsAutocomplete: function(query) { + var self = this; + this.collection.fetch({ + success: function() { + query.callback({ + results: _.invoke(self.collection.filterByName(query.term), 'toJSON') + }); + } + }); + }, + + _preventDefault: function(e) { + e.stopPropagation(); + }, + + /** + * Formats a single dropdown result + * + * @param {Object} data data to format + * @return {string} HTML markup + */ + _formatDropDownResult: function(data) { + if (!this._resultTemplate) { + this._resultTemplate = Handlebars.compile(RESULT_TEMPLATE); + } + return this._resultTemplate(_.extend({ + renameTooltip: t('core', 'Rename'), + allowActions: this._allowActions + }, data)); + }, + + /** + * Create new dummy choice for select2 when the user + * types an arbitrary string + * + * @param {string} term entered term + * @return {Object} dummy tag + */ + _createSearchChoice: function(term) { + if (this.collection.filterByName(term).length) { + return; + } + if (!this._newTag) { + this._newTag = { + id: -1, + name: term, + isNew: true + }; + } else { + this._newTag.name = term; + } + + return this._newTag; + }, + + _initSelection: function(element, callback) { + var self = this; + var ids = $(element).val().split(','); + + function findSelectedObjects(ids) { + var selectedModels = self.collection.filter(function(model) { + return ids.indexOf(model.id) >= 0; + }); + return _.invoke(selectedModels, 'toJSON'); + } + + this.collection.fetch({ + success: function() { + callback(findSelectedObjects(ids)); + } + }); + }, + + /** + * Renders this details view + */ + render: function() { + var self = this; + this.$el.html(this.template()); + + this.$el.find('[title]').tooltip({placement: 'bottom'}); + this.$tagsField = this.$el.find('[name=tags]'); + this.$tagsField.select2({ + placeholder: t('core', 'Global tags'), + containerCssClass: 'systemtags-select2-container', + dropdownCssClass: 'systemtags-select2-dropdown', + closeOnSelect: false, + allowClear: false, + multiple: this._multiple, + toggleSelect: this._multiple, + query: _.bind(this._queryTagsAutocomplete, this), + id: function(tag) { + return tag.id; + }, + initSelection: _.bind(this._initSelection, this), + formatResult: _.bind(this._formatDropDownResult, this), + formatSelection: function(tag) { + return '<span class="label">' + escapeHTML(tag.name) + '</span>' + + '<span class="comma">, </span>'; + }, + createSearchChoice: this._allowCreate ? _.bind(this._createSearchChoice, this) : undefined, + sortResults: function(results) { + var selectedItems = _.pluck(self.$tagsField.select2('data'), 'id'); + results.sort(function(a, b) { + var aSelected = selectedItems.indexOf(a.id) >= 0; + var bSelected = selectedItems.indexOf(b.id) >= 0; + if (aSelected === bSelected) { + return OC.Util.naturalSortCompare(a.name, b.name); + } + if (aSelected && !bSelected) { + return -1; + } + return 1; + }); + return results; + } + }) + .on('select2-selecting', this._onSelectTag) + .on('select2-removing', this._onDeselectTag); + + var $dropDown = this.$tagsField.select2('dropdown'); + // register events for inside the dropdown + $dropDown.on('mouseup', '.rename', this._onClickRenameTag); + $dropDown.on('mouseup', '.delete', this._onClickDeleteTag); + $dropDown.on('mouseup', '.select2-result-selectable.has-form', this._preventDefault); + $dropDown.on('submit', '.systemtags-rename-form', this._onSubmitRenameTag); + + this.delegateEvents(); + }, + + remove: function() { + if (this.$tagsField) { + this.$tagsField.select2('destroy'); + } + }, + + setValues: function(values) { + this.$tagsField.select2('val', values); + }, + + setData: function(data) { + this.$tagsField.select2('data', data); + } + }); + + OC.SystemTags = OC.SystemTags || {}; + OC.SystemTags.SystemTagsInputField = SystemTagsInputField; + +})(OC); + diff --git a/core/js/systemtags/systemtagsmappingcollection.js b/core/js/systemtags/systemtagsmappingcollection.js new file mode 100644 index 00000000000..f30a9dbd98e --- /dev/null +++ b/core/js/systemtags/systemtagsmappingcollection.js @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OC) { + /** + * @class OC.SystemTags.SystemTagsMappingCollection + * @classdesc + * + * Collection of tags assigned to a an object + * + */ + var SystemTagsMappingCollection = OC.Backbone.Collection.extend( + /** @lends OC.SystemTags.SystemTagsMappingCollection.prototype */ { + + sync: OC.Backbone.davSync, + + /** + * Use PUT instead of PROPPATCH + */ + usePUT: true, + + /** + * Id of the file for which to filter activities by + * + * @var int + */ + _objectId: null, + + /** + * Type of the object to filter by + * + * @var string + */ + _objectType: 'files', + + model: OC.SystemTags.SystemTagModel, + + url: function() { + return OC.linkToRemote('dav') + '/systemtags-relations/' + this._objectType + '/' + this._objectId; + }, + + /** + * Sets the object id to filter by or null for all. + * + * @param {int} objectId file id or null + */ + setObjectId: function(objectId) { + this._objectId = objectId; + }, + + /** + * Sets the object type to filter by or null for all. + * + * @param {int} objectType file id or null + */ + setObjectType: function(objectType) { + this._objectType = objectType; + }, + + initialize: function(models, options) { + options = options || {}; + if (!_.isUndefined(options.objectId)) { + this._objectId = options.objectId; + } + if (!_.isUndefined(options.objectType)) { + this._objectType = options.objectType; + } + }, + + getTagIds: function() { + return this.map(function(model) { + return model.id; + }); + } + }); + + OC.SystemTags = OC.SystemTags || {}; + OC.SystemTags.SystemTagsMappingCollection = SystemTagsMappingCollection; +})(OC); + diff --git a/core/js/tests/specHelper.js b/core/js/tests/specHelper.js index f09a7054c9f..d1c7873f0ea 100644 --- a/core/js/tests/specHelper.js +++ b/core/js/tests/specHelper.js @@ -160,7 +160,7 @@ window.isPhantom = /phantom/i.test(navigator.userAgent); OC.Plugins._plugins = []; // dummy select2 (which isn't loaded during the tests) - $.fn.select2 = function() {}; + $.fn.select2 = function() { return this; }; }); afterEach(function() { diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index f653fc88637..2e970f7e707 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -524,7 +524,7 @@ describe('Core base tests', function() { ["0", '0 B'], ["A", 'NaN B'], [125, '125 B'], - [128000, '125 kB'], + [128000, '125 KB'], [128000000, '122.1 MB'], [128000000000, '119.2 GB'], [128000000000000, '116.4 TB'] @@ -535,9 +535,9 @@ describe('Core base tests', function() { }); it('renders file sizes with the correct unit for small sizes', function() { var data = [ - [0, '0 kB'], - [125, '< 1 kB'], - [128000, '125 kB'], + [0, '0 KB'], + [125, '< 1 KB'], + [128000, '125 KB'], [128000000, '122.1 MB'], [128000000000, '119.2 GB'], [128000000000000, '116.4 TB'] diff --git a/core/js/tests/specs/systemtags/systemtagsSpec.js b/core/js/tests/specs/systemtags/systemtagsSpec.js new file mode 100644 index 00000000000..2e8390ad9f0 --- /dev/null +++ b/core/js/tests/specs/systemtags/systemtagsSpec.js @@ -0,0 +1,51 @@ +/** +* ownCloud +* +* @author Joas Schilling +* @copyright 2016 Joas Schilling <nickvergessen@owncloud.com> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +describe('OC.SystemTags tests', function() { + it('describes non existing tag', function() { + var $return = OC.SystemTags.getDescriptiveTag('23'); + expect($return.text()).toEqual('Non-existing tag #23'); + expect($return.hasClass('non-existing-tag')).toEqual(true); + }); + + it('describes SystemTagModel', function() { + var tag = new OC.SystemTags.SystemTagModel({ + id: 23, + name: 'Twenty Three', + userAssignable: true, + userVisible: true + }); + var $return = OC.SystemTags.getDescriptiveTag(tag); + expect($return.text()).toEqual('Twenty Three (visible, assignable)'); + expect($return.hasClass('non-existing-tag')).toEqual(false); + }); + + it('describes JSON tag object', function() { + var $return = OC.SystemTags.getDescriptiveTag({ + id: 42, + name: 'Fourty Two', + userAssignable: false, + userVisible: false + }); + expect($return.text()).toEqual('Fourty Two (invisible, not assignable)'); + expect($return.hasClass('non-existing-tag')).toEqual(false); + }); +}); diff --git a/core/js/tests/specs/systemtags/systemtagscollectionSpec.js b/core/js/tests/specs/systemtags/systemtagscollectionSpec.js new file mode 100644 index 00000000000..6f2d8361754 --- /dev/null +++ b/core/js/tests/specs/systemtags/systemtagscollectionSpec.js @@ -0,0 +1,84 @@ +/** +* ownCloud +* +* @author Vincent Petry +* @copyright 2016 Vincent Petry <pvince81@owncloud.com> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +describe('OC.SystemTags.SystemTagsCollection tests', function() { + var collection; + + beforeEach(function() { + collection = new OC.SystemTags.SystemTagsCollection(); + }); + it('fetches only once, until reset', function() { + var syncStub = sinon.stub(collection, 'sync'); + var callback = sinon.stub(); + var callback2 = sinon.stub(); + var callback3 = sinon.stub(); + var eventHandler = sinon.stub(); + + collection.on('sync', eventHandler); + + collection.fetch({ + success: callback + }); + + expect(callback.notCalled).toEqual(true); + expect(syncStub.calledOnce).toEqual(true); + expect(eventHandler.notCalled).toEqual(true); + + syncStub.yieldTo('success', collection); + + expect(callback.calledOnce).toEqual(true); + expect(callback.firstCall.args[0]).toEqual(collection); + expect(eventHandler.calledOnce).toEqual(true); + expect(eventHandler.firstCall.args[0]).toEqual(collection); + + collection.fetch({ + success: callback2 + }); + + expect(eventHandler.calledTwice).toEqual(true); + expect(eventHandler.secondCall.args[0]).toEqual(collection); + + // not re-called + expect(syncStub.calledOnce).toEqual(true); + + expect(callback.calledOnce).toEqual(true); + expect(callback2.calledOnce).toEqual(true); + expect(callback2.firstCall.args[0]).toEqual(collection); + + expect(collection.fetched).toEqual(true); + + collection.reset(); + + expect(collection.fetched).toEqual(false); + + collection.fetch({ + success: callback3 + }); + + expect(syncStub.calledTwice).toEqual(true); + + syncStub.yieldTo('success', collection); + expect(callback3.calledOnce).toEqual(true); + expect(callback3.firstCall.args[0]).toEqual(collection); + + syncStub.restore(); + }); +}); diff --git a/core/js/tests/specs/systemtags/systemtagsinputfieldSpec.js b/core/js/tests/specs/systemtags/systemtagsinputfieldSpec.js new file mode 100644 index 00000000000..dc8d2ec82ff --- /dev/null +++ b/core/js/tests/specs/systemtags/systemtagsinputfieldSpec.js @@ -0,0 +1,308 @@ +/** +* ownCloud +* +* @author Vincent Petry +* @copyright 2016 Vincent Petry <pvince81@owncloud.com> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +describe('OC.SystemTags.SystemTagsInputField tests', function() { + var view, select2Stub; + + beforeEach(function() { + var $container = $('<div class="testInputContainer"></div>'); + select2Stub = sinon.stub($.fn, 'select2'); + select2Stub.returnsThis(); + $('#testArea').append($container); + view = new OC.SystemTags.SystemTagsInputField(); + $container.append(view.$el); + }); + afterEach(function() { + select2Stub.restore(); + OC.SystemTags.collection.reset(); + view.remove(); + view = undefined; + }); + describe('rendering', function() { + beforeEach(function() { + view.render(); + }); + it('calls select2 on rendering', function() { + expect(view.$el.find('input[name=tags]').length).toEqual(1); + expect(select2Stub.called).toEqual(true); + }); + it('formatResult renders rename button', function() { + var opts = select2Stub.getCall(0).args[0]; + var $el = $(opts.formatResult({id: '1', name: 'test'})); + expect($el.find('.label').text()).toEqual('test'); + expect($el.find('.rename').length).toEqual(1); + }); + }); + describe('initSelection', function() { + var fetchStub; + var testTags; + + beforeEach(function() { + fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch'); + testTags = [ + new OC.SystemTags.SystemTagModel({id: '1', name: 'test1'}), + new OC.SystemTags.SystemTagModel({id: '2', name: 'test2'}), + new OC.SystemTags.SystemTagModel({id: '3', name: 'test3'}), + ]; + view.render(); + }); + afterEach(function() { + fetchStub.restore(); + }); + it('grabs values from the full collection', function() { + var $el = view.$el.find('input'); + $el.val('1,3'); + var opts = select2Stub.getCall(0).args[0]; + var callback = sinon.stub(); + opts.initSelection($el, callback); + + expect(fetchStub.calledOnce).toEqual(true); + view.collection.add(testTags); + fetchStub.yieldTo('success', view.collection); + + expect(callback.calledOnce).toEqual(true); + var models = callback.getCall(0).args[0]; + expect(models.length).toEqual(2); + expect(models[0].id).toEqual('1'); + expect(models[0].name).toEqual('test1'); + expect(models[1].id).toEqual('3'); + expect(models[1].name).toEqual('test3'); + }); + }); + describe('tag selection', function() { + beforeEach(function() { + view.render(); + var $el = view.$el.find('input'); + $el.val('1'); + + view.collection.add([ + new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}), + new OC.SystemTags.SystemTagModel({id: '2', name: 'def'}), + new OC.SystemTags.SystemTagModel({id: '3', name: 'abd'}), + ]); + }); + afterEach(function() { + }); + it('does not create dummy tag when user types non-matching name', function() { + var opts = select2Stub.getCall(0).args[0]; + var result = opts.createSearchChoice('abc'); + expect(result).not.toBeDefined(); + }); + it('creates dummy tag when user types non-matching name', function() { + var opts = select2Stub.getCall(0).args[0]; + var result = opts.createSearchChoice('abnew'); + expect(result.id).toEqual(-1); + expect(result.name).toEqual('abnew'); + expect(result.isNew).toEqual(true); + }); + it('creates the real tag and fires select event after user selects the dummy tag', function() { + var selectHandler = sinon.stub(); + view.on('select', selectHandler); + var createStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'create'); + view.$el.find('input').trigger(new $.Event('select2-selecting', { + object: { + id: -1, + name: 'newname', + isNew: true + } + })); + + expect(createStub.calledOnce).toEqual(true); + expect(createStub.getCall(0).args[0]).toEqual({ + name: 'newname', + userVisible: true, + userAssignable: true + }); + + var newModel = new OC.SystemTags.SystemTagModel({ + id: '123', + name: 'newname', + userVisible: true, + userAssignable: true + }); + + // not called yet + expect(selectHandler.notCalled).toEqual(true); + + select2Stub.withArgs('data').returns([{ + id: '1', + name: 'abc' + }]); + + createStub.yieldTo('success', newModel); + + expect(select2Stub.lastCall.args[0]).toEqual('data'); + expect(select2Stub.lastCall.args[1]).toEqual([{ + id: '1', + name: 'abc' + }, + newModel.toJSON() + ]); + + expect(selectHandler.calledOnce).toEqual(true); + expect(selectHandler.getCall(0).args[0]).toEqual(newModel); + + createStub.restore(); + }); + it('triggers select event after selecting an existing tag', function() { + var selectHandler = sinon.stub(); + view.on('select', selectHandler); + view.$el.find('input').trigger(new $.Event('select2-selecting', { + object: { + id: '2', + name: 'def' + } + })); + + expect(selectHandler.calledOnce).toEqual(true); + expect(selectHandler.getCall(0).args[0]).toEqual(view.collection.get('2')); + }); + it('triggers deselect event after deselecting an existing tag', function() { + var selectHandler = sinon.stub(); + view.on('deselect', selectHandler); + view.$el.find('input').trigger(new $.Event('select2-removing', { + choice: { + id: '2', + name: 'def' + } + })); + + expect(selectHandler.calledOnce).toEqual(true); + expect(selectHandler.getCall(0).args[0]).toEqual('2'); + }); + }); + describe('autocomplete', function() { + var fetchStub, opts; + + beforeEach(function() { + fetchStub = sinon.stub(OC.SystemTags.SystemTagsCollection.prototype, 'fetch'); + view.render(); + opts = select2Stub.getCall(0).args[0]; + + view.collection.add([ + new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}), + new OC.SystemTags.SystemTagModel({id: '2', name: 'def'}), + new OC.SystemTags.SystemTagModel({id: '3', name: 'abd'}), + ]); + }); + afterEach(function() { + fetchStub.restore(); + }); + it('completes results', function() { + var callback = sinon.stub(); + opts.query({ + term: 'ab', + callback: callback + }); + expect(fetchStub.calledOnce).toEqual(true); + + fetchStub.yieldTo('success', view.collection); + + expect(callback.calledOnce).toEqual(true); + expect(callback.getCall(0).args[0].results).toEqual([ + { + id: '1', + name: 'abc', + userVisible: true, + userAssignable: true + }, + { + id: '3', + name: 'abd', + userVisible: true, + userAssignable: true + } + ]); + }); + }); + describe('tag actions', function() { + var $dropdown, opts; + + beforeEach(function() { + $dropdown = $('<div class="select2-dropdown"></div>'); + select2Stub.withArgs('dropdown').returns($dropdown); + $('#testArea').append($dropdown); + + view.render(); + + opts = select2Stub.getCall(0).args[0]; + + view.collection.add([ + new OC.SystemTags.SystemTagModel({id: '1', name: 'abc'}), + ]); + + $dropdown.append(opts.formatResult(view.collection.get('1').toJSON())); + + }); + afterEach(function() { + }); + it('displays rename form when clicking rename', function() { + $dropdown.find('.rename').mouseup(); + expect($dropdown.find('form.systemtags-rename-form').length).toEqual(1); + expect($dropdown.find('form.systemtags-rename-form input').val()).toEqual('abc'); + }); + it('renames model and submits change when submitting form', function() { + var saveStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'save'); + $dropdown.find('.rename').mouseup(); + $dropdown.find('form input').val('abc_renamed'); + $dropdown.find('form').trigger(new $.Event('submit')); + + expect(saveStub.calledOnce).toEqual(true); + expect(saveStub.getCall(0).args[0]).toEqual({'name': 'abc_renamed'}); + + expect($dropdown.find('.label').text()).toEqual('abc_renamed'); + expect($dropdown.find('form').length).toEqual(0); + + saveStub.restore(); + }); + it('deletes model and submits change when clicking delete', function() { + var destroyStub = sinon.stub(OC.SystemTags.SystemTagModel.prototype, 'destroy'); + + expect($dropdown.find('.delete').length).toEqual(0); + $dropdown.find('.rename').mouseup(); + // delete button appears + expect($dropdown.find('.delete').length).toEqual(1); + $dropdown.find('.delete').mouseup(); + + expect(destroyStub.calledOnce).toEqual(true); + expect(destroyStub.calledOn(view.collection.get('1'))); + + destroyStub.restore(); + }); + }); + describe('setting data', function() { + beforeEach(function() { + view.render(); + }); + it('sets value when calling setValues', function() { + var vals = ['1', '2']; + view.setValues(vals); + expect(select2Stub.lastCall.args[0]).toEqual('val'); + expect(select2Stub.lastCall.args[1]).toEqual(vals); + }); + it('sets data when calling setData', function() { + var vals = [{id: '1', name: 'test1'}, {id: '2', name: 'test2'}]; + view.setData(vals); + expect(select2Stub.lastCall.args[0]).toEqual('data'); + expect(select2Stub.lastCall.args[1]).toEqual(vals); + }); + }); +}); diff --git a/core/l10n/af_ZA.js b/core/l10n/af_ZA.js index 151311b4848..04a93f6b476 100644 --- a/core/l10n/af_ZA.js +++ b/core/l10n/af_ZA.js @@ -15,6 +15,8 @@ OC.L10N.register( "Invalid image" : "Ongeldige prent", "No temporary profile picture available, try again" : "Geen tydelike profiel foto beskikbaar nie, probeer weer", "No crop data provided" : "Geen \"crop\" data verskaf", + "%s password reset" : "%s wagwoord herstel", + "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "Sunday" : "Sondag", "Monday" : "Maandag", "Tuesday" : "Dinsdag", @@ -37,7 +39,6 @@ OC.L10N.register( "Settings" : "Instellings", "Saving..." : "Stoor...", "seconds ago" : "sekondes gelede", - "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Die \"link\" vir die herstel van jou wagwoord is na jou epos gestuur. As jy dit nie binne 'n redelike tyd ontvang nie, soek deur jou \"spam/junk\" omslagte.<br>As dit nie daar is nie vra jou administrateur vir hulp.", "I know what I'm doing" : "Ek weet wat ek doen", "Password can not be changed. Please contact your administrator." : "Wagwoord kan nie verander word nie. Kontak asseblief jou stelsel administrateur.", @@ -85,10 +86,6 @@ OC.L10N.register( "The object type is not specified." : "Hierdie objek tipe is nie gespesifiseer nie.", "Add" : "Voeg by", "The update was successful. Redirecting you to ownCloud now." : "Die opdatering was suksesvol. Jy word nou aan ownCloud terug gelei.", - "%s password reset" : "%s wagwoord herstel", - "Use the following link to reset your password: {link}" : "Gebruik die volgende skakel om jou wagwoord te herstel: {link}", - "New password" : "Nuwe wagwoord", - "Reset password" : "Herstel wagwoord", "Personal" : "Persoonlik", "Users" : "Gebruikers", "Apps" : "Toepassings", @@ -110,6 +107,9 @@ OC.L10N.register( "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Halo daar,<br><br>wou jou net laat weet dat %s <strong>%s</strong> met jou gedeel het.<br><a href=\"%s\">Sien alles!</a><br><br>", "Log out" : "Teken uit", "Log in" : "Teken aan", - "Alternative Logins" : "Alternatiewe aantekeninge" + "Alternative Logins" : "Alternatiewe aantekeninge", + "Use the following link to reset your password: {link}" : "Gebruik die volgende skakel om jou wagwoord te herstel: {link}", + "New password" : "Nuwe wagwoord", + "Reset password" : "Herstel wagwoord" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/af_ZA.json b/core/l10n/af_ZA.json index 7d30b3c6566..7ea72e2407e 100644 --- a/core/l10n/af_ZA.json +++ b/core/l10n/af_ZA.json @@ -13,6 +13,8 @@ "Invalid image" : "Ongeldige prent", "No temporary profile picture available, try again" : "Geen tydelike profiel foto beskikbaar nie, probeer weer", "No crop data provided" : "Geen \"crop\" data verskaf", + "%s password reset" : "%s wagwoord herstel", + "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "Sunday" : "Sondag", "Monday" : "Maandag", "Tuesday" : "Dinsdag", @@ -35,7 +37,6 @@ "Settings" : "Instellings", "Saving..." : "Stoor...", "seconds ago" : "sekondes gelede", - "Couldn't send reset email. Please contact your administrator." : "Die herstel epos kon nie gestuur word nie. Kontak asseblief die stelsel administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Die \"link\" vir die herstel van jou wagwoord is na jou epos gestuur. As jy dit nie binne 'n redelike tyd ontvang nie, soek deur jou \"spam/junk\" omslagte.<br>As dit nie daar is nie vra jou administrateur vir hulp.", "I know what I'm doing" : "Ek weet wat ek doen", "Password can not be changed. Please contact your administrator." : "Wagwoord kan nie verander word nie. Kontak asseblief jou stelsel administrateur.", @@ -83,10 +84,6 @@ "The object type is not specified." : "Hierdie objek tipe is nie gespesifiseer nie.", "Add" : "Voeg by", "The update was successful. Redirecting you to ownCloud now." : "Die opdatering was suksesvol. Jy word nou aan ownCloud terug gelei.", - "%s password reset" : "%s wagwoord herstel", - "Use the following link to reset your password: {link}" : "Gebruik die volgende skakel om jou wagwoord te herstel: {link}", - "New password" : "Nuwe wagwoord", - "Reset password" : "Herstel wagwoord", "Personal" : "Persoonlik", "Users" : "Gebruikers", "Apps" : "Toepassings", @@ -108,6 +105,9 @@ "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Halo daar,<br><br>wou jou net laat weet dat %s <strong>%s</strong> met jou gedeel het.<br><a href=\"%s\">Sien alles!</a><br><br>", "Log out" : "Teken uit", "Log in" : "Teken aan", - "Alternative Logins" : "Alternatiewe aantekeninge" + "Alternative Logins" : "Alternatiewe aantekeninge", + "Use the following link to reset your password: {link}" : "Gebruik die volgende skakel om jou wagwoord te herstel: {link}", + "New password" : "Nuwe wagwoord", + "Reset password" : "Herstel wagwoord" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/ar.js b/core/l10n/ar.js index 9a5a9119991..d5727192f33 100644 --- a/core/l10n/ar.js +++ b/core/l10n/ar.js @@ -5,6 +5,7 @@ OC.L10N.register( "No image or file provided" : "لم يتم توفير صورة أو ملف", "Unknown filetype" : "نوع الملف غير معروف", "Invalid image" : "الصورة غير صالحة", + "%s password reset" : "تمت إعادة ضبط كلمة مرور %s", "Sunday" : "الأحد", "Monday" : "الأثنين", "Tuesday" : "الثلاثاء", @@ -99,15 +100,11 @@ OC.L10N.register( "access control" : "ضبط الوصول", "Share" : "شارك", "Warning" : "تحذير", + "Delete" : "إلغاء", "The object type is not specified." : "نوع العنصر غير محدد.", "Enter new" : "إدخال جديد", - "Delete" : "إلغاء", "Add" : "اضف", "The update was successful. Redirecting you to ownCloud now." : "تم التحديث بنجاح , يتم اعادة توجيهك الان الى Owncloud", - "%s password reset" : "تمت إعادة ضبط كلمة مرور %s", - "Use the following link to reset your password: {link}" : "استخدم هذه الوصلة لاسترجاع كلمة السر: {link}", - "New password" : "كلمات سر جديدة", - "Reset password" : "تعديل كلمة السر", "Personal" : "شخصي", "Users" : "المستخدمين", "Apps" : "التطبيقات", @@ -129,6 +126,9 @@ OC.L10N.register( "Log out" : "الخروج", "Search" : "البحث", "Log in" : "أدخل", - "Alternative Logins" : "اسماء دخول بديلة" + "Alternative Logins" : "اسماء دخول بديلة", + "Use the following link to reset your password: {link}" : "استخدم هذه الوصلة لاسترجاع كلمة السر: {link}", + "New password" : "كلمات سر جديدة", + "Reset password" : "تعديل كلمة السر" }, "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/core/l10n/ar.json b/core/l10n/ar.json index 0e3db12b2c3..01f3265ba78 100644 --- a/core/l10n/ar.json +++ b/core/l10n/ar.json @@ -3,6 +3,7 @@ "No image or file provided" : "لم يتم توفير صورة أو ملف", "Unknown filetype" : "نوع الملف غير معروف", "Invalid image" : "الصورة غير صالحة", + "%s password reset" : "تمت إعادة ضبط كلمة مرور %s", "Sunday" : "الأحد", "Monday" : "الأثنين", "Tuesday" : "الثلاثاء", @@ -97,15 +98,11 @@ "access control" : "ضبط الوصول", "Share" : "شارك", "Warning" : "تحذير", + "Delete" : "إلغاء", "The object type is not specified." : "نوع العنصر غير محدد.", "Enter new" : "إدخال جديد", - "Delete" : "إلغاء", "Add" : "اضف", "The update was successful. Redirecting you to ownCloud now." : "تم التحديث بنجاح , يتم اعادة توجيهك الان الى Owncloud", - "%s password reset" : "تمت إعادة ضبط كلمة مرور %s", - "Use the following link to reset your password: {link}" : "استخدم هذه الوصلة لاسترجاع كلمة السر: {link}", - "New password" : "كلمات سر جديدة", - "Reset password" : "تعديل كلمة السر", "Personal" : "شخصي", "Users" : "المستخدمين", "Apps" : "التطبيقات", @@ -127,6 +124,9 @@ "Log out" : "الخروج", "Search" : "البحث", "Log in" : "أدخل", - "Alternative Logins" : "اسماء دخول بديلة" + "Alternative Logins" : "اسماء دخول بديلة", + "Use the following link to reset your password: {link}" : "استخدم هذه الوصلة لاسترجاع كلمة السر: {link}", + "New password" : "كلمات سر جديدة", + "Reset password" : "تعديل كلمة السر" },"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/core/l10n/ast.js b/core/l10n/ast.js index 18274e59cbc..aa0b07d62f6 100644 --- a/core/l10n/ast.js +++ b/core/l10n/ast.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "Imaxe inválida", "No temporary profile picture available, try again" : "Nengún perfil d'imaxe temporal disponible, intentalo de nueves", "No crop data provided" : "Nun s'apurrió'l retayu de datos", + "Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu", + "Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu", + "%s password reset" : "%s restablecer contraseña", + "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "Sunday" : "Domingu", "Monday" : "Llunes", "Tuesday" : "Martes", @@ -54,7 +58,6 @@ OC.L10N.register( "Settings" : "Axustes", "Saving..." : "Guardando...", "seconds ago" : "hai segundos", - "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Unviósete al corréu l'enllaz pa reaniciar la to contraseña. Si nun lu recibes nuna cantidá razonable de tiempu, comprueba les tos carpetes de corréu puxarra. <br>Si nun ta ehí, entruga al to alministrador llocal", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Los tos ficheros tán crifraos. Si nun habilitesti la clave de recuperación, nun habrá forma de recuperar los tos datos dempués de que se reanicie la to contraseña.<br />Si nun tas seguru de qué facer, por favor contauta col to alministrador enantes que sigas. <br />¿De xuru quies siguir?", "I know what I'm doing" : "Sé lo que toi faciendo", @@ -122,9 +125,9 @@ OC.L10N.register( "Share with users or groups …" : "Compartir con usuarios o grupos", "Share with users, groups or remote users …" : "Compartir con usuarios, grupos o usuarios remotos", "Warning" : "Avisu", + "Delete" : "Desaniciar", "The object type is not specified." : "El tipu d'oxetu nun ta especificáu.", "Enter new" : "Introducir nueva", - "Delete" : "Desaniciar", "Add" : "Amestar", "Edit tags" : "Editar etiquetes", "Error loading dialog template: {error}" : "Fallu cargando plantía de diálogu: {error}", @@ -132,13 +135,6 @@ OC.L10N.register( "Updating {productName} to version {version}, this may take a while." : "Anovando {productName} a la versión {version}, esto pue llevar un tiempu.", "Please reload the page." : "Por favor, recarga la páxina", "The update was successful. Redirecting you to ownCloud now." : "L'anovamientu fízose con ésitu. Redirixiendo agora al to ownCloud.", - "Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu", - "Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}", - "New password" : "Contraseña nueva", - "New Password" : "Contraseña nueva", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", @@ -177,6 +173,10 @@ OC.L10N.register( "Please contact your administrator." : "Por favor, contauta col to alministrador", "Log in" : "Aniciar sesión", "Alternative Logins" : "Anicios de sesión alternativos", + "Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}", + "New password" : "Contraseña nueva", + "New Password" : "Contraseña nueva", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación d'ownCloud ta en mou d'usuariu únicu.", "This means only administrators can use the instance." : "Esto quier dicir que namái pue usala un alministrador.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contauta col alministrador si esti problema sigui apaeciendo.", diff --git a/core/l10n/ast.json b/core/l10n/ast.json index 39059c9a89a..eee79216811 100644 --- a/core/l10n/ast.json +++ b/core/l10n/ast.json @@ -11,6 +11,10 @@ "Invalid image" : "Imaxe inválida", "No temporary profile picture available, try again" : "Nengún perfil d'imaxe temporal disponible, intentalo de nueves", "No crop data provided" : "Nun s'apurrió'l retayu de datos", + "Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu", + "Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu", + "%s password reset" : "%s restablecer contraseña", + "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "Sunday" : "Domingu", "Monday" : "Llunes", "Tuesday" : "Martes", @@ -52,7 +56,6 @@ "Settings" : "Axustes", "Saving..." : "Guardando...", "seconds ago" : "hai segundos", - "Couldn't send reset email. Please contact your administrator." : "Nun pudo unviase'l corréu de reaniciu. Por favor, contauta col alministrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Unviósete al corréu l'enllaz pa reaniciar la to contraseña. Si nun lu recibes nuna cantidá razonable de tiempu, comprueba les tos carpetes de corréu puxarra. <br>Si nun ta ehí, entruga al to alministrador llocal", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Los tos ficheros tán crifraos. Si nun habilitesti la clave de recuperación, nun habrá forma de recuperar los tos datos dempués de que se reanicie la to contraseña.<br />Si nun tas seguru de qué facer, por favor contauta col to alministrador enantes que sigas. <br />¿De xuru quies siguir?", "I know what I'm doing" : "Sé lo que toi faciendo", @@ -120,9 +123,9 @@ "Share with users or groups …" : "Compartir con usuarios o grupos", "Share with users, groups or remote users …" : "Compartir con usuarios, grupos o usuarios remotos", "Warning" : "Avisu", + "Delete" : "Desaniciar", "The object type is not specified." : "El tipu d'oxetu nun ta especificáu.", "Enter new" : "Introducir nueva", - "Delete" : "Desaniciar", "Add" : "Amestar", "Edit tags" : "Editar etiquetes", "Error loading dialog template: {error}" : "Fallu cargando plantía de diálogu: {error}", @@ -130,13 +133,6 @@ "Updating {productName} to version {version}, this may take a while." : "Anovando {productName} a la versión {version}, esto pue llevar un tiempu.", "Please reload the page." : "Por favor, recarga la páxina", "The update was successful. Redirecting you to ownCloud now." : "L'anovamientu fízose con ésitu. Redirixiendo agora al to ownCloud.", - "Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu", - "Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}", - "New password" : "Contraseña nueva", - "New Password" : "Contraseña nueva", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", @@ -175,6 +171,10 @@ "Please contact your administrator." : "Por favor, contauta col to alministrador", "Log in" : "Aniciar sesión", "Alternative Logins" : "Anicios de sesión alternativos", + "Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}", + "New password" : "Contraseña nueva", + "New Password" : "Contraseña nueva", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación d'ownCloud ta en mou d'usuariu únicu.", "This means only administrators can use the instance." : "Esto quier dicir que namái pue usala un alministrador.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contauta col alministrador si esti problema sigui apaeciendo.", diff --git a/core/l10n/az.js b/core/l10n/az.js index 234431ec3b9..bf3cd00450e 100644 --- a/core/l10n/az.js +++ b/core/l10n/az.js @@ -75,7 +75,6 @@ OC.L10N.register( "Warning" : "Xəbərdarlıq", "Delete" : "Sil", "Add" : "Əlavə etmək", - "New password" : "Yeni şifrə", "Personal" : "Şəxsi", "Users" : "İstifadəçilər", "Admin" : "İnzibatçı", @@ -85,6 +84,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", "Search" : "Axtarış", "Log in" : "Giriş", + "New password" : "Yeni şifrə", "You are accessing the server from an untrusted domain." : "Siz serverə inamsız domain-dən girməyə çalışırsız." }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/az.json b/core/l10n/az.json index 4d45bdd9d96..1169cb66196 100644 --- a/core/l10n/az.json +++ b/core/l10n/az.json @@ -73,7 +73,6 @@ "Warning" : "Xəbərdarlıq", "Delete" : "Sil", "Add" : "Əlavə etmək", - "New password" : "Yeni şifrə", "Personal" : "Şəxsi", "Users" : "İstifadəçilər", "Admin" : "İnzibatçı", @@ -83,6 +82,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", "Search" : "Axtarış", "Log in" : "Giriş", + "New password" : "Yeni şifrə", "You are accessing the server from an untrusted domain." : "Siz serverə inamsız domain-dən girməyə çalışırsız." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js index cdadedbf74b..b38a36f6f06 100644 --- a/core/l10n/bg_BG.js +++ b/core/l10n/bg_BG.js @@ -16,6 +16,10 @@ OC.L10N.register( "Invalid image" : "Невалидно изображение", "No temporary profile picture available, try again" : "Не е налична временна профилна снимка, опитайте отново", "No crop data provided" : "Липсват данни за изрязването", + "Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна", + "Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.", + "%s password reset" : "Паролата на %s е променена.", + "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "Sunday" : "Неделя", "Monday" : "Понеделник", "Tuesday" : "Вторник", @@ -57,7 +61,6 @@ OC.L10N.register( "Settings" : "Настройки", "Saving..." : "Запазване...", "seconds ago" : "преди секунди", - "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Връзката за възстановяване на паролата беше изпратена до вашата електронна поща. Ако не я получите в разумен период от време, проверете папките си за спам и junk.<br>Ако не я откривате и там, се свържете с местния администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Файловете Ви са криптирани. Ако не сте настроили ключ за възстановяване, няма да е възможно да се възстановят данните Ви след смяна на паролата.<br />Ако не сте сигурни какво да направите, моля, свържете се с Вашия администратор преди да продължите. <br/>Наистина ли искате да продължите?", "I know what I'm doing" : "Знам какво правя", @@ -126,9 +129,9 @@ OC.L10N.register( "access control" : "контрол на достъпа", "Share" : "Споделяне", "Warning" : "Предупреждение", + "Delete" : "Изтриване", "The object type is not specified." : "Видът на обекта не е избран.", "Enter new" : "Въвеждане на нов", - "Delete" : "Изтриване", "Add" : "Добавяне", "Edit tags" : "Промяна на етикетите", "Error loading dialog template: {error}" : "Грешка при зареждането на шаблон за диалог: {error}.", @@ -143,13 +146,6 @@ OC.L10N.register( "Please reload the page." : "Моля, презаредете страницата.", "The update was unsuccessful. " : "Обновяването бе неуспешно.", "The update was successful. Redirecting you to ownCloud now." : "Обновяването е успешно. Сега Ви пренасочваме към ownCloud.", - "Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна", - "Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.", - "%s password reset" : "Паролата на %s е променена.", - "Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}", - "New password" : "Нова парола", - "New Password" : "Нова Парола", - "Reset password" : "Възстановяване на паролата", "Searching other places" : "Търсене в други места", "Personal" : "Лични", "Users" : "Потребители", @@ -209,6 +205,10 @@ OC.L10N.register( "Please contact your administrator." : "Моля, свържете се с администратора.", "Log in" : "Вписване", "Alternative Logins" : "Алтернативни методи на вписване", + "Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}", + "New password" : "Нова парола", + "New Password" : "Нова Парола", + "Reset password" : "Възстановяване на паролата", "This ownCloud instance is currently in single user mode." : "В момента този ownCloud е в режим допускащ само един потребител.", "This means only administrators can use the instance." : "Това означава, че само администраторът може да го използва.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Свържи се със системния си администратор ако това съобщение се задържи твърде дълго или се е появило неочаквано.", diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json index c4f9a03757a..151f4a7d2e6 100644 --- a/core/l10n/bg_BG.json +++ b/core/l10n/bg_BG.json @@ -14,6 +14,10 @@ "Invalid image" : "Невалидно изображение", "No temporary profile picture available, try again" : "Не е налична временна профилна снимка, опитайте отново", "No crop data provided" : "Липсват данни за изрязването", + "Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна", + "Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.", + "%s password reset" : "Паролата на %s е променена.", + "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "Sunday" : "Неделя", "Monday" : "Понеделник", "Tuesday" : "Вторник", @@ -55,7 +59,6 @@ "Settings" : "Настройки", "Saving..." : "Запазване...", "seconds ago" : "преди секунди", - "Couldn't send reset email. Please contact your administrator." : "Изпращането на електронна поща е неуспешно. Моля, свържете се с вашия администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Връзката за възстановяване на паролата беше изпратена до вашата електронна поща. Ако не я получите в разумен период от време, проверете папките си за спам и junk.<br>Ако не я откривате и там, се свържете с местния администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Файловете Ви са криптирани. Ако не сте настроили ключ за възстановяване, няма да е възможно да се възстановят данните Ви след смяна на паролата.<br />Ако не сте сигурни какво да направите, моля, свържете се с Вашия администратор преди да продължите. <br/>Наистина ли искате да продължите?", "I know what I'm doing" : "Знам какво правя", @@ -124,9 +127,9 @@ "access control" : "контрол на достъпа", "Share" : "Споделяне", "Warning" : "Предупреждение", + "Delete" : "Изтриване", "The object type is not specified." : "Видът на обекта не е избран.", "Enter new" : "Въвеждане на нов", - "Delete" : "Изтриване", "Add" : "Добавяне", "Edit tags" : "Промяна на етикетите", "Error loading dialog template: {error}" : "Грешка при зареждането на шаблон за диалог: {error}.", @@ -141,13 +144,6 @@ "Please reload the page." : "Моля, презаредете страницата.", "The update was unsuccessful. " : "Обновяването бе неуспешно.", "The update was successful. Redirecting you to ownCloud now." : "Обновяването е успешно. Сега Ви пренасочваме към ownCloud.", - "Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна", - "Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.", - "%s password reset" : "Паролата на %s е променена.", - "Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}", - "New password" : "Нова парола", - "New Password" : "Нова Парола", - "Reset password" : "Възстановяване на паролата", "Searching other places" : "Търсене в други места", "Personal" : "Лични", "Users" : "Потребители", @@ -207,6 +203,10 @@ "Please contact your administrator." : "Моля, свържете се с администратора.", "Log in" : "Вписване", "Alternative Logins" : "Алтернативни методи на вписване", + "Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}", + "New password" : "Нова парола", + "New Password" : "Нова Парола", + "Reset password" : "Възстановяване на паролата", "This ownCloud instance is currently in single user mode." : "В момента този ownCloud е в режим допускащ само един потребител.", "This means only administrators can use the instance." : "Това означава, че само администраторът може да го използва.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Свържи се със системния си администратор ако това съобщение се задържи твърде дълго или се е появило неочаквано.", diff --git a/core/l10n/bn_BD.js b/core/l10n/bn_BD.js index 4730e70c633..255721fbfd4 100644 --- a/core/l10n/bn_BD.js +++ b/core/l10n/bn_BD.js @@ -89,16 +89,12 @@ OC.L10N.register( "access control" : "অধিগম্যতা নিয়ন্ত্রণ", "Share" : "ভাগাভাগি কর", "Warning" : "সতর্কবাণী", + "Delete" : "মুছে", "The object type is not specified." : "অবজেক্টের ধরণটি সুনির্দিষ্ট নয়।", "Enter new" : "নতুন লিখুন", - "Delete" : "মুছে", "Add" : "যোগ কর", "Edit tags" : "ট্যাগ সম্পাদনা", "Please reload the page." : "দয়া করে পৃষ্ঠাটি পূনরায় লোড করুন।", - "Use the following link to reset your password: {link}" : "আপনার কূটশব্দটি পূনঃনির্ধারণ করার জন্য নিম্নোক্ত লিংকটি ব্যবহার করুনঃ {link}", - "New password" : "নতুন কূটশব্দ", - "New Password" : "নতুন কূটশব্দ", - "Reset password" : "কূটশব্দ পূনঃনির্ধারণ কর", "Personal" : "ব্যক্তিগত", "Users" : "ব্যবহারকারী", "Apps" : "অ্যাপ", @@ -125,6 +121,10 @@ OC.L10N.register( "Log out" : "প্রস্থান", "Search" : "অনুসন্ধান", "Log in" : "প্রবেশ", - "Alternative Logins" : "বিকল্প লগইন" + "Alternative Logins" : "বিকল্প লগইন", + "Use the following link to reset your password: {link}" : "আপনার কূটশব্দটি পূনঃনির্ধারণ করার জন্য নিম্নোক্ত লিংকটি ব্যবহার করুনঃ {link}", + "New password" : "নতুন কূটশব্দ", + "New Password" : "নতুন কূটশব্দ", + "Reset password" : "কূটশব্দ পূনঃনির্ধারণ কর" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/bn_BD.json b/core/l10n/bn_BD.json index d4de5a67aa9..62e59cad16a 100644 --- a/core/l10n/bn_BD.json +++ b/core/l10n/bn_BD.json @@ -87,16 +87,12 @@ "access control" : "অধিগম্যতা নিয়ন্ত্রণ", "Share" : "ভাগাভাগি কর", "Warning" : "সতর্কবাণী", + "Delete" : "মুছে", "The object type is not specified." : "অবজেক্টের ধরণটি সুনির্দিষ্ট নয়।", "Enter new" : "নতুন লিখুন", - "Delete" : "মুছে", "Add" : "যোগ কর", "Edit tags" : "ট্যাগ সম্পাদনা", "Please reload the page." : "দয়া করে পৃষ্ঠাটি পূনরায় লোড করুন।", - "Use the following link to reset your password: {link}" : "আপনার কূটশব্দটি পূনঃনির্ধারণ করার জন্য নিম্নোক্ত লিংকটি ব্যবহার করুনঃ {link}", - "New password" : "নতুন কূটশব্দ", - "New Password" : "নতুন কূটশব্দ", - "Reset password" : "কূটশব্দ পূনঃনির্ধারণ কর", "Personal" : "ব্যক্তিগত", "Users" : "ব্যবহারকারী", "Apps" : "অ্যাপ", @@ -123,6 +119,10 @@ "Log out" : "প্রস্থান", "Search" : "অনুসন্ধান", "Log in" : "প্রবেশ", - "Alternative Logins" : "বিকল্প লগইন" + "Alternative Logins" : "বিকল্প লগইন", + "Use the following link to reset your password: {link}" : "আপনার কূটশব্দটি পূনঃনির্ধারণ করার জন্য নিম্নোক্ত লিংকটি ব্যবহার করুনঃ {link}", + "New password" : "নতুন কূটশব্দ", + "New Password" : "নতুন কূটশব্দ", + "Reset password" : "কূটশব্দ পূনঃনির্ধারণ কর" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/bs.js b/core/l10n/bs.js index f3b39d5fb97..f25ca00032e 100644 --- a/core/l10n/bs.js +++ b/core/l10n/bs.js @@ -12,6 +12,10 @@ OC.L10N.register( "Unknown filetype" : "Nepoznat tip datoteke", "Invalid image" : "Nevažeća datoteka", "No temporary profile picture available, try again" : "Trenutna slika profila nije dostupna, pokušajte ponovo", + "Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.", + "Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.", + "%s password reset" : "%s lozinka resetovana", + "Couldn't send reset email. Please contact your administrator." : "Slanje emaila resetovanja nije moguće. Molim kontaktirajte administratora.", "Sunday" : "Nedjelja", "Monday" : "Ponedjeljak", "Tuesday" : "Utorak", @@ -52,7 +56,6 @@ OC.L10N.register( "Dec." : "Dec.", "Settings" : "Postavke", "Saving..." : "Spašavam...", - "Couldn't send reset email. Please contact your administrator." : "Slanje emaila resetovanja nije moguće. Molim kontaktirajte administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetovanje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite u nekom razumnom vremenskom roku, provjerite svoje spam/junk direktorij. <br> Ako nije tamo, kontaktirajte vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali povratni ključ, neećete imati mogućnost povratka vaših podataka nakon što vaša lozinka bude resetovana.<br />Ako niste sigurni šta učiniti, prije nego nastavite, molimo kontaktirajte vašeg administratora. <br />Želite li zaista nastaviti?", "I know what I'm doing" : "Ja znam šta radim", @@ -117,9 +120,9 @@ OC.L10N.register( "access control" : "Kontrola pristupa", "Share" : "Podijeli", "Warning" : "Upozorenje", + "Delete" : "Izbriši", "The object type is not specified." : "Vrsta objekta nije određena.", "Enter new" : "Unesi novi", - "Delete" : "Izbriši", "Add" : "Dodaj", "Edit tags" : "Izmjeni oznake", "Error loading dialog template: {error}" : "Pogrešno učitavanje šablona dijaloga: {error}", @@ -132,13 +135,6 @@ OC.L10N.register( "Please reload the page." : "Molim, ponovno učitajte stranicu", "The update was unsuccessful. " : "Ažuriranje nije uspjelo.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Preusmjeravam vas na ownCloud.", - "Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.", - "Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.", - "%s password reset" : "%s lozinka resetovana", - "Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova Lozinka", - "Reset password" : "Resetuj lozinku", "Personal" : "Osobno", "Users" : "Korisnici", "Apps" : "Aplikacije", @@ -188,6 +184,10 @@ OC.L10N.register( "Please contact your administrator." : "Molim kontaktirajte svog administratora.", "Log in" : "Prijava", "Alternative Logins" : "Alternativne Prijave", + "Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova Lozinka", + "Reset password" : "Resetuj lozinku", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u jednokorisničkom načinu rada.", "This means only administrators can use the instance." : "To znači da tu instancu mogu koristiti samo administratori.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte svog administratora sistema ako se ova poruka ponavlja ili se pojavila neočekivano.", diff --git a/core/l10n/bs.json b/core/l10n/bs.json index 8105c2c9866..c3e6357c88f 100644 --- a/core/l10n/bs.json +++ b/core/l10n/bs.json @@ -10,6 +10,10 @@ "Unknown filetype" : "Nepoznat tip datoteke", "Invalid image" : "Nevažeća datoteka", "No temporary profile picture available, try again" : "Trenutna slika profila nije dostupna, pokušajte ponovo", + "Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.", + "Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.", + "%s password reset" : "%s lozinka resetovana", + "Couldn't send reset email. Please contact your administrator." : "Slanje emaila resetovanja nije moguće. Molim kontaktirajte administratora.", "Sunday" : "Nedjelja", "Monday" : "Ponedjeljak", "Tuesday" : "Utorak", @@ -50,7 +54,6 @@ "Dec." : "Dec.", "Settings" : "Postavke", "Saving..." : "Spašavam...", - "Couldn't send reset email. Please contact your administrator." : "Slanje emaila resetovanja nije moguće. Molim kontaktirajte administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetovanje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite u nekom razumnom vremenskom roku, provjerite svoje spam/junk direktorij. <br> Ako nije tamo, kontaktirajte vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali povratni ključ, neećete imati mogućnost povratka vaših podataka nakon što vaša lozinka bude resetovana.<br />Ako niste sigurni šta učiniti, prije nego nastavite, molimo kontaktirajte vašeg administratora. <br />Želite li zaista nastaviti?", "I know what I'm doing" : "Ja znam šta radim", @@ -115,9 +118,9 @@ "access control" : "Kontrola pristupa", "Share" : "Podijeli", "Warning" : "Upozorenje", + "Delete" : "Izbriši", "The object type is not specified." : "Vrsta objekta nije određena.", "Enter new" : "Unesi novi", - "Delete" : "Izbriši", "Add" : "Dodaj", "Edit tags" : "Izmjeni oznake", "Error loading dialog template: {error}" : "Pogrešno učitavanje šablona dijaloga: {error}", @@ -130,13 +133,6 @@ "Please reload the page." : "Molim, ponovno učitajte stranicu", "The update was unsuccessful. " : "Ažuriranje nije uspjelo.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Preusmjeravam vas na ownCloud.", - "Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.", - "Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.", - "%s password reset" : "%s lozinka resetovana", - "Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova Lozinka", - "Reset password" : "Resetuj lozinku", "Personal" : "Osobno", "Users" : "Korisnici", "Apps" : "Aplikacije", @@ -186,6 +182,10 @@ "Please contact your administrator." : "Molim kontaktirajte svog administratora.", "Log in" : "Prijava", "Alternative Logins" : "Alternativne Prijave", + "Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova Lozinka", + "Reset password" : "Resetuj lozinku", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u jednokorisničkom načinu rada.", "This means only administrators can use the instance." : "To znači da tu instancu mogu koristiti samo administratori.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte svog administratora sistema ako se ova poruka ponavlja ili se pojavila neočekivano.", diff --git a/core/l10n/ca.js b/core/l10n/ca.js index 015e224aade..8a74b3ddbfa 100644 --- a/core/l10n/ca.js +++ b/core/l10n/ca.js @@ -23,6 +23,11 @@ OC.L10N.register( "No crop data provided" : "No heu proporcionat dades del retall", "No valid crop data provided" : "Les dades del retall proporcionades no són vàlides", "Crop is not square" : "El retall no és quadrat", + "Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid", + "Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut", + "Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.", + "%s password reset" : "restableix la contrasenya %s", + "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "Sunday" : "Diumenge", "Monday" : "Dilluns", "Tuesday" : "Dimarts", @@ -71,7 +76,6 @@ OC.L10N.register( "Settings" : "Configuració", "Saving..." : "Desant...", "seconds ago" : "segons enrere", - "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "L'enllaç per reiniciar la vostra contrasenya s'ha enviat al vostre correu. Si no el rebeu en un temps raonable comproveu les carpetes de spam. <br>Si no és allà, pregunteu a l'administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Els vostres fitxers estan encriptats. Si no heu habilitat la clau de recuperació no hi haurà manera de recuperar les dades després que reestabliu la contrasenya. <br />Si sabeu què fer, contacteu amb l'administrador abans de continuar.<br />Voleu continuar?", "I know what I'm doing" : "Sé el que faig", @@ -145,9 +149,9 @@ OC.L10N.register( "Share with users or groups …" : "Comparteix amb usuaris o grups ...", "Share with users, groups or remote users …" : "Comparteix amb usuaris, grups o usuaris remots ...", "Warning" : "Avís", + "Delete" : "Esborra", "The object type is not specified." : "No s'ha especificat el tipus d'objecte.", "Enter new" : "Escriu nou", - "Delete" : "Esborra", "Add" : "Afegeix", "Edit tags" : "Edita etiquetes", "Error loading dialog template: {error}" : "Error en carregar la plantilla de diàleg: {error}", @@ -164,14 +168,6 @@ OC.L10N.register( "The update was unsuccessful. " : "La actualització no ha tingut èxit", "The update was successful. There were warnings." : "La actualització ha estat exitosa. Hi ha alertes.", "The update was successful. Redirecting you to ownCloud now." : "L'actualització ha estat correcte. Ara us redirigim a ownCloud.", - "Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid", - "Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut", - "Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.", - "%s password reset" : "restableix la contrasenya %s", - "Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}", - "New password" : "Contrasenya nova", - "New Password" : "Contrasenya nova", - "Reset password" : "Reinicialitza la contrasenya", "Searching other places" : "Buscant altres ubicacions", "Personal" : "Personal", "Users" : "Usuaris", @@ -242,6 +238,10 @@ OC.L10N.register( "Wrong password." : "Contrasenya incorrecta.", "Stay logged in" : "Mantén la sessió connectada", "Alternative Logins" : "Acreditacions alternatives", + "Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}", + "New password" : "Contrasenya nova", + "New Password" : "Contrasenya nova", + "Reset password" : "Reinicialitza la contrasenya", "This ownCloud instance is currently in single user mode." : "La instància ownCloud està en mode d'usuari únic.", "This means only administrators can use the instance." : "Això significa que només els administradors poden usar la instància.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacteu amb l'administrador del sistema si aquest missatge persisteix o apareix inesperadament.", diff --git a/core/l10n/ca.json b/core/l10n/ca.json index 65a09b6e7c7..e7aec7e093e 100644 --- a/core/l10n/ca.json +++ b/core/l10n/ca.json @@ -21,6 +21,11 @@ "No crop data provided" : "No heu proporcionat dades del retall", "No valid crop data provided" : "Les dades del retall proporcionades no són vàlides", "Crop is not square" : "El retall no és quadrat", + "Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid", + "Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut", + "Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.", + "%s password reset" : "restableix la contrasenya %s", + "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "Sunday" : "Diumenge", "Monday" : "Dilluns", "Tuesday" : "Dimarts", @@ -69,7 +74,6 @@ "Settings" : "Configuració", "Saving..." : "Desant...", "seconds ago" : "segons enrere", - "Couldn't send reset email. Please contact your administrator." : "No s'ha pogut restablir el correu. Contacteu amb l'administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "L'enllaç per reiniciar la vostra contrasenya s'ha enviat al vostre correu. Si no el rebeu en un temps raonable comproveu les carpetes de spam. <br>Si no és allà, pregunteu a l'administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Els vostres fitxers estan encriptats. Si no heu habilitat la clau de recuperació no hi haurà manera de recuperar les dades després que reestabliu la contrasenya. <br />Si sabeu què fer, contacteu amb l'administrador abans de continuar.<br />Voleu continuar?", "I know what I'm doing" : "Sé el que faig", @@ -143,9 +147,9 @@ "Share with users or groups …" : "Comparteix amb usuaris o grups ...", "Share with users, groups or remote users …" : "Comparteix amb usuaris, grups o usuaris remots ...", "Warning" : "Avís", + "Delete" : "Esborra", "The object type is not specified." : "No s'ha especificat el tipus d'objecte.", "Enter new" : "Escriu nou", - "Delete" : "Esborra", "Add" : "Afegeix", "Edit tags" : "Edita etiquetes", "Error loading dialog template: {error}" : "Error en carregar la plantilla de diàleg: {error}", @@ -162,14 +166,6 @@ "The update was unsuccessful. " : "La actualització no ha tingut èxit", "The update was successful. There were warnings." : "La actualització ha estat exitosa. Hi ha alertes.", "The update was successful. Redirecting you to ownCloud now." : "L'actualització ha estat correcte. Ara us redirigim a ownCloud.", - "Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid", - "Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut", - "Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.", - "%s password reset" : "restableix la contrasenya %s", - "Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}", - "New password" : "Contrasenya nova", - "New Password" : "Contrasenya nova", - "Reset password" : "Reinicialitza la contrasenya", "Searching other places" : "Buscant altres ubicacions", "Personal" : "Personal", "Users" : "Usuaris", @@ -240,6 +236,10 @@ "Wrong password." : "Contrasenya incorrecta.", "Stay logged in" : "Mantén la sessió connectada", "Alternative Logins" : "Acreditacions alternatives", + "Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}", + "New password" : "Contrasenya nova", + "New Password" : "Contrasenya nova", + "Reset password" : "Reinicialitza la contrasenya", "This ownCloud instance is currently in single user mode." : "La instància ownCloud està en mode d'usuari únic.", "This means only administrators can use the instance." : "Això significa que només els administradors poden usar la instància.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacteu amb l'administrador del sistema si aquest missatge persisteix o apareix inesperadament.", diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index 8f928bb50ea..f5613721999 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Nebyla poskytnuta data pro oříznutí obrázku", "No valid crop data provided" : "Nebyla poskytnuta platná data pro oříznutí obrázku", "Crop is not square" : "Ořez není čtvercový", + "Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu", + "Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu", + "Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého administrátora.", + "%s password reset" : "reset hesla %s", + "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "Sunday" : "Neděle", "Monday" : "Pondělí", "Tuesday" : "Úterý", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Nastavení", "Saving..." : "Ukládám...", "seconds ago" : "před pár sekundami", - "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte složku nevyžádané pošty a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?", "I know what I'm doing" : "Vím co dělám", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli", "Warning" : "Varování", "Error while sending notification" : "Chyba při odesílání upozornění", + "Delete" : "Smazat", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", - "Delete" : "Smazat", "Add" : "Přidat", "Edit tags" : "Editovat štítky", "Error loading dialog template: {error}" : "Chyba při načítání šablony dialogu: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Aktualizace nebyla úspěšná.", "The update was successful. There were warnings." : "Aktualizace byla úspěšná. Zachycen výskyt varování.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizace byla úspěšná. Přesměrovávám na ownCloud.", - "Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu", - "Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu", - "Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého administrátora.", - "%s password reset" : "reset hesla %s", - "Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}", - "New password" : "Nové heslo", - "New Password" : "Nové heslo", - "Reset password" : "Obnovit heslo", "Searching other places" : "Prohledávání ostatních umístění", "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} nález v dalším adresáři","{count} nálezy v dalších adresářích","{count} nálezů v dalších adresářích"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", + "Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}", + "New password" : "Nové heslo", + "New Password" : "Nové heslo", + "Reset password" : "Obnovit heslo", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", "This means only administrators can use the instance." : "To znamená, že pouze správci systému mohou aplikaci používat.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktujte prosím správce systému, pokud se tato zpráva objevuje opakovaně nebo nečekaně.", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index 527fe800d0a..305c088a868 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -33,6 +33,12 @@ "No crop data provided" : "Nebyla poskytnuta data pro oříznutí obrázku", "No valid crop data provided" : "Nebyla poskytnuta platná data pro oříznutí obrázku", "Crop is not square" : "Ořez není čtvercový", + "Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu", + "Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu", + "Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého administrátora.", + "%s password reset" : "reset hesla %s", + "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "Sunday" : "Neděle", "Monday" : "Pondělí", "Tuesday" : "Úterý", @@ -82,7 +88,6 @@ "Settings" : "Nastavení", "Saving..." : "Ukládám...", "seconds ago" : "před pár sekundami", - "Couldn't send reset email. Please contact your administrator." : "Nepodařilo se odeslat email pro změnu hesla. Kontaktujte svého správce systému.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovení hesla byl odeslán na vaši emailovou adresu. Pokud jej v krátké době neobdržíte, zkontrolujte složku nevyžádané pošty a koš.<br>Pokud jej nenaleznete, kontaktujte svého správce systému.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše soubory jsou šifrovány. Pokud jste nepovolili klíč pro obnovení, neexistuje způsob jak získat po změně hesla vaše data zpět.<br />Pokud si nejste jisti co dělat, kontaktujte nejprve svého správce systému, než budete pokračovat. <br />Opravdu si přejete pokračovat?", "I know what I'm doing" : "Vím co dělám", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli", "Warning" : "Varování", "Error while sending notification" : "Chyba při odesílání upozornění", + "Delete" : "Smazat", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", - "Delete" : "Smazat", "Add" : "Přidat", "Edit tags" : "Editovat štítky", "Error loading dialog template: {error}" : "Chyba při načítání šablony dialogu: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "Aktualizace nebyla úspěšná.", "The update was successful. There were warnings." : "Aktualizace byla úspěšná. Zachycen výskyt varování.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizace byla úspěšná. Přesměrovávám na ownCloud.", - "Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu", - "Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu", - "Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého administrátora.", - "%s password reset" : "reset hesla %s", - "Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}", - "New password" : "Nové heslo", - "New Password" : "Nové heslo", - "Reset password" : "Obnovit heslo", "Searching other places" : "Prohledávání ostatních umístění", "No search results in other folders" : "V ostatních adresářích nebylo nic nalezeno", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} nález v dalším adresáři","{count} nálezy v dalších adresářích","{count} nálezů v dalších adresářích"], @@ -269,6 +265,10 @@ "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", + "Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}", + "New password" : "Nové heslo", + "New Password" : "Nové heslo", + "Reset password" : "Obnovit heslo", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", "This means only administrators can use the instance." : "To znamená, že pouze správci systému mohou aplikaci používat.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktujte prosím správce systému, pokud se tato zpráva objevuje opakovaně nebo nečekaně.", diff --git a/core/l10n/cy_GB.js b/core/l10n/cy_GB.js index 2aa8280d96a..3653e304a73 100644 --- a/core/l10n/cy_GB.js +++ b/core/l10n/cy_GB.js @@ -73,13 +73,10 @@ OC.L10N.register( "access control" : "rheolaeth mynediad", "Share" : "Rhannu", "Warning" : "Rhybudd", - "The object type is not specified." : "Nid yw'r math o wrthrych wedi cael ei nodi.", "Delete" : "Dileu", + "The object type is not specified." : "Nid yw'r math o wrthrych wedi cael ei nodi.", "Add" : "Ychwanegu", "The update was successful. Redirecting you to ownCloud now." : "Roedd y diweddariad yn llwyddiannus. Cewch eich ailgyfeirio i ownCloud nawr.", - "Use the following link to reset your password: {link}" : "Defnyddiwch y ddolen hon i ailosod eich cyfrinair: {link}", - "New password" : "Cyfrinair newydd", - "Reset password" : "Ailosod cyfrinair", "Personal" : "Personol", "Users" : "Defnyddwyr", "Apps" : "Pecynnau", @@ -100,6 +97,9 @@ OC.L10N.register( "Log out" : "Allgofnodi", "Search" : "Chwilio", "Log in" : "Mewngofnodi", - "Alternative Logins" : "Mewngofnodiadau Amgen" + "Alternative Logins" : "Mewngofnodiadau Amgen", + "Use the following link to reset your password: {link}" : "Defnyddiwch y ddolen hon i ailosod eich cyfrinair: {link}", + "New password" : "Cyfrinair newydd", + "Reset password" : "Ailosod cyfrinair" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/core/l10n/cy_GB.json b/core/l10n/cy_GB.json index e4a46ace1be..9833495aa79 100644 --- a/core/l10n/cy_GB.json +++ b/core/l10n/cy_GB.json @@ -71,13 +71,10 @@ "access control" : "rheolaeth mynediad", "Share" : "Rhannu", "Warning" : "Rhybudd", - "The object type is not specified." : "Nid yw'r math o wrthrych wedi cael ei nodi.", "Delete" : "Dileu", + "The object type is not specified." : "Nid yw'r math o wrthrych wedi cael ei nodi.", "Add" : "Ychwanegu", "The update was successful. Redirecting you to ownCloud now." : "Roedd y diweddariad yn llwyddiannus. Cewch eich ailgyfeirio i ownCloud nawr.", - "Use the following link to reset your password: {link}" : "Defnyddiwch y ddolen hon i ailosod eich cyfrinair: {link}", - "New password" : "Cyfrinair newydd", - "Reset password" : "Ailosod cyfrinair", "Personal" : "Personol", "Users" : "Defnyddwyr", "Apps" : "Pecynnau", @@ -98,6 +95,9 @@ "Log out" : "Allgofnodi", "Search" : "Chwilio", "Log in" : "Mewngofnodi", - "Alternative Logins" : "Mewngofnodiadau Amgen" + "Alternative Logins" : "Mewngofnodiadau Amgen", + "Use the following link to reset your password: {link}" : "Defnyddiwch y ddolen hon i ailosod eich cyfrinair: {link}", + "New password" : "Cyfrinair newydd", + "Reset password" : "Ailosod cyfrinair" },"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/core/l10n/da.js b/core/l10n/da.js index 0049723161e..ef1dd9146ba 100644 --- a/core/l10n/da.js +++ b/core/l10n/da.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Ingen beskæringsdata give", "No valid crop data provided" : "Der er ikke angivet gyldige data om beskæring", "Crop is not square" : "Beskæringen er ikke kvadratisk", + "Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt", + "Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet", + "Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt", + "%s password reset" : "%s adgangskode nulstillet", + "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "Sunday" : "Søndag", "Monday" : "Mandag", "Tuesday" : "Tirsdag", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Indstillinger", "Saving..." : "Gemmer...", "seconds ago" : "sekunder siden", - "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?", "I know what I'm doing" : "Jeg ved, hvad jeg har gang i", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Del med brugere, grupper eller eksterne brugere...", "Warning" : "Advarsel", "Error while sending notification" : "Fejl ved afsendelse af notifikation", + "Delete" : "Slet", "The object type is not specified." : "Objekttypen er ikke angivet.", "Enter new" : "Indtast nyt", - "Delete" : "Slet", "Add" : "Tilføj", "Edit tags" : "Redigér mærker", "Error loading dialog template: {error}" : "Fejl ved indlæsning dialog skabelon: {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Opdateringen blev ikke gennemført.", "The update was successful. There were warnings." : "Opdateringen blev gennemført. Der fremkom advarsler.", "The update was successful. Redirecting you to ownCloud now." : "Opdateringen blev udført korrekt. Du bliver nu viderestillet til ownCloud.", - "Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt", - "Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet", - "Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt", - "%s password reset" : "%s adgangskode nulstillet", - "Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}", - "New password" : "Ny adgangskode", - "New Password" : "Ny adgangskode", - "Reset password" : "Nulstil kodeord", "Searching other places" : "Søger på andre steder", "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Forkert kodeord. Skal det nulstilles?", "Stay logged in" : "Forbliv logget ind", "Alternative Logins" : "Alternative logins", + "Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}", + "New password" : "Ny adgangskode", + "New Password" : "Ny adgangskode", + "Reset password" : "Nulstil kodeord", "This ownCloud instance is currently in single user mode." : "Denne ownCloud instans er lige nu i enkeltbruger tilstand.", "This means only administrators can use the instance." : "Det betyder at det kun er administrator, som kan benytte ownCloud.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren, hvis denne meddelelse fortsætter eller optrådte uventet.", diff --git a/core/l10n/da.json b/core/l10n/da.json index cabee9f2cc1..77bc93ad75b 100644 --- a/core/l10n/da.json +++ b/core/l10n/da.json @@ -28,6 +28,11 @@ "No crop data provided" : "Ingen beskæringsdata give", "No valid crop data provided" : "Der er ikke angivet gyldige data om beskæring", "Crop is not square" : "Beskæringen er ikke kvadratisk", + "Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt", + "Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet", + "Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt", + "%s password reset" : "%s adgangskode nulstillet", + "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "Sunday" : "Søndag", "Monday" : "Mandag", "Tuesday" : "Tirsdag", @@ -76,7 +81,6 @@ "Settings" : "Indstillinger", "Saving..." : "Gemmer...", "seconds ago" : "sekunder siden", - "Couldn't send reset email. Please contact your administrator." : "Der opstod et problem under afsending af e-mailen til nulstilling. Kontakt venligst systemadministratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linket til at nulstille dit kodeord er blevet sendt til din e-post: hvis du ikke modtager den inden for en rimelig tid, så tjek dine spam/junk-mapper.<br> Hvis det ikke er der, så spørg din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dine filer er krypterede. Hvis du ikke har aktiveret gendannelsesnøglen kan du ikke få dine data tilbage efter at du har ændret adgangskode.<br />Hvis du ikke er sikker på, hvad du skal gøre så kontakt din administrator før du fortsætter.<br />Vil du fortsætte?", "I know what I'm doing" : "Jeg ved, hvad jeg har gang i", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "Del med brugere, grupper eller eksterne brugere...", "Warning" : "Advarsel", "Error while sending notification" : "Fejl ved afsendelse af notifikation", + "Delete" : "Slet", "The object type is not specified." : "Objekttypen er ikke angivet.", "Enter new" : "Indtast nyt", - "Delete" : "Slet", "Add" : "Tilføj", "Edit tags" : "Redigér mærker", "Error loading dialog template: {error}" : "Fejl ved indlæsning dialog skabelon: {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "Opdateringen blev ikke gennemført.", "The update was successful. There were warnings." : "Opdateringen blev gennemført. Der fremkom advarsler.", "The update was successful. Redirecting you to ownCloud now." : "Opdateringen blev udført korrekt. Du bliver nu viderestillet til ownCloud.", - "Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt", - "Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet", - "Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt", - "%s password reset" : "%s adgangskode nulstillet", - "Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}", - "New password" : "Ny adgangskode", - "New Password" : "Ny adgangskode", - "Reset password" : "Nulstil kodeord", "Searching other places" : "Søger på andre steder", "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søgeresultat fundet i andre mapper","{count} søgeresultater fundet i andre mapper"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "Forkert kodeord. Skal det nulstilles?", "Stay logged in" : "Forbliv logget ind", "Alternative Logins" : "Alternative logins", + "Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}", + "New password" : "Ny adgangskode", + "New Password" : "Ny adgangskode", + "Reset password" : "Nulstil kodeord", "This ownCloud instance is currently in single user mode." : "Denne ownCloud instans er lige nu i enkeltbruger tilstand.", "This means only administrators can use the instance." : "Det betyder at det kun er administrator, som kan benytte ownCloud.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren, hvis denne meddelelse fortsætter eller optrådte uventet.", diff --git a/core/l10n/de.js b/core/l10n/de.js index 6512cf50bd0..41858986ace 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -33,6 +33,12 @@ OC.L10N.register( "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", + "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", + "%s password reset" : "%s-Passwort zurücksetzen", + "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -81,7 +87,6 @@ OC.L10N.register( "Settings" : "Einstellungen", "Saving..." : "Speichern…", "seconds ago" : "Gerade eben", - "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?", "I know what I'm doing" : "Ich weiß, was ich mache", @@ -158,9 +163,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", + "Delete" : "Löschen", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", - "Delete" : "Löschen", "Add" : "Hinzufügen", "Edit tags" : "Schlagwörter bearbeiten", "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}", @@ -179,15 +184,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.", - "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", - "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", - "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", - "New password" : "Neues Passwort", - "New Password" : "Neues Passwort", - "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"], @@ -260,6 +256,10 @@ OC.L10N.register( "Wrong password." : "Falsches Passwort.", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", + "New password" : "Neues Passwort", + "New Password" : "Neues Passwort", + "Reset password" : "Passwort zurücksetzen", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", "This means only administrators can use the instance." : "Dies bedeutet, dass diese Instanz nur von Administratoren genutzt werden kann.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktiere Deinen Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.", diff --git a/core/l10n/de.json b/core/l10n/de.json index 526a74468b8..ac24a30b825 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -31,6 +31,12 @@ "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", + "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", + "%s password reset" : "%s-Passwort zurücksetzen", + "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -79,7 +85,6 @@ "Settings" : "Einstellungen", "Saving..." : "Speichern…", "seconds ago" : "Gerade eben", - "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?", "I know what I'm doing" : "Ich weiß, was ich mache", @@ -156,9 +161,9 @@ "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", + "Delete" : "Löschen", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", - "Delete" : "Löschen", "Add" : "Hinzufügen", "Edit tags" : "Schlagwörter bearbeiten", "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}", @@ -177,15 +182,6 @@ "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.", - "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", - "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", - "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", - "New password" : "Neues Passwort", - "New Password" : "Neues Passwort", - "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"], @@ -258,6 +254,10 @@ "Wrong password." : "Falsches Passwort.", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}", + "New password" : "Neues Passwort", + "New Password" : "Neues Passwort", + "Reset password" : "Passwort zurücksetzen", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", "This means only administrators can use the instance." : "Dies bedeutet, dass diese Instanz nur von Administratoren genutzt werden kann.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktiere Deinen Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 48bdb8e7565..1d2c7a980ee 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -33,6 +33,11 @@ OC.L10N.register( "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", + "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", + "%s password reset" : "%s-Passwort zurücksetzen", + "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -81,7 +86,6 @@ OC.L10N.register( "Settings" : "Einstellungen", "Saving..." : "Speichervorgang…", "seconds ago" : "Gerade eben", - "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn er sich nicht darin befindet, fragen Sie bitte bei Ihrem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?", "I know what I'm doing" : "Ich weiß, was ich mache", @@ -158,9 +162,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", + "Delete" : "Löschen", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", - "Delete" : "Löschen", "Add" : "Hinzufügen", "Edit tags" : "Schlagwörter bearbeiten", "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}", @@ -178,14 +182,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", - "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", - "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", - "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}", - "New password" : "Neues Passwort", - "New Password" : "Neues Passwort", - "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis in anderen Ordnern","{count} Suchergebnisse in anderen Ordnern"], @@ -257,6 +253,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}", + "New password" : "Neues Passwort", + "New Password" : "Neues Passwort", + "Reset password" : "Passwort zurücksetzen", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", "This means only administrators can use the instance." : "Das bedeutet, dass diese Instanz nur von Administratoren benutzt werden kann.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktieren Sie Ihren Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index e357c630c2b..968900656e6 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -31,6 +31,11 @@ "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt", "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", + "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", + "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", + "%s password reset" : "%s-Passwort zurücksetzen", + "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -79,7 +84,6 @@ "Settings" : "Einstellungen", "Saving..." : "Speichervorgang…", "seconds ago" : "Gerade eben", - "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktieren Sie Ihren Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Ihres Passworts ist an Ihre E-Mail-Adresse versandt worden. Sollten Sie ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfen Sie bitte Ihren Spam-Ordner.<br>Wenn er sich nicht darin befindet, fragen Sie bitte bei Ihrem lokalen Administrator nach.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wieder zu erhalten, nachdem Ihr Passwort zurückgesetzt wurde.<br />Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren.<br />Wollen Sie wirklich fortfahren?", "I know what I'm doing" : "Ich weiß, was ich mache", @@ -156,9 +160,9 @@ "Share with users, groups or remote users …" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…", "Warning" : "Warnung", "Error while sending notification" : "Fehler beim Senden der Benachrichtigung", + "Delete" : "Löschen", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", - "Delete" : "Löschen", "Add" : "Hinzufügen", "Edit tags" : "Schlagwörter bearbeiten", "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}", @@ -176,14 +180,6 @@ "The update was unsuccessful. " : "Die Aktualisierung war nicht erfolgreich.", "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.", "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", - "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden", - "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist", - "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}", - "New password" : "Neues Passwort", - "New Password" : "Neues Passwort", - "Reset password" : "Passwort zurücksetzen", "Searching other places" : "Andere Orte durchsuchen", "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis in anderen Ordnern","{count} Suchergebnisse in anderen Ordnern"], @@ -255,6 +251,10 @@ "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "Stay logged in" : "Angemeldet bleiben", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}", + "New password" : "Neues Passwort", + "New Password" : "Neues Passwort", + "Reset password" : "Passwort zurücksetzen", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", "This means only administrators can use the instance." : "Das bedeutet, dass diese Instanz nur von Administratoren benutzt werden kann.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktieren Sie Ihren Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.", diff --git a/core/l10n/el.js b/core/l10n/el.js index 07877d1c44a..e6ccd9d5a0d 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", "Crop is not square" : "Η περικοπή δεν εχει τετραγωνικό σχήμα", + "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο", + "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει", + "Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.", + "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", + "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "Sunday" : "Κυριακή", "Monday" : "Δευτέρα", "Tuesday" : "Τρίτη", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Ρυθμίσεις", "Saving..." : "Γίνεται αποθήκευση...", "seconds ago" : "δευτερόλεπτα πριν", - "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <br>Εάν δεν βρίσκεται εκεί ρωτήστε τον τοπικό διαχειριστή σας.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Τα αρχεία σας είναι κρυπτογραφημένα. Εάν δεν έχετε ενεργοποιήσει το κλειδί επαναφοράς, δεν θα υπάρχει τρόπος να ανακτήσετε τα δεδομένα σας μετά την επαναφορά του κωδικού πρόσβασής σας.<br />Εάν δεν είστε σίγουροι για το τι θα θέλατε να κάνετε, παρακαλώ επικοινωνήστε με το διαχειριστή σας πριν συνεχίσετε. <br />Θέλετε στ' αλήθεια να συνεχίσετε;", "I know what I'm doing" : "Γνωρίζω τι κάνω", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...", "Warning" : "Προειδοποίηση", "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", + "Delete" : "Διαγραφή", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", "Enter new" : "Εισαγωγή νέου", - "Delete" : "Διαγραφή", "Add" : "Προσθήκη", "Edit tags" : "Επεξεργασία ετικετών", "Error loading dialog template: {error}" : "Σφάλμα φόρτωσης προτύπου διαλόγων: {σφάλμα}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Η ενημέρωση ήταν ανεπιτυχής.", "The update was successful. There were warnings." : "Η ενημέρωση ήταν επιτυχής. Υπήρχαν προειδοποιήσεις.", "The update was successful. Redirecting you to ownCloud now." : "Η ενημέρωση ήταν επιτυχής. Μετάβαση στο ownCloud.", - "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο", - "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει", - "Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.", - "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", - "Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}", - "New password" : "Νέο συνθηματικό", - "New Password" : "Νέος Κωδικός", - "Reset password" : "Επαναφορά συνθηματικού", "Searching other places" : "Έρευνα σε άλλα σημεία.", "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Λάθος Κωδικός. Επαναφορά;", "Stay logged in" : "Μείνετε συνδεδεμένος", "Alternative Logins" : "Εναλλακτικές Συνδέσεις", + "Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}", + "New password" : "Νέο συνθηματικό", + "New Password" : "Νέος Κωδικός", + "Reset password" : "Επαναφορά συνθηματικού", "This ownCloud instance is currently in single user mode." : "Αυτή η εγκατάσταση ownCloud είναι τώρα σε κατάσταση ενός χρήστη.", "This means only administrators can use the instance." : "Αυτό σημαίνει ότι μόνο διαχειριστές μπορούν να χρησιμοποιήσουν την εγκατάσταση.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Επικοινωνήστε με το διαχειριστή του συστήματος αν αυτό το μήνυμα συνεχίζει να εμφανίζεται ή εμφανίστηκε απρόσμενα.", diff --git a/core/l10n/el.json b/core/l10n/el.json index a61b7040233..bbc242e8e7e 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -28,6 +28,11 @@ "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", "Crop is not square" : "Η περικοπή δεν εχει τετραγωνικό σχήμα", + "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο", + "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει", + "Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.", + "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", + "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "Sunday" : "Κυριακή", "Monday" : "Δευτέρα", "Tuesday" : "Τρίτη", @@ -76,7 +81,6 @@ "Settings" : "Ρυθμίσεις", "Saving..." : "Γίνεται αποθήκευση...", "seconds ago" : "δευτερόλεπτα πριν", - "Couldn't send reset email. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ο σύνδεσμος για την επαναφορά του κωδικού πρόσβασής σας απεστάλη στο ηλ. ταχυδρομείο σας. Εάν δεν το παραλάβετε μέσα σε ένα εύλογο χρονικό διάστημα, ελέγξτε το φάκελο ανεπιθύμητων μηνυμάτων σας. <br>Εάν δεν βρίσκεται εκεί ρωτήστε τον τοπικό διαχειριστή σας.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Τα αρχεία σας είναι κρυπτογραφημένα. Εάν δεν έχετε ενεργοποιήσει το κλειδί επαναφοράς, δεν θα υπάρχει τρόπος να ανακτήσετε τα δεδομένα σας μετά την επαναφορά του κωδικού πρόσβασής σας.<br />Εάν δεν είστε σίγουροι για το τι θα θέλατε να κάνετε, παρακαλώ επικοινωνήστε με το διαχειριστή σας πριν συνεχίσετε. <br />Θέλετε στ' αλήθεια να συνεχίσετε;", "I know what I'm doing" : "Γνωρίζω τι κάνω", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "Διαμοιρασμός με χρήστες, ομάδες ή απομακρυσμένους χρήστες ...", "Warning" : "Προειδοποίηση", "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", + "Delete" : "Διαγραφή", "The object type is not specified." : "Δεν καθορίστηκε ο τύπος του αντικειμένου.", "Enter new" : "Εισαγωγή νέου", - "Delete" : "Διαγραφή", "Add" : "Προσθήκη", "Edit tags" : "Επεξεργασία ετικετών", "Error loading dialog template: {error}" : "Σφάλμα φόρτωσης προτύπου διαλόγων: {σφάλμα}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "Η ενημέρωση ήταν ανεπιτυχής.", "The update was successful. There were warnings." : "Η ενημέρωση ήταν επιτυχής. Υπήρχαν προειδοποιήσεις.", "The update was successful. Redirecting you to ownCloud now." : "Η ενημέρωση ήταν επιτυχής. Μετάβαση στο ownCloud.", - "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο", - "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει", - "Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.", - "%s password reset" : "%s επαναφορά κωδικού πρόσβασης", - "Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}", - "New password" : "Νέο συνθηματικό", - "New Password" : "Νέος Κωδικός", - "Reset password" : "Επαναφορά συνθηματικού", "Searching other places" : "Έρευνα σε άλλα σημεία.", "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} αποτέλεσμα αναζήτησης σε άλλο φάκελο","{count} αποτελέσματα αναζήτησης σε άλλους φακέλους"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "Λάθος Κωδικός. Επαναφορά;", "Stay logged in" : "Μείνετε συνδεδεμένος", "Alternative Logins" : "Εναλλακτικές Συνδέσεις", + "Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}", + "New password" : "Νέο συνθηματικό", + "New Password" : "Νέος Κωδικός", + "Reset password" : "Επαναφορά συνθηματικού", "This ownCloud instance is currently in single user mode." : "Αυτή η εγκατάσταση ownCloud είναι τώρα σε κατάσταση ενός χρήστη.", "This means only administrators can use the instance." : "Αυτό σημαίνει ότι μόνο διαχειριστές μπορούν να χρησιμοποιήσουν την εγκατάσταση.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Επικοινωνήστε με το διαχειριστή του συστήματος αν αυτό το μήνυμα συνεχίζει να εμφανίζεται ή εμφανίστηκε απρόσμενα.", diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js index 82e17dc59a1..da9b86b8bf3 100644 --- a/core/l10n/en_GB.js +++ b/core/l10n/en_GB.js @@ -18,6 +18,10 @@ OC.L10N.register( "No crop data provided" : "No crop data provided", "No valid crop data provided" : "No valid crop data provided", "Crop is not square" : "Crop is not square", + "Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid", + "Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.", + "%s password reset" : "%s password reset", + "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "Sunday" : "Sunday", "Monday" : "Monday", "Tuesday" : "Tuesday", @@ -59,7 +63,6 @@ OC.L10N.register( "Settings" : "Settings", "Saving..." : "Saving...", "seconds ago" : "seconds ago", - "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?", "I know what I'm doing" : "I know what I'm doing", @@ -133,9 +136,9 @@ OC.L10N.register( "Share with users or groups …" : "Share with users or groups …", "Share with users, groups or remote users …" : "Share with users, groups or remote users …", "Warning" : "Warning", + "Delete" : "Delete", "The object type is not specified." : "The object type is not specified.", "Enter new" : "Enter new", - "Delete" : "Delete", "Add" : "Add", "Edit tags" : "Edit tags", "Error loading dialog template: {error}" : "Error loading dialog template: {error}", @@ -151,13 +154,6 @@ OC.L10N.register( "Please reload the page." : "Please reload the page.", "The update was unsuccessful. " : "The update was unsuccessful. ", "The update was successful. Redirecting you to ownCloud now." : "The update was successful. Redirecting you to ownCloud now.", - "Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid", - "Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.", - "%s password reset" : "%s password reset", - "Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}", - "New password" : "New password", - "New Password" : "New Password", - "Reset password" : "Reset password", "Searching other places" : "Searching other places", "Personal" : "Personal", "Users" : "Users", @@ -225,6 +221,10 @@ OC.L10N.register( "Please try again or contact your administrator." : "Please try again or contact your administrator.", "Log in" : "Log in", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}", + "New password" : "New password", + "New Password" : "New Password", + "Reset password" : "Reset password", "This ownCloud instance is currently in single user mode." : "This ownCloud instance is currently in single user mode.", "This means only administrators can use the instance." : "This means only administrators can use the instance.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contact your system administrator if this message persists or appeared unexpectedly.", diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json index a9129acaa83..3d1f2406097 100644 --- a/core/l10n/en_GB.json +++ b/core/l10n/en_GB.json @@ -16,6 +16,10 @@ "No crop data provided" : "No crop data provided", "No valid crop data provided" : "No valid crop data provided", "Crop is not square" : "Crop is not square", + "Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid", + "Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.", + "%s password reset" : "%s password reset", + "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "Sunday" : "Sunday", "Monday" : "Monday", "Tuesday" : "Tuesday", @@ -57,7 +61,6 @@ "Settings" : "Settings", "Saving..." : "Saving...", "seconds ago" : "seconds ago", - "Couldn't send reset email. Please contact your administrator." : "Couldn't send reset email. Please contact your administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?", "I know what I'm doing" : "I know what I'm doing", @@ -131,9 +134,9 @@ "Share with users or groups …" : "Share with users or groups …", "Share with users, groups or remote users …" : "Share with users, groups or remote users …", "Warning" : "Warning", + "Delete" : "Delete", "The object type is not specified." : "The object type is not specified.", "Enter new" : "Enter new", - "Delete" : "Delete", "Add" : "Add", "Edit tags" : "Edit tags", "Error loading dialog template: {error}" : "Error loading dialog template: {error}", @@ -149,13 +152,6 @@ "Please reload the page." : "Please reload the page.", "The update was unsuccessful. " : "The update was unsuccessful. ", "The update was successful. Redirecting you to ownCloud now." : "The update was successful. Redirecting you to ownCloud now.", - "Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid", - "Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.", - "%s password reset" : "%s password reset", - "Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}", - "New password" : "New password", - "New Password" : "New Password", - "Reset password" : "Reset password", "Searching other places" : "Searching other places", "Personal" : "Personal", "Users" : "Users", @@ -223,6 +219,10 @@ "Please try again or contact your administrator." : "Please try again or contact your administrator.", "Log in" : "Log in", "Alternative Logins" : "Alternative Logins", + "Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}", + "New password" : "New password", + "New Password" : "New Password", + "Reset password" : "Reset password", "This ownCloud instance is currently in single user mode." : "This ownCloud instance is currently in single user mode.", "This means only administrators can use the instance." : "This means only administrators can use the instance.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contact your system administrator if this message persists or appeared unexpectedly.", diff --git a/core/l10n/eo.js b/core/l10n/eo.js index 87d049b88e4..4032f1cfaba 100644 --- a/core/l10n/eo.js +++ b/core/l10n/eo.js @@ -92,17 +92,14 @@ OC.L10N.register( "access control" : "alirkontrolo", "Share" : "Kunhavigi", "Warning" : "Averto", + "Delete" : "Forigi", "The object type is not specified." : "Ne indikiĝis tipo de la objekto.", "Enter new" : "Enigu novan", - "Delete" : "Forigi", "Add" : "Aldoni", "Edit tags" : "Redakti etikedojn", "No tags selected for deletion." : "Neniu etikedo elektitas por forigo.", "Please reload the page." : "Bonvolu reŝargi la paĝon.", "The update was successful. Redirecting you to ownCloud now." : "La ĝisdatigo estis sukcesa. Alidirektante nun al ownCloud.", - "Use the following link to reset your password: {link}" : "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", - "New password" : "Nova pasvorto", - "Reset password" : "Rekomenci la pasvorton", "Personal" : "Persona", "Users" : "Uzantoj", "Apps" : "Aplikaĵoj", @@ -130,6 +127,9 @@ OC.L10N.register( "Please contact your administrator." : "Bonvolu kontakti vian administranton.", "Log in" : "Ensaluti", "Alternative Logins" : "Alternativaj ensalutoj", + "Use the following link to reset your password: {link}" : "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", + "New password" : "Nova pasvorto", + "Reset password" : "Rekomenci la pasvorton", "Thank you for your patience." : "Dankon pro via pacienco." }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/eo.json b/core/l10n/eo.json index cc5b680d580..c7aab5d9532 100644 --- a/core/l10n/eo.json +++ b/core/l10n/eo.json @@ -90,17 +90,14 @@ "access control" : "alirkontrolo", "Share" : "Kunhavigi", "Warning" : "Averto", + "Delete" : "Forigi", "The object type is not specified." : "Ne indikiĝis tipo de la objekto.", "Enter new" : "Enigu novan", - "Delete" : "Forigi", "Add" : "Aldoni", "Edit tags" : "Redakti etikedojn", "No tags selected for deletion." : "Neniu etikedo elektitas por forigo.", "Please reload the page." : "Bonvolu reŝargi la paĝon.", "The update was successful. Redirecting you to ownCloud now." : "La ĝisdatigo estis sukcesa. Alidirektante nun al ownCloud.", - "Use the following link to reset your password: {link}" : "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", - "New password" : "Nova pasvorto", - "Reset password" : "Rekomenci la pasvorton", "Personal" : "Persona", "Users" : "Uzantoj", "Apps" : "Aplikaĵoj", @@ -128,6 +125,9 @@ "Please contact your administrator." : "Bonvolu kontakti vian administranton.", "Log in" : "Ensaluti", "Alternative Logins" : "Alternativaj ensalutoj", + "Use the following link to reset your password: {link}" : "Uzu la jenan ligilon por restarigi vian pasvorton: {link}", + "New password" : "Nova pasvorto", + "Reset password" : "Rekomenci la pasvorton", "Thank you for your patience." : "Dankon pro via pacienco." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/es.js b/core/l10n/es.js index c3dc85bca9b..886be37f569 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "No se proporcionó datos del recorte", "No valid crop data provided" : "Recorte inválido", "Crop is not square" : "El recorte no es cuadrado", + "Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.", + "Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.", + "Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico de restablecimiento porque no hay una dirección de correo electrónico para este nombre de usuario. Póngase en contacto con un administrador.", + "%s password reset" : "%s restablecer contraseña", + "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Ajustes", "Saving..." : "Guardando...", "seconds ago" : "hace segundos", - "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?", "I know what I'm doing" : "Sé lo que estoy haciendo", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Warning" : "Precaución", "Error while sending notification" : "Error mientras se enviaba la notificación", + "Delete" : "Eliminar", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", - "Delete" : "Eliminar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error al cargar plantilla de diálogo: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "La actualización ha fallado.", "The update was successful. There were warnings." : "La actualización fue exitosa. Había advertencias.", "The update was successful. Redirecting you to ownCloud now." : "La actualización se ha realizado con éxito. Redireccionando a ownCloud ahora.", - "Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.", - "Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.", - "Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico de restablecimiento porque no hay una dirección de correo electrónico para este nombre de usuario. Póngase en contacto con un administrador.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", - "New password" : "Nueva contraseña", - "New Password" : "Contraseña nueva", - "Reset password" : "Restablecer contraseña", "Searching other places" : "Buscando en otros lugares", "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de búsqueda en otra carpeta","{count} resultados de búsqueda en otras carpetas"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Contraseña incorrecta.", "Stay logged in" : "Permanecer autenticado", "Alternative Logins" : "Inicios de sesión alternativos", + "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", + "New password" : "Nueva contraseña", + "New Password" : "Contraseña nueva", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", diff --git a/core/l10n/es.json b/core/l10n/es.json index ea75547aa64..400f2d7edcb 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -33,6 +33,12 @@ "No crop data provided" : "No se proporcionó datos del recorte", "No valid crop data provided" : "Recorte inválido", "Crop is not square" : "El recorte no es cuadrado", + "Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.", + "Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.", + "Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico de restablecimiento porque no hay una dirección de correo electrónico para este nombre de usuario. Póngase en contacto con un administrador.", + "%s password reset" : "%s restablecer contraseña", + "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -82,7 +88,6 @@ "Settings" : "Ajustes", "Saving..." : "Guardando...", "seconds ago" : "hace segundos", - "Couldn't send reset email. Please contact your administrator." : "No pudo enviarse el correo para restablecer la contraseña. Por favor, contacte con su administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Se ha enviado un enlace para restablecer su contraseña a su correo electrónico. Si usted no lo recibe en un tiempo razonable, revise su carpeta de spam/chatarra/basura.<br>Si no lo encuentra, consulte a su administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sus archivos están cifrados. Si no ha activado la clave de recuperación, no habrá manera de recuperar los datos una vez su contraseña sea restablecida.<br /> Si no está seguro de lo que debe hacer, por favor contacte con su administrador antes de continuar.<br />¿Realmente desea continuar?", "I know what I'm doing" : "Sé lo que estoy haciendo", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Warning" : "Precaución", "Error while sending notification" : "Error mientras se enviaba la notificación", + "Delete" : "Eliminar", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", - "Delete" : "Eliminar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error al cargar plantilla de diálogo: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "La actualización ha fallado.", "The update was successful. There were warnings." : "La actualización fue exitosa. Había advertencias.", "The update was successful. Redirecting you to ownCloud now." : "La actualización se ha realizado con éxito. Redireccionando a ownCloud ahora.", - "Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.", - "Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.", - "Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico de restablecimiento porque no hay una dirección de correo electrónico para este nombre de usuario. Póngase en contacto con un administrador.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", - "New password" : "Nueva contraseña", - "New Password" : "Contraseña nueva", - "Reset password" : "Restablecer contraseña", "Searching other places" : "Buscando en otros lugares", "No search results in other folders" : "Ningún resultado de búsqueda en otras carpetas", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de búsqueda en otra carpeta","{count} resultados de búsqueda en otras carpetas"], @@ -269,6 +265,10 @@ "Wrong password." : "Contraseña incorrecta.", "Stay logged in" : "Permanecer autenticado", "Alternative Logins" : "Inicios de sesión alternativos", + "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", + "New password" : "Nueva contraseña", + "New Password" : "Contraseña nueva", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", diff --git a/core/l10n/es_AR.js b/core/l10n/es_AR.js index e1fd168fbb8..5bdcce8fdc2 100644 --- a/core/l10n/es_AR.js +++ b/core/l10n/es_AR.js @@ -10,6 +10,7 @@ OC.L10N.register( "Invalid image" : "Imagen inválida", "No temporary profile picture available, try again" : "No hay una imágen temporal del perfil disponible, intente de nuevo", "No crop data provided" : "No se proveyeron datos de recorte", + "%s password reset" : "%s restablecer contraseña", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -102,19 +103,15 @@ OC.L10N.register( "access control" : "control de acceso", "Share" : "Compartir", "Warning" : "Atención", + "Delete" : "Borrar", "The object type is not specified." : "El tipo de objeto no está especificado. ", "Enter new" : "Entrar nuevo", - "Delete" : "Borrar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error cargando la plantilla de dialogo: {error}", "No tags selected for deletion." : "No se han seleccionado etiquetas para eliminar.", "Please reload the page." : "Por favor, recargue la página.", "The update was successful. Redirecting you to ownCloud now." : "La actualización fue exitosa. Estás siendo redirigido a ownCloud.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Usá este enlace para restablecer tu contraseña: {link}", - "New password" : "Nueva contraseña:", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Apps", @@ -150,6 +147,9 @@ OC.L10N.register( "Please contact your administrator." : "Por favor, contacte a su administrador.", "Log in" : "Iniciar sesión", "Alternative Logins" : "Nombre alternativos de usuarios", + "Use the following link to reset your password: {link}" : "Usá este enlace para restablecer tu contraseña: {link}", + "New password" : "Nueva contraseña:", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instancia de ownCloud está en modo de usuario único.", "This means only administrators can use the instance." : "Esto significa que solo administradores pueden usar esta instancia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte su administrador de sistema si este mensaje persiste o aparece inesperadamente.", diff --git a/core/l10n/es_AR.json b/core/l10n/es_AR.json index 9f70252b189..59bc79e58d8 100644 --- a/core/l10n/es_AR.json +++ b/core/l10n/es_AR.json @@ -8,6 +8,7 @@ "Invalid image" : "Imagen inválida", "No temporary profile picture available, try again" : "No hay una imágen temporal del perfil disponible, intente de nuevo", "No crop data provided" : "No se proveyeron datos de recorte", + "%s password reset" : "%s restablecer contraseña", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -100,19 +101,15 @@ "access control" : "control de acceso", "Share" : "Compartir", "Warning" : "Atención", + "Delete" : "Borrar", "The object type is not specified." : "El tipo de objeto no está especificado. ", "Enter new" : "Entrar nuevo", - "Delete" : "Borrar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error cargando la plantilla de dialogo: {error}", "No tags selected for deletion." : "No se han seleccionado etiquetas para eliminar.", "Please reload the page." : "Por favor, recargue la página.", "The update was successful. Redirecting you to ownCloud now." : "La actualización fue exitosa. Estás siendo redirigido a ownCloud.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Usá este enlace para restablecer tu contraseña: {link}", - "New password" : "Nueva contraseña:", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Apps", @@ -148,6 +145,9 @@ "Please contact your administrator." : "Por favor, contacte a su administrador.", "Log in" : "Iniciar sesión", "Alternative Logins" : "Nombre alternativos de usuarios", + "Use the following link to reset your password: {link}" : "Usá este enlace para restablecer tu contraseña: {link}", + "New password" : "Nueva contraseña:", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instancia de ownCloud está en modo de usuario único.", "This means only administrators can use the instance." : "Esto significa que solo administradores pueden usar esta instancia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte su administrador de sistema si este mensaje persiste o aparece inesperadamente.", diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js index 2d56f7428fe..54ac586e59b 100644 --- a/core/l10n/es_MX.js +++ b/core/l10n/es_MX.js @@ -10,6 +10,7 @@ OC.L10N.register( "Invalid image" : "Imagen inválida", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", "No crop data provided" : "No se proporcionó datos del recorte", + "%s password reset" : "%s restablecer contraseña", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -96,19 +97,15 @@ OC.L10N.register( "access control" : "control de acceso", "Share" : "Compartir", "Warning" : "Precaución", + "Delete" : "Eliminar", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", - "Delete" : "Eliminar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error cargando plantilla de diálogo: {error}", "No tags selected for deletion." : "No hay etiquetas seleccionadas para borrar.", "Please reload the page." : "Vuelva a cargar la página.", "The update was successful. Redirecting you to ownCloud now." : "La actualización se ha realizado con éxito. Redireccionando a ownCloud ahora.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", - "New password" : "Nueva contraseña", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", @@ -144,6 +141,9 @@ OC.L10N.register( "Please contact your administrator." : "Por favor, contacte con el administrador.", "Log in" : "Entrar", "Alternative Logins" : "Accesos Alternativos", + "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", + "New password" : "Nueva contraseña", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json index 94cd0efbe8a..75cea80b69b 100644 --- a/core/l10n/es_MX.json +++ b/core/l10n/es_MX.json @@ -8,6 +8,7 @@ "Invalid image" : "Imagen inválida", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", "No crop data provided" : "No se proporcionó datos del recorte", + "%s password reset" : "%s restablecer contraseña", "Sunday" : "Domingo", "Monday" : "Lunes", "Tuesday" : "Martes", @@ -94,19 +95,15 @@ "access control" : "control de acceso", "Share" : "Compartir", "Warning" : "Precaución", + "Delete" : "Eliminar", "The object type is not specified." : "El tipo de objeto no está especificado.", "Enter new" : "Ingresar nueva", - "Delete" : "Eliminar", "Add" : "Agregar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Error cargando plantilla de diálogo: {error}", "No tags selected for deletion." : "No hay etiquetas seleccionadas para borrar.", "Please reload the page." : "Vuelva a cargar la página.", "The update was successful. Redirecting you to ownCloud now." : "La actualización se ha realizado con éxito. Redireccionando a ownCloud ahora.", - "%s password reset" : "%s restablecer contraseña", - "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", - "New password" : "Nueva contraseña", - "Reset password" : "Restablecer contraseña", "Personal" : "Personal", "Users" : "Usuarios", "Apps" : "Aplicaciones", @@ -142,6 +139,9 @@ "Please contact your administrator." : "Por favor, contacte con el administrador.", "Log in" : "Entrar", "Alternative Logins" : "Accesos Alternativos", + "Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}", + "New password" : "Nueva contraseña", + "Reset password" : "Restablecer contraseña", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte con su administrador de sistemas si este mensaje persiste o aparece de forma inesperada.", diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js index b3dc78ba16d..f3d58a1a12c 100644 --- a/core/l10n/et_EE.js +++ b/core/l10n/et_EE.js @@ -25,6 +25,10 @@ OC.L10N.register( "No temporary profile picture available, try again" : "Ühtegi ajutist profiili pilti pole saadaval, proovi uuesti", "No crop data provided" : "Lõikeandmeid ei leitud", "Crop is not square" : "Lõikamine pole ruudukujuline", + "Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane", + "Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.", + "%s password reset" : "%s parooli lähtestus", + "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "Sunday" : "Pühapäev", "Monday" : "Esmaspäev", "Tuesday" : "Teisipäev", @@ -73,7 +77,6 @@ OC.L10N.register( "Settings" : "Seaded", "Saving..." : "Salvestamine...", "seconds ago" : "sekundit tagasi", - "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link parooli vahetuseks on saadetud Sinu e-posti aadressil.<br>Kui kiri pole saabunud mõistliku aja jooksul, siis kontrolli oma spam-/rämpskirjade katalooge<br>.Kui kirja pole ka seal, siis küsi abi süsteemihaldurilt.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sinu failid on krüpteeritud. Kui sa pole taastamise võtit veel määranud, siis pole präast parooli taastamist mingit võimalust sinu andmeid tagasi saada. <br />Kui sa pole kindel, mida teha, siis palun väta enne jätkamist ühendust oma administaatoriga. <br />Oled sa kindel, et sa soovid jätkata?", "I know what I'm doing" : "Ma tean mida teen", @@ -143,9 +146,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Jaga kasutajate, gruppide või eemal olevate kasutajatega ...", "Warning" : "Hoiatus", "Error while sending notification" : "Tõrge teavituse saatmisel", + "Delete" : "Kustuta", "The object type is not specified." : "Objekti tüüp pole määratletud.", "Enter new" : "Sisesta uus", - "Delete" : "Kustuta", "Add" : "Lisa", "Edit tags" : "Muuda silte", "Error loading dialog template: {error}" : "Viga dialoogi malli laadimisel: {error}", @@ -161,13 +164,6 @@ OC.L10N.register( "Please reload the page." : "Palun laadi see uuesti.", "The update was unsuccessful. " : "Uuendamine ebaõnnestus.", "The update was successful. Redirecting you to ownCloud now." : "Uuendus oli edukas. Kohe suunatakse Sind ownCloudi.", - "Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane", - "Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.", - "%s password reset" : "%s parooli lähtestus", - "Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}", - "New password" : "Uus parool", - "New Password" : "Uus parool", - "Reset password" : "Nulli parool", "Searching other places" : "Otsi teistest kohtadest", "Personal" : "Isiklik", "Users" : "Kasutajad", @@ -235,6 +231,10 @@ OC.L10N.register( "Wrong password." : "Vale parool.", "Stay logged in" : "Püsi sisselogituna", "Alternative Logins" : "Alternatiivsed sisselogimisviisid", + "Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}", + "New password" : "Uus parool", + "New Password" : "Uus parool", + "Reset password" : "Nulli parool", "This ownCloud instance is currently in single user mode." : "See ownCloud on momendil seadistatud ühe kasutaja jaoks.", "This means only administrators can use the instance." : "See tähendab, et seda saavad kasutada ainult administraatorid.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakteeru oma süsteemihalduriga, kui see teade püsib või on tekkinud ootamatult.", diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json index 1c1ed60244b..5bf8fedbacf 100644 --- a/core/l10n/et_EE.json +++ b/core/l10n/et_EE.json @@ -23,6 +23,10 @@ "No temporary profile picture available, try again" : "Ühtegi ajutist profiili pilti pole saadaval, proovi uuesti", "No crop data provided" : "Lõikeandmeid ei leitud", "Crop is not square" : "Lõikamine pole ruudukujuline", + "Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane", + "Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.", + "%s password reset" : "%s parooli lähtestus", + "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "Sunday" : "Pühapäev", "Monday" : "Esmaspäev", "Tuesday" : "Teisipäev", @@ -71,7 +75,6 @@ "Settings" : "Seaded", "Saving..." : "Salvestamine...", "seconds ago" : "sekundit tagasi", - "Couldn't send reset email. Please contact your administrator." : "Ei suutnud lähtestada e-maili. Palun kontakteeru süsteemihalduriga.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link parooli vahetuseks on saadetud Sinu e-posti aadressil.<br>Kui kiri pole saabunud mõistliku aja jooksul, siis kontrolli oma spam-/rämpskirjade katalooge<br>.Kui kirja pole ka seal, siis küsi abi süsteemihaldurilt.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Sinu failid on krüpteeritud. Kui sa pole taastamise võtit veel määranud, siis pole präast parooli taastamist mingit võimalust sinu andmeid tagasi saada. <br />Kui sa pole kindel, mida teha, siis palun väta enne jätkamist ühendust oma administaatoriga. <br />Oled sa kindel, et sa soovid jätkata?", "I know what I'm doing" : "Ma tean mida teen", @@ -141,9 +144,9 @@ "Share with users, groups or remote users …" : "Jaga kasutajate, gruppide või eemal olevate kasutajatega ...", "Warning" : "Hoiatus", "Error while sending notification" : "Tõrge teavituse saatmisel", + "Delete" : "Kustuta", "The object type is not specified." : "Objekti tüüp pole määratletud.", "Enter new" : "Sisesta uus", - "Delete" : "Kustuta", "Add" : "Lisa", "Edit tags" : "Muuda silte", "Error loading dialog template: {error}" : "Viga dialoogi malli laadimisel: {error}", @@ -159,13 +162,6 @@ "Please reload the page." : "Palun laadi see uuesti.", "The update was unsuccessful. " : "Uuendamine ebaõnnestus.", "The update was successful. Redirecting you to ownCloud now." : "Uuendus oli edukas. Kohe suunatakse Sind ownCloudi.", - "Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane", - "Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.", - "%s password reset" : "%s parooli lähtestus", - "Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}", - "New password" : "Uus parool", - "New Password" : "Uus parool", - "Reset password" : "Nulli parool", "Searching other places" : "Otsi teistest kohtadest", "Personal" : "Isiklik", "Users" : "Kasutajad", @@ -233,6 +229,10 @@ "Wrong password." : "Vale parool.", "Stay logged in" : "Püsi sisselogituna", "Alternative Logins" : "Alternatiivsed sisselogimisviisid", + "Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}", + "New password" : "Uus parool", + "New Password" : "Uus parool", + "Reset password" : "Nulli parool", "This ownCloud instance is currently in single user mode." : "See ownCloud on momendil seadistatud ühe kasutaja jaoks.", "This means only administrators can use the instance." : "See tähendab, et seda saavad kasutada ainult administraatorid.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakteeru oma süsteemihalduriga, kui see teade püsib või on tekkinud ootamatult.", diff --git a/core/l10n/eu.js b/core/l10n/eu.js index 2283c5969de..d6d29d89f13 100644 --- a/core/l10n/eu.js +++ b/core/l10n/eu.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "Baliogabeko irudia", "No temporary profile picture available, try again" : "Ez dago behin-behineko profil irudirik, saiatu berriro", "No crop data provided" : "Ez da ebaketarako daturik zehaztu", + "Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako", + "Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.", + "%s password reset" : "%s pasahitza berrezarri", + "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "Sunday" : "Igandea", "Monday" : "Astelehena", "Tuesday" : "Asteartea", @@ -56,7 +60,6 @@ OC.L10N.register( "Settings" : "Ezarpenak", "Saving..." : "Gordetzen...", "seconds ago" : "segundu", - "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Zure pasahitza berrezartzeko lotura zure postara bidalia izan da.<br>Ez baduzu arrazoizko denbora epe batean jasotzen begiratu zure zabor-posta karpetan.<br>Hor ere ez badago kudeatzailearekin harremanetan jarri.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Zure fitxategiak enkriptaturik daude. Ez baduzu berreskuratze gakoa gaitzen pasahitza berrabiaraztean ez da zure fitxategiak berreskuratzeko modurik egongo. <br />Zer egin ziur ez bazaude kudeatzailearekin harremanetan ipini jarraitu aurretik.<br /> Ziur zaude aurrera jarraitu nahi duzula?", "I know what I'm doing" : "Badakit zer ari naizen egiten", @@ -122,9 +125,9 @@ OC.L10N.register( "access control" : "sarrera kontrola", "Share" : "Elkarbanatu", "Warning" : "Abisua", + "Delete" : "Ezabatu", "The object type is not specified." : "Objetu mota ez dago zehaztuta.", "Enter new" : "Sartu berria", - "Delete" : "Ezabatu", "Add" : "Gehitu", "Edit tags" : "Editatu etiketak", "Error loading dialog template: {error}" : "Errorea elkarrizketa txantiloia kargatzean: {errorea}", @@ -140,13 +143,6 @@ OC.L10N.register( "Please reload the page." : "Mesedez birkargatu orria.", "The update was unsuccessful. " : "Eguneraketa ongi burutu da.", "The update was successful. Redirecting you to ownCloud now." : "Eguneraketa ongi egin da. Orain zure ownClouderea berbideratua izango zara.", - "Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako", - "Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.", - "%s password reset" : "%s pasahitza berrezarri", - "Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", - "New password" : "Pasahitz berria", - "New Password" : "Pasahitz Berria", - "Reset password" : "Berrezarri pasahitza", "Searching other places" : "Beste lekuak bilatzen", "No search results in other folders" : "Ez da bilaketaren emaitzik lortu beste karpetatan", "Personal" : "Pertsonala", @@ -204,6 +200,10 @@ OC.L10N.register( "Please contact your administrator." : "Mesedez jarri harremetan zure administradorearekin.", "Log in" : "Hasi saioa", "Alternative Logins" : "Beste erabiltzaile izenak", + "Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", + "New password" : "Pasahitz berria", + "New Password" : "Pasahitz Berria", + "Reset password" : "Berrezarri pasahitza", "This ownCloud instance is currently in single user mode." : "ownCloud instantzia hau erabiltzaile bakar moduan dago.", "This means only administrators can use the instance." : "Honek administradoreak bakarrik erabili dezakeela esan nahi du.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Jarri harremanetan zure sistema administratzailearekin mezu hau irauten badu edo bat-batean agertu bada.", diff --git a/core/l10n/eu.json b/core/l10n/eu.json index d422e1276b9..288710498db 100644 --- a/core/l10n/eu.json +++ b/core/l10n/eu.json @@ -11,6 +11,10 @@ "Invalid image" : "Baliogabeko irudia", "No temporary profile picture available, try again" : "Ez dago behin-behineko profil irudirik, saiatu berriro", "No crop data provided" : "Ez da ebaketarako daturik zehaztu", + "Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako", + "Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.", + "%s password reset" : "%s pasahitza berrezarri", + "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "Sunday" : "Igandea", "Monday" : "Astelehena", "Tuesday" : "Asteartea", @@ -54,7 +58,6 @@ "Settings" : "Ezarpenak", "Saving..." : "Gordetzen...", "seconds ago" : "segundu", - "Couldn't send reset email. Please contact your administrator." : "Ezin da berrezartzeko eposta bidali. Mesedez jarri harremetan zure administradorearekin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Zure pasahitza berrezartzeko lotura zure postara bidalia izan da.<br>Ez baduzu arrazoizko denbora epe batean jasotzen begiratu zure zabor-posta karpetan.<br>Hor ere ez badago kudeatzailearekin harremanetan jarri.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Zure fitxategiak enkriptaturik daude. Ez baduzu berreskuratze gakoa gaitzen pasahitza berrabiaraztean ez da zure fitxategiak berreskuratzeko modurik egongo. <br />Zer egin ziur ez bazaude kudeatzailearekin harremanetan ipini jarraitu aurretik.<br /> Ziur zaude aurrera jarraitu nahi duzula?", "I know what I'm doing" : "Badakit zer ari naizen egiten", @@ -120,9 +123,9 @@ "access control" : "sarrera kontrola", "Share" : "Elkarbanatu", "Warning" : "Abisua", + "Delete" : "Ezabatu", "The object type is not specified." : "Objetu mota ez dago zehaztuta.", "Enter new" : "Sartu berria", - "Delete" : "Ezabatu", "Add" : "Gehitu", "Edit tags" : "Editatu etiketak", "Error loading dialog template: {error}" : "Errorea elkarrizketa txantiloia kargatzean: {errorea}", @@ -138,13 +141,6 @@ "Please reload the page." : "Mesedez birkargatu orria.", "The update was unsuccessful. " : "Eguneraketa ongi burutu da.", "The update was successful. Redirecting you to ownCloud now." : "Eguneraketa ongi egin da. Orain zure ownClouderea berbideratua izango zara.", - "Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako", - "Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.", - "%s password reset" : "%s pasahitza berrezarri", - "Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", - "New password" : "Pasahitz berria", - "New Password" : "Pasahitz Berria", - "Reset password" : "Berrezarri pasahitza", "Searching other places" : "Beste lekuak bilatzen", "No search results in other folders" : "Ez da bilaketaren emaitzik lortu beste karpetatan", "Personal" : "Pertsonala", @@ -202,6 +198,10 @@ "Please contact your administrator." : "Mesedez jarri harremetan zure administradorearekin.", "Log in" : "Hasi saioa", "Alternative Logins" : "Beste erabiltzaile izenak", + "Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}", + "New password" : "Pasahitz berria", + "New Password" : "Pasahitz Berria", + "Reset password" : "Berrezarri pasahitza", "This ownCloud instance is currently in single user mode." : "ownCloud instantzia hau erabiltzaile bakar moduan dago.", "This means only administrators can use the instance." : "Honek administradoreak bakarrik erabili dezakeela esan nahi du.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Jarri harremanetan zure sistema administratzailearekin mezu hau irauten badu edo bat-batean agertu bada.", diff --git a/core/l10n/fa.js b/core/l10n/fa.js index 9f9fe7eb3f7..df8422a6dee 100644 --- a/core/l10n/fa.js +++ b/core/l10n/fa.js @@ -19,6 +19,8 @@ OC.L10N.register( "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.", "No temporary profile picture available, try again" : "تصویر پروفایل موقت در حال حاضر در دسترس نیست ، دوباره تلاش کنید ", "Crop is not square" : "بخش بریده شده مربع نیست", + "%s password reset" : "%s رمزعبور تغییر کرد", + "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "Sunday" : "یکشنبه", "Monday" : "دوشنبه", "Tuesday" : "سه شنبه", @@ -67,7 +69,6 @@ OC.L10N.register( "Settings" : "تنظیمات", "Saving..." : "در حال ذخیره سازی...", "seconds ago" : "ثانیهها پیش", - "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "لینک تنظیم مجدد رمز عبور به ایمیل شما ارسال شده است.<br>اگر آن رادر یک زمان مشخصی دریافت نکرده اید، لطفا هرزنامه/ پوشه های ناخواسته را بررسی کنید.<br>در صورت نبودن از مدیر خود بپرسید.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "فایل های شما رمزگذاری شده اند. اگر شما کلید بازیابی را فعال نکرده اید، پس از راه اندازی مجدد رمزعبور هیچ راهی برای بازگشت اطلاعاتتان وجود نخواهد داشت.در صورت عدم اطمینان به انجام کار، لطفا ابتدا با مدیر خود تماس بگیرید. آیا واقعا میخواهید ادامه دهید ؟", "I know what I'm doing" : "اطلاع از انجام این کار دارم", @@ -136,9 +137,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "اشتراک گذاری با کاربران، گروهها یا کاربران راه دور...", "Warning" : "اخطار", "Error while sending notification" : "خطا در حین ارسال نوتیفیکیشن", + "Delete" : "حذف", "The object type is not specified." : "نوع شی تعیین نشده است.", "Enter new" : "مورد جدید را وارد کنید", - "Delete" : "حذف", "Add" : "افزودن", "Edit tags" : "ویرایش تگ ها", "No tags selected for deletion." : "هیچ تگی برای حذف انتخاب نشده است.", @@ -154,11 +155,6 @@ OC.L10N.register( "The update was unsuccessful. " : "بروزرسانی ناموفق بود.", "The update was successful. There were warnings." : "بروزرسانی با موفقیت انجام شد، اخطارهایی وجود دارد.", "The update was successful. Redirecting you to ownCloud now." : "به روزرسانی موفقیت آمیز بود. در حال انتقال شما به OwnCloud.", - "%s password reset" : "%s رمزعبور تغییر کرد", - "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", - "New password" : "گذرواژه جدید", - "New Password" : "رمزعبور جدید", - "Reset password" : "تنظیم مجدد رمز عبور", "Searching other places" : "جستجو در مکانهای دیگر", "Personal" : "شخصی", "Users" : "کاربران", @@ -216,6 +212,10 @@ OC.L10N.register( "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", "Log in" : "ورود", "Alternative Logins" : "ورود متناوب", + "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", + "New password" : "گذرواژه جدید", + "New Password" : "رمزعبور جدید", + "Reset password" : "تنظیم مجدد رمز عبور", "Thank you for your patience." : "از صبر شما متشکریم", "Add \"%s\" as trusted domain" : "افزودن \"%s\" به عنوان دامنه مورد اعتماد", "App update required" : "نیاز به بروزرسانی برنامه وجود دارد", diff --git a/core/l10n/fa.json b/core/l10n/fa.json index 383c0ec1ef3..9b77a31272e 100644 --- a/core/l10n/fa.json +++ b/core/l10n/fa.json @@ -17,6 +17,8 @@ "An error occurred. Please contact your admin." : "یک خطا رخ داده است. لطفا با مدیر سیستم تماس بگیرید.", "No temporary profile picture available, try again" : "تصویر پروفایل موقت در حال حاضر در دسترس نیست ، دوباره تلاش کنید ", "Crop is not square" : "بخش بریده شده مربع نیست", + "%s password reset" : "%s رمزعبور تغییر کرد", + "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "Sunday" : "یکشنبه", "Monday" : "دوشنبه", "Tuesday" : "سه شنبه", @@ -65,7 +67,6 @@ "Settings" : "تنظیمات", "Saving..." : "در حال ذخیره سازی...", "seconds ago" : "ثانیهها پیش", - "Couldn't send reset email. Please contact your administrator." : "ارسال ایمیل مجدد با مشکل مواجه شد . لطفا با مدیر سیستم تماس بگیرید .", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "لینک تنظیم مجدد رمز عبور به ایمیل شما ارسال شده است.<br>اگر آن رادر یک زمان مشخصی دریافت نکرده اید، لطفا هرزنامه/ پوشه های ناخواسته را بررسی کنید.<br>در صورت نبودن از مدیر خود بپرسید.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "فایل های شما رمزگذاری شده اند. اگر شما کلید بازیابی را فعال نکرده اید، پس از راه اندازی مجدد رمزعبور هیچ راهی برای بازگشت اطلاعاتتان وجود نخواهد داشت.در صورت عدم اطمینان به انجام کار، لطفا ابتدا با مدیر خود تماس بگیرید. آیا واقعا میخواهید ادامه دهید ؟", "I know what I'm doing" : "اطلاع از انجام این کار دارم", @@ -134,9 +135,9 @@ "Share with users, groups or remote users …" : "اشتراک گذاری با کاربران، گروهها یا کاربران راه دور...", "Warning" : "اخطار", "Error while sending notification" : "خطا در حین ارسال نوتیفیکیشن", + "Delete" : "حذف", "The object type is not specified." : "نوع شی تعیین نشده است.", "Enter new" : "مورد جدید را وارد کنید", - "Delete" : "حذف", "Add" : "افزودن", "Edit tags" : "ویرایش تگ ها", "No tags selected for deletion." : "هیچ تگی برای حذف انتخاب نشده است.", @@ -152,11 +153,6 @@ "The update was unsuccessful. " : "بروزرسانی ناموفق بود.", "The update was successful. There were warnings." : "بروزرسانی با موفقیت انجام شد، اخطارهایی وجود دارد.", "The update was successful. Redirecting you to ownCloud now." : "به روزرسانی موفقیت آمیز بود. در حال انتقال شما به OwnCloud.", - "%s password reset" : "%s رمزعبور تغییر کرد", - "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", - "New password" : "گذرواژه جدید", - "New Password" : "رمزعبور جدید", - "Reset password" : "تنظیم مجدد رمز عبور", "Searching other places" : "جستجو در مکانهای دیگر", "Personal" : "شخصی", "Users" : "کاربران", @@ -214,6 +210,10 @@ "Please try again or contact your administrator." : "لطفا مجددا تلاش کنید یا با مدیر سیستم تماس بگیرید.", "Log in" : "ورود", "Alternative Logins" : "ورود متناوب", + "Use the following link to reset your password: {link}" : "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}", + "New password" : "گذرواژه جدید", + "New Password" : "رمزعبور جدید", + "Reset password" : "تنظیم مجدد رمز عبور", "Thank you for your patience." : "از صبر شما متشکریم", "Add \"%s\" as trusted domain" : "افزودن \"%s\" به عنوان دامنه مورد اعتماد", "App update required" : "نیاز به بروزرسانی برنامه وجود دارد", diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index f14b55badf3..f78d557c31f 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Puutteellinen tieto", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", "Crop is not square" : "Leikkaus ei ole neliö", + "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", + "Couldn't reset password because the token is expired" : "Salasanan palauttaminen ei onnistunut, koska valtuutus on vanhentunut", + "Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Salasanan palautusiviestiä ei voitu lähettää sähköpostitse, koska tälle käyttäjätunnukselle ei ole määritetty sähköpostiosoitetta. Ota yhteys ylläpitäjään.", + "%s password reset" : "%s salasanan palautus", + "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "Sunday" : "sunnuntai", "Monday" : "maanantai", "Tuesday" : "tiistai", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Asetukset", "Saving..." : "Tallennetaan...", "seconds ago" : "sekuntia sitten", - "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?", "I know what I'm doing" : "Tiedän mitä teen", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Jaa käyttäjien, ryhmien tai etäkäyttäjien kanssa…", "Warning" : "Varoitus", "Error while sending notification" : "Virhe ilmoitusta lähettäessä", + "Delete" : "Poista", "The object type is not specified." : "The object type is not specified.", "Enter new" : "Kirjoita uusi", - "Delete" : "Poista", "Add" : "Lisää", "Edit tags" : "Muokkaa tunnisteita", "Error loading dialog template: {error}" : "Virhe ladatessa keskustelupohja: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Päivitys epäonnistui.", "The update was successful. There were warnings." : "Päivitys onnistui, tosin ilmeni varoituksia.", "The update was successful. Redirecting you to ownCloud now." : "Päivitys onnistui. Selain ohjautuu nyt ownCloudiisi.", - "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", - "Couldn't reset password because the token is expired" : "Salasanan palauttaminen ei onnistunut, koska valtuutus on vanhentunut", - "Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Salasanan palautusiviestiä ei voitu lähettää sähköpostitse, koska tälle käyttäjätunnukselle ei ole määritetty sähköpostiosoitetta. Ota yhteys ylläpitäjään.", - "%s password reset" : "%s salasanan palautus", - "Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}", - "New password" : "Uusi salasana", - "New Password" : "Uusi salasana", - "Reset password" : "Palauta salasana", "Searching other places" : "Etsitään muista paikoista", "No search results in other folders" : "Ei hakutuloksia muissa kansioissa", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", + "Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}", + "New password" : "Uusi salasana", + "New Password" : "Uusi salasana", + "Reset password" : "Palauta salasana", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", "This means only administrators can use the instance." : "Se tarkoittaa, että vain ylläpitäjät voivat nyt käyttää tätä ownCloudia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Ota yhteys järjestelmän ylläpitäjään, jos tämä viesti ilmenee uudelleen tai odottamatta.", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index bb27c265627..d02b7c1283a 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -33,6 +33,12 @@ "No crop data provided" : "Puutteellinen tieto", "No valid crop data provided" : "Kelvollisia leikkaustietoja ei määritetty", "Crop is not square" : "Leikkaus ei ole neliö", + "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", + "Couldn't reset password because the token is expired" : "Salasanan palauttaminen ei onnistunut, koska valtuutus on vanhentunut", + "Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Salasanan palautusiviestiä ei voitu lähettää sähköpostitse, koska tälle käyttäjätunnukselle ei ole määritetty sähköpostiosoitetta. Ota yhteys ylläpitäjään.", + "%s password reset" : "%s salasanan palautus", + "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "Sunday" : "sunnuntai", "Monday" : "maanantai", "Tuesday" : "tiistai", @@ -82,7 +88,6 @@ "Settings" : "Asetukset", "Saving..." : "Tallennetaan...", "seconds ago" : "sekuntia sitten", - "Couldn't send reset email. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut. Ota yhteys ylläpitäjään.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Linkki salasanan palauttamista varten on lähetetty sähköpostitse. Jos et saa sähköpostiviestiä kohtuullisessa ajassa, tarkista roskapostikansiot.<br>Jos et saa sähköpostiviestiä, ota yhteys paikalliseen ylläpitäjään.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Tiedostosi on salattu. Jos et ole ottanut käyttöön palautusavainta, tietojasi ei ole mahdollista palauttaa salasanan nollaamisen jälkeen.<br />Jos et ole varma mitä tehdä, ota yhteys ylläpitäjään.<br />Haluatko varmasti jatkaa?", "I know what I'm doing" : "Tiedän mitä teen", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Jaa käyttäjien, ryhmien tai etäkäyttäjien kanssa…", "Warning" : "Varoitus", "Error while sending notification" : "Virhe ilmoitusta lähettäessä", + "Delete" : "Poista", "The object type is not specified." : "The object type is not specified.", "Enter new" : "Kirjoita uusi", - "Delete" : "Poista", "Add" : "Lisää", "Edit tags" : "Muokkaa tunnisteita", "Error loading dialog template: {error}" : "Virhe ladatessa keskustelupohja: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "Päivitys epäonnistui.", "The update was successful. There were warnings." : "Päivitys onnistui, tosin ilmeni varoituksia.", "The update was successful. Redirecting you to ownCloud now." : "Päivitys onnistui. Selain ohjautuu nyt ownCloudiisi.", - "Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen", - "Couldn't reset password because the token is expired" : "Salasanan palauttaminen ei onnistunut, koska valtuutus on vanhentunut", - "Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Salasanan palautusiviestiä ei voitu lähettää sähköpostitse, koska tälle käyttäjätunnukselle ei ole määritetty sähköpostiosoitetta. Ota yhteys ylläpitäjään.", - "%s password reset" : "%s salasanan palautus", - "Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}", - "New password" : "Uusi salasana", - "New Password" : "Uusi salasana", - "Reset password" : "Palauta salasana", "Searching other places" : "Etsitään muista paikoista", "No search results in other folders" : "Ei hakutuloksia muissa kansioissa", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hakutulos muussa kansiossa","{count} hakutulosta muissa kansioissa"], @@ -269,6 +265,10 @@ "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", + "Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}", + "New password" : "Uusi salasana", + "New Password" : "Uusi salasana", + "Reset password" : "Palauta salasana", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", "This means only administrators can use the instance." : "Se tarkoittaa, että vain ylläpitäjät voivat nyt käyttää tätä ownCloudia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Ota yhteys järjestelmän ylläpitäjään, jos tämä viesti ilmenee uudelleen tai odottamatta.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 41b302a569a..31da55d526b 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Aucune donnée de recadrage fournie", "No valid crop data provided" : "Données de recadrage non valides", "Crop is not square" : "Le recadrage n'est pas carré", + "Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.", + "Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.", + "Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.", + "%s password reset" : "Réinitialisation de votre mot de passe %s", + "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "Sunday" : "Dimanche", "Monday" : "Lundi", "Tuesday" : "Mardi", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Paramètres", "Saving..." : "Enregistrement…", "seconds ago" : "à l'instant", - "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clef de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", "I know what I'm doing" : "Je sais ce que je fais", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants", "Warning" : "Attention", "Error while sending notification" : "Erreur lors de l'envoi de la notification", + "Delete" : "Supprimer", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", - "Delete" : "Supprimer", "Add" : "Ajouter", "Edit tags" : "Modifier les étiquettes", "Error loading dialog template: {error}" : "Erreur lors du chargement du modèle de dialogue : {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "La mise à jour a échoué.", "The update was successful. There were warnings." : "La mise à jour a réussi, mais il y a eu des avertissements", "The update was successful. Redirecting you to ownCloud now." : "La mise à jour a réussi. Vous êtes maintenant redirigé vers ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.", - "Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.", - "Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.", - "%s password reset" : "Réinitialisation de votre mot de passe %s", - "Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}", - "New password" : "Nouveau mot de passe", - "New Password" : "Nouveau mot de passe", - "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", "No search results in other folders" : "Aucun résultat dans d'autres dossiers", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", + "Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}", + "New password" : "Nouveau mot de passe", + "New Password" : "Nouveau mot de passe", + "Reset password" : "Réinitialiser le mot de passe", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", "This means only administrators can use the instance." : "Cela signifie que seuls les administrateurs peuvent utiliser l'instance.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Veuillez contacter votre administrateur système si ce message persiste ou apparaît de façon inattendue.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 6e54ce49f5e..3dea46eee55 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -33,6 +33,12 @@ "No crop data provided" : "Aucune donnée de recadrage fournie", "No valid crop data provided" : "Données de recadrage non valides", "Crop is not square" : "Le recadrage n'est pas carré", + "Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.", + "Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.", + "Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.", + "%s password reset" : "Réinitialisation de votre mot de passe %s", + "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "Sunday" : "Dimanche", "Monday" : "Lundi", "Tuesday" : "Mardi", @@ -82,7 +88,6 @@ "Settings" : "Paramètres", "Saving..." : "Enregistrement…", "seconds ago" : "à l'instant", - "Couldn't send reset email. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez contacter votre administrateur.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clef de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", "I know what I'm doing" : "Je sais ce que je fais", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Partager avec des utilisateurs, groupes, ou utilisateurs distants", "Warning" : "Attention", "Error while sending notification" : "Erreur lors de l'envoi de la notification", + "Delete" : "Supprimer", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", - "Delete" : "Supprimer", "Add" : "Ajouter", "Edit tags" : "Modifier les étiquettes", "Error loading dialog template: {error}" : "Erreur lors du chargement du modèle de dialogue : {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "La mise à jour a échoué.", "The update was successful. There were warnings." : "La mise à jour a réussi, mais il y a eu des avertissements", "The update was successful. Redirecting you to ownCloud now." : "La mise à jour a réussi. Vous êtes maintenant redirigé vers ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.", - "Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.", - "Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.", - "%s password reset" : "Réinitialisation de votre mot de passe %s", - "Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}", - "New password" : "Nouveau mot de passe", - "New Password" : "Nouveau mot de passe", - "Reset password" : "Réinitialiser le mot de passe", "Searching other places" : "Recherche en cours dans d'autres emplacements", "No search results in other folders" : "Aucun résultat dans d'autres dossiers", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], @@ -269,6 +265,10 @@ "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", + "Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}", + "New password" : "Nouveau mot de passe", + "New Password" : "Nouveau mot de passe", + "Reset password" : "Réinitialiser le mot de passe", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", "This means only administrators can use the instance." : "Cela signifie que seuls les administrateurs peuvent utiliser l'instance.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Veuillez contacter votre administrateur système si ce message persiste ou apparaît de façon inattendue.", diff --git a/core/l10n/gl.js b/core/l10n/gl.js index d0a5468a235..482032064c7 100644 --- a/core/l10n/gl.js +++ b/core/l10n/gl.js @@ -21,6 +21,10 @@ OC.L10N.register( "No crop data provided" : "Non indicou como recortar", "No valid crop data provided" : "Os datos cortados fornecidos non son válidos", "Crop is not square" : "O corte non é cadrado", + "Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta", + "Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.", + "%s password reset" : "Restabelecer o contrasinal %s", + "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "Sunday" : "domingo", "Monday" : "luns", "Tuesday" : "martes", @@ -69,7 +73,6 @@ OC.L10N.register( "Settings" : "Axustes", "Saving..." : "Gardando...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A ligazón para restabelecer o seu contrasinal foi enviada ao seu correo. Se non a recibe nun prazo razoábel de tempo, vexa o seu cartafol de correo lixo. <br> Se non está ali pregúntelle ao administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros están cifrados. Se non activou a chave de recuperación, non haberá maneira de recuperar os datos após o restabelecemento do contrasinal. <br />Se non está seguro de que facer, póñase en contacto co administrador antes de continuar. <br /> Confirma que quere continuar?", "I know what I'm doing" : "Sei o estou a facer", @@ -145,9 +148,9 @@ OC.L10N.register( "Share with users or groups …" : "Compartir con usuarios ou grupos ...", "Share with users, groups or remote users …" : "Compartir con usuarios, grupos ou usuarios remotos ...", "Warning" : "Aviso", + "Delete" : "Eliminar", "The object type is not specified." : "Non se especificou o tipo de obxecto.", "Enter new" : "Introduza o novo", - "Delete" : "Eliminar", "Add" : "Engadir", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Produciuse un erro ao cargar o modelo do dialogo: {error}", @@ -164,13 +167,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Fracasou a actualización.", "The update was successful. There were warnings." : "A actualización realizouse correctamente. Houbo algún aviso.", "The update was successful. Redirecting you to ownCloud now." : "A actualización realizouse correctamente. Redirixíndoo agora á ownCloud.", - "Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta", - "Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.", - "%s password reset" : "Restabelecer o contrasinal %s", - "Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}", - "New password" : "Novo contrasinal", - "New Password" : "Novo contrasinal", - "Reset password" : "Restabelecer o contrasinal", "Searching other places" : "Buscando noutros lugares", "Personal" : "Persoal", "Users" : "Usuarios", @@ -238,6 +234,10 @@ OC.L10N.register( "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", "Log in" : "Acceder", "Alternative Logins" : "Accesos alternativos", + "Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}", + "New password" : "Novo contrasinal", + "New Password" : "Novo contrasinal", + "Reset password" : "Restabelecer o contrasinal", "This ownCloud instance is currently in single user mode." : "Esta instancia do ownCloud está actualmente en modo de usuario único.", "This means only administrators can use the instance." : "Isto significa que só os administradores poden utilizar a instancia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Póñase en contacto co administrador do sistema se persiste esta mensaxe ou se aparece de forma inesperada.", diff --git a/core/l10n/gl.json b/core/l10n/gl.json index 823b08c4d14..6fbefb56893 100644 --- a/core/l10n/gl.json +++ b/core/l10n/gl.json @@ -19,6 +19,10 @@ "No crop data provided" : "Non indicou como recortar", "No valid crop data provided" : "Os datos cortados fornecidos non son válidos", "Crop is not square" : "O corte non é cadrado", + "Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta", + "Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.", + "%s password reset" : "Restabelecer o contrasinal %s", + "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "Sunday" : "domingo", "Monday" : "luns", "Tuesday" : "martes", @@ -67,7 +71,6 @@ "Settings" : "Axustes", "Saving..." : "Gardando...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Póñase en contacto co administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A ligazón para restabelecer o seu contrasinal foi enviada ao seu correo. Se non a recibe nun prazo razoábel de tempo, vexa o seu cartafol de correo lixo. <br> Se non está ali pregúntelle ao administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros están cifrados. Se non activou a chave de recuperación, non haberá maneira de recuperar os datos após o restabelecemento do contrasinal. <br />Se non está seguro de que facer, póñase en contacto co administrador antes de continuar. <br /> Confirma que quere continuar?", "I know what I'm doing" : "Sei o estou a facer", @@ -143,9 +146,9 @@ "Share with users or groups …" : "Compartir con usuarios ou grupos ...", "Share with users, groups or remote users …" : "Compartir con usuarios, grupos ou usuarios remotos ...", "Warning" : "Aviso", + "Delete" : "Eliminar", "The object type is not specified." : "Non se especificou o tipo de obxecto.", "Enter new" : "Introduza o novo", - "Delete" : "Eliminar", "Add" : "Engadir", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Produciuse un erro ao cargar o modelo do dialogo: {error}", @@ -162,13 +165,6 @@ "The update was unsuccessful. " : "Fracasou a actualización.", "The update was successful. There were warnings." : "A actualización realizouse correctamente. Houbo algún aviso.", "The update was successful. Redirecting you to ownCloud now." : "A actualización realizouse correctamente. Redirixíndoo agora á ownCloud.", - "Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta", - "Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.", - "%s password reset" : "Restabelecer o contrasinal %s", - "Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}", - "New password" : "Novo contrasinal", - "New Password" : "Novo contrasinal", - "Reset password" : "Restabelecer o contrasinal", "Searching other places" : "Buscando noutros lugares", "Personal" : "Persoal", "Users" : "Usuarios", @@ -236,6 +232,10 @@ "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", "Log in" : "Acceder", "Alternative Logins" : "Accesos alternativos", + "Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}", + "New password" : "Novo contrasinal", + "New Password" : "Novo contrasinal", + "Reset password" : "Restabelecer o contrasinal", "This ownCloud instance is currently in single user mode." : "Esta instancia do ownCloud está actualmente en modo de usuario único.", "This means only administrators can use the instance." : "Isto significa que só os administradores poden utilizar a instancia.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Póñase en contacto co administrador do sistema se persiste esta mensaxe ou se aparece de forma inesperada.", diff --git a/core/l10n/he.js b/core/l10n/he.js index 1b46c6ee694..7bc0429ade7 100644 --- a/core/l10n/he.js +++ b/core/l10n/he.js @@ -35,6 +35,8 @@ OC.L10N.register( "No crop data provided" : "לא סופק מידע קיטום", "No valid crop data provided" : "לא סופק מידע קיטום חוקי", "Crop is not square" : "הקיטום אינו מרובע", + "%s password reset" : "%s הסיסמא אופסה", + "Couldn't send reset email. Please contact your administrator." : "לא ניתן היה לשלוח דואר אלקטרוני לאיפוס. יש לפנות למנהל שלך.", "Sunday" : "יום ראשון", "Monday" : "יום שני", "Tuesday" : "יום שלישי", @@ -84,7 +86,6 @@ OC.L10N.register( "Settings" : "הגדרות", "Saving..." : "שמירה…", "seconds ago" : "שניות", - "Couldn't send reset email. Please contact your administrator." : "לא ניתן היה לשלוח דואר אלקטרוני לאיפוס. יש לפנות למנהל שלך.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "הקישור לאיפוס הסיסמא שלך נשלח אליך בדואר אלקטרוני. אם לא קיבלת את הקישור תוך זמן סביר, מוטב לבדוק את תיבת דואר הזבל/ספאם שלך.<br>אם ההודעה אינה שם, יש לשאול את המנהל המקומי שלך .", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "הקבצים שלך מוצפנים. אם לא הפעלת את מפתח השחזור, לא תהיה דרך לקבל את המידע מחדש אחרי שהסיסמא תאופס.<br />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?", "I know what I'm doing" : "אני יודע/ת מה אני עושה", @@ -158,9 +159,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "שיתוף עם משתמשים, קבוצות או משתמשים חצוניים...", "Warning" : "אזהרה", "Error while sending notification" : "שגיאה בזמן שליחת הודעה", + "Delete" : "מחיקה", "The object type is not specified." : "סוג הפריט לא צוין.", "Enter new" : "הכנסת חדש", - "Delete" : "מחיקה", "Add" : "הוספה", "Edit tags" : "עריכת תגים", "Error loading dialog template: {error}" : "שגיאה בזמן טעינת תבנית דיאלוג: {error}", @@ -177,11 +178,6 @@ OC.L10N.register( "The update was unsuccessful. " : "העדכון בוצע בהצלחה.", "The update was successful. There were warnings." : "העדכון בוצע בהצלחה. היו הזהרות.", "The update was successful. Redirecting you to ownCloud now." : "תהליך העדכון הסתיים בהצלחה. עכשיו מנתב אותך אל ownCloud.", - "%s password reset" : "%s הסיסמא אופסה", - "Use the following link to reset your password: {link}" : "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", - "New password" : "ססמה חדשה", - "New Password" : "סיסמא חדשה", - "Reset password" : "איפוס ססמה", "Searching other places" : "מחפש במקומות אחרים", "No search results in other folders" : "אין תוצאות חיפוש בתיקיות אחרות", "Personal" : "אישי", @@ -236,6 +232,10 @@ OC.L10N.register( "Wrong password." : "סיסמא שגוייה.", "Stay logged in" : "השאר מחובר", "Alternative Logins" : "כניסות אלטרנטיביות", + "Use the following link to reset your password: {link}" : "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", + "New password" : "ססמה חדשה", + "New Password" : "סיסמא חדשה", + "Reset password" : "איפוס ססמה", "Thank you for your patience." : "תודה על הסבלנות.", "Start update" : "התחלת עדכון" }, diff --git a/core/l10n/he.json b/core/l10n/he.json index bb4aa68855d..62383588c52 100644 --- a/core/l10n/he.json +++ b/core/l10n/he.json @@ -33,6 +33,8 @@ "No crop data provided" : "לא סופק מידע קיטום", "No valid crop data provided" : "לא סופק מידע קיטום חוקי", "Crop is not square" : "הקיטום אינו מרובע", + "%s password reset" : "%s הסיסמא אופסה", + "Couldn't send reset email. Please contact your administrator." : "לא ניתן היה לשלוח דואר אלקטרוני לאיפוס. יש לפנות למנהל שלך.", "Sunday" : "יום ראשון", "Monday" : "יום שני", "Tuesday" : "יום שלישי", @@ -82,7 +84,6 @@ "Settings" : "הגדרות", "Saving..." : "שמירה…", "seconds ago" : "שניות", - "Couldn't send reset email. Please contact your administrator." : "לא ניתן היה לשלוח דואר אלקטרוני לאיפוס. יש לפנות למנהל שלך.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "הקישור לאיפוס הסיסמא שלך נשלח אליך בדואר אלקטרוני. אם לא קיבלת את הקישור תוך זמן סביר, מוטב לבדוק את תיבת דואר הזבל/ספאם שלך.<br>אם ההודעה אינה שם, יש לשאול את המנהל המקומי שלך .", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "הקבצים שלך מוצפנים. אם לא הפעלת את מפתח השחזור, לא תהיה דרך לקבל את המידע מחדש אחרי שהסיסמא תאופס.<br />אם אין לך מושג מה לעשות what to do, מוטב לפנות למנהל שלך לפני ההמשך. <br />האם באמת ברצונך להמשיך?", "I know what I'm doing" : "אני יודע/ת מה אני עושה", @@ -156,9 +157,9 @@ "Share with users, groups or remote users …" : "שיתוף עם משתמשים, קבוצות או משתמשים חצוניים...", "Warning" : "אזהרה", "Error while sending notification" : "שגיאה בזמן שליחת הודעה", + "Delete" : "מחיקה", "The object type is not specified." : "סוג הפריט לא צוין.", "Enter new" : "הכנסת חדש", - "Delete" : "מחיקה", "Add" : "הוספה", "Edit tags" : "עריכת תגים", "Error loading dialog template: {error}" : "שגיאה בזמן טעינת תבנית דיאלוג: {error}", @@ -175,11 +176,6 @@ "The update was unsuccessful. " : "העדכון בוצע בהצלחה.", "The update was successful. There were warnings." : "העדכון בוצע בהצלחה. היו הזהרות.", "The update was successful. Redirecting you to ownCloud now." : "תהליך העדכון הסתיים בהצלחה. עכשיו מנתב אותך אל ownCloud.", - "%s password reset" : "%s הסיסמא אופסה", - "Use the following link to reset your password: {link}" : "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", - "New password" : "ססמה חדשה", - "New Password" : "סיסמא חדשה", - "Reset password" : "איפוס ססמה", "Searching other places" : "מחפש במקומות אחרים", "No search results in other folders" : "אין תוצאות חיפוש בתיקיות אחרות", "Personal" : "אישי", @@ -234,6 +230,10 @@ "Wrong password." : "סיסמא שגוייה.", "Stay logged in" : "השאר מחובר", "Alternative Logins" : "כניסות אלטרנטיביות", + "Use the following link to reset your password: {link}" : "יש להשתמש בקישור הבא כדי לאפס את הססמה שלך: {link}", + "New password" : "ססמה חדשה", + "New Password" : "סיסמא חדשה", + "Reset password" : "איפוס ססמה", "Thank you for your patience." : "תודה על הסבלנות.", "Start update" : "התחלת עדכון" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/hi.js b/core/l10n/hi.js index b6106eaf867..df717fd1ac5 100644 --- a/core/l10n/hi.js +++ b/core/l10n/hi.js @@ -31,8 +31,6 @@ OC.L10N.register( "Share" : "साझा करें", "Warning" : "चेतावनी ", "Add" : "डाले", - "Use the following link to reset your password: {link}" : "आगे दिये गये लिंक का उपयोग पासवर्ड बदलने के लिये किजीये: {link}", - "New password" : "नया पासवर्ड", "Personal" : "यक्तिगत", "Users" : "उपयोगकर्ता", "Apps" : "Apps", @@ -45,6 +43,8 @@ OC.L10N.register( "Database password" : "डेटाबेस पासवर्ड", "Database name" : "डेटाबेस का नाम", "Finish setup" : "सेटअप समाप्त करे", - "Log out" : "लोग आउट" + "Log out" : "लोग आउट", + "Use the following link to reset your password: {link}" : "आगे दिये गये लिंक का उपयोग पासवर्ड बदलने के लिये किजीये: {link}", + "New password" : "नया पासवर्ड" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/hi.json b/core/l10n/hi.json index 206baee03e9..877b65381a7 100644 --- a/core/l10n/hi.json +++ b/core/l10n/hi.json @@ -29,8 +29,6 @@ "Share" : "साझा करें", "Warning" : "चेतावनी ", "Add" : "डाले", - "Use the following link to reset your password: {link}" : "आगे दिये गये लिंक का उपयोग पासवर्ड बदलने के लिये किजीये: {link}", - "New password" : "नया पासवर्ड", "Personal" : "यक्तिगत", "Users" : "उपयोगकर्ता", "Apps" : "Apps", @@ -43,6 +41,8 @@ "Database password" : "डेटाबेस पासवर्ड", "Database name" : "डेटाबेस का नाम", "Finish setup" : "सेटअप समाप्त करे", - "Log out" : "लोग आउट" + "Log out" : "लोग आउट", + "Use the following link to reset your password: {link}" : "आगे दिये गये लिंक का उपयोग पासवर्ड बदलने के लिये किजीये: {link}", + "New password" : "नया पासवर्ड" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/hr.js b/core/l10n/hr.js index 647657629f4..94d31d826c5 100644 --- a/core/l10n/hr.js +++ b/core/l10n/hr.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "Slika neispravna", "No temporary profile picture available, try again" : "Slike privremenih profila nisu dostupne, pokušajte ponovno", "No crop data provided" : "Nema podataka o obrezivanju", + "Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.", + "Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.", + "%s password reset" : "%s lozinka resetirana", + "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "Sunday" : "Nedjelja", "Monday" : "Ponedjeljak", "Tuesday" : "Utorak", @@ -54,7 +58,6 @@ OC.L10N.register( "Settings" : "Postavke", "Saving..." : "Spremanje...", "seconds ago" : "prije par sekundi", - "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetiranje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite unekom razumnom vremenskom roku, provjerite svoje spam/junk mape. <br> Ako nije tamo, kontaktirajtesvoga lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali ključ oporavka,svoje podatke nećete moći dohvatitinakon što vaša lozinka bude resetirana.<br />Ako ne znate što učiniti, prije nego linastavite, molimo kontaktirajte svog administratora. <br />Želite li doista nastaviti?", "I know what I'm doing" : "Znam što radim", @@ -124,9 +127,9 @@ OC.L10N.register( "Share with users or groups …" : "Podijeli sa korisnicima ili grupama ...", "Share with users, groups or remote users …" : "Podijeli sa korisnicima, grupama ili udaljenim korisnicima ...", "Warning" : "Upozorenje", + "Delete" : "Izbrišite", "The object type is not specified." : "Vrsta objekta nije specificirana.", "Enter new" : "Unesite novi", - "Delete" : "Izbrišite", "Add" : "Dodajte", "Edit tags" : "Uredite oznake", "Error loading dialog template: {error}" : "Pogrešno učitavanje predloška dijaloga: {error}", @@ -141,13 +144,6 @@ OC.L10N.register( "Please reload the page." : "Molimo, ponovno učitajte stranicu", "The update was unsuccessful. " : "Usklađivanje je bilo neuspješno.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Upravo ste preusmjeravani na ownCloud.", - "Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.", - "Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.", - "%s password reset" : "%s lozinka resetirana", - "Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova lozinka", - "Reset password" : "Resetirajte lozinku", "Searching other places" : "Pretraživanje drugih lokacija", "Personal" : "Osobno", "Users" : "Korisnici", @@ -202,6 +198,10 @@ OC.L10N.register( "Please contact your administrator." : "Molimo kontaktirajte svog administratora.", "Log in" : "Prijavite se", "Alternative Logins" : "Alternativne prijave", + "Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova lozinka", + "Reset password" : "Resetirajte lozinku", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u načinu rada za jednog korisnika.", "This means only administrators can use the instance." : "To znači da tu instancu mogu koristiti samo administratori.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte svog administratora sustava ako se ova poruka ponavlja ili sepojavila neočekivano.", diff --git a/core/l10n/hr.json b/core/l10n/hr.json index 9c9d7eff95f..bac99ebcaa3 100644 --- a/core/l10n/hr.json +++ b/core/l10n/hr.json @@ -11,6 +11,10 @@ "Invalid image" : "Slika neispravna", "No temporary profile picture available, try again" : "Slike privremenih profila nisu dostupne, pokušajte ponovno", "No crop data provided" : "Nema podataka o obrezivanju", + "Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.", + "Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.", + "%s password reset" : "%s lozinka resetirana", + "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "Sunday" : "Nedjelja", "Monday" : "Ponedjeljak", "Tuesday" : "Utorak", @@ -52,7 +56,6 @@ "Settings" : "Postavke", "Saving..." : "Spremanje...", "seconds ago" : "prije par sekundi", - "Couldn't send reset email. Please contact your administrator." : "Nije mogće poslati resetiranu poštu. MOlimo kontaktirajte svog administratora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Veza za resetiranje vaše lozinke poslana je na vašu adresu e-pošte. Ako je ne primite unekom razumnom vremenskom roku, provjerite svoje spam/junk mape. <br> Ako nije tamo, kontaktirajtesvoga lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaše datoteke su šifrirane. Ako niste aktivirali ključ oporavka,svoje podatke nećete moći dohvatitinakon što vaša lozinka bude resetirana.<br />Ako ne znate što učiniti, prije nego linastavite, molimo kontaktirajte svog administratora. <br />Želite li doista nastaviti?", "I know what I'm doing" : "Znam što radim", @@ -122,9 +125,9 @@ "Share with users or groups …" : "Podijeli sa korisnicima ili grupama ...", "Share with users, groups or remote users …" : "Podijeli sa korisnicima, grupama ili udaljenim korisnicima ...", "Warning" : "Upozorenje", + "Delete" : "Izbrišite", "The object type is not specified." : "Vrsta objekta nije specificirana.", "Enter new" : "Unesite novi", - "Delete" : "Izbrišite", "Add" : "Dodajte", "Edit tags" : "Uredite oznake", "Error loading dialog template: {error}" : "Pogrešno učitavanje predloška dijaloga: {error}", @@ -139,13 +142,6 @@ "Please reload the page." : "Molimo, ponovno učitajte stranicu", "The update was unsuccessful. " : "Usklađivanje je bilo neuspješno.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Upravo ste preusmjeravani na ownCloud.", - "Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.", - "Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.", - "%s password reset" : "%s lozinka resetirana", - "Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova lozinka", - "Reset password" : "Resetirajte lozinku", "Searching other places" : "Pretraživanje drugih lokacija", "Personal" : "Osobno", "Users" : "Korisnici", @@ -200,6 +196,10 @@ "Please contact your administrator." : "Molimo kontaktirajte svog administratora.", "Log in" : "Prijavite se", "Alternative Logins" : "Alternativne prijave", + "Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova lozinka", + "Reset password" : "Resetirajte lozinku", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u načinu rada za jednog korisnika.", "This means only administrators can use the instance." : "To znači da tu instancu mogu koristiti samo administratori.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte svog administratora sustava ako se ova poruka ponavlja ili sepojavila neočekivano.", diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js index c69087ed82b..cb09b1b0e37 100644 --- a/core/l10n/hu_HU.js +++ b/core/l10n/hu_HU.js @@ -30,6 +30,12 @@ OC.L10N.register( "No crop data provided" : "Vágáshoz nincs adat megadva", "No valid crop data provided" : "Nem lett valós levágási adat megadva", "Crop is not square" : "Levágás nem négyzet alakú", + "Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.", + "Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.", + "Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nem tudtunk visszaállítási e-mailt küldeni, mert ehhez a felhasználóhoz nem tartozik e-mail cím. Kérjük, vedd fel a kapcsolatot a rendszergazdáddal!", + "%s password reset" : "%s jelszó visszaállítás", + "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "Sunday" : "vasárnap", "Monday" : "hétfő", "Tuesday" : "kedd", @@ -78,7 +84,6 @@ OC.L10N.register( "Settings" : "Beállítások", "Saving..." : "Mentés...", "seconds ago" : "pár másodperce", - "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne. Biztos, hogy folytatni kívánja?", "I know what I'm doing" : "Tudom mit csinálok.", @@ -158,9 +163,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...", "Warning" : "Figyelmeztetés", "Error while sending notification" : "Hiba történt az értesítő küldése közben", + "Delete" : "Törlés", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", - "Delete" : "Törlés", "Add" : "Hozzáadás", "Edit tags" : "Címkék szerkesztése", "Error loading dialog template: {error}" : "Hiba a párbeszédpanel-sablon betöltésekor: {error}", @@ -179,15 +184,6 @@ OC.L10N.register( "The update was unsuccessful. " : "A frissítés nem sikerült.", "The update was successful. There were warnings." : "A frissítés sikerült. Figyelmeztetések találhatók.", "The update was successful. Redirecting you to ownCloud now." : "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatáshoz.", - "Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.", - "Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.", - "Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nem tudtunk visszaállítási e-mailt küldeni, mert ehhez a felhasználóhoz nem tartozik e-mail cím. Kérjük, vedd fel a kapcsolatot a rendszergazdáddal!", - "%s password reset" : "%s jelszó visszaállítás", - "Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}", - "New password" : "Az új jelszó", - "New Password" : "Új jelszó", - "Reset password" : "Jelszó-visszaállítás", "Searching other places" : "Keresés más helyeken", "No search results in other folders" : "Nincs keresési eredmény a másik könyvtárakban", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} keresési eredmény egy másik könyvtárban","{count} keresési eredmény más könyvtárakban"], @@ -260,6 +256,10 @@ OC.L10N.register( "Wrong password." : "Rossz jelszó.", "Stay logged in" : "Maradjon bejelentkezve", "Alternative Logins" : "Alternatív bejelentkezés", + "Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}", + "New password" : "Az új jelszó", + "New Password" : "Új jelszó", + "Reset password" : "Jelszó-visszaállítás", "This ownCloud instance is currently in single user mode." : "Ez az ownCloud szolgáltatás jelenleg egyfelhasználós üzemmódban működik.", "This means only administrators can use the instance." : "Ez azt jelenti, hogy csak az adminisztrátor használhatja ezt a példányt", "Contact your system administrator if this message persists or appeared unexpectedly." : "Ha ez az üzenet ismételten vagy indokolatlanul megjelenik, akkor keresse a rendszergazda segítségét!", diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json index f3468817d44..880bd25cd09 100644 --- a/core/l10n/hu_HU.json +++ b/core/l10n/hu_HU.json @@ -28,6 +28,12 @@ "No crop data provided" : "Vágáshoz nincs adat megadva", "No valid crop data provided" : "Nem lett valós levágási adat megadva", "Crop is not square" : "Levágás nem négyzet alakú", + "Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.", + "Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.", + "Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nem tudtunk visszaállítási e-mailt küldeni, mert ehhez a felhasználóhoz nem tartozik e-mail cím. Kérjük, vedd fel a kapcsolatot a rendszergazdáddal!", + "%s password reset" : "%s jelszó visszaállítás", + "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "Sunday" : "vasárnap", "Monday" : "hétfő", "Tuesday" : "kedd", @@ -76,7 +82,6 @@ "Settings" : "Beállítások", "Saving..." : "Mentés...", "seconds ago" : "pár másodperce", - "Couldn't send reset email. Please contact your administrator." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne. Biztos, hogy folytatni kívánja?", "I know what I'm doing" : "Tudom mit csinálok.", @@ -156,9 +161,9 @@ "Share with users, groups or remote users …" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal ...", "Warning" : "Figyelmeztetés", "Error while sending notification" : "Hiba történt az értesítő küldése közben", + "Delete" : "Törlés", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", - "Delete" : "Törlés", "Add" : "Hozzáadás", "Edit tags" : "Címkék szerkesztése", "Error loading dialog template: {error}" : "Hiba a párbeszédpanel-sablon betöltésekor: {error}", @@ -177,15 +182,6 @@ "The update was unsuccessful. " : "A frissítés nem sikerült.", "The update was successful. There were warnings." : "A frissítés sikerült. Figyelmeztetések találhatók.", "The update was successful. Redirecting you to ownCloud now." : "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatáshoz.", - "Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.", - "Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.", - "Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nem tudtunk visszaállítási e-mailt küldeni, mert ehhez a felhasználóhoz nem tartozik e-mail cím. Kérjük, vedd fel a kapcsolatot a rendszergazdáddal!", - "%s password reset" : "%s jelszó visszaállítás", - "Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}", - "New password" : "Az új jelszó", - "New Password" : "Új jelszó", - "Reset password" : "Jelszó-visszaállítás", "Searching other places" : "Keresés más helyeken", "No search results in other folders" : "Nincs keresési eredmény a másik könyvtárakban", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} keresési eredmény egy másik könyvtárban","{count} keresési eredmény más könyvtárakban"], @@ -258,6 +254,10 @@ "Wrong password." : "Rossz jelszó.", "Stay logged in" : "Maradjon bejelentkezve", "Alternative Logins" : "Alternatív bejelentkezés", + "Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}", + "New password" : "Az új jelszó", + "New Password" : "Új jelszó", + "Reset password" : "Jelszó-visszaállítás", "This ownCloud instance is currently in single user mode." : "Ez az ownCloud szolgáltatás jelenleg egyfelhasználós üzemmódban működik.", "This means only administrators can use the instance." : "Ez azt jelenti, hogy csak az adminisztrátor használhatja ezt a példányt", "Contact your system administrator if this message persists or appeared unexpectedly." : "Ha ez az üzenet ismételten vagy indokolatlanul megjelenik, akkor keresse a rendszergazda segítségét!", diff --git a/core/l10n/hy.js b/core/l10n/hy.js index a09ee8f0110..d91d6e38ea0 100644 --- a/core/l10n/hy.js +++ b/core/l10n/hy.js @@ -57,8 +57,8 @@ OC.L10N.register( "Warning" : "Զգուշացում", "Delete" : "Ջնջել", "Add" : "Ավելացնել", - "New password" : "Նոր գաղտնաբառ", "Personal" : "Անձնական", - "Username" : "Օգտանուն" + "Username" : "Օգտանուն", + "New password" : "Նոր գաղտնաբառ" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/hy.json b/core/l10n/hy.json index 52bc1322a8e..008990ee02f 100644 --- a/core/l10n/hy.json +++ b/core/l10n/hy.json @@ -55,8 +55,8 @@ "Warning" : "Զգուշացում", "Delete" : "Ջնջել", "Add" : "Ավելացնել", - "New password" : "Նոր գաղտնաբառ", "Personal" : "Անձնական", - "Username" : "Օգտանուն" + "Username" : "Օգտանուն", + "New password" : "Նոր գաղտնաբառ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/ia.js b/core/l10n/ia.js index 254699c5fd2..0b95a420417 100644 --- a/core/l10n/ia.js +++ b/core/l10n/ia.js @@ -12,6 +12,8 @@ OC.L10N.register( "Unknown filetype" : "Typo de file incognite", "Invalid image" : "Imagine invalide", "No temporary profile picture available, try again" : "Necun photo de profilo temporanee disponibile, essaya novemente", + "%s password reset" : "%s contrasigno re-fixate", + "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "Sunday" : "Dominica", "Monday" : "Lunedi", "Tuesday" : "Martedi", @@ -53,7 +55,6 @@ OC.L10N.register( "Settings" : "Configurationes", "Saving..." : "Salveguardante...", "seconds ago" : "secundas passate", - "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "I know what I'm doing" : "Io sape lo que io es facente", "Password can not be changed. Please contact your administrator." : "Contrasigno non pote esser modificate. Pro favor continge tu administrator.", "No" : "No", @@ -105,18 +106,13 @@ OC.L10N.register( "access control" : "controlo de accesso", "Share" : "Compartir", "Warning" : "Aviso", + "Delete" : "Deler", "The object type is not specified." : "Le typo de objecto non es specificate", "Enter new" : "Inserta nove", - "Delete" : "Deler", "Add" : "Adder", "Edit tags" : "Modifica etiquettas", "Please reload the page." : "Pro favor recarga le pagina.", "The update was successful. Redirecting you to ownCloud now." : "Le actualisation terminava con successo. On redirige nunc a tu ownCloud.", - "%s password reset" : "%s contrasigno re-fixate", - "Use the following link to reset your password: {link}" : "Usa le ligamine sequente pro re-fixar tu contrasigno: {link}", - "New password" : "Nove contrasigno", - "New Password" : "Nove contrasigno", - "Reset password" : "Reinitialisar contrasigno", "Personal" : "Personal", "Users" : "Usatores", "Apps" : "Applicationes", @@ -156,6 +152,10 @@ OC.L10N.register( "Please contact your administrator." : "Pro favor continge tu administrator.", "Log in" : "Aperir session", "Alternative Logins" : "Accessos de autorisation alternative", + "Use the following link to reset your password: {link}" : "Usa le ligamine sequente pro re-fixar tu contrasigno: {link}", + "New password" : "Nove contrasigno", + "New Password" : "Nove contrasigno", + "Reset password" : "Reinitialisar contrasigno", "Thank you for your patience." : "Gratias pro tu patientia.", "Start update" : "Initia actualisation" }, diff --git a/core/l10n/ia.json b/core/l10n/ia.json index f3173a9dd35..7c99ed3c5b0 100644 --- a/core/l10n/ia.json +++ b/core/l10n/ia.json @@ -10,6 +10,8 @@ "Unknown filetype" : "Typo de file incognite", "Invalid image" : "Imagine invalide", "No temporary profile picture available, try again" : "Necun photo de profilo temporanee disponibile, essaya novemente", + "%s password reset" : "%s contrasigno re-fixate", + "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "Sunday" : "Dominica", "Monday" : "Lunedi", "Tuesday" : "Martedi", @@ -51,7 +53,6 @@ "Settings" : "Configurationes", "Saving..." : "Salveguardante...", "seconds ago" : "secundas passate", - "Couldn't send reset email. Please contact your administrator." : "On non pote inviar message de configurar ex novo. Pro favor continge tu administrator.", "I know what I'm doing" : "Io sape lo que io es facente", "Password can not be changed. Please contact your administrator." : "Contrasigno non pote esser modificate. Pro favor continge tu administrator.", "No" : "No", @@ -103,18 +104,13 @@ "access control" : "controlo de accesso", "Share" : "Compartir", "Warning" : "Aviso", + "Delete" : "Deler", "The object type is not specified." : "Le typo de objecto non es specificate", "Enter new" : "Inserta nove", - "Delete" : "Deler", "Add" : "Adder", "Edit tags" : "Modifica etiquettas", "Please reload the page." : "Pro favor recarga le pagina.", "The update was successful. Redirecting you to ownCloud now." : "Le actualisation terminava con successo. On redirige nunc a tu ownCloud.", - "%s password reset" : "%s contrasigno re-fixate", - "Use the following link to reset your password: {link}" : "Usa le ligamine sequente pro re-fixar tu contrasigno: {link}", - "New password" : "Nove contrasigno", - "New Password" : "Nove contrasigno", - "Reset password" : "Reinitialisar contrasigno", "Personal" : "Personal", "Users" : "Usatores", "Apps" : "Applicationes", @@ -154,6 +150,10 @@ "Please contact your administrator." : "Pro favor continge tu administrator.", "Log in" : "Aperir session", "Alternative Logins" : "Accessos de autorisation alternative", + "Use the following link to reset your password: {link}" : "Usa le ligamine sequente pro re-fixar tu contrasigno: {link}", + "New password" : "Nove contrasigno", + "New Password" : "Nove contrasigno", + "Reset password" : "Reinitialisar contrasigno", "Thank you for your patience." : "Gratias pro tu patientia.", "Start update" : "Initia actualisation" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/id.js b/core/l10n/id.js index b0efff2b1ef..d2b06839ba3 100644 --- a/core/l10n/id.js +++ b/core/l10n/id.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Tidak ada data krop tersedia", "No valid crop data provided" : "Tidak ada data valid untuk dipangkas", "Crop is not square" : "Pangkas ini tidak persegi", + "Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah", + "Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa", + "Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.", + "%s password reset" : "%s sandi disetel ulang", + "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "Sunday" : "Minggu", "Monday" : "Senin", "Tuesday" : "Selasa", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Pengaturan", "Saving..." : "Menyimpan...", "seconds ago" : "beberapa detik yang lalu", - "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?", "I know what I'm doing" : "Saya tahu apa yang saya lakukan", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...", "Warning" : "Peringatan", "Error while sending notification" : "Kesalahan ketika mengirim notifikasi", + "Delete" : "Hapus", "The object type is not specified." : "Tipe objek tidak ditentukan.", "Enter new" : "Masukkan baru", - "Delete" : "Hapus", "Add" : "Tambah", "Edit tags" : "Sunting label", "Error loading dialog template: {error}" : "Kesalahan saat memuat templat dialog: {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Pembaruan tidak berhasil.", "The update was successful. There were warnings." : "Pembaruan telah berhasil. Terdapat peringatan.", "The update was successful. Redirecting you to ownCloud now." : "Pembaruan sukses. Anda akan diarahkan ulang ke ownCloud.", - "Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah", - "Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa", - "Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.", - "%s password reset" : "%s sandi disetel ulang", - "Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}", - "New password" : "Sandi baru", - "New Password" : "Sandi Baru", - "Reset password" : "Setel ulang sandi", "Searching other places" : "Mencari tempat lainnya", "No search results in other folders" : "Tidak ada hasil penelusuran didalam folder yang lain", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hasil pencarian di folder lain"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Sandi salah. Atur ulang?", "Stay logged in" : "Tetap masuk", "Alternative Logins" : "Cara Alternatif untuk Masuk", + "Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}", + "New password" : "Sandi baru", + "New Password" : "Sandi Baru", + "Reset password" : "Setel ulang sandi", "This ownCloud instance is currently in single user mode." : "ownCloud ini sedang dalam mode pengguna tunggal.", "This means only administrators can use the instance." : "Ini berarti hanya administrator yang dapat menggunakan ownCloud.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hubungi administrator sistem anda jika pesan ini terus muncul atau muncul tiba-tiba.", diff --git a/core/l10n/id.json b/core/l10n/id.json index 0ee6a256d42..7c997cdb25f 100644 --- a/core/l10n/id.json +++ b/core/l10n/id.json @@ -28,6 +28,11 @@ "No crop data provided" : "Tidak ada data krop tersedia", "No valid crop data provided" : "Tidak ada data valid untuk dipangkas", "Crop is not square" : "Pangkas ini tidak persegi", + "Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah", + "Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa", + "Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.", + "%s password reset" : "%s sandi disetel ulang", + "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "Sunday" : "Minggu", "Monday" : "Senin", "Tuesday" : "Selasa", @@ -76,7 +81,6 @@ "Settings" : "Pengaturan", "Saving..." : "Menyimpan...", "seconds ago" : "beberapa detik yang lalu", - "Couldn't send reset email. Please contact your administrator." : "Tidak dapat mengirim email setel ulang. Silakan hubungi administrator Anda.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Sebuah tautan untuk setel ulang sandi Anda telah dikirim ke email Anda. Jika Anda tidak menerima dalam jangka waktu yang wajar, periksa folder spam/sampah Anda.<br>Jika tidak ada, tanyakan pada administrator Anda.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Berkas-berkas Anda terenkripsi. Jika Anda tidak mengaktifkan kunci pemulihan, tidak ada cara lain untuk mendapatkan data Anda kembali setelah sandi di setel ulang.<br />Jika Anda tidak yakin dengan apa yang akan Anda dilakukan, mohon hubungi administrator Anda sebelum melanjutkan. <br />Apakah Anda yakin ingin melanjutkan?", "I know what I'm doing" : "Saya tahu apa yang saya lakukan", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "Bagikan dengan pengguna, grup atau pengguna remote ...", "Warning" : "Peringatan", "Error while sending notification" : "Kesalahan ketika mengirim notifikasi", + "Delete" : "Hapus", "The object type is not specified." : "Tipe objek tidak ditentukan.", "Enter new" : "Masukkan baru", - "Delete" : "Hapus", "Add" : "Tambah", "Edit tags" : "Sunting label", "Error loading dialog template: {error}" : "Kesalahan saat memuat templat dialog: {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "Pembaruan tidak berhasil.", "The update was successful. There were warnings." : "Pembaruan telah berhasil. Terdapat peringatan.", "The update was successful. Redirecting you to ownCloud now." : "Pembaruan sukses. Anda akan diarahkan ulang ke ownCloud.", - "Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah", - "Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa", - "Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.", - "%s password reset" : "%s sandi disetel ulang", - "Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}", - "New password" : "Sandi baru", - "New Password" : "Sandi Baru", - "Reset password" : "Setel ulang sandi", "Searching other places" : "Mencari tempat lainnya", "No search results in other folders" : "Tidak ada hasil penelusuran didalam folder yang lain", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} hasil pencarian di folder lain"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "Sandi salah. Atur ulang?", "Stay logged in" : "Tetap masuk", "Alternative Logins" : "Cara Alternatif untuk Masuk", + "Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}", + "New password" : "Sandi baru", + "New Password" : "Sandi Baru", + "Reset password" : "Setel ulang sandi", "This ownCloud instance is currently in single user mode." : "ownCloud ini sedang dalam mode pengguna tunggal.", "This means only administrators can use the instance." : "Ini berarti hanya administrator yang dapat menggunakan ownCloud.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hubungi administrator sistem anda jika pesan ini terus muncul atau muncul tiba-tiba.", diff --git a/core/l10n/is.js b/core/l10n/is.js index f965ef064a9..70ef414b261 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -23,6 +23,11 @@ OC.L10N.register( "No crop data provided" : "Enginn klippi gögn veit", "No valid crop data provided" : "Ógild klippi gögn veit", "Crop is not square" : "Skurður er ekki ferhyrntur", + "Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt", + "Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið", + "Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.", + "%s password reset" : "%s lykilorð endurstillt", + "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "Sunday" : "Sunnudagur", "Monday" : "Mánudagur", "Tuesday" : "Þriðjudagur", @@ -71,7 +76,6 @@ OC.L10N.register( "Settings" : "Stillingar", "Saving..." : "Er að vista ...", "seconds ago" : "sek.", - "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Hlekkurinn til að endurstilla lykilorðið þitt hefur verið sent á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá í ruslpóst möppu.<br>Ef það er ekki þar spurðu þá kerfisstjórann þinn.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skrárnar þínar eru dulkóðaðar. Ef þú hefur ekki kveikt á vara lykill, það verður engin leið til að fá þinn gögn til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað á að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?", "I know what I'm doing" : "Ég veit hvað ég er að gera", @@ -149,9 +153,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...", "Warning" : "Aðvörun", "Error while sending notification" : "Villa við að senda tilkynningu", + "Delete" : "Eyða", "The object type is not specified." : "Tegund ekki tilgreind", "Enter new" : "Sláðu inn nýtt", - "Delete" : "Eyða", "Add" : "Bæta við", "Edit tags" : "Breyta tögum", "Error loading dialog template: {error}" : "Villa við að hlaða valmynd sniðmátið: {error}", @@ -168,14 +172,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Uppfærslan tókst ekki.", "The update was successful. There were warnings." : "Uppfærslan tókst. Það voru viðvaranir.", "The update was successful. Redirecting you to ownCloud now." : "Uppfærslan heppnaðist. Beini þér til ownCloud nú.", - "Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt", - "Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið", - "Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.", - "%s password reset" : "%s lykilorð endurstillt", - "Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}", - "New password" : "Nýtt lykilorð", - "New Password" : "Nýtt Lykilorð", - "Reset password" : "Endursetja lykilorð", "Searching other places" : "Leitað á öðrum stöðum", "Personal" : "Um mig", "Users" : "Notendur", @@ -244,6 +240,10 @@ OC.L10N.register( "Log in" : "Skrá inn", "Wrong password. Reset it?" : "Rangt lykilorð. Endursetja?", "Alternative Logins" : "Aðrar Innskráningar", + "Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}", + "New password" : "Nýtt lykilorð", + "New Password" : "Nýtt Lykilorð", + "Reset password" : "Endursetja lykilorð", "This ownCloud instance is currently in single user mode." : "Þetta ownCloud eintak er nú í einnar notandaham.", "This means only administrators can use the instance." : "Þetta þýðir aðeins stjórnendur geta notað eintak.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hafðu samband við kerfisstjóra ef þessi skilaboð eru viðvarandi eða birtist óvænt.", diff --git a/core/l10n/is.json b/core/l10n/is.json index 4e80bb75204..f699e93fc17 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -21,6 +21,11 @@ "No crop data provided" : "Enginn klippi gögn veit", "No valid crop data provided" : "Ógild klippi gögn veit", "Crop is not square" : "Skurður er ekki ferhyrntur", + "Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt", + "Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið", + "Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.", + "%s password reset" : "%s lykilorð endurstillt", + "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "Sunday" : "Sunnudagur", "Monday" : "Mánudagur", "Tuesday" : "Þriðjudagur", @@ -69,7 +74,6 @@ "Settings" : "Stillingar", "Saving..." : "Er að vista ...", "seconds ago" : "sek.", - "Couldn't send reset email. Please contact your administrator." : "Gat ekki sent endursetningar tölvupóst. Vinsamlegast hafðu samband við kerfisstjóra.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Hlekkurinn til að endurstilla lykilorðið þitt hefur verið sent á netfangið þitt. Ef þú færð ekki póstinn innan hæfilegs tíma, athugaðu þá í ruslpóst möppu.<br>Ef það er ekki þar spurðu þá kerfisstjórann þinn.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Skrárnar þínar eru dulkóðaðar. Ef þú hefur ekki kveikt á vara lykill, það verður engin leið til að fá þinn gögn til baka eftir lykilorðið þitt er endurstillt.<br />Ef þú ert ekki viss hvað á að gera, skaltu hafa samband við kerfisstjórann áður en þú heldur áfram. <br />Viltu halda áfram?", "I know what I'm doing" : "Ég veit hvað ég er að gera", @@ -147,9 +151,9 @@ "Share with users, groups or remote users …" : "Deila með notendum, hópa eða ytri notendum ...", "Warning" : "Aðvörun", "Error while sending notification" : "Villa við að senda tilkynningu", + "Delete" : "Eyða", "The object type is not specified." : "Tegund ekki tilgreind", "Enter new" : "Sláðu inn nýtt", - "Delete" : "Eyða", "Add" : "Bæta við", "Edit tags" : "Breyta tögum", "Error loading dialog template: {error}" : "Villa við að hlaða valmynd sniðmátið: {error}", @@ -166,14 +170,6 @@ "The update was unsuccessful. " : "Uppfærslan tókst ekki.", "The update was successful. There were warnings." : "Uppfærslan tókst. Það voru viðvaranir.", "The update was successful. Redirecting you to ownCloud now." : "Uppfærslan heppnaðist. Beini þér til ownCloud nú.", - "Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt", - "Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið", - "Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.", - "%s password reset" : "%s lykilorð endurstillt", - "Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}", - "New password" : "Nýtt lykilorð", - "New Password" : "Nýtt Lykilorð", - "Reset password" : "Endursetja lykilorð", "Searching other places" : "Leitað á öðrum stöðum", "Personal" : "Um mig", "Users" : "Notendur", @@ -242,6 +238,10 @@ "Log in" : "Skrá inn", "Wrong password. Reset it?" : "Rangt lykilorð. Endursetja?", "Alternative Logins" : "Aðrar Innskráningar", + "Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}", + "New password" : "Nýtt lykilorð", + "New Password" : "Nýtt Lykilorð", + "Reset password" : "Endursetja lykilorð", "This ownCloud instance is currently in single user mode." : "Þetta ownCloud eintak er nú í einnar notandaham.", "This means only administrators can use the instance." : "Þetta þýðir aðeins stjórnendur geta notað eintak.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hafðu samband við kerfisstjóra ef þessi skilaboð eru viðvarandi eða birtist óvænt.", diff --git a/core/l10n/it.js b/core/l10n/it.js index 02918ab937a..247530f5080 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Non sono stati forniti dati di ritaglio", "No valid crop data provided" : "Non sono stati forniti dati di ritaglio validi", "Crop is not square" : "Il ritaglio non è quadrato", + "Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido", + "Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto", + "Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", + "%s password reset" : "Ripristino password di %s", + "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "Sunday" : "Domenica", "Monday" : "Lunedì", "Tuesday" : "Martedì", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Impostazioni", "Saving..." : "Salvataggio in corso...", "seconds ago" : "secondi fa", - "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", "I know what I'm doing" : "So cosa sto facendo", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Condividi con utenti, gruppi o utenti remoti...", "Warning" : "Avviso", "Error while sending notification" : "Errore durante l'invio della notifica", + "Delete" : "Elimina", "The object type is not specified." : "Il tipo di oggetto non è specificato.", "Enter new" : "Inserisci nuovo", - "Delete" : "Elimina", "Add" : "Aggiungi", "Edit tags" : "Modifica etichette", "Error loading dialog template: {error}" : "Errore durante il caricamento del modello di finestra: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "L'aggiornamento non è riuscito.", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", "The update was successful. Redirecting you to ownCloud now." : "L'aggiornamento è stato effettuato correttamente. Stai per essere reindirizzato a ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido", - "Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto", - "Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", - "%s password reset" : "Ripristino password di %s", - "Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}", - "New password" : "Nuova password", - "New Password" : "Nuova password", - "Reset password" : "Ripristina la password", "Searching other places" : "Ricerca in altre posizioni", "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", + "Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}", + "New password" : "Nuova password", + "New Password" : "Nuova password", + "Reset password" : "Ripristina la password", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", "This means only administrators can use the instance." : "Ciò significa che solo gli amministratori possono utilizzare l'istanza.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contatta il tuo amministratore di sistema se questo messaggio persiste o appare inaspettatamente.", diff --git a/core/l10n/it.json b/core/l10n/it.json index bef77a7342f..dab21431eff 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -33,6 +33,12 @@ "No crop data provided" : "Non sono stati forniti dati di ritaglio", "No valid crop data provided" : "Non sono stati forniti dati di ritaglio validi", "Crop is not square" : "Il ritaglio non è quadrato", + "Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido", + "Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto", + "Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", + "%s password reset" : "Ripristino password di %s", + "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "Sunday" : "Domenica", "Monday" : "Lunedì", "Tuesday" : "Martedì", @@ -82,7 +88,6 @@ "Settings" : "Impostazioni", "Saving..." : "Salvataggio in corso...", "seconds ago" : "secondi fa", - "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Il collegamento per reimpostare la password è stato inviato al tuo indirizzo di posta. Se non lo ricevi in tempi ragionevoli, controlla le cartelle della posta indesiderata.<br>Se non dovesse essere nemmeno lì, contatta il tuo amministratore locale.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "I tuoi file sono cifrati. Se non hai precedentemente abilitato la chiave di ripristino, non sarà più possibile ritrovare i tuoi dati una volta che la password sarà reimpostata.<br />Se non sei sicuro, contatta l'amministratore prima di proseguire.<br />Vuoi davvero continuare?", "I know what I'm doing" : "So cosa sto facendo", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Condividi con utenti, gruppi o utenti remoti...", "Warning" : "Avviso", "Error while sending notification" : "Errore durante l'invio della notifica", + "Delete" : "Elimina", "The object type is not specified." : "Il tipo di oggetto non è specificato.", "Enter new" : "Inserisci nuovo", - "Delete" : "Elimina", "Add" : "Aggiungi", "Edit tags" : "Modifica etichette", "Error loading dialog template: {error}" : "Errore durante il caricamento del modello di finestra: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "L'aggiornamento non è riuscito.", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", "The update was successful. Redirecting you to ownCloud now." : "L'aggiornamento è stato effettuato correttamente. Stai per essere reindirizzato a ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido", - "Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto", - "Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", - "%s password reset" : "Ripristino password di %s", - "Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}", - "New password" : "Nuova password", - "New Password" : "Nuova password", - "Reset password" : "Ripristina la password", "Searching other places" : "Ricerca in altre posizioni", "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} risultato di ricerca in altre cartelle","{count} risultati di ricerca in altre cartelle"], @@ -269,6 +265,10 @@ "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", + "Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}", + "New password" : "Nuova password", + "New Password" : "Nuova password", + "Reset password" : "Ripristina la password", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", "This means only administrators can use the instance." : "Ciò significa che solo gli amministratori possono utilizzare l'istanza.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contatta il tuo amministratore di sistema se questo messaggio persiste o appare inaspettatamente.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 07f3ac3aadf..07b6b2e4aa6 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "クロップデータは提供されません", "No valid crop data provided" : "有効なクロップデータは提供されません", "Crop is not square" : "クロップが正方形ではありません", + "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", + "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", + "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", + "%s password reset" : "%s パスワードリセット", + "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "Sunday" : "日", "Monday" : "月", "Tuesday" : "火", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "設定", "Saving..." : "保存中...", "seconds ago" : "数秒前", - "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<br>それでも見つからなかった場合は、管理者に問合わせてください。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ファイルが暗号化されています。リカバリーキーが有効でない場合は、パスワードをリセットした後にあなたのデータを元に戻す方法はありません。<br />どういうことか分からない場合は、操作を継続する前に管理者に問い合わせてください。<br />続けてよろしいでしょうか?", "I know what I'm doing" : "どういう操作をしているか理解しています", @@ -168,9 +173,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "ユーザー、グループもしくはリモートユーザーと共有 ...", "Warning" : "警告", "Error while sending notification" : "通知送信中にエラーが発生", + "Delete" : "削除", "The object type is not specified." : "オブジェクトタイプが指定されていません。", "Enter new" : "新規に入力", - "Delete" : "削除", "Add" : "追加", "Edit tags" : "タグを編集", "Error loading dialog template: {error}" : "メッセージテンプレートの読み込みエラー: {error}", @@ -189,15 +194,6 @@ OC.L10N.register( "The update was unsuccessful. " : "アップデートに失敗しました。", "The update was successful. There were warnings." : "アップデートは成功しました。警告がありました。", "The update was successful. Redirecting you to ownCloud now." : "アップデートに成功しました。今すぐownCloudにリダイレクトします。", - "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", - "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", - "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", - "%s password reset" : "%s パスワードリセット", - "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", - "New password" : "新しいパスワードを入力", - "New Password" : "新しいパスワード", - "Reset password" : "パスワードをリセット", "Searching other places" : "他の場所の検索", "No search results in other folders" : "他のフォルダーの検索結果はありません", "_{count} search result in another folder_::_{count} search results in other folders_" : ["他のフォルダーの検索件数 {count}"], @@ -270,6 +266,10 @@ OC.L10N.register( "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", + "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", + "New password" : "新しいパスワードを入力", + "New Password" : "新しいパスワード", + "Reset password" : "パスワードをリセット", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", "This means only administrators can use the instance." : "これは、管理者のみがインスタンスを利用できることを意味しています。", "Contact your system administrator if this message persists or appeared unexpectedly." : "このメッセージが引き続きもしくは予期せず現れる場合は、システム管理者に問い合わせてください。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 769e2d53ea0..6e4a12748e5 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -33,6 +33,12 @@ "No crop data provided" : "クロップデータは提供されません", "No valid crop data provided" : "有効なクロップデータは提供されません", "Crop is not square" : "クロップが正方形ではありません", + "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", + "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", + "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", + "%s password reset" : "%s パスワードリセット", + "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "Sunday" : "日", "Monday" : "月", "Tuesday" : "火", @@ -82,7 +88,6 @@ "Settings" : "設定", "Saving..." : "保存中...", "seconds ago" : "数秒前", - "Couldn't send reset email. Please contact your administrator." : "リセットメールを送信できませんでした。管理者に問い合わせてください。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "パスワードをリセットするリンクをクリックしたので、メールを送信しました。しばらくたってもメールが届かなかった場合は、スパム/ジャンクフォルダーを確認してください。<br>それでも見つからなかった場合は、管理者に問合わせてください。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ファイルが暗号化されています。リカバリーキーが有効でない場合は、パスワードをリセットした後にあなたのデータを元に戻す方法はありません。<br />どういうことか分からない場合は、操作を継続する前に管理者に問い合わせてください。<br />続けてよろしいでしょうか?", "I know what I'm doing" : "どういう操作をしているか理解しています", @@ -166,9 +171,9 @@ "Share with users, groups or remote users …" : "ユーザー、グループもしくはリモートユーザーと共有 ...", "Warning" : "警告", "Error while sending notification" : "通知送信中にエラーが発生", + "Delete" : "削除", "The object type is not specified." : "オブジェクトタイプが指定されていません。", "Enter new" : "新規に入力", - "Delete" : "削除", "Add" : "追加", "Edit tags" : "タグを編集", "Error loading dialog template: {error}" : "メッセージテンプレートの読み込みエラー: {error}", @@ -187,15 +192,6 @@ "The update was unsuccessful. " : "アップデートに失敗しました。", "The update was successful. There were warnings." : "アップデートは成功しました。警告がありました。", "The update was successful. Redirecting you to ownCloud now." : "アップデートに成功しました。今すぐownCloudにリダイレクトします。", - "Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした", - "Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした", - "Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。", - "%s password reset" : "%s パスワードリセット", - "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", - "New password" : "新しいパスワードを入力", - "New Password" : "新しいパスワード", - "Reset password" : "パスワードをリセット", "Searching other places" : "他の場所の検索", "No search results in other folders" : "他のフォルダーの検索結果はありません", "_{count} search result in another folder_::_{count} search results in other folders_" : ["他のフォルダーの検索件数 {count}"], @@ -268,6 +264,10 @@ "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", + "Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}", + "New password" : "新しいパスワードを入力", + "New Password" : "新しいパスワード", + "Reset password" : "パスワードをリセット", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", "This means only administrators can use the instance." : "これは、管理者のみがインスタンスを利用できることを意味しています。", "Contact your system administrator if this message persists or appeared unexpectedly." : "このメッセージが引き続きもしくは予期せず現れる場合は、システム管理者に問い合わせてください。", diff --git a/core/l10n/ka_GE.js b/core/l10n/ka_GE.js index d70352ee92c..86146ce0f20 100644 --- a/core/l10n/ka_GE.js +++ b/core/l10n/ka_GE.js @@ -75,13 +75,10 @@ OC.L10N.register( "access control" : "დაშვების კონტროლი", "Share" : "გაზიარება", "Warning" : "გაფრთხილება", - "The object type is not specified." : "ობიექტის ტიპი არ არის მითითებული.", "Delete" : "წაშლა", + "The object type is not specified." : "ობიექტის ტიპი არ არის მითითებული.", "Add" : "დამატება", "The update was successful. Redirecting you to ownCloud now." : "განახლება ვერ განხორციელდა. გადამისამართება თქვენს ownCloud–ზე.", - "Use the following link to reset your password: {link}" : "გამოიყენე შემდეგი ლინკი პაროლის შესაცვლელად: {link}", - "New password" : "ახალი პაროლი", - "Reset password" : "პაროლის შეცვლა", "Personal" : "პირადი", "Users" : "მომხმარებელი", "Apps" : "აპლიკაციები", @@ -102,6 +99,9 @@ OC.L10N.register( "Log out" : "გამოსვლა", "Search" : "ძებნა", "Log in" : "შესვლა", - "Alternative Logins" : "ალტერნატიული Login–ი" + "Alternative Logins" : "ალტერნატიული Login–ი", + "Use the following link to reset your password: {link}" : "გამოიყენე შემდეგი ლინკი პაროლის შესაცვლელად: {link}", + "New password" : "ახალი პაროლი", + "Reset password" : "პაროლის შეცვლა" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ka_GE.json b/core/l10n/ka_GE.json index fb6adcf7e77..8d855e61d11 100644 --- a/core/l10n/ka_GE.json +++ b/core/l10n/ka_GE.json @@ -73,13 +73,10 @@ "access control" : "დაშვების კონტროლი", "Share" : "გაზიარება", "Warning" : "გაფრთხილება", - "The object type is not specified." : "ობიექტის ტიპი არ არის მითითებული.", "Delete" : "წაშლა", + "The object type is not specified." : "ობიექტის ტიპი არ არის მითითებული.", "Add" : "დამატება", "The update was successful. Redirecting you to ownCloud now." : "განახლება ვერ განხორციელდა. გადამისამართება თქვენს ownCloud–ზე.", - "Use the following link to reset your password: {link}" : "გამოიყენე შემდეგი ლინკი პაროლის შესაცვლელად: {link}", - "New password" : "ახალი პაროლი", - "Reset password" : "პაროლის შეცვლა", "Personal" : "პირადი", "Users" : "მომხმარებელი", "Apps" : "აპლიკაციები", @@ -100,6 +97,9 @@ "Log out" : "გამოსვლა", "Search" : "ძებნა", "Log in" : "შესვლა", - "Alternative Logins" : "ალტერნატიული Login–ი" + "Alternative Logins" : "ალტერნატიული Login–ი", + "Use the following link to reset your password: {link}" : "გამოიყენე შემდეგი ლინკი პაროლის შესაცვლელად: {link}", + "New password" : "ახალი პაროლი", + "Reset password" : "პაროლის შეცვლა" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/km.js b/core/l10n/km.js index c84f02018d3..a4f6f2c5cfe 100644 --- a/core/l10n/km.js +++ b/core/l10n/km.js @@ -84,12 +84,10 @@ OC.L10N.register( "access control" : "សិទ្ធិបញ្ជា", "Share" : "ចែករំលែក", "Warning" : "បម្រាម", - "The object type is not specified." : "មិនបានកំណត់ប្រភេទវត្ថុ។", "Delete" : "លុប", + "The object type is not specified." : "មិនបានកំណត់ប្រភេទវត្ថុ។", "Add" : "បញ្ចូល", "Please reload the page." : "សូមផ្ទុកទំព័រនេះឡើងវិញ។", - "New password" : "ពាក្យសម្ងាត់ថ្មី", - "Reset password" : "កំណត់ពាក្យសម្ងាត់ម្ដងទៀត", "Personal" : "ផ្ទាល់ខ្លួន", "Users" : "អ្នកប្រើ", "Apps" : "កម្មវិធី", @@ -110,6 +108,8 @@ OC.L10N.register( "Log out" : "ចាកចេញ", "Search" : "ស្វែងរក", "Log in" : "ចូល", - "Alternative Logins" : "ការចូលជំនួស" + "Alternative Logins" : "ការចូលជំនួស", + "New password" : "ពាក្យសម្ងាត់ថ្មី", + "Reset password" : "កំណត់ពាក្យសម្ងាត់ម្ដងទៀត" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/km.json b/core/l10n/km.json index 480b6bb7b77..ec8b73f21c8 100644 --- a/core/l10n/km.json +++ b/core/l10n/km.json @@ -82,12 +82,10 @@ "access control" : "សិទ្ធិបញ្ជា", "Share" : "ចែករំលែក", "Warning" : "បម្រាម", - "The object type is not specified." : "មិនបានកំណត់ប្រភេទវត្ថុ។", "Delete" : "លុប", + "The object type is not specified." : "មិនបានកំណត់ប្រភេទវត្ថុ។", "Add" : "បញ្ចូល", "Please reload the page." : "សូមផ្ទុកទំព័រនេះឡើងវិញ។", - "New password" : "ពាក្យសម្ងាត់ថ្មី", - "Reset password" : "កំណត់ពាក្យសម្ងាត់ម្ដងទៀត", "Personal" : "ផ្ទាល់ខ្លួន", "Users" : "អ្នកប្រើ", "Apps" : "កម្មវិធី", @@ -108,6 +106,8 @@ "Log out" : "ចាកចេញ", "Search" : "ស្វែងរក", "Log in" : "ចូល", - "Alternative Logins" : "ការចូលជំនួស" + "Alternative Logins" : "ការចូលជំនួស", + "New password" : "ពាក្យសម្ងាត់ថ្មី", + "Reset password" : "កំណត់ពាក្យសម្ងាត់ម្ដងទៀត" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/kn.js b/core/l10n/kn.js index 97d90600a6d..eb59d43a9e1 100644 --- a/core/l10n/kn.js +++ b/core/l10n/kn.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ", "No temporary profile picture available, try again" : "ಯಾವುದೇ ತಾತ್ಕಾಲಿಕ ವ್ಯಕ್ತಿ ಚಿತ್ರ ದೊರಕುತ್ತಿಲ್ಲ, ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", "No crop data provided" : "ಸುಕ್ಕು ಒದಗಿಸಿದ ಮಾಹಿತಿ ", + "Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", + "%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", + "Couldn't send reset email. Please contact your administrator." : "ರೀಸೆಟ್ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", "Sunday" : "ಭಾನುವಾರ", "Monday" : "ಸೋಮವಾರ", "Tuesday" : "ಮಂಗಳವಾರ", @@ -34,7 +38,6 @@ OC.L10N.register( "December" : "ಡಿಸೆಂಬರ್", "Settings" : "ಆಯ್ಕೆಗಳು", "Saving..." : "ಉಳಿಸಲಾಗುತ್ತಿದೆ ...", - "Couldn't send reset email. Please contact your administrator." : "ರೀಸೆಟ್ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ನಿಮ್ಮ ಇ-ಅಂಚೆ ಪೆಟ್ಟಿಗೆಗೆ ಕಳುಹಿಸಲಾಗಿದೆ. ಇದನ್ನು ನಿರ್ದಿಷ್ಟ ಸಮಯದಲ್ಲಿ ಇ-ಅಂಚೆ ಪೆಟ್ಟಿಗೆಯ ಮುಖ್ಯ ಕೂಶದಲ್ಲಿ ಪಡೆಯದಿದ್ದಲ್ಲಿ, ಇತರೇ ಕೂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ. <br> ಇದು ಇನ್ನು ಬಾರದೆ ಇದ್ದರೆ, ನಿಮ್ಮ ಸ್ಥಳೀಯ ಸಂಕೀರ್ಣ ವ್ಯವಸ್ಥೆಯ ನಿರ್ವಾಹಕರ ಸಹಾಯ ಕೇಳಿ.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ನಿಮ್ಮ ಕಡತಗಳನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್. ನೀವು ಚೇತರಿಕೆ ಕೀ ಸಶಕ್ತ ಇದ್ದರೆ, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ರೀಸೆಟ್ ಮತ್ತೆ ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಪಡೆಯಲು ಯಾವುದೇ ದಾರಿ ಇರುತ್ತದೆ. <br /> ನೀವು ಏನು ಖಚಿತವಾಗಿ ಇದ್ದರೆ ನೀವು ಮುಂದುವರೆಯಲು ಮೊದಲು, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. <br /> ನೀವು ನಿಜವಾಗಿಯೂ ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?", "I know what I'm doing" : "ಏನು ಮಾಡುತ್ತಿರುವೆ ಎಂದು ನನಗೆ ತಿಳಿದಿದೆ", @@ -96,9 +99,9 @@ OC.L10N.register( "access control" : "ಪ್ರವೇಶ ನಿಯಂತ್ರಣ", "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", "Warning" : "ಎಚ್ಚರಿಕೆ", + "Delete" : "ಅಳಿಸಿ", "The object type is not specified." : "ವಸ್ತು ಮಾದರಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ.", "Enter new" : "ಹೊಸ ನಮೂದನೆ", - "Delete" : "ಅಳಿಸಿ", "Add" : "ಸೇರಿಸಿ", "Edit tags" : "ಕಿರು-ಪದ ಗಳನ್ನು ಸಂಪಾದಿಸು", "No tags selected for deletion." : "ಯಾವುದೇ ಕಿರು ಪದಗಳನ್ನ ಅಳಿಸಲು ಆಯ್ಕೆ ಇಲ್ಲ.", @@ -109,13 +112,6 @@ OC.L10N.register( "_download %n file_::_download %n files_" : ["%n ಕಡತಗಳನ್ನು ಸ್ಥಳೀಯ ಪ್ರತಿಯಾಗಿಸಿ"], "Please reload the page." : "ಪುಟವನ್ನು ಪುನಃ ನವೀಕರಿಸಿ.", "The update was unsuccessful. " : "ಆಧುನೀಕರಿಣೆ ಯಶಸ್ವಿಯಾಗಿಲ್ಲ.", - "Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", - "%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", - "Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}", - "New password" : "ಹೊಸ ಗುಪ್ತಪದ", - "New Password" : "ಹೊಸ ಗುಪ್ತಪದ", - "Reset password" : "ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", "Personal" : "ವೈಯಕ್ತಿಕ", "Users" : "ಬಳಕೆದಾರರು", "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು", @@ -156,6 +152,10 @@ OC.L10N.register( "Log out" : "ಈ ಆವೃತ್ತಿ ಇಂದ ನಿರ್ಗಮಿಸಿ", "Search" : "ಹುಡುಕು", "Please contact your administrator." : "ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಲು ಕೋರಲಾಗಿದೆ.", + "Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}", + "New password" : "ಹೊಸ ಗುಪ್ತಪದ", + "New Password" : "ಹೊಸ ಗುಪ್ತಪದ", + "Reset password" : "ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", "This ownCloud instance is currently in single user mode." : "ಪ್ರಸ್ತುತ ಕ್ರಮದಲ್ಲಿ, ಈ OwnCloud ನ್ನು ಕೇವಲ ಒಬ್ಬನೇ ಬಳಕೆದಾರ ಮಾತ್ರ ಬಳಸಬಹುದಾಗಿದೆ.", "This means only administrators can use the instance." : "ಇದರ ಅರ್ಥ, ಸದ್ಯದ ನಿದರ್ಶನದಲ್ಲಿ ನಿರ್ವಾಹಕರು ಮಾತ್ರ ಬಳಸಬಹುದಾಗಿದೆ.", "Thank you for your patience." : "ನಿಮ್ಮ ತಾಳ್ಮೆಗೆ ಧನ್ಯವಾದಗಳು.", diff --git a/core/l10n/kn.json b/core/l10n/kn.json index 0fef8e9abea..a5f25d40f33 100644 --- a/core/l10n/kn.json +++ b/core/l10n/kn.json @@ -11,6 +11,10 @@ "Invalid image" : "ಅಸಾಮರ್ಥ್ಯ ಚಿತ್ರ", "No temporary profile picture available, try again" : "ಯಾವುದೇ ತಾತ್ಕಾಲಿಕ ವ್ಯಕ್ತಿ ಚಿತ್ರ ದೊರಕುತ್ತಿಲ್ಲ, ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ", "No crop data provided" : "ಸುಕ್ಕು ಒದಗಿಸಿದ ಮಾಹಿತಿ ", + "Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", + "%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", + "Couldn't send reset email. Please contact your administrator." : "ರೀಸೆಟ್ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", "Sunday" : "ಭಾನುವಾರ", "Monday" : "ಸೋಮವಾರ", "Tuesday" : "ಮಂಗಳವಾರ", @@ -32,7 +36,6 @@ "December" : "ಡಿಸೆಂಬರ್", "Settings" : "ಆಯ್ಕೆಗಳು", "Saving..." : "ಉಳಿಸಲಾಗುತ್ತಿದೆ ...", - "Couldn't send reset email. Please contact your administrator." : "ರೀಸೆಟ್ ಇಮೇಲ್ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ನಿಮ್ಮ ಇ-ಅಂಚೆ ಪೆಟ್ಟಿಗೆಗೆ ಕಳುಹಿಸಲಾಗಿದೆ. ಇದನ್ನು ನಿರ್ದಿಷ್ಟ ಸಮಯದಲ್ಲಿ ಇ-ಅಂಚೆ ಪೆಟ್ಟಿಗೆಯ ಮುಖ್ಯ ಕೂಶದಲ್ಲಿ ಪಡೆಯದಿದ್ದಲ್ಲಿ, ಇತರೇ ಕೂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ. <br> ಇದು ಇನ್ನು ಬಾರದೆ ಇದ್ದರೆ, ನಿಮ್ಮ ಸ್ಥಳೀಯ ಸಂಕೀರ್ಣ ವ್ಯವಸ್ಥೆಯ ನಿರ್ವಾಹಕರ ಸಹಾಯ ಕೇಳಿ.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ನಿಮ್ಮ ಕಡತಗಳನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್. ನೀವು ಚೇತರಿಕೆ ಕೀ ಸಶಕ್ತ ಇದ್ದರೆ, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ರೀಸೆಟ್ ಮತ್ತೆ ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಪಡೆಯಲು ಯಾವುದೇ ದಾರಿ ಇರುತ್ತದೆ. <br /> ನೀವು ಏನು ಖಚಿತವಾಗಿ ಇದ್ದರೆ ನೀವು ಮುಂದುವರೆಯಲು ಮೊದಲು, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. <br /> ನೀವು ನಿಜವಾಗಿಯೂ ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಾ?", "I know what I'm doing" : "ಏನು ಮಾಡುತ್ತಿರುವೆ ಎಂದು ನನಗೆ ತಿಳಿದಿದೆ", @@ -94,9 +97,9 @@ "access control" : "ಪ್ರವೇಶ ನಿಯಂತ್ರಣ", "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", "Warning" : "ಎಚ್ಚರಿಕೆ", + "Delete" : "ಅಳಿಸಿ", "The object type is not specified." : "ವಸ್ತು ಮಾದರಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ.", "Enter new" : "ಹೊಸ ನಮೂದನೆ", - "Delete" : "ಅಳಿಸಿ", "Add" : "ಸೇರಿಸಿ", "Edit tags" : "ಕಿರು-ಪದ ಗಳನ್ನು ಸಂಪಾದಿಸು", "No tags selected for deletion." : "ಯಾವುದೇ ಕಿರು ಪದಗಳನ್ನ ಅಳಿಸಲು ಆಯ್ಕೆ ಇಲ್ಲ.", @@ -107,13 +110,6 @@ "_download %n file_::_download %n files_" : ["%n ಕಡತಗಳನ್ನು ಸ್ಥಳೀಯ ಪ್ರತಿಯಾಗಿಸಿ"], "Please reload the page." : "ಪುಟವನ್ನು ಪುನಃ ನವೀಕರಿಸಿ.", "The update was unsuccessful. " : "ಆಧುನೀಕರಿಣೆ ಯಶಸ್ವಿಯಾಗಿಲ್ಲ.", - "Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", - "%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", - "Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}", - "New password" : "ಹೊಸ ಗುಪ್ತಪದ", - "New Password" : "ಹೊಸ ಗುಪ್ತಪದ", - "Reset password" : "ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", "Personal" : "ವೈಯಕ್ತಿಕ", "Users" : "ಬಳಕೆದಾರರು", "Apps" : "ಕಾರ್ಯಕ್ರಮಗಳು", @@ -154,6 +150,10 @@ "Log out" : "ಈ ಆವೃತ್ತಿ ಇಂದ ನಿರ್ಗಮಿಸಿ", "Search" : "ಹುಡುಕು", "Please contact your administrator." : "ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಲು ಕೋರಲಾಗಿದೆ.", + "Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}", + "New password" : "ಹೊಸ ಗುಪ್ತಪದ", + "New Password" : "ಹೊಸ ಗುಪ್ತಪದ", + "Reset password" : "ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ", "This ownCloud instance is currently in single user mode." : "ಪ್ರಸ್ತುತ ಕ್ರಮದಲ್ಲಿ, ಈ OwnCloud ನ್ನು ಕೇವಲ ಒಬ್ಬನೇ ಬಳಕೆದಾರ ಮಾತ್ರ ಬಳಸಬಹುದಾಗಿದೆ.", "This means only administrators can use the instance." : "ಇದರ ಅರ್ಥ, ಸದ್ಯದ ನಿದರ್ಶನದಲ್ಲಿ ನಿರ್ವಾಹಕರು ಮಾತ್ರ ಬಳಸಬಹುದಾಗಿದೆ.", "Thank you for your patience." : "ನಿಮ್ಮ ತಾಳ್ಮೆಗೆ ಧನ್ಯವಾದಗಳು.", diff --git a/core/l10n/ko.js b/core/l10n/ko.js index 09864201ef5..86e369a473a 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "선택된 데이터가 없습니다.", "No valid crop data provided" : "올바른 잘라내기 데이터가 지정되지 않음", "Crop is not square" : "잘라내는 영역이 사각형이 아님", + "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", + "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", + "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", + "%s password reset" : "%s 암호 재설정", + "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "Sunday" : "일요일", "Monday" : "월요일", "Tuesday" : "화요일", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "설정", "Saving..." : "저장 중...", "seconds ago" : "초 지남", - "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<br>스팸함에도 없는 경우 로컬 관리자에게 문의하십시오.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "파일이 암호화되어 있습니다. 복구 키를 활성화하지 않았다면 암호를 초기화한 후 데이터를 복구할 수 없습니다.<br />무엇을 해야 할 지 잘 모르겠으면 계속하기 전에 관리자에게 연락하십시오.<br />그래도 계속 진행하시겠습니까?", "I know what I'm doing" : "지금 하려는 것을 알고 있습니다", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "사용자, 그룹 및 원격 사용자와 공유...", "Warning" : "경고", "Error while sending notification" : "알림을 보내는 중 오류 발생", + "Delete" : "삭제", "The object type is not specified." : "객체 유형이 지정되지 않았습니다.", "Enter new" : "새로운 값 입력", - "Delete" : "삭제", "Add" : "추가", "Edit tags" : "태그 편집", "Error loading dialog template: {error}" : "대화 상자 템플릿을 불러오는 중 오류 발생: {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "업데이트가 실패했습니다. ", "The update was successful. There were warnings." : "업데이트가 성공했습니다. 일부 경고가 있습니다.", "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공했습니다. ownCloud로 돌아갑니다.", - "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", - "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", - "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", - "%s password reset" : "%s 암호 재설정", - "Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}", - "New password" : "새 암호", - "New Password" : "새 암호", - "Reset password" : "암호 재설정", "Searching other places" : "다른 장소 찾는 중", "No search results in other folders" : "다른 폴더에 검색 결과 없음", "_{count} search result in another folder_::_{count} search results in other folders_" : ["다른 폴더의 검색 결과 {count}개"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "암호가 잘못되었습니다. 다시 설정하시겠습니까?", "Stay logged in" : "로그인 유지", "Alternative Logins" : "대체 로그인", + "Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}", + "New password" : "새 암호", + "New Password" : "새 암호", + "Reset password" : "암호 재설정", "This ownCloud instance is currently in single user mode." : "ownCloud 인스턴스가 현재 단일 사용자 모드로 동작 중입니다.", "This means only administrators can use the instance." : "현재 시스템 관리자만 인스턴스를 사용할 수 있습니다.", "Contact your system administrator if this message persists or appeared unexpectedly." : "이 메시지가 계속 표시되거나, 예상하지 못하였을 때 표시된다면 시스템 관리자에게 연락하십시오", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index ca246da388f..4bad4c1f93f 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -28,6 +28,11 @@ "No crop data provided" : "선택된 데이터가 없습니다.", "No valid crop data provided" : "올바른 잘라내기 데이터가 지정되지 않음", "Crop is not square" : "잘라내는 영역이 사각형이 아님", + "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", + "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", + "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", + "%s password reset" : "%s 암호 재설정", + "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "Sunday" : "일요일", "Monday" : "월요일", "Tuesday" : "화요일", @@ -76,7 +81,6 @@ "Settings" : "설정", "Saving..." : "저장 중...", "seconds ago" : "초 지남", - "Couldn't send reset email. Please contact your administrator." : "재설정 메일을 보낼수 없습니다. 관리자에게 문의하십시오.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "암호 재설정 링크를 포함하고 있는 이메일을 보냈습니다. 이메일이 도착하지 않은 경우 스팸함을 확인해 보십시오.<br>스팸함에도 없는 경우 로컬 관리자에게 문의하십시오.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "파일이 암호화되어 있습니다. 복구 키를 활성화하지 않았다면 암호를 초기화한 후 데이터를 복구할 수 없습니다.<br />무엇을 해야 할 지 잘 모르겠으면 계속하기 전에 관리자에게 연락하십시오.<br />그래도 계속 진행하시겠습니까?", "I know what I'm doing" : "지금 하려는 것을 알고 있습니다", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "사용자, 그룹 및 원격 사용자와 공유...", "Warning" : "경고", "Error while sending notification" : "알림을 보내는 중 오류 발생", + "Delete" : "삭제", "The object type is not specified." : "객체 유형이 지정되지 않았습니다.", "Enter new" : "새로운 값 입력", - "Delete" : "삭제", "Add" : "추가", "Edit tags" : "태그 편집", "Error loading dialog template: {error}" : "대화 상자 템플릿을 불러오는 중 오류 발생: {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "업데이트가 실패했습니다. ", "The update was successful. There were warnings." : "업데이트가 성공했습니다. 일부 경고가 있습니다.", "The update was successful. Redirecting you to ownCloud now." : "업데이트가 성공했습니다. ownCloud로 돌아갑니다.", - "Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다", - "Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다", - "Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.", - "%s password reset" : "%s 암호 재설정", - "Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}", - "New password" : "새 암호", - "New Password" : "새 암호", - "Reset password" : "암호 재설정", "Searching other places" : "다른 장소 찾는 중", "No search results in other folders" : "다른 폴더에 검색 결과 없음", "_{count} search result in another folder_::_{count} search results in other folders_" : ["다른 폴더의 검색 결과 {count}개"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "암호가 잘못되었습니다. 다시 설정하시겠습니까?", "Stay logged in" : "로그인 유지", "Alternative Logins" : "대체 로그인", + "Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}", + "New password" : "새 암호", + "New Password" : "새 암호", + "Reset password" : "암호 재설정", "This ownCloud instance is currently in single user mode." : "ownCloud 인스턴스가 현재 단일 사용자 모드로 동작 중입니다.", "This means only administrators can use the instance." : "현재 시스템 관리자만 인스턴스를 사용할 수 있습니다.", "Contact your system administrator if this message persists or appeared unexpectedly." : "이 메시지가 계속 표시되거나, 예상하지 못하였을 때 표시된다면 시스템 관리자에게 연락하십시오", diff --git a/core/l10n/ku_IQ.js b/core/l10n/ku_IQ.js index 066e7c365bc..82faa80db05 100644 --- a/core/l10n/ku_IQ.js +++ b/core/l10n/ku_IQ.js @@ -12,8 +12,6 @@ OC.L10N.register( "Share" : "هاوبەشی کردن", "Warning" : "ئاگاداری", "Add" : "زیادکردن", - "New password" : "وشەی نهێنی نوێ", - "Reset password" : "دووباره كردنهوهی وشهی نهێنی", "Users" : "بهكارهێنهر", "Apps" : "بهرنامهكان", "Admin" : "بهڕێوهبهری سهرهكی", @@ -26,6 +24,8 @@ OC.L10N.register( "Database host" : "هۆستی داتابهیس", "Finish setup" : "كۆتایی هات دهستكاریهكان", "Log out" : "چوونەدەرەوە", - "Search" : "بگەڕێ" + "Search" : "بگەڕێ", + "New password" : "وشەی نهێنی نوێ", + "Reset password" : "دووباره كردنهوهی وشهی نهێنی" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ku_IQ.json b/core/l10n/ku_IQ.json index 601ad30d303..bc105c06e4e 100644 --- a/core/l10n/ku_IQ.json +++ b/core/l10n/ku_IQ.json @@ -10,8 +10,6 @@ "Share" : "هاوبەشی کردن", "Warning" : "ئاگاداری", "Add" : "زیادکردن", - "New password" : "وشەی نهێنی نوێ", - "Reset password" : "دووباره كردنهوهی وشهی نهێنی", "Users" : "بهكارهێنهر", "Apps" : "بهرنامهكان", "Admin" : "بهڕێوهبهری سهرهكی", @@ -24,6 +22,8 @@ "Database host" : "هۆستی داتابهیس", "Finish setup" : "كۆتایی هات دهستكاریهكان", "Log out" : "چوونەدەرەوە", - "Search" : "بگەڕێ" + "Search" : "بگەڕێ", + "New password" : "وشەی نهێنی نوێ", + "Reset password" : "دووباره كردنهوهی وشهی نهێنی" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/lb.js b/core/l10n/lb.js index 0d900dcfd69..d2621ebae81 100644 --- a/core/l10n/lb.js +++ b/core/l10n/lb.js @@ -7,6 +7,7 @@ OC.L10N.register( "No image or file provided" : "Kee Bild oder Fichier uginn", "Unknown filetype" : "Onbekannten Fichier Typ", "Invalid image" : "Ongülteg d'Bild", + "%s password reset" : "%s Passwuert ass nei gesat", "Sunday" : "Sonndeg", "Monday" : "Méindeg", "Tuesday" : "Dënschdeg", @@ -86,16 +87,12 @@ OC.L10N.register( "access control" : "Zougrëffskontroll", "Share" : "Deelen", "Warning" : "Warnung", + "Delete" : "Läschen", "The object type is not specified." : "Den Typ vum Object ass net uginn.", "Enter new" : "Gëff nei an", - "Delete" : "Läschen", "Add" : "Dobäisetzen", "Edit tags" : "Tags editéieren", "The update was successful. Redirecting you to ownCloud now." : "Den Update war erfollegräich. Du gëss elo bei d'ownCloud ëmgeleet.", - "%s password reset" : "%s Passwuert ass nei gesat", - "Use the following link to reset your password: {link}" : "Benotz folgende Link fir däi Passwuert zréckzesetzen: {link}", - "New password" : "Neit Passwuert", - "Reset password" : "Passwuert zréck setzen", "Personal" : "Perséinlech", "Users" : "Benotzer", "Apps" : "Applikatiounen", @@ -121,6 +118,9 @@ OC.L10N.register( "Search" : "Sichen", "Log in" : "Umellen", "Alternative Logins" : "Alternativ Umeldungen", + "Use the following link to reset your password: {link}" : "Benotz folgende Link fir däi Passwuert zréckzesetzen: {link}", + "New password" : "Neit Passwuert", + "Reset password" : "Passwuert zréck setzen", "Thank you for your patience." : "Merci fir deng Gedold." }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/lb.json b/core/l10n/lb.json index c43c22990dc..cdab638f287 100644 --- a/core/l10n/lb.json +++ b/core/l10n/lb.json @@ -5,6 +5,7 @@ "No image or file provided" : "Kee Bild oder Fichier uginn", "Unknown filetype" : "Onbekannten Fichier Typ", "Invalid image" : "Ongülteg d'Bild", + "%s password reset" : "%s Passwuert ass nei gesat", "Sunday" : "Sonndeg", "Monday" : "Méindeg", "Tuesday" : "Dënschdeg", @@ -84,16 +85,12 @@ "access control" : "Zougrëffskontroll", "Share" : "Deelen", "Warning" : "Warnung", + "Delete" : "Läschen", "The object type is not specified." : "Den Typ vum Object ass net uginn.", "Enter new" : "Gëff nei an", - "Delete" : "Läschen", "Add" : "Dobäisetzen", "Edit tags" : "Tags editéieren", "The update was successful. Redirecting you to ownCloud now." : "Den Update war erfollegräich. Du gëss elo bei d'ownCloud ëmgeleet.", - "%s password reset" : "%s Passwuert ass nei gesat", - "Use the following link to reset your password: {link}" : "Benotz folgende Link fir däi Passwuert zréckzesetzen: {link}", - "New password" : "Neit Passwuert", - "Reset password" : "Passwuert zréck setzen", "Personal" : "Perséinlech", "Users" : "Benotzer", "Apps" : "Applikatiounen", @@ -119,6 +116,9 @@ "Search" : "Sichen", "Log in" : "Umellen", "Alternative Logins" : "Alternativ Umeldungen", + "Use the following link to reset your password: {link}" : "Benotz folgende Link fir däi Passwuert zréckzesetzen: {link}", + "New password" : "Neit Passwuert", + "Reset password" : "Passwuert zréck setzen", "Thank you for your patience." : "Merci fir deng Gedold." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js index 1a0d8816e84..b97350d9829 100644 --- a/core/l10n/lt_LT.js +++ b/core/l10n/lt_LT.js @@ -22,6 +22,8 @@ OC.L10N.register( "Invalid image" : "Netinkamas paveikslėlis", "No temporary profile picture available, try again" : "Nėra laikino profilio paveikslėlio, bandykite dar kartą", "No crop data provided" : "Nenurodyti apkirpimo duomenys", + "%s password reset" : "%s slaptažodžio atnaujinimas", + "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", "Sunday" : "Sekmadienis", "Monday" : "Pirmadienis", "Tuesday" : "Antradienis", @@ -70,7 +72,6 @@ OC.L10N.register( "Settings" : "Nustatymai", "Saving..." : "Saugoma...", "seconds ago" : "prieš sekundę", - "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", "I know what I'm doing" : "Aš žinau ką darau", "Password can not be changed. Please contact your administrator." : "Slaptažodis negali būti pakeistas, susisiekite su administratoriumi.", "No" : "Ne", @@ -136,9 +137,9 @@ OC.L10N.register( "Share with users or groups …" : "Dalintis su vartotoju ar grupe", "Share with users, groups or remote users …" : "Dalintis su vartotoju, grupe, ar nutolusiu vartotoju...", "Warning" : "Įspėjimas", + "Delete" : "Ištrinti", "The object type is not specified." : "Objekto tipas nenurodytas.", "Enter new" : "Įveskite naują", - "Delete" : "Ištrinti", "Add" : "Pridėti", "Edit tags" : "Redaguoti žymes", "Error loading dialog template: {error}" : "Klaida įkeliant dialogo ruošinį: {error}", @@ -147,11 +148,6 @@ OC.L10N.register( "sunny" : "saulėta", "Please reload the page." : "Prašome perkrauti puslapį.", "The update was successful. Redirecting you to ownCloud now." : "Atnaujinimas buvo sėkmingas. Nukreipiame į jūsų ownCloud.", - "%s password reset" : "%s slaptažodžio atnaujinimas", - "Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}", - "New password" : "Naujas slaptažodis", - "New Password" : "Naujas slaptažodis", - "Reset password" : "Atkurti slaptažodį", "Personal" : "Asmeniniai", "Users" : "Vartotojai", "Apps" : "Programos", @@ -192,6 +188,10 @@ OC.L10N.register( "Please contact your administrator." : "Kreipkitės į savo sistemos administratorių.", "Log in" : "Prisijungti", "Alternative Logins" : "Alternatyvūs prisijungimai", + "Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}", + "New password" : "Naujas slaptažodis", + "New Password" : "Naujas slaptažodis", + "Reset password" : "Atkurti slaptažodį", "This ownCloud instance is currently in single user mode." : "Ši ownCloud sistema yra vieno naudotojo veiksenoje.", "This means only administrators can use the instance." : "Tai reiškia, kad tik administratorius gali naudotis sistema.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Susisiekite su savo sistemos administratoriumi jei šis pranešimas nedingsta arba jei jis pasirodė netikėtai.", diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json index 908ace76c55..2cc4d40e24f 100644 --- a/core/l10n/lt_LT.json +++ b/core/l10n/lt_LT.json @@ -20,6 +20,8 @@ "Invalid image" : "Netinkamas paveikslėlis", "No temporary profile picture available, try again" : "Nėra laikino profilio paveikslėlio, bandykite dar kartą", "No crop data provided" : "Nenurodyti apkirpimo duomenys", + "%s password reset" : "%s slaptažodžio atnaujinimas", + "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", "Sunday" : "Sekmadienis", "Monday" : "Pirmadienis", "Tuesday" : "Antradienis", @@ -68,7 +70,6 @@ "Settings" : "Nustatymai", "Saving..." : "Saugoma...", "seconds ago" : "prieš sekundę", - "Couldn't send reset email. Please contact your administrator." : "Nepavyko išsiųsti atkūrimo laiško, susisiekite su administratoriumi.", "I know what I'm doing" : "Aš žinau ką darau", "Password can not be changed. Please contact your administrator." : "Slaptažodis negali būti pakeistas, susisiekite su administratoriumi.", "No" : "Ne", @@ -134,9 +135,9 @@ "Share with users or groups …" : "Dalintis su vartotoju ar grupe", "Share with users, groups or remote users …" : "Dalintis su vartotoju, grupe, ar nutolusiu vartotoju...", "Warning" : "Įspėjimas", + "Delete" : "Ištrinti", "The object type is not specified." : "Objekto tipas nenurodytas.", "Enter new" : "Įveskite naują", - "Delete" : "Ištrinti", "Add" : "Pridėti", "Edit tags" : "Redaguoti žymes", "Error loading dialog template: {error}" : "Klaida įkeliant dialogo ruošinį: {error}", @@ -145,11 +146,6 @@ "sunny" : "saulėta", "Please reload the page." : "Prašome perkrauti puslapį.", "The update was successful. Redirecting you to ownCloud now." : "Atnaujinimas buvo sėkmingas. Nukreipiame į jūsų ownCloud.", - "%s password reset" : "%s slaptažodžio atnaujinimas", - "Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}", - "New password" : "Naujas slaptažodis", - "New Password" : "Naujas slaptažodis", - "Reset password" : "Atkurti slaptažodį", "Personal" : "Asmeniniai", "Users" : "Vartotojai", "Apps" : "Programos", @@ -190,6 +186,10 @@ "Please contact your administrator." : "Kreipkitės į savo sistemos administratorių.", "Log in" : "Prisijungti", "Alternative Logins" : "Alternatyvūs prisijungimai", + "Use the following link to reset your password: {link}" : "Slaptažodio atkūrimui naudokite šią nuorodą: {link}", + "New password" : "Naujas slaptažodis", + "New Password" : "Naujas slaptažodis", + "Reset password" : "Atkurti slaptažodį", "This ownCloud instance is currently in single user mode." : "Ši ownCloud sistema yra vieno naudotojo veiksenoje.", "This means only administrators can use the instance." : "Tai reiškia, kad tik administratorius gali naudotis sistema.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Susisiekite su savo sistemos administratoriumi jei šis pranešimas nedingsta arba jei jis pasirodė netikėtai.", diff --git a/core/l10n/lv.js b/core/l10n/lv.js index 95bc2a62165..4a40619eece 100644 --- a/core/l10n/lv.js +++ b/core/l10n/lv.js @@ -7,6 +7,7 @@ OC.L10N.register( "Updated database" : "Atjaunota datu bāze", "Unknown filetype" : "Nezināms datnes tips", "Invalid image" : "Nederīgs attēls", + "%s password reset" : "%s paroles maiņa", "Sunday" : "Svētdiena", "Monday" : "Pirmdiena", "Tuesday" : "Otrdiena", @@ -91,14 +92,10 @@ OC.L10N.register( "access control" : "piekļuves vadība", "Share" : "Dalīties", "Warning" : "Brīdinājums", - "The object type is not specified." : "Nav norādīts objekta tips.", "Delete" : "Dzēst", + "The object type is not specified." : "Nav norādīts objekta tips.", "Add" : "Pievienot", "The update was successful. Redirecting you to ownCloud now." : "Atjaunināšana beidzās sekmīgi. Tagad pārsūta jūs uz ownCloud.", - "%s password reset" : "%s paroles maiņa", - "Use the following link to reset your password: {link}" : "Izmantojiet šo saiti, lai mainītu paroli: {link}", - "New password" : "Jauna parole", - "Reset password" : "Mainīt paroli", "Personal" : "Personīgi", "Users" : "Lietotāji", "Apps" : "Lietotnes", @@ -120,6 +117,9 @@ OC.L10N.register( "Log out" : "Izrakstīties", "Search" : "Meklēt", "Log in" : "Ierakstīties", - "Alternative Logins" : "Alternatīvās pieteikšanās" + "Alternative Logins" : "Alternatīvās pieteikšanās", + "Use the following link to reset your password: {link}" : "Izmantojiet šo saiti, lai mainītu paroli: {link}", + "New password" : "Jauna parole", + "Reset password" : "Mainīt paroli" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/core/l10n/lv.json b/core/l10n/lv.json index 05dbd6b588e..5dfe7b6f489 100644 --- a/core/l10n/lv.json +++ b/core/l10n/lv.json @@ -5,6 +5,7 @@ "Updated database" : "Atjaunota datu bāze", "Unknown filetype" : "Nezināms datnes tips", "Invalid image" : "Nederīgs attēls", + "%s password reset" : "%s paroles maiņa", "Sunday" : "Svētdiena", "Monday" : "Pirmdiena", "Tuesday" : "Otrdiena", @@ -89,14 +90,10 @@ "access control" : "piekļuves vadība", "Share" : "Dalīties", "Warning" : "Brīdinājums", - "The object type is not specified." : "Nav norādīts objekta tips.", "Delete" : "Dzēst", + "The object type is not specified." : "Nav norādīts objekta tips.", "Add" : "Pievienot", "The update was successful. Redirecting you to ownCloud now." : "Atjaunināšana beidzās sekmīgi. Tagad pārsūta jūs uz ownCloud.", - "%s password reset" : "%s paroles maiņa", - "Use the following link to reset your password: {link}" : "Izmantojiet šo saiti, lai mainītu paroli: {link}", - "New password" : "Jauna parole", - "Reset password" : "Mainīt paroli", "Personal" : "Personīgi", "Users" : "Lietotāji", "Apps" : "Lietotnes", @@ -118,6 +115,9 @@ "Log out" : "Izrakstīties", "Search" : "Meklēt", "Log in" : "Ierakstīties", - "Alternative Logins" : "Alternatīvās pieteikšanās" + "Alternative Logins" : "Alternatīvās pieteikšanās", + "Use the following link to reset your password: {link}" : "Izmantojiet šo saiti, lai mainītu paroli: {link}", + "New password" : "Jauna parole", + "Reset password" : "Mainīt paroli" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" }
\ No newline at end of file diff --git a/core/l10n/mk.js b/core/l10n/mk.js index 20985fac584..5e2ae256a48 100644 --- a/core/l10n/mk.js +++ b/core/l10n/mk.js @@ -25,6 +25,8 @@ OC.L10N.register( "No crop data provided" : "Не се доставени податоци за сечење", "No valid crop data provided" : "Нема валидни податоци за сечење", "Crop is not square" : "Сечењето не е правоаголно", + "%s password reset" : "%s ресетирање на лозинката", + "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "Sunday" : "Недела", "Monday" : "Понеделник", "Tuesday" : "Вторник", @@ -73,7 +75,6 @@ OC.L10N.register( "Settings" : "Подесувања", "Saving..." : "Снимам...", "seconds ago" : "пред секунди", - "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Врската за ресетирање на вашата лозинка е испратена на вашата е-адреса. Ако не ја добиете во разумно време, проверете ги вашите папки за спам/ѓубре.<br>Ако не е таму прашајте го вашиот локален администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Вашите датотеки се шифрирани. Ако не сте го овозможиле клучот за враќање, нема да можете да ги повратите вашите податоци откога вашата лозинка ќе биде ресетирана.<br>Ако не сте сигурни што да правите, ве молам контактирајте го вашиот локален администратор пред да продолжите.<br/>Дали навистина сакате да продолжите?", "I know what I'm doing" : "Знам што правам", @@ -144,9 +145,9 @@ OC.L10N.register( "Share with users or groups …" : "Сподели со корисници или групи ...", "Share with users, groups or remote users …" : "Споделено со корисници, групи или оддалечени корисници ...", "Warning" : "Предупредување", + "Delete" : "Избриши", "The object type is not specified." : "Не е специфициран типот на објект.", "Enter new" : "Внеси нов", - "Delete" : "Избриши", "Add" : "Додади", "Edit tags" : "Уреди ги таговите", "No tags selected for deletion." : "Не се селектирани тагови за бришење.", @@ -156,11 +157,6 @@ OC.L10N.register( "Hello {name}" : "Здраво {name}", "An error occurred." : "Се случи грешка", "The update was successful. Redirecting you to ownCloud now." : "Надградбата беше успешна. Веднаш ве префрлам на вашиот ownCloud.", - "%s password reset" : "%s ресетирање на лозинката", - "Use the following link to reset your password: {link}" : "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}", - "New password" : "Нова лозинка", - "New Password" : "Нова лозинка", - "Reset password" : "Ресетирај лозинка", "Personal" : "Лично", "Users" : "Корисници", "Apps" : "Аппликации", @@ -204,6 +200,10 @@ OC.L10N.register( "Wrong password." : "Погрешна лозинка.", "Stay logged in" : "Остани најаваен", "Alternative Logins" : "Алтернативни најавувања", + "Use the following link to reset your password: {link}" : "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}", + "New password" : "Нова лозинка", + "New Password" : "Нова лозинка", + "Reset password" : "Ресетирај лозинка", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте го вашиот систем администратор до колку оваа порака продолжи да се појавува или пак се појавува ненадејно.", "Thank you for your patience." : "Благодариме на вашето трпение.", "These apps will be updated:" : "Следните апликации чќе бидат надградени:" diff --git a/core/l10n/mk.json b/core/l10n/mk.json index cf5eaf9a9cc..e4df15c9cd5 100644 --- a/core/l10n/mk.json +++ b/core/l10n/mk.json @@ -23,6 +23,8 @@ "No crop data provided" : "Не се доставени податоци за сечење", "No valid crop data provided" : "Нема валидни податоци за сечење", "Crop is not square" : "Сечењето не е правоаголно", + "%s password reset" : "%s ресетирање на лозинката", + "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "Sunday" : "Недела", "Monday" : "Понеделник", "Tuesday" : "Вторник", @@ -71,7 +73,6 @@ "Settings" : "Подесувања", "Saving..." : "Снимам...", "seconds ago" : "пред секунди", - "Couldn't send reset email. Please contact your administrator." : "Не можам да истпратам порака за ресетирање. Ве молам контактирајте го вашиот администратор.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Врската за ресетирање на вашата лозинка е испратена на вашата е-адреса. Ако не ја добиете во разумно време, проверете ги вашите папки за спам/ѓубре.<br>Ако не е таму прашајте го вашиот локален администратор.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Вашите датотеки се шифрирани. Ако не сте го овозможиле клучот за враќање, нема да можете да ги повратите вашите податоци откога вашата лозинка ќе биде ресетирана.<br>Ако не сте сигурни што да правите, ве молам контактирајте го вашиот локален администратор пред да продолжите.<br/>Дали навистина сакате да продолжите?", "I know what I'm doing" : "Знам што правам", @@ -142,9 +143,9 @@ "Share with users or groups …" : "Сподели со корисници или групи ...", "Share with users, groups or remote users …" : "Споделено со корисници, групи или оддалечени корисници ...", "Warning" : "Предупредување", + "Delete" : "Избриши", "The object type is not specified." : "Не е специфициран типот на објект.", "Enter new" : "Внеси нов", - "Delete" : "Избриши", "Add" : "Додади", "Edit tags" : "Уреди ги таговите", "No tags selected for deletion." : "Не се селектирани тагови за бришење.", @@ -154,11 +155,6 @@ "Hello {name}" : "Здраво {name}", "An error occurred." : "Се случи грешка", "The update was successful. Redirecting you to ownCloud now." : "Надградбата беше успешна. Веднаш ве префрлам на вашиот ownCloud.", - "%s password reset" : "%s ресетирање на лозинката", - "Use the following link to reset your password: {link}" : "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}", - "New password" : "Нова лозинка", - "New Password" : "Нова лозинка", - "Reset password" : "Ресетирај лозинка", "Personal" : "Лично", "Users" : "Корисници", "Apps" : "Аппликации", @@ -202,6 +198,10 @@ "Wrong password." : "Погрешна лозинка.", "Stay logged in" : "Остани најаваен", "Alternative Logins" : "Алтернативни најавувања", + "Use the following link to reset your password: {link}" : "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}", + "New password" : "Нова лозинка", + "New Password" : "Нова лозинка", + "Reset password" : "Ресетирај лозинка", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте го вашиот систем администратор до колку оваа порака продолжи да се појавува или пак се појавува ненадејно.", "Thank you for your patience." : "Благодариме на вашето трпение.", "These apps will be updated:" : "Следните апликации чќе бидат надградени:" diff --git a/core/l10n/ms_MY.js b/core/l10n/ms_MY.js index 262119dd07a..cd5194613d1 100644 --- a/core/l10n/ms_MY.js +++ b/core/l10n/ms_MY.js @@ -55,9 +55,6 @@ OC.L10N.register( "Warning" : "Amaran", "Delete" : "Padam", "Add" : "Tambah", - "Use the following link to reset your password: {link}" : "Guna pautan berikut untuk menetapkan semula kata laluan anda: {link}", - "New password" : "Kata laluan baru", - "Reset password" : "Penetapan semula kata laluan", "Personal" : "Peribadi", "Users" : "Pengguna", "Apps" : "Aplikasi", @@ -75,6 +72,9 @@ OC.L10N.register( "Finish setup" : "Setup selesai", "Log out" : "Log keluar", "Search" : "Cari", - "Log in" : "Log masuk" + "Log in" : "Log masuk", + "Use the following link to reset your password: {link}" : "Guna pautan berikut untuk menetapkan semula kata laluan anda: {link}", + "New password" : "Kata laluan baru", + "Reset password" : "Penetapan semula kata laluan" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ms_MY.json b/core/l10n/ms_MY.json index b2a8f0c4ff3..9e1d9e24884 100644 --- a/core/l10n/ms_MY.json +++ b/core/l10n/ms_MY.json @@ -53,9 +53,6 @@ "Warning" : "Amaran", "Delete" : "Padam", "Add" : "Tambah", - "Use the following link to reset your password: {link}" : "Guna pautan berikut untuk menetapkan semula kata laluan anda: {link}", - "New password" : "Kata laluan baru", - "Reset password" : "Penetapan semula kata laluan", "Personal" : "Peribadi", "Users" : "Pengguna", "Apps" : "Aplikasi", @@ -73,6 +70,9 @@ "Finish setup" : "Setup selesai", "Log out" : "Log keluar", "Search" : "Cari", - "Log in" : "Log masuk" + "Log in" : "Log masuk", + "Use the following link to reset your password: {link}" : "Guna pautan berikut untuk menetapkan semula kata laluan anda: {link}", + "New password" : "Kata laluan baru", + "Reset password" : "Penetapan semula kata laluan" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/my_MM.js b/core/l10n/my_MM.js index 52165a6caed..70492ac63fa 100644 --- a/core/l10n/my_MM.js +++ b/core/l10n/my_MM.js @@ -27,7 +27,6 @@ OC.L10N.register( "create" : "ဖန်တီးမည်", "delete" : "ဖျက်မည်", "Add" : "ပေါင်းထည့်", - "New password" : "စကားဝှက်အသစ်", "Users" : "သုံးစွဲသူ", "Apps" : "Apps", "Admin" : "အက်ဒမင်", @@ -39,6 +38,7 @@ OC.L10N.register( "Database password" : "Database စကားဝှက်", "Database name" : "Database အမည်", "Finish setup" : "တပ်ဆင်ခြင်းပြီးပါပြီ။", - "Log in" : "ဝင်ရောက်ရန်" + "Log in" : "ဝင်ရောက်ရန်", + "New password" : "စကားဝှက်အသစ်" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/my_MM.json b/core/l10n/my_MM.json index 7dfaa1fe6b1..126318a1a73 100644 --- a/core/l10n/my_MM.json +++ b/core/l10n/my_MM.json @@ -25,7 +25,6 @@ "create" : "ဖန်တီးမည်", "delete" : "ဖျက်မည်", "Add" : "ပေါင်းထည့်", - "New password" : "စကားဝှက်အသစ်", "Users" : "သုံးစွဲသူ", "Apps" : "Apps", "Admin" : "အက်ဒမင်", @@ -37,6 +36,7 @@ "Database password" : "Database စကားဝှက်", "Database name" : "Database အမည်", "Finish setup" : "တပ်ဆင်ခြင်းပြီးပါပြီ။", - "Log in" : "ဝင်ရောက်ရန်" + "Log in" : "ဝင်ရောက်ရန်", + "New password" : "စကားဝှက်အသစ်" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js index 48f199570e5..3a87d955747 100644 --- a/core/l10n/nb_NO.js +++ b/core/l10n/nb_NO.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Ingen beskjæringsinformasjon angitt", "No valid crop data provided" : "Ingen gyldige beskjæringsdata oppgitt", "Crop is not square" : "Beskjæringen er ikke kvadratisk", + "Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.", + "Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.", + "Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.", + "%s password reset" : "%s tilbakestilling av passord", + "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "Sunday" : "Søndag", "Monday" : "Mandag", "Tuesday" : "Tirsdag", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Innstillinger", "Saving..." : "Lagrer...", "seconds ago" : "for få sekunder siden", - "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?", "I know what I'm doing" : "Jeg vet hva jeg gjør", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Del med brukere, grupper eller eksterne brukere ...", "Warning" : "Advarsel", "Error while sending notification" : "Feil ved sending av varsling", + "Delete" : "Slett", "The object type is not specified." : "Objekttypen er ikke spesifisert.", "Enter new" : "Oppgi ny", - "Delete" : "Slett", "Add" : "Legg til", "Edit tags" : "Rediger merkelapper", "Error loading dialog template: {error}" : "Feil ved lasting av dialogmal: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Oppdateringen var mislykket.", "The update was successful. There were warnings." : "Oppdateringen var vellykket. Det oppstod advarsler.", "The update was successful. Redirecting you to ownCloud now." : "Oppdateringen var vellykket. Du omdirigeres nå til ownCloud.", - "Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.", - "Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.", - "Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.", - "%s password reset" : "%s tilbakestilling av passord", - "Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}", - "New password" : "Nytt passord", - "New Password" : "Nytt passord", - "Reset password" : "Tilbakestill passord", "Searching other places" : "Søker andre steder", "No search results in other folders" : "Ingen søkeresultater i andre mapper", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søkeresultat i en annen mappe","{count} søkeresultater i andre mapper"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Feil passord.", "Stay logged in" : "Forbli innlogget", "Alternative Logins" : "Alternative innlogginger", + "Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}", + "New password" : "Nytt passord", + "New Password" : "Nytt passord", + "Reset password" : "Tilbakestill passord", "This ownCloud instance is currently in single user mode." : "Denne ownCloud-instansen er for øyeblikket i enbrukermodus.", "This means only administrators can use the instance." : "Dette betyr at kun administratorer kan bruke instansen.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren hvis denne meldingen var uventet eller ikke forsvinner.", diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json index a3b94fb31ff..73a3fad09c0 100644 --- a/core/l10n/nb_NO.json +++ b/core/l10n/nb_NO.json @@ -33,6 +33,12 @@ "No crop data provided" : "Ingen beskjæringsinformasjon angitt", "No valid crop data provided" : "Ingen gyldige beskjæringsdata oppgitt", "Crop is not square" : "Beskjæringen er ikke kvadratisk", + "Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.", + "Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.", + "Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.", + "%s password reset" : "%s tilbakestilling av passord", + "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "Sunday" : "Søndag", "Monday" : "Mandag", "Tuesday" : "Tirsdag", @@ -82,7 +88,6 @@ "Settings" : "Innstillinger", "Saving..." : "Lagrer...", "seconds ago" : "for få sekunder siden", - "Couldn't send reset email. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling. Kontakt administratoren.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lenken for tilbakestilling av passordet ditt er sendt til din e-postadresse. Hvis du ikke mottar den innen rimelig tid, sjekk mappen for søppelpost.<br>Hvis du ikke finner den der, kontakt din lokale administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Filene dine er kryptert. Hvis du ikke har aktivert gjenopprettingsnøkkelen, vil det være helt umulig å få tilbake dataene dine etter at pasordet ditt er tilbakestilt.<br />Hvis du er usikker på hva du skal gjøre, kontakt administratoren din før du fortsetter. <br />Vil du virkelig fortsette?", "I know what I'm doing" : "Jeg vet hva jeg gjør", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Del med brukere, grupper eller eksterne brukere ...", "Warning" : "Advarsel", "Error while sending notification" : "Feil ved sending av varsling", + "Delete" : "Slett", "The object type is not specified." : "Objekttypen er ikke spesifisert.", "Enter new" : "Oppgi ny", - "Delete" : "Slett", "Add" : "Legg til", "Edit tags" : "Rediger merkelapper", "Error loading dialog template: {error}" : "Feil ved lasting av dialogmal: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "Oppdateringen var mislykket.", "The update was successful. There were warnings." : "Oppdateringen var vellykket. Det oppstod advarsler.", "The update was successful. Redirecting you to ownCloud now." : "Oppdateringen var vellykket. Du omdirigeres nå til ownCloud.", - "Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.", - "Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.", - "Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.", - "%s password reset" : "%s tilbakestilling av passord", - "Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}", - "New password" : "Nytt passord", - "New Password" : "Nytt passord", - "Reset password" : "Tilbakestill passord", "Searching other places" : "Søker andre steder", "No search results in other folders" : "Ingen søkeresultater i andre mapper", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} søkeresultat i en annen mappe","{count} søkeresultater i andre mapper"], @@ -269,6 +265,10 @@ "Wrong password." : "Feil passord.", "Stay logged in" : "Forbli innlogget", "Alternative Logins" : "Alternative innlogginger", + "Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}", + "New password" : "Nytt passord", + "New Password" : "Nytt passord", + "Reset password" : "Tilbakestill passord", "This ownCloud instance is currently in single user mode." : "Denne ownCloud-instansen er for øyeblikket i enbrukermodus.", "This means only administrators can use the instance." : "Dette betyr at kun administratorer kan bruke instansen.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontakt systemadministratoren hvis denne meldingen var uventet eller ikke forsvinner.", diff --git a/core/l10n/nds.js b/core/l10n/nds.js index 5e91fe3e687..71bdf00fdcf 100644 --- a/core/l10n/nds.js +++ b/core/l10n/nds.js @@ -23,6 +23,7 @@ OC.L10N.register( "No crop data provided" : "Keine Angaben zum Zuschneiden geliefert", "No valid crop data provided" : "Keine gültigen Angaben zum Zuschnitt geliefert", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -71,7 +72,6 @@ OC.L10N.register( "Settings" : "Einstellungen", "Saving..." : "Speichern...", "seconds ago" : "vor wenigen Sekunden", - "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Zurücksetzen deines Passworts wurde an Deine E-Mailadresse geschickt. Wenn Du diesen in einer angemessenen Zeit nicht erhältst, prüfe bitte deine Spam/Junk Ordner.<br> Wenn die E-Mail dort nicht ist, wende Dich an Deinen lokalen Administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Wenn Dein Wiederherstellungsschlüssel nicht aktiviert ist, gibt es keine Möglichkeit die Daten wiederherzustellen, nachdem Dein Passwort zurückgesetzt wurde.<br /> Wenn Du nicht sicher weißt was zu tun ist, wende Dich bitte an deinen Adminstrator bevor du fortfährst.<br />Willst du wirklich fortfahren?", "I know what I'm doing" : "Ich weiß was ich tue", diff --git a/core/l10n/nds.json b/core/l10n/nds.json index 914dd26b977..753a6bea64d 100644 --- a/core/l10n/nds.json +++ b/core/l10n/nds.json @@ -21,6 +21,7 @@ "No crop data provided" : "Keine Angaben zum Zuschneiden geliefert", "No valid crop data provided" : "Keine gültigen Angaben zum Zuschnitt geliefert", "Crop is not square" : "Zuschnitt ist nicht quadratisch", + "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", "Sunday" : "Sonntag", "Monday" : "Montag", "Tuesday" : "Dienstag", @@ -69,7 +70,6 @@ "Settings" : "Einstellungen", "Saving..." : "Speichern...", "seconds ago" : "vor wenigen Sekunden", - "Couldn't send reset email. Please contact your administrator." : "E-Mail zum Zurücksetzen konnte nicht gesendet werden. Bitte wende Dich an Deinem Administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Zurücksetzen deines Passworts wurde an Deine E-Mailadresse geschickt. Wenn Du diesen in einer angemessenen Zeit nicht erhältst, prüfe bitte deine Spam/Junk Ordner.<br> Wenn die E-Mail dort nicht ist, wende Dich an Deinen lokalen Administrator.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Wenn Dein Wiederherstellungsschlüssel nicht aktiviert ist, gibt es keine Möglichkeit die Daten wiederherzustellen, nachdem Dein Passwort zurückgesetzt wurde.<br /> Wenn Du nicht sicher weißt was zu tun ist, wende Dich bitte an deinen Adminstrator bevor du fortfährst.<br />Willst du wirklich fortfahren?", "I know what I'm doing" : "Ich weiß was ich tue", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index f6738a524a9..0a8197c17d9 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Geen bijsnijdingsgegevens opgegeven", "No valid crop data provided" : "Geen geldige bijsnijdingsgegevens opgegeven", "Crop is not square" : "Bijsnijding is niet vierkant", + "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", + "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", + "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", + "%s password reset" : "%s wachtwoord reset", + "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "Sunday" : "zondag", "Monday" : "maandag", "Tuesday" : "dinsdag", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Instellingen", "Saving..." : "Opslaan", "seconds ago" : "seconden geleden", - "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "De link om uw wachtwoord te herstellen is per e-mail naar u verstuurd. Als u dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan uw spammap. <br>Als het daar niet in zit, neem dan contact op met uw beheerder.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Uw bestanden zijn versleuteld. Als u de herstelsleutel niet hebt geactiveerd, is er geen mogelijk om uw gegevens terug te krijgen nadat uw wachtwoord is hersteld. <br>Als u niet weet wat u moet doen, neem dan eerst contact op met uw beheerder. <br>Wilt u echt verder gaan?", "I know what I'm doing" : "Ik weet wat ik doe", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Delen met gebruikers, groepen of externe gebruikers ...", "Warning" : "Waarschuwing", "Error while sending notification" : "Fout bij versturen melding", + "Delete" : "Verwijder", "The object type is not specified." : "Het object type is niet gespecificeerd.", "Enter new" : "Opgeven nieuw", - "Delete" : "Verwijder", "Add" : "Toevoegen", "Edit tags" : "Bewerken tags", "Error loading dialog template: {error}" : "Fout bij laden dialoog sjabloon: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "De update is niet geslaagd.", "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", "The update was successful. Redirecting you to ownCloud now." : "De update is geslaagd. U wordt teruggeleid naar uw eigen ownCloud.", - "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", - "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", - "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", - "%s password reset" : "%s wachtwoord reset", - "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", - "New password" : "Nieuw wachtwoord", - "New Password" : "Nieuw wachtwoord", - "Reset password" : "Reset wachtwoord", "Searching other places" : "Zoeken op andere plaatsen", "No search results in other folders" : "Geen zoekresultaten in andere mappen", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", + "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", + "New password" : "Nieuw wachtwoord", + "New Password" : "Nieuw wachtwoord", + "Reset password" : "Reset wachtwoord", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met uw systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index d21f42b89b7..43c46c28f39 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -33,6 +33,12 @@ "No crop data provided" : "Geen bijsnijdingsgegevens opgegeven", "No valid crop data provided" : "Geen geldige bijsnijdingsgegevens opgegeven", "Crop is not square" : "Bijsnijding is niet vierkant", + "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", + "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", + "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", + "%s password reset" : "%s wachtwoord reset", + "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "Sunday" : "zondag", "Monday" : "maandag", "Tuesday" : "dinsdag", @@ -82,7 +88,6 @@ "Settings" : "Instellingen", "Saving..." : "Opslaan", "seconds ago" : "seconden geleden", - "Couldn't send reset email. Please contact your administrator." : "Kon herstel e-mail niet versturen. Neem contact op met uw beheerder.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "De link om uw wachtwoord te herstellen is per e-mail naar u verstuurd. Als u dit bericht niet binnen redelijke tijd hebt ontvangen, controleer dan uw spammap. <br>Als het daar niet in zit, neem dan contact op met uw beheerder.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Uw bestanden zijn versleuteld. Als u de herstelsleutel niet hebt geactiveerd, is er geen mogelijk om uw gegevens terug te krijgen nadat uw wachtwoord is hersteld. <br>Als u niet weet wat u moet doen, neem dan eerst contact op met uw beheerder. <br>Wilt u echt verder gaan?", "I know what I'm doing" : "Ik weet wat ik doe", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Delen met gebruikers, groepen of externe gebruikers ...", "Warning" : "Waarschuwing", "Error while sending notification" : "Fout bij versturen melding", + "Delete" : "Verwijder", "The object type is not specified." : "Het object type is niet gespecificeerd.", "Enter new" : "Opgeven nieuw", - "Delete" : "Verwijder", "Add" : "Toevoegen", "Edit tags" : "Bewerken tags", "Error loading dialog template: {error}" : "Fout bij laden dialoog sjabloon: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "De update is niet geslaagd.", "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", "The update was successful. Redirecting you to ownCloud now." : "De update is geslaagd. U wordt teruggeleid naar uw eigen ownCloud.", - "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", - "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", - "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", - "%s password reset" : "%s wachtwoord reset", - "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", - "New password" : "Nieuw wachtwoord", - "New Password" : "Nieuw wachtwoord", - "Reset password" : "Reset wachtwoord", "Searching other places" : "Zoeken op andere plaatsen", "No search results in other folders" : "Geen zoekresultaten in andere mappen", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} zoekresultaat in een andere map","{count} zoekresultaten in andere mappen"], @@ -269,6 +265,10 @@ "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", + "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", + "New password" : "Nieuw wachtwoord", + "New Password" : "Nieuw wachtwoord", + "Reset password" : "Reset wachtwoord", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", "This means only administrators can use the instance." : "Dat betekent dat alleen beheerders deze installatie kunnen gebruiken.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Neem contact op met uw systeembeheerder als deze melding aanhoudt of onverwacht verscheen.", diff --git a/core/l10n/nn_NO.js b/core/l10n/nn_NO.js index c16b1dc7887..130a355a449 100644 --- a/core/l10n/nn_NO.js +++ b/core/l10n/nn_NO.js @@ -10,6 +10,7 @@ OC.L10N.register( "Invalid image" : "Ugyldig bilete", "No temporary profile picture available, try again" : "Inga midlertidig profilbilete tilgjengeleg, prøv igjen", "No crop data provided" : "Ingen beskjeringsdata gjeve", + "%s password reset" : "%s passordnullstilling", "Sunday" : "Søndag", "Monday" : "Måndag", "Tuesday" : "Tysdag", @@ -98,14 +99,10 @@ OC.L10N.register( "access control" : "tilgangskontroll", "Share" : "Del", "Warning" : "Åtvaring", - "The object type is not specified." : "Objekttypen er ikkje spesifisert.", "Delete" : "Slett", + "The object type is not specified." : "Objekttypen er ikkje spesifisert.", "Add" : "Legg til", "The update was successful. Redirecting you to ownCloud now." : "Oppdateringa er fullført. Sender deg vidare til ownCloud no.", - "%s password reset" : "%s passordnullstilling", - "Use the following link to reset your password: {link}" : "Klikk følgjande lenkje til å nullstilla passordet ditt: {link}", - "New password" : "Nytt passord", - "Reset password" : "Nullstill passord", "Personal" : "Personleg", "Users" : "Brukarar", "Apps" : "Program", @@ -127,6 +124,9 @@ OC.L10N.register( "Log out" : "Logg ut", "Search" : "Søk", "Log in" : "Logg inn", - "Alternative Logins" : "Alternative innloggingar" + "Alternative Logins" : "Alternative innloggingar", + "Use the following link to reset your password: {link}" : "Klikk følgjande lenkje til å nullstilla passordet ditt: {link}", + "New password" : "Nytt passord", + "Reset password" : "Nullstill passord" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/nn_NO.json b/core/l10n/nn_NO.json index fd4fb2dd4a7..6e9f8b4e9dd 100644 --- a/core/l10n/nn_NO.json +++ b/core/l10n/nn_NO.json @@ -8,6 +8,7 @@ "Invalid image" : "Ugyldig bilete", "No temporary profile picture available, try again" : "Inga midlertidig profilbilete tilgjengeleg, prøv igjen", "No crop data provided" : "Ingen beskjeringsdata gjeve", + "%s password reset" : "%s passordnullstilling", "Sunday" : "Søndag", "Monday" : "Måndag", "Tuesday" : "Tysdag", @@ -96,14 +97,10 @@ "access control" : "tilgangskontroll", "Share" : "Del", "Warning" : "Åtvaring", - "The object type is not specified." : "Objekttypen er ikkje spesifisert.", "Delete" : "Slett", + "The object type is not specified." : "Objekttypen er ikkje spesifisert.", "Add" : "Legg til", "The update was successful. Redirecting you to ownCloud now." : "Oppdateringa er fullført. Sender deg vidare til ownCloud no.", - "%s password reset" : "%s passordnullstilling", - "Use the following link to reset your password: {link}" : "Klikk følgjande lenkje til å nullstilla passordet ditt: {link}", - "New password" : "Nytt passord", - "Reset password" : "Nullstill passord", "Personal" : "Personleg", "Users" : "Brukarar", "Apps" : "Program", @@ -125,6 +122,9 @@ "Log out" : "Logg ut", "Search" : "Søk", "Log in" : "Logg inn", - "Alternative Logins" : "Alternative innloggingar" + "Alternative Logins" : "Alternative innloggingar", + "Use the following link to reset your password: {link}" : "Klikk følgjande lenkje til å nullstilla passordet ditt: {link}", + "New password" : "Nytt passord", + "Reset password" : "Nullstill passord" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/oc.js b/core/l10n/oc.js index 1f8330501fb..0a1940a71ae 100644 --- a/core/l10n/oc.js +++ b/core/l10n/oc.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Cap de donada de requadratge pas provesida", "No valid crop data provided" : "Donadas de requadratge invalidas", "Crop is not square" : "Lo requadratge es pas carrat", + "Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.", + "Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.", + "Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.", + "%s password reset" : "Reïnicializacion de vòstre senhal %s", + "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "Sunday" : "Dimenge", "Monday" : "Diluns", "Tuesday" : "Dimars", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Paramètres", "Saving..." : "Enregistrament…", "seconds ago" : "i a qualques segondas", - "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lo ligam que permet de reïnicializar vòstre senhal ven d'èsser mandat a vòstra adreça de corrièl.<br>Se o recebètz pas dins un relambi rasonable, contactatz vòstre administrator.<br>Doblidetz pas de verificar dins vòstre dorsièr corrièr indesirable / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vòstres fichièrs son chifrats. Se avètz pas activat la clau de recuperacion, i aurà pas cap de mejan de recuperar vòstras donadas un còp lo senhal reïnicializat.<br />Se sètz pas segur(a) de çò que fasètz, contactatz vòstre administrator abans de contunhar. <br />Sètz segur que volètz contunhar ?", "I know what I'm doing" : "Sabi çò que fau", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Partejar amb d'utilizaires, gropes, o utilizaires distants", "Warning" : "Atencion", "Error while sending notification" : "Error al moment del mandadís de la notificacion", + "Delete" : "Suprimir", "The object type is not specified." : "Lo tipe d'objècte es pas especificat.", "Enter new" : "Picar un novèl", - "Delete" : "Suprimir", "Add" : "Apondre", "Edit tags" : "Modificar las etiquetas", "Error loading dialog template: {error}" : "Error al moment del cargament del modèl de dialòg : {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "La mesa a jorn a fracassat.", "The update was successful. There were warnings." : "La mesa a jorn a capitat, mas i a agut d'avertiments", "The update was successful. Redirecting you to ownCloud now." : "La mesa a jorn a capitat. Ara sètz redirigit cap a ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.", - "Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.", - "Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.", - "%s password reset" : "Reïnicializacion de vòstre senhal %s", - "Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}", - "New password" : "Senhal novèl", - "New Password" : "Senhal novèl", - "Reset password" : "Reïnicializar lo senhal", "Searching other places" : "Recèrca en cors dins d'autres emplaçaments", "No search results in other folders" : "Pas cap de resultat dins d'autres dorsièrs", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultat dins un autre dorsièr","{count} resultats dins d'autres dorsièrs"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Senhal incorrècte. Reïnicializar ?", "Stay logged in" : "Demorar connectat", "Alternative Logins" : "Identificants alternatius", + "Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}", + "New password" : "Senhal novèl", + "New Password" : "Senhal novèl", + "Reset password" : "Reïnicializar lo senhal", "This ownCloud instance is currently in single user mode." : "Aquesta instància de ownCloud es actualament en mòde utilizaire unic.", "This means only administrators can use the instance." : "Aquò significa que sols los administrators pòdon utilizar l'instància.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactatz vòstre administrator sistèma se aqueste messatge persistís o apareis de faiçon imprevista.", diff --git a/core/l10n/oc.json b/core/l10n/oc.json index c6f8536aa06..1b37d7774c0 100644 --- a/core/l10n/oc.json +++ b/core/l10n/oc.json @@ -28,6 +28,11 @@ "No crop data provided" : "Cap de donada de requadratge pas provesida", "No valid crop data provided" : "Donadas de requadratge invalidas", "Crop is not square" : "Lo requadratge es pas carrat", + "Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.", + "Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.", + "Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.", + "%s password reset" : "Reïnicializacion de vòstre senhal %s", + "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "Sunday" : "Dimenge", "Monday" : "Diluns", "Tuesday" : "Dimars", @@ -76,7 +81,6 @@ "Settings" : "Paramètres", "Saving..." : "Enregistrament…", "seconds ago" : "i a qualques segondas", - "Couldn't send reset email. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion. Contactatz vòstre administrator.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lo ligam que permet de reïnicializar vòstre senhal ven d'èsser mandat a vòstra adreça de corrièl.<br>Se o recebètz pas dins un relambi rasonable, contactatz vòstre administrator.<br>Doblidetz pas de verificar dins vòstre dorsièr corrièr indesirable / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vòstres fichièrs son chifrats. Se avètz pas activat la clau de recuperacion, i aurà pas cap de mejan de recuperar vòstras donadas un còp lo senhal reïnicializat.<br />Se sètz pas segur(a) de çò que fasètz, contactatz vòstre administrator abans de contunhar. <br />Sètz segur que volètz contunhar ?", "I know what I'm doing" : "Sabi çò que fau", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "Partejar amb d'utilizaires, gropes, o utilizaires distants", "Warning" : "Atencion", "Error while sending notification" : "Error al moment del mandadís de la notificacion", + "Delete" : "Suprimir", "The object type is not specified." : "Lo tipe d'objècte es pas especificat.", "Enter new" : "Picar un novèl", - "Delete" : "Suprimir", "Add" : "Apondre", "Edit tags" : "Modificar las etiquetas", "Error loading dialog template: {error}" : "Error al moment del cargament del modèl de dialòg : {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "La mesa a jorn a fracassat.", "The update was successful. There were warnings." : "La mesa a jorn a capitat, mas i a agut d'avertiments", "The update was successful. Redirecting you to ownCloud now." : "La mesa a jorn a capitat. Ara sètz redirigit cap a ownCloud.", - "Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.", - "Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.", - "Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.", - "%s password reset" : "Reïnicializacion de vòstre senhal %s", - "Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}", - "New password" : "Senhal novèl", - "New Password" : "Senhal novèl", - "Reset password" : "Reïnicializar lo senhal", "Searching other places" : "Recèrca en cors dins d'autres emplaçaments", "No search results in other folders" : "Pas cap de resultat dins d'autres dorsièrs", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultat dins un autre dorsièr","{count} resultats dins d'autres dorsièrs"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "Senhal incorrècte. Reïnicializar ?", "Stay logged in" : "Demorar connectat", "Alternative Logins" : "Identificants alternatius", + "Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}", + "New password" : "Senhal novèl", + "New Password" : "Senhal novèl", + "Reset password" : "Reïnicializar lo senhal", "This ownCloud instance is currently in single user mode." : "Aquesta instància de ownCloud es actualament en mòde utilizaire unic.", "This means only administrators can use the instance." : "Aquò significa que sols los administrators pòdon utilizar l'instància.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactatz vòstre administrator sistèma se aqueste messatge persistís o apareis de faiçon imprevista.", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index c55b25e3956..3087ac8fcc8 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -16,6 +16,10 @@ OC.L10N.register( "Invalid image" : "Nieprawidłowe zdjęcie", "No temporary profile picture available, try again" : "Brak obrazka profilu tymczasowego, spróbuj ponownie", "No crop data provided" : "Brak danych do przycięcia", + "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", + "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", + "%s password reset" : "%s reset hasła", + "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "Sunday" : "Niedziela", "Monday" : "Poniedziałek", "Tuesday" : "Wtorek", @@ -57,7 +61,6 @@ OC.L10N.register( "Settings" : "Ustawienia", "Saving..." : "Zapisywanie...", "seconds ago" : "sekund temu", - "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ", "I know what I'm doing" : "Wiem co robię", @@ -124,9 +127,9 @@ OC.L10N.register( "Share" : "Udostępnij", "Share with users or groups …" : "Współdziel z użytkownikami lub grupami", "Warning" : "Ostrzeżenie", + "Delete" : "Usuń", "The object type is not specified." : "Nie określono typu obiektu.", "Enter new" : "Wpisz nowy", - "Delete" : "Usuń", "Add" : "Dodaj", "Edit tags" : "Edytuj tagi", "Error loading dialog template: {error}" : "Błąd podczas ładowania szablonu dialogu: {error}", @@ -141,13 +144,6 @@ OC.L10N.register( "Please reload the page." : "Proszę przeładować stronę", "The update was unsuccessful. " : "Aktualizowanie zakończyło się niepowodzeniem.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizacji zakończyła się powodzeniem. Przekierowuję do ownCloud.", - "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", - "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", - "%s password reset" : "%s reset hasła", - "Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}", - "New password" : "Nowe hasło", - "New Password" : "Nowe hasło", - "Reset password" : "Zresetuj hasło", "Searching other places" : "Przeszukaj inne miejsca", "Personal" : "Osobiste", "Users" : "Użytkownicy", @@ -205,6 +201,10 @@ OC.L10N.register( "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", "Log in" : "Zaloguj", "Alternative Logins" : "Alternatywne loginy", + "Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}", + "New password" : "Nowe hasło", + "New Password" : "Nowe hasło", + "Reset password" : "Zresetuj hasło", "This ownCloud instance is currently in single user mode." : "Ta instalacja ownCloud działa obecnie w trybie pojedynczego użytkownika.", "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 9e1d2b8a8f3..7ea36f69220 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -14,6 +14,10 @@ "Invalid image" : "Nieprawidłowe zdjęcie", "No temporary profile picture available, try again" : "Brak obrazka profilu tymczasowego, spróbuj ponownie", "No crop data provided" : "Brak danych do przycięcia", + "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", + "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", + "%s password reset" : "%s reset hasła", + "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "Sunday" : "Niedziela", "Monday" : "Poniedziałek", "Tuesday" : "Wtorek", @@ -55,7 +59,6 @@ "Settings" : "Ustawienia", "Saving..." : "Zapisywanie...", "seconds ago" : "sekund temu", - "Couldn't send reset email. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Skontaktuj się z administratorem.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link do zresetowanego hasła, został wysłany na twój adres e-mail. Jeśli nie dostałeś wiadomości w rozsądnym czasie, sprawdź folder ze spamem.<br> Jeśli nie ma wiadomości w tym folderze, skontaktuj się ze swoim administratorem.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Twoje pliki są zaszyfrowane. Jeśli nie włączyłeś klucza odzyskiwania, nie będzie możliwości odszyfrowania tych plików po zresetowaniu hasła.<br>Jeśli nie jesteś pewien co zrobić, skontaktuj się ze swoim administratorem, zanim bedziesz kontynuował. <br/> Czy chcesz kontynuować?\n ", "I know what I'm doing" : "Wiem co robię", @@ -122,9 +125,9 @@ "Share" : "Udostępnij", "Share with users or groups …" : "Współdziel z użytkownikami lub grupami", "Warning" : "Ostrzeżenie", + "Delete" : "Usuń", "The object type is not specified." : "Nie określono typu obiektu.", "Enter new" : "Wpisz nowy", - "Delete" : "Usuń", "Add" : "Dodaj", "Edit tags" : "Edytuj tagi", "Error loading dialog template: {error}" : "Błąd podczas ładowania szablonu dialogu: {error}", @@ -139,13 +142,6 @@ "Please reload the page." : "Proszę przeładować stronę", "The update was unsuccessful. " : "Aktualizowanie zakończyło się niepowodzeniem.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizacji zakończyła się powodzeniem. Przekierowuję do ownCloud.", - "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", - "Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.", - "%s password reset" : "%s reset hasła", - "Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}", - "New password" : "Nowe hasło", - "New Password" : "Nowe hasło", - "Reset password" : "Zresetuj hasło", "Searching other places" : "Przeszukaj inne miejsca", "Personal" : "Osobiste", "Users" : "Użytkownicy", @@ -203,6 +199,10 @@ "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", "Log in" : "Zaloguj", "Alternative Logins" : "Alternatywne loginy", + "Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}", + "New password" : "Nowe hasło", + "New Password" : "Nowe hasło", + "Reset password" : "Zresetuj hasło", "This ownCloud instance is currently in single user mode." : "Ta instalacja ownCloud działa obecnie w trybie pojedynczego użytkownika.", "This means only administrators can use the instance." : "To oznacza, że tylko administratorzy mogą w tej chwili używać aplikacji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Skontaktuj się z administratorem, jeśli ten komunikat pojawił się nieoczekiwanie lub wyświetla się ciągle.", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 033e7e8a402..d901a3c2d13 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Nenhum dado para coleta foi fornecido", "No valid crop data provided" : "Nenhum dado recortado válido", "Crop is not square" : "Recorte não é quadrado", + "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", + "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", + "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", + "%s password reset" : "%s redefinir senha", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "Sunday" : "Domingo", "Monday" : "Segunda-feira", "Tuesday" : "Terça-feira", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Configurações", "Saving..." : "Salvando...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "O link para redefinir sua senha foi enviada para o seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo. <br> Se ele não estiver lá, pergunte ao administrador do local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida. <br/> Se você não tem certeza do que fazer, por favor, contate o administrador antes de continuar. <br/> Você realmente deseja continuar?", "I know what I'm doing" : "Eu sei o que estou fazendo", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Compartilhar com usuários, grupos ou usuários remoto ...", "Warning" : "Aviso", "Error while sending notification" : "Erro ao enviar notificação", + "Delete" : "Eliminar", "The object type is not specified." : "O tipo de objeto não foi especificado.", "Enter new" : "Entrar uma nova", - "Delete" : "Eliminar", "Add" : "Adicionar", "Edit tags" : "Editar etiqueta", "Error loading dialog template: {error}" : "Erro carregando diálogo de formatação: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "A atualização não foi bem sucedida.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Havia advertências.", "The update was successful. Redirecting you to ownCloud now." : "A atualização teve êxito. Você será redirecionado ao ownCloud agora.", - "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", - "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", - "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", - "%s password reset" : "%s redefinir senha", - "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", - "New password" : "Nova senha", - "New Password" : "Nova Senha", - "Reset password" : "Redefinir senha", "Searching other places" : "Pesquisando em outros lugares", "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", + "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", + "New password" : "Nova senha", + "New Password" : "Nova Senha", + "Reset password" : "Redefinir senha", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", "This means only administrators can use the instance." : "Isso significa que apenas os administradores podem usar esta instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou aparecer inesperadamente.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index a64d0f92b27..38dfa2ec314 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -33,6 +33,12 @@ "No crop data provided" : "Nenhum dado para coleta foi fornecido", "No valid crop data provided" : "Nenhum dado recortado válido", "Crop is not square" : "Recorte não é quadrado", + "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", + "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", + "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", + "%s password reset" : "%s redefinir senha", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "Sunday" : "Domingo", "Monday" : "Segunda-feira", "Tuesday" : "Terça-feira", @@ -82,7 +88,6 @@ "Settings" : "Configurações", "Saving..." : "Salvando...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição. Por favor, contate o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "O link para redefinir sua senha foi enviada para o seu e-mail. Se você não recebê-lo dentro de um período razoável de tempo, verifique suas pastas de spam/lixo. <br> Se ele não estiver lá, pergunte ao administrador do local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Seus arquivos são criptografados. Se você não ativou a chave de recuperação, não haverá maneira de obter seus dados de volta após a sua senha ser redefinida. <br/> Se você não tem certeza do que fazer, por favor, contate o administrador antes de continuar. <br/> Você realmente deseja continuar?", "I know what I'm doing" : "Eu sei o que estou fazendo", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Compartilhar com usuários, grupos ou usuários remoto ...", "Warning" : "Aviso", "Error while sending notification" : "Erro ao enviar notificação", + "Delete" : "Eliminar", "The object type is not specified." : "O tipo de objeto não foi especificado.", "Enter new" : "Entrar uma nova", - "Delete" : "Eliminar", "Add" : "Adicionar", "Edit tags" : "Editar etiqueta", "Error loading dialog template: {error}" : "Erro carregando diálogo de formatação: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "A atualização não foi bem sucedida.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Havia advertências.", "The update was successful. Redirecting you to ownCloud now." : "A atualização teve êxito. Você será redirecionado ao ownCloud agora.", - "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", - "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", - "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", - "%s password reset" : "%s redefinir senha", - "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", - "New password" : "Nova senha", - "New Password" : "Nova Senha", - "Reset password" : "Redefinir senha", "Searching other places" : "Pesquisando em outros lugares", "No search results in other folders" : "Nenhum resultado de pesquisa em outras pastas", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado da pesquisa em outras pastas","{count} resultados da pesquisa em outras pastas"], @@ -269,6 +265,10 @@ "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", + "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", + "New password" : "Nova senha", + "New Password" : "Nova Senha", + "Reset password" : "Redefinir senha", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", "This means only administrators can use the instance." : "Isso significa que apenas os administradores podem usar esta instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador do sistema se esta mensagem persistir ou aparecer inesperadamente.", diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js index c8b2255eb19..42e473d912f 100644 --- a/core/l10n/pt_PT.js +++ b/core/l10n/pt_PT.js @@ -8,17 +8,23 @@ OC.L10N.register( "Maintenance mode is kept active" : "O modo de manutenção é mantido ativo", "Updating database schema" : "A actualizar o esquema da base de dados", "Updated database" : "Base de dados atualizada", + "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)", "Checked database schema update" : "Atualização do esquema da base de dados verificada.", "Checking updates of apps" : "A procurar por atualizações das apps", + "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados para %s pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)", "Checked database schema update for apps" : "Atualização do esquema da base de dados verificada.", "Updated \"%s\" to %s" : "Atualizado \"%s\" para %s", "Repair warning: " : "Aviso de reparação:", "Repair error: " : "Corrija o erro:", + "Set log level to debug" : "Definir o nível de log para debug", "Reset log level" : "Reiniciar nível de registo", + "Starting code integrity check" : "A iniciar verificação de integridade do código", + "Finished code integrity check" : "Terminada a verificação de integridade do código", "%s (3rdparty)" : "%s (terceiros)", "%s (incompatible)" : "%s (incompatível)", "Following apps have been disabled: %s" : "As seguintes apps foram desativadas: %s", "Already up to date" : "Já está atualizado", + "Please select a file." : "Por favor, selecione um ficheiro.", "File is too big" : "O ficheiro é muito grande", "Invalid file provided" : "Ficheiro indicado inválido", "No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem", @@ -29,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Não foram fornecidos dados de recorte", "No valid crop data provided" : "Não foram indicados dados de recorte válidos", "Crop is not square" : "O recorte não é quadrado", + "Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida", + "Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou", + "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar o email de reposição porque não existe nenhum email associado a este utilizador. Por favor contacte o administrador.", + "%s password reset" : "%s reposição da palavra-passe", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "Sunday" : "Domingo", "Monday" : "Segunda", "Tuesday" : "Terça", @@ -74,10 +86,10 @@ OC.L10N.register( "Oct." : "Out.", "Nov." : "Nov.", "Dec." : "Dez.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>", "Settings" : "Definições", "Saving..." : "A guardar ...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?", "I know what I'm doing" : "Eu sei o que eu estou a fazer", @@ -106,10 +118,18 @@ OC.L10N.register( "Good password" : "Palavra-passe boa", "Strong password" : "Palavra-passe forte", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiro, porque a interface WebDAV parece estar com problemas.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor ownCloud não tem uma ligação de Internet a funcionar. Isto significa que algumas funcionalidades como o acesso a locais externos, notificações sobre actualizações, ou a instalação de aplicações de terceiros não irá funcionar. Aceder aos ficheiros remotamente e enviar notificações de email poderão não funcionar também. Sugerimos que active uma ligação à Internet se pretende obter todas as funcionalidades do ownCloud.", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desanimador por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão ({version}) do PHP já não é <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós encorajamos-lhe a atualizar a sua versão do PHP para aproveitar o desempenho e as atualizações de segurança fornecidas pelo PHP.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "A configuração dos proxy headers reversos está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar o seu endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lists de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)", "Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.", + "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "Shared" : "Partilhado", "Shared with {recipients}" : "Partilhado com {recipients}", @@ -154,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Partilhar com utilizadores, grupos ou utilizadores remotos...", "Warning" : "Aviso", "Error while sending notification" : "Erro enquanto estava a enviar a notificação", + "Delete" : "Apagar", "The object type is not specified." : "O tipo de objeto não está especificado.", "Enter new" : "Introduza novo", - "Delete" : "Apagar", "Add" : "Adicionar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Ocorreu um erro ao carregar o modelo de janela: {error}", @@ -168,22 +188,16 @@ OC.L10N.register( "Hello {name}" : "Olá {name}", "_download %n file_::_download %n files_" : ["transferir %n ficheiro","transferir %n ficheiros"], "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informação sobre como atualizar.", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Deixar esta página agora poderá interromper o processo nalguns ambientes.", "Updating {productName} to version {version}, this may take a while." : "A atualizar {productName} para a versão {version}, isto poderá demorar algum tempo.", "An error occurred." : "Ocorreu um erro.", "Please reload the page." : "Por favor, recarregue a página.", "The update was unsuccessful. " : "Não foi possível atualizar.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Tem alguns avisos.", "The update was successful. Redirecting you to ownCloud now." : "A actualização foi concluída com sucesso. Vai ser redireccionado para o ownCloud agora.", - "Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida", - "Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou", - "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.", - "%s password reset" : "%s reposição da palavra-passe", - "Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}", - "New password" : "Nova palavra-chave", - "New Password" : "Nova palavra-passe", - "Reset password" : "Repor palavra-passe", "Searching other places" : "A pesquisar noutros lugares", "No search results in other folders" : "Sem resultados de procura nas outras pastas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de pesquisa noutra pasta","{count} resultados de pesquisa noutras pastas"], "Personal" : "Pessoal", "Users" : "Utilizadores", "Apps" : "Apps", @@ -250,13 +264,19 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.", "Log in" : "Iniciar Sessão", "Wrong password. Reset it?" : "Senha errada. Repô-la?", + "Wrong password." : "Palavra-passe errada.", "Stay logged in" : "Manter sessão iniciada", "Alternative Logins" : "Contas de acesso alternativas", + "Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}", + "New password" : "Nova palavra-chave", + "New Password" : "Nova palavra-passe", + "Reset password" : "Repor palavra-passe", "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.", "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem usar a instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador de sistema se esta mensagem continuar a aparecer ou apareceu inesperadamente.", "Thank you for your patience." : "Obrigado pela sua paciência.", "You are accessing the server from an untrusted domain." : "Está a aceder ao servidor a partir de um domínio que não é de confiança.", + "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador desta instância, configure as definições \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.", "Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança", "App update required" : "É necessário atualizar a app", diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json index 747e8fb29cb..75052ed6f2e 100644 --- a/core/l10n/pt_PT.json +++ b/core/l10n/pt_PT.json @@ -6,17 +6,23 @@ "Maintenance mode is kept active" : "O modo de manutenção é mantido ativo", "Updating database schema" : "A actualizar o esquema da base de dados", "Updated database" : "Base de dados atualizada", + "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)", "Checked database schema update" : "Atualização do esquema da base de dados verificada.", "Checking updates of apps" : "A procurar por atualizações das apps", + "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "A verificar se o esquema da base de dados para %s pode ser atualizado (isto pode demorar algum tempo dependendo do tamanho da base de dados)", "Checked database schema update for apps" : "Atualização do esquema da base de dados verificada.", "Updated \"%s\" to %s" : "Atualizado \"%s\" para %s", "Repair warning: " : "Aviso de reparação:", "Repair error: " : "Corrija o erro:", + "Set log level to debug" : "Definir o nível de log para debug", "Reset log level" : "Reiniciar nível de registo", + "Starting code integrity check" : "A iniciar verificação de integridade do código", + "Finished code integrity check" : "Terminada a verificação de integridade do código", "%s (3rdparty)" : "%s (terceiros)", "%s (incompatible)" : "%s (incompatível)", "Following apps have been disabled: %s" : "As seguintes apps foram desativadas: %s", "Already up to date" : "Já está atualizado", + "Please select a file." : "Por favor, selecione um ficheiro.", "File is too big" : "O ficheiro é muito grande", "Invalid file provided" : "Ficheiro indicado inválido", "No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem", @@ -27,6 +33,12 @@ "No crop data provided" : "Não foram fornecidos dados de recorte", "No valid crop data provided" : "Não foram indicados dados de recorte válidos", "Crop is not square" : "O recorte não é quadrado", + "Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida", + "Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou", + "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar o email de reposição porque não existe nenhum email associado a este utilizador. Por favor contacte o administrador.", + "%s password reset" : "%s reposição da palavra-passe", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "Sunday" : "Domingo", "Monday" : "Segunda", "Tuesday" : "Terça", @@ -72,10 +84,10 @@ "Oct." : "Out.", "Nov." : "Nov.", "Dec." : "Dez.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>", "Settings" : "Definições", "Saving..." : "A guardar ...", "seconds ago" : "segundos atrás", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de reposição. Por favor, contacte o administrador.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A hiperligação para reiniciar a sua senha foi enviada para o seu correio eletrónico. Se não a receber dentro de um tempo aceitável, verifique as suas pastas de span/lixo.<br> Se não a encontrar, pergunte ao seu administrador local.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Os seus ficheiros estão encriptados. Se não ativou a chave de recuperação, não terá nenhum modo para voltar obter os seus dados depois de reiniciar a sua senha. <br />Se não tem a certeza do que fazer, por favor, contacte o seu administrador antes de continuar.<br /> Tem a certeza que quer continuar?", "I know what I'm doing" : "Eu sei o que eu estou a fazer", @@ -104,10 +116,18 @@ "Good password" : "Palavra-passe boa", "Strong password" : "Palavra-passe forte", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "O seu servidor da Web não está configurado corretamente para permitir a sincronização de ficheiro, porque a interface WebDAV parece estar com problemas.", + "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "O seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor ownCloud não tem uma ligação de Internet a funcionar. Isto significa que algumas funcionalidades como o acesso a locais externos, notificações sobre actualizações, ou a instalação de aplicações de terceiros não irá funcionar. Aceder aos ficheiros remotamente e enviar notificações de email poderão não funcionar também. Sugerimos que active uma ligação à Internet se pretende obter todas as funcionalidades do ownCloud.", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.", + "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desanimador por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Your PHP version ({version}) is no longer <a target=\"_blank\" href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "A sua versão ({version}) do PHP já não é <a target=\"_blank\" href=\"{phpLink}\">suportada pelo PHP</a>. Nós encorajamos-lhe a atualizar a sua versão do PHP para aproveitar o desempenho e as atualizações de segurança fornecidas pelo PHP.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "A configuração dos proxy headers reversos está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar o seu endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lists de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)", "Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.", + "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "Shared" : "Partilhado", "Shared with {recipients}" : "Partilhado com {recipients}", @@ -152,9 +172,9 @@ "Share with users, groups or remote users …" : "Partilhar com utilizadores, grupos ou utilizadores remotos...", "Warning" : "Aviso", "Error while sending notification" : "Erro enquanto estava a enviar a notificação", + "Delete" : "Apagar", "The object type is not specified." : "O tipo de objeto não está especificado.", "Enter new" : "Introduza novo", - "Delete" : "Apagar", "Add" : "Adicionar", "Edit tags" : "Editar etiquetas", "Error loading dialog template: {error}" : "Ocorreu um erro ao carregar o modelo de janela: {error}", @@ -166,22 +186,16 @@ "Hello {name}" : "Olá {name}", "_download %n file_::_download %n files_" : ["transferir %n ficheiro","transferir %n ficheiros"], "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informação sobre como atualizar.", + "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "A atualização está em curso. Deixar esta página agora poderá interromper o processo nalguns ambientes.", "Updating {productName} to version {version}, this may take a while." : "A atualizar {productName} para a versão {version}, isto poderá demorar algum tempo.", "An error occurred." : "Ocorreu um erro.", "Please reload the page." : "Por favor, recarregue a página.", "The update was unsuccessful. " : "Não foi possível atualizar.", "The update was successful. There were warnings." : "A atualização foi bem sucedida. Tem alguns avisos.", "The update was successful. Redirecting you to ownCloud now." : "A actualização foi concluída com sucesso. Vai ser redireccionado para o ownCloud agora.", - "Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida", - "Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou", - "Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.", - "%s password reset" : "%s reposição da palavra-passe", - "Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}", - "New password" : "Nova palavra-chave", - "New Password" : "Nova palavra-passe", - "Reset password" : "Repor palavra-passe", "Searching other places" : "A pesquisar noutros lugares", "No search results in other folders" : "Sem resultados de procura nas outras pastas", + "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} resultado de pesquisa noutra pasta","{count} resultados de pesquisa noutras pastas"], "Personal" : "Pessoal", "Users" : "Utilizadores", "Apps" : "Apps", @@ -248,13 +262,19 @@ "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.", "Log in" : "Iniciar Sessão", "Wrong password. Reset it?" : "Senha errada. Repô-la?", + "Wrong password." : "Palavra-passe errada.", "Stay logged in" : "Manter sessão iniciada", "Alternative Logins" : "Contas de acesso alternativas", + "Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}", + "New password" : "Nova palavra-chave", + "New Password" : "Nova palavra-passe", + "Reset password" : "Repor palavra-passe", "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.", "This means only administrators can use the instance." : "Isto significa que apenas os administradores podem usar a instância.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Contacte o seu administrador de sistema se esta mensagem continuar a aparecer ou apareceu inesperadamente.", "Thank you for your patience." : "Obrigado pela sua paciência.", "You are accessing the server from an untrusted domain." : "Está a aceder ao servidor a partir de um domínio que não é de confiança.", + "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Por favor contacte o seu administrador. Se é um administrador desta instância, configure as definições \"trusted_domains\" em config/config.php. Um exemplo de configuração é fornecido em config/config.sample.php.", "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Dependendo da configuração, como administrador, você também pode ser capaz de usar o botão abaixo para confiar neste domínio.", "Add \"%s\" as trusted domain" : "Adicionar \"%s\" como um domínio de confiança", "App update required" : "É necessário atualizar a app", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index ac56a921da3..4e16ae1e8bb 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -11,6 +11,8 @@ OC.L10N.register( "No image or file provided" : "Nu a fost furnizat vreo imagine sau fișier", "Unknown filetype" : "Tip fișier necunoscut", "Invalid image" : "Imagine invalidă", + "%s password reset" : "%s resetare parola", + "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Sunday" : "Duminică", "Monday" : "Luni", "Tuesday" : "Marți", @@ -52,7 +54,6 @@ OC.L10N.register( "Settings" : "Setări", "Saving..." : "Se salvează...", "seconds ago" : "secunde în urmă", - "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "I know what I'm doing" : "Eu știu ce fac", "Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificata. Vă rugăm să contactați administratorul dvs.", "No" : "Nu", @@ -110,18 +111,13 @@ OC.L10N.register( "access control" : "control acces", "Share" : "Partajează", "Warning" : "Atenție", + "Delete" : "Șterge", "The object type is not specified." : "Tipul obiectului nu este specificat.", "Enter new" : "Introducere nou", - "Delete" : "Șterge", "Add" : "Adaugă", "Updating {productName} to version {version}, this may take a while." : "Se actualizează {productName} la versiunea {version}, poate dura câteva momente.", "Please reload the page." : "Te rugăm să reîncarci pagina.", "The update was successful. Redirecting you to ownCloud now." : "Actualizare reușită. Ești redirecționat către ownCloud.", - "%s password reset" : "%s resetare parola", - "Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}", - "New password" : "Noua parolă", - "New Password" : "Noua parolă", - "Reset password" : "Resetează parola", "Personal" : "Personal", "Users" : "Utilizatori", "Apps" : "Aplicații", @@ -148,6 +144,10 @@ OC.L10N.register( "Search" : "Căutare", "Log in" : "Autentificare", "Alternative Logins" : "Conectări alternative", + "Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}", + "New password" : "Noua parolă", + "New Password" : "Noua parolă", + "Reset password" : "Resetează parola", "Thank you for your patience." : "Îți mulțumim pentru răbrade.", "Start update" : "Începe actualizarea" }, diff --git a/core/l10n/ro.json b/core/l10n/ro.json index 701b991ba98..12944f678bd 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -9,6 +9,8 @@ "No image or file provided" : "Nu a fost furnizat vreo imagine sau fișier", "Unknown filetype" : "Tip fișier necunoscut", "Invalid image" : "Imagine invalidă", + "%s password reset" : "%s resetare parola", + "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Sunday" : "Duminică", "Monday" : "Luni", "Tuesday" : "Marți", @@ -50,7 +52,6 @@ "Settings" : "Setări", "Saving..." : "Se salvează...", "seconds ago" : "secunde în urmă", - "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "I know what I'm doing" : "Eu știu ce fac", "Password can not be changed. Please contact your administrator." : "Parola nu poate fi modificata. Vă rugăm să contactați administratorul dvs.", "No" : "Nu", @@ -108,18 +109,13 @@ "access control" : "control acces", "Share" : "Partajează", "Warning" : "Atenție", + "Delete" : "Șterge", "The object type is not specified." : "Tipul obiectului nu este specificat.", "Enter new" : "Introducere nou", - "Delete" : "Șterge", "Add" : "Adaugă", "Updating {productName} to version {version}, this may take a while." : "Se actualizează {productName} la versiunea {version}, poate dura câteva momente.", "Please reload the page." : "Te rugăm să reîncarci pagina.", "The update was successful. Redirecting you to ownCloud now." : "Actualizare reușită. Ești redirecționat către ownCloud.", - "%s password reset" : "%s resetare parola", - "Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}", - "New password" : "Noua parolă", - "New Password" : "Noua parolă", - "Reset password" : "Resetează parola", "Personal" : "Personal", "Users" : "Utilizatori", "Apps" : "Aplicații", @@ -146,6 +142,10 @@ "Search" : "Căutare", "Log in" : "Autentificare", "Alternative Logins" : "Conectări alternative", + "Use the following link to reset your password: {link}" : "Folosește următorul link pentru a reseta parola: {link}", + "New password" : "Noua parolă", + "New Password" : "Noua parolă", + "Reset password" : "Resetează parola", "Thank you for your patience." : "Îți mulțumim pentru răbrade.", "Start update" : "Începe actualizarea" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" diff --git a/core/l10n/ru.js b/core/l10n/ru.js index 590dfd3ea2b..0d1c20680a5 100644 --- a/core/l10n/ru.js +++ b/core/l10n/ru.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "Не указана информация о кадрировании", "No valid crop data provided" : "Не указаны корректные данные о кадрировании", "Crop is not square" : "Кадр не является квадратом", + "Couldn't reset password because the token is invalid" : "Не удалось сбросить пароль из-за неверного токена", + "Couldn't reset password because the token is expired" : "Не удалось сбросить пароль, так как срок действия токена истек.", + "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Не удалось отправить письмо сброса так как у данного пользователя не задан адрес электронной почты. Пожалуйста, обратитесь к администратору.", + "%s password reset" : "Сброс пароля %s", + "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "Sunday" : "Воскресенье", "Monday" : "Понедельник", "Tuesday" : "Вторник", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Настройки", "Saving..." : "Сохранение...", "seconds ago" : "несколько секунд назад", - "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку со спамом.<br>Если его там нет, то обратитесь к вашему администратору.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. Если вы не включили ключ восстановления, то ваши данные будут недоступны после сброса пароля.<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?", "I know what I'm doing" : "Я понимаю, что делаю", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Поделиться с пользователями, группами или удаленными пользователями ...", "Warning" : "Предупреждение", "Error while sending notification" : "Ошибка при отправке уведомления", + "Delete" : "Удалить", "The object type is not specified." : "Тип объекта не указан", "Enter new" : "Ввести новое", - "Delete" : "Удалить", "Add" : "Добавить", "Edit tags" : "Изменить метки", "Error loading dialog template: {error}" : "Ошибка загрузки шаблона диалога: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Обновление окончилось неудачей.", "The update was successful. There were warnings." : "Обновление прошло успешно. Были предупреждения.", "The update was successful. Redirecting you to ownCloud now." : "Обновление прошло успешно. Перенаправляем в ownCloud.", - "Couldn't reset password because the token is invalid" : "Не удалось сбросить пароль из-за неверного токена", - "Couldn't reset password because the token is expired" : "Не удалось сбросить пароль, так как срок действия токена истек.", - "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Не удалось отправить письмо сброса так как у данного пользователя не задан адрес электронной почты. Пожалуйста, обратитесь к администратору.", - "%s password reset" : "Сброс пароля %s", - "Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}", - "New password" : "Новый пароль", - "New Password" : "Новый пароль", - "Reset password" : "Сбросить пароль", "Searching other places" : "Идет поиск в других местах", "No search results in other folders" : "В других папках ничего не найдено", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат в другой папке","{count} результата в другой папке","{count} результатов в другой папке","{count} результатов в других папках"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Неправильный пароль.", "Stay logged in" : "Оставаться в системе", "Alternative Logins" : "Альтернативные имена пользователя", + "Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}", + "New password" : "Новый пароль", + "New Password" : "Новый пароль", + "Reset password" : "Сбросить пароль", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в настоящее время работает в однопользовательском режиме.", "This means only administrators can use the instance." : "Это значит, что только администраторы могут использовать сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.", diff --git a/core/l10n/ru.json b/core/l10n/ru.json index f98955b663b..1a4b0a70a83 100644 --- a/core/l10n/ru.json +++ b/core/l10n/ru.json @@ -33,6 +33,12 @@ "No crop data provided" : "Не указана информация о кадрировании", "No valid crop data provided" : "Не указаны корректные данные о кадрировании", "Crop is not square" : "Кадр не является квадратом", + "Couldn't reset password because the token is invalid" : "Не удалось сбросить пароль из-за неверного токена", + "Couldn't reset password because the token is expired" : "Не удалось сбросить пароль, так как срок действия токена истек.", + "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Не удалось отправить письмо сброса так как у данного пользователя не задан адрес электронной почты. Пожалуйста, обратитесь к администратору.", + "%s password reset" : "Сброс пароля %s", + "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "Sunday" : "Воскресенье", "Monday" : "Понедельник", "Tuesday" : "Вторник", @@ -82,7 +88,6 @@ "Settings" : "Настройки", "Saving..." : "Сохранение...", "seconds ago" : "несколько секунд назад", - "Couldn't send reset email. Please contact your administrator." : "Не удалось отправить письмо для сброса пароля. Пожалуйста, свяжитесь с вашим администратором.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Ссылка для сброса пароля была отправлена на ваш email. Если вы не получили письмо в течении разумного промежутка времени, проверьте папку со спамом.<br>Если его там нет, то обратитесь к вашему администратору.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваши файлы зашифрованы. Если вы не включили ключ восстановления, то ваши данные будут недоступны после сброса пароля.<br />Если вы не уверены что делать дальше - обратитесь к вашему администратору.<br />Вы действительно хотите продолжить?", "I know what I'm doing" : "Я понимаю, что делаю", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Поделиться с пользователями, группами или удаленными пользователями ...", "Warning" : "Предупреждение", "Error while sending notification" : "Ошибка при отправке уведомления", + "Delete" : "Удалить", "The object type is not specified." : "Тип объекта не указан", "Enter new" : "Ввести новое", - "Delete" : "Удалить", "Add" : "Добавить", "Edit tags" : "Изменить метки", "Error loading dialog template: {error}" : "Ошибка загрузки шаблона диалога: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "Обновление окончилось неудачей.", "The update was successful. There were warnings." : "Обновление прошло успешно. Были предупреждения.", "The update was successful. Redirecting you to ownCloud now." : "Обновление прошло успешно. Перенаправляем в ownCloud.", - "Couldn't reset password because the token is invalid" : "Не удалось сбросить пароль из-за неверного токена", - "Couldn't reset password because the token is expired" : "Не удалось сбросить пароль, так как срок действия токена истек.", - "Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Не удалось отправить письмо сброса так как у данного пользователя не задан адрес электронной почты. Пожалуйста, обратитесь к администратору.", - "%s password reset" : "Сброс пароля %s", - "Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}", - "New password" : "Новый пароль", - "New Password" : "Новый пароль", - "Reset password" : "Сбросить пароль", "Searching other places" : "Идет поиск в других местах", "No search results in other folders" : "В других папках ничего не найдено", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат в другой папке","{count} результата в другой папке","{count} результатов в другой папке","{count} результатов в других папках"], @@ -269,6 +265,10 @@ "Wrong password." : "Неправильный пароль.", "Stay logged in" : "Оставаться в системе", "Alternative Logins" : "Альтернативные имена пользователя", + "Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}", + "New password" : "Новый пароль", + "New Password" : "Новый пароль", + "Reset password" : "Сбросить пароль", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в настоящее время работает в однопользовательском режиме.", "This means only administrators can use the instance." : "Это значит, что только администраторы могут использовать сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.", diff --git a/core/l10n/si_LK.js b/core/l10n/si_LK.js index ca5b4af1b9a..9276cc6dc76 100644 --- a/core/l10n/si_LK.js +++ b/core/l10n/si_LK.js @@ -63,8 +63,6 @@ OC.L10N.register( "Warning" : "අවවාදය", "Delete" : "මකා දමන්න", "Add" : "එකතු කරන්න", - "New password" : "නව මුරපදය", - "Reset password" : "මුරපදය ප්රත්යාරම්භ කරන්න", "Personal" : "පෞද්ගලික", "Users" : "පරිශීලකයන්", "Apps" : "යෙදුම්", @@ -81,6 +79,8 @@ OC.L10N.register( "Finish setup" : "ස්ථාපනය කිරීම අවසන් කරන්න", "Log out" : "නික්මීම", "Search" : "සොයන්න", - "Log in" : "ප්රවේශවන්න" + "Log in" : "ප්රවේශවන්න", + "New password" : "නව මුරපදය", + "Reset password" : "මුරපදය ප්රත්යාරම්භ කරන්න" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/si_LK.json b/core/l10n/si_LK.json index f28f0086eba..3f87eb4ac24 100644 --- a/core/l10n/si_LK.json +++ b/core/l10n/si_LK.json @@ -61,8 +61,6 @@ "Warning" : "අවවාදය", "Delete" : "මකා දමන්න", "Add" : "එකතු කරන්න", - "New password" : "නව මුරපදය", - "Reset password" : "මුරපදය ප්රත්යාරම්භ කරන්න", "Personal" : "පෞද්ගලික", "Users" : "පරිශීලකයන්", "Apps" : "යෙදුම්", @@ -79,6 +77,8 @@ "Finish setup" : "ස්ථාපනය කිරීම අවසන් කරන්න", "Log out" : "නික්මීම", "Search" : "සොයන්න", - "Log in" : "ප්රවේශවන්න" + "Log in" : "ප්රවේශවන්න", + "New password" : "නව මුරපදය", + "Reset password" : "මුරපදය ප්රත්යාරම්භ කරන්න" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js index c8256bf1869..508998b3e35 100644 --- a/core/l10n/sk_SK.js +++ b/core/l10n/sk_SK.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Dáta pre orezanie neboli zadané", "No valid crop data provided" : "Neplatné dáta pre orezanie neboli zadané", "Crop is not square" : "Orezanie nie je štvorcové", + "Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.", + "Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.", + "Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.", + "%s password reset" : "reset hesla %s", + "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "Sunday" : "Nedeľa", "Monday" : "Pondelok", "Tuesday" : "Utorok", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Nastavenia", "Saving..." : "Ukladám...", "seconds ago" : "pred sekundami", - "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?", "I know what I'm doing" : "Viem, čo robím", @@ -153,9 +157,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Zdieľať s používateľmi, skupinami alebo vzdialenými používateľmi ...", "Warning" : "Varovanie", "Error while sending notification" : "Chyba pri posielaní oznámenia", + "Delete" : "Zmazať", "The object type is not specified." : "Nešpecifikovaný typ objektu.", "Enter new" : "Zadať nový", - "Delete" : "Zmazať", "Add" : "Pridať", "Edit tags" : "Upraviť štítky", "Error loading dialog template: {error}" : "Chyba pri načítaní šablóny dialógu: {error}", @@ -174,14 +178,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Aktualizácia bola neúspešná.", "The update was successful. There were warnings." : "Aktualizácia bola úspešná. Vyskytli sa upozornenia.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizácia bola úspešná. Presmerovávam vás na prihlasovaciu stránku.", - "Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.", - "Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.", - "Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.", - "%s password reset" : "reset hesla %s", - "Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}", - "New password" : "Nové heslo", - "New Password" : "Nové heslo", - "Reset password" : "Obnovenie hesla", "Searching other places" : "Prehľadanie ostatných umiestnení", "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} výsledok vyhľadávania v ostatných priečinkoch","{count} výsledky vyhľadávania v ostatných priečinkoch","{count} výsledkov vyhľadávania v ostatných priečinkoch"], @@ -253,6 +249,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Chybné heslo. Chcete ho obnoviť?", "Stay logged in" : "Zostať prihlásený", "Alternative Logins" : "Alternatívne prihlásenie", + "Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}", + "New password" : "Nové heslo", + "New Password" : "Nové heslo", + "Reset password" : "Obnovenie hesla", "This ownCloud instance is currently in single user mode." : "Táto inštancia ownCloudu je teraz v jednopoužívateľskom móde.", "This means only administrators can use the instance." : "Len správca systému môže používať túto inštanciu.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktujte prosím správcu systému, ak sa táto správa objavuje opakovane alebo neočakávane.", diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json index 3379984db23..f1e26bd254a 100644 --- a/core/l10n/sk_SK.json +++ b/core/l10n/sk_SK.json @@ -28,6 +28,11 @@ "No crop data provided" : "Dáta pre orezanie neboli zadané", "No valid crop data provided" : "Neplatné dáta pre orezanie neboli zadané", "Crop is not square" : "Orezanie nie je štvorcové", + "Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.", + "Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.", + "Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.", + "%s password reset" : "reset hesla %s", + "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "Sunday" : "Nedeľa", "Monday" : "Pondelok", "Tuesday" : "Utorok", @@ -76,7 +81,6 @@ "Settings" : "Nastavenia", "Saving..." : "Ukladám...", "seconds ago" : "pred sekundami", - "Couldn't send reset email. Please contact your administrator." : "Nemožno poslať email pre obnovu. Kontaktujte prosím vášho administrátora.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Odkaz na obnovu hesla bol odoslaný na váš email. Pokiaľ ho neobdržíte v primeranom čase, skontrolujte spam / priečinok nevyžiadanej pošty. <br> Ak tam nie je, kontaktujte svojho administrátora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Súbory sú zašifrované. Ak ste nepovolili kľúč pre obnovenie, neexistuje žiadny spôsob, ako obnoviť vaše dáta po obnovení vášho hesla. <br /> Ak si nie ste istí čo urobiť, prosím skôr než budete pokračovať, obráťte sa na administrátora. <br /> Naozaj chcete pokračovať?", "I know what I'm doing" : "Viem, čo robím", @@ -151,9 +155,9 @@ "Share with users, groups or remote users …" : "Zdieľať s používateľmi, skupinami alebo vzdialenými používateľmi ...", "Warning" : "Varovanie", "Error while sending notification" : "Chyba pri posielaní oznámenia", + "Delete" : "Zmazať", "The object type is not specified." : "Nešpecifikovaný typ objektu.", "Enter new" : "Zadať nový", - "Delete" : "Zmazať", "Add" : "Pridať", "Edit tags" : "Upraviť štítky", "Error loading dialog template: {error}" : "Chyba pri načítaní šablóny dialógu: {error}", @@ -172,14 +176,6 @@ "The update was unsuccessful. " : "Aktualizácia bola neúspešná.", "The update was successful. There were warnings." : "Aktualizácia bola úspešná. Vyskytli sa upozornenia.", "The update was successful. Redirecting you to ownCloud now." : "Aktualizácia bola úspešná. Presmerovávam vás na prihlasovaciu stránku.", - "Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.", - "Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.", - "Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.", - "%s password reset" : "reset hesla %s", - "Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}", - "New password" : "Nové heslo", - "New Password" : "Nové heslo", - "Reset password" : "Obnovenie hesla", "Searching other places" : "Prehľadanie ostatných umiestnení", "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} výsledok vyhľadávania v ostatných priečinkoch","{count} výsledky vyhľadávania v ostatných priečinkoch","{count} výsledkov vyhľadávania v ostatných priečinkoch"], @@ -251,6 +247,10 @@ "Wrong password. Reset it?" : "Chybné heslo. Chcete ho obnoviť?", "Stay logged in" : "Zostať prihlásený", "Alternative Logins" : "Alternatívne prihlásenie", + "Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}", + "New password" : "Nové heslo", + "New Password" : "Nové heslo", + "Reset password" : "Obnovenie hesla", "This ownCloud instance is currently in single user mode." : "Táto inštancia ownCloudu je teraz v jednopoužívateľskom móde.", "This means only administrators can use the instance." : "Len správca systému môže používať túto inštanciu.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktujte prosím správcu systému, ak sa táto správa objavuje opakovane alebo neočakávane.", diff --git a/core/l10n/sl.js b/core/l10n/sl.js index c22f5a9a414..70298747ddf 100644 --- a/core/l10n/sl.js +++ b/core/l10n/sl.js @@ -10,7 +10,7 @@ OC.L10N.register( "Updated database" : "Posodobljena podatkovna zbirka", "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Preverjam, ali lahko posodobim strukturo baze (lahko traja dlje zaradi velikosti baze)", "Checked database schema update" : "Izbrana posodobitev sheme podatkovne zbirke", - "Checking updates of apps" : "Preverjam posodobitve aplikacij", + "Checking updates of apps" : "Poteka preverjanje za posodobitve programov", "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Preverjam, ali lahko posodobim strukturo baze za %s (lahko traja dlje zaradi velikosti baze)", "Checked database schema update for apps" : "Izbrana posodobitev sheme podatkovne zbirke za programe", "Updated \"%s\" to %s" : "Datoteka \"%s\" je posodobljena na %s", @@ -20,6 +20,7 @@ OC.L10N.register( "%s (incompatible)" : "%s (neskladno)", "Following apps have been disabled: %s" : "Sledeče aplikacije so blie izključene: %s", "Already up to date" : "Že zadnja verzija", + "Please select a file." : "Izberite datoteko", "File is too big" : "Datoteka je prevelika", "Invalid file provided" : "Predložena je bila napačna datoteka", "No image or file provided" : "Ni podane datoteke ali slike", @@ -30,6 +31,11 @@ OC.L10N.register( "No crop data provided" : "Ni podanih podatkov obreza", "No valid crop data provided" : "Napačni podatki za obrez slike", "Crop is not square" : "Obrez ni pravokoten", + "Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.", + "Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.", + "Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.", + "%s password reset" : "Ponastavitev gesla %s", + "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "Sunday" : "nedelja", "Monday" : "ponedeljek", "Tuesday" : "torek", @@ -78,7 +84,6 @@ OC.L10N.register( "Settings" : "Nastavitve", "Saving..." : "Poteka shranjevanje ...", "seconds ago" : "pred nekaj sekundami", - "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?", "I know what I'm doing" : "Vem, kaj delam!", @@ -150,9 +155,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Souporaba z usporabniki, skupinami ali zunanjimi uporabniki ...", "Warning" : "Opozorilo", "Error while sending notification" : "Napaka med pošiljanjem obvestila", + "Delete" : "Izbriši", "The object type is not specified." : "Vrsta predmeta ni podana.", "Enter new" : "Vnesite novo", - "Delete" : "Izbriši", "Add" : "Dodaj", "Edit tags" : "Uredi oznake", "Error loading dialog template: {error}" : "Napaka nalaganja predloge pogovornega okna: {error}", @@ -171,14 +176,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Posodobitev je spodletela.", "The update was successful. There were warnings." : "Posodobitev je uspela. Z nekaj opozorili.", "The update was successful. Redirecting you to ownCloud now." : "Posodobitev je uspešno končana. Stran bo preusmerjena na oblak ownCloud.", - "Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.", - "Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.", - "Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.", - "%s password reset" : "Ponastavitev gesla %s", - "Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}", - "New password" : "Novo geslo", - "New Password" : "Novo geslo", - "Reset password" : "Ponastavi geslo", "Searching other places" : "Iskanje drugih mest", "No search results in other folders" : "Iskanje po drugih mapah ni vrnilo rezultata", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} rezultat v drugih mapah","{count} rezultata v drugih mapah","{count} rezultatov v drugih mapah","{count} rezultatov v drugih mapah"], @@ -243,8 +240,13 @@ OC.L10N.register( "Please try again or contact your administrator." : "Poskusite ponovno ali kontaktirajte skrbnika.", "Log in" : "Prijava", "Wrong password. Reset it?" : "Napačno gelo. Ponastavimo?", - "Stay logged in" : "Ostanite prijavljeni", + "Wrong password." : "Napačno geslo!", + "Stay logged in" : "Ohrani prijavo", "Alternative Logins" : "Druge prijavne možnosti", + "Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}", + "New password" : "Novo geslo", + "New Password" : "Novo geslo", + "Reset password" : "Ponastavi geslo", "This ownCloud instance is currently in single user mode." : "Ta seja oblaka ownCloud je trenutno v načinu enega sočasnega uporabnika.", "This means only administrators can use the instance." : "To pomeni, da lahko oblak uporabljajo le osebe s skrbniškimi dovoljenji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Stopite v stik s skrbnikom sistema, če se bo sporočilo še naprej nepričakovano prikazovalo.", diff --git a/core/l10n/sl.json b/core/l10n/sl.json index a5b1633783e..0b57a42e908 100644 --- a/core/l10n/sl.json +++ b/core/l10n/sl.json @@ -8,7 +8,7 @@ "Updated database" : "Posodobljena podatkovna zbirka", "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Preverjam, ali lahko posodobim strukturo baze (lahko traja dlje zaradi velikosti baze)", "Checked database schema update" : "Izbrana posodobitev sheme podatkovne zbirke", - "Checking updates of apps" : "Preverjam posodobitve aplikacij", + "Checking updates of apps" : "Poteka preverjanje za posodobitve programov", "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Preverjam, ali lahko posodobim strukturo baze za %s (lahko traja dlje zaradi velikosti baze)", "Checked database schema update for apps" : "Izbrana posodobitev sheme podatkovne zbirke za programe", "Updated \"%s\" to %s" : "Datoteka \"%s\" je posodobljena na %s", @@ -18,6 +18,7 @@ "%s (incompatible)" : "%s (neskladno)", "Following apps have been disabled: %s" : "Sledeče aplikacije so blie izključene: %s", "Already up to date" : "Že zadnja verzija", + "Please select a file." : "Izberite datoteko", "File is too big" : "Datoteka je prevelika", "Invalid file provided" : "Predložena je bila napačna datoteka", "No image or file provided" : "Ni podane datoteke ali slike", @@ -28,6 +29,11 @@ "No crop data provided" : "Ni podanih podatkov obreza", "No valid crop data provided" : "Napačni podatki za obrez slike", "Crop is not square" : "Obrez ni pravokoten", + "Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.", + "Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.", + "Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.", + "%s password reset" : "Ponastavitev gesla %s", + "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "Sunday" : "nedelja", "Monday" : "ponedeljek", "Tuesday" : "torek", @@ -76,7 +82,6 @@ "Settings" : "Nastavitve", "Saving..." : "Poteka shranjevanje ...", "seconds ago" : "pred nekaj sekundami", - "Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Povezava za ponastavitev gesla je bila poslana na naveden elektronski naslov. V kolikor sporočila ne dobite v kratkem, preverite tudi mapo neželene pošte.<br> Če sporočila ni niti v tej mapi, stopite v stik s skrbnikom.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Datoteke so šifrirane. Če niste omogočili obnovitvenega ključa, po ponastavitvi gesla ne bo mogoč dostop do datotek.<br />V primeru, da niste prepričani, kaj storiti, stopite v stik s skrbnikom sistema.<br />Ali ste prepričani, da želite nadaljevati?", "I know what I'm doing" : "Vem, kaj delam!", @@ -148,9 +153,9 @@ "Share with users, groups or remote users …" : "Souporaba z usporabniki, skupinami ali zunanjimi uporabniki ...", "Warning" : "Opozorilo", "Error while sending notification" : "Napaka med pošiljanjem obvestila", + "Delete" : "Izbriši", "The object type is not specified." : "Vrsta predmeta ni podana.", "Enter new" : "Vnesite novo", - "Delete" : "Izbriši", "Add" : "Dodaj", "Edit tags" : "Uredi oznake", "Error loading dialog template: {error}" : "Napaka nalaganja predloge pogovornega okna: {error}", @@ -169,14 +174,6 @@ "The update was unsuccessful. " : "Posodobitev je spodletela.", "The update was successful. There were warnings." : "Posodobitev je uspela. Z nekaj opozorili.", "The update was successful. Redirecting you to ownCloud now." : "Posodobitev je uspešno končana. Stran bo preusmerjena na oblak ownCloud.", - "Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.", - "Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.", - "Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.", - "%s password reset" : "Ponastavitev gesla %s", - "Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}", - "New password" : "Novo geslo", - "New Password" : "Novo geslo", - "Reset password" : "Ponastavi geslo", "Searching other places" : "Iskanje drugih mest", "No search results in other folders" : "Iskanje po drugih mapah ni vrnilo rezultata", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} rezultat v drugih mapah","{count} rezultata v drugih mapah","{count} rezultatov v drugih mapah","{count} rezultatov v drugih mapah"], @@ -241,8 +238,13 @@ "Please try again or contact your administrator." : "Poskusite ponovno ali kontaktirajte skrbnika.", "Log in" : "Prijava", "Wrong password. Reset it?" : "Napačno gelo. Ponastavimo?", - "Stay logged in" : "Ostanite prijavljeni", + "Wrong password." : "Napačno geslo!", + "Stay logged in" : "Ohrani prijavo", "Alternative Logins" : "Druge prijavne možnosti", + "Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}", + "New password" : "Novo geslo", + "New Password" : "Novo geslo", + "Reset password" : "Ponastavi geslo", "This ownCloud instance is currently in single user mode." : "Ta seja oblaka ownCloud je trenutno v načinu enega sočasnega uporabnika.", "This means only administrators can use the instance." : "To pomeni, da lahko oblak uporabljajo le osebe s skrbniškimi dovoljenji.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Stopite v stik s skrbnikom sistema, če se bo sporočilo še naprej nepričakovano prikazovalo.", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index ad1a11bd327..cde9976c472 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "S’u dhanë të dhëna qethjeje", "No valid crop data provided" : "S’u dhanë të dhëna qethjeje të vlefshme", "Crop is not square" : "Qethja s’është katrore", + "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", + "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", + "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "%s password reset" : "U ricaktua fjalëkalimi për %s", + "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", "Sunday" : "E dielë", "Monday" : "E hënë", "Tuesday" : "E martë", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "Rregullime", "Saving..." : "Po ruhet …", "seconds ago" : "sekonda më parë", - "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?", "I know what I'm doing" : "E di se ç’bëj", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Ndajeni me përdorues, grupe ose përdorues të largët …", "Warning" : "Kujdes", "Error while sending notification" : "Gabim gjatë dërgimit të njoftimit", + "Delete" : "Fshije", "The object type is not specified." : "S’është specifikuar lloji i objektit.", "Enter new" : "Jep të ri", - "Delete" : "Fshije", "Add" : "Shtoni", "Edit tags" : "Përpunoni etiketa", "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të gjedhes së dialogut: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Përditësimi qe i pasuksesshëm. ", "The update was successful. There were warnings." : "Përditësimi qe i suksesshëm. Pati sinjalizime.", "The update was successful. Redirecting you to ownCloud now." : "Përditësimi qe i suksesshëm. Po ridrejtoheni te ownCloud-i.", - "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", - "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", - "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", - "%s password reset" : "U ricaktua fjalëkalimi për %s", - "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", - "New password" : "Fjalëkalim i ri", - "New Password" : "Fjalëkalim i Ri", - "Reset password" : "Ricaktoni fjalëkalimin", "Searching other places" : "Po kërkohet në vende të tjera", "No search results in other folders" : "S’u gjetën përfundime në dosje të tjera", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} përfundim kërkimi në një tjetër dosje","{count} përfundime kërkimi në dosje të tjera"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", + "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", + "New password" : "Fjalëkalim i ri", + "New Password" : "Fjalëkalim i Ri", + "Reset password" : "Ricaktoni fjalëkalimin", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", "This means only administrators can use the instance." : "Kjo do të thotë që instancën mund ta përdorin vetëm administratorët.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Nëse ky mesazh shfaqet vazhdimisht ose u shfaq papritmas, lidhuni me përgjegjësin e sistemit.", diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 863b5bdce8a..067dec87b75 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -33,6 +33,12 @@ "No crop data provided" : "S’u dhanë të dhëna qethjeje", "No valid crop data provided" : "S’u dhanë të dhëna qethjeje të vlefshme", "Crop is not square" : "Qethja s’është katrore", + "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", + "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", + "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", + "%s password reset" : "U ricaktua fjalëkalimi për %s", + "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", "Sunday" : "E dielë", "Monday" : "E hënë", "Tuesday" : "E martë", @@ -82,7 +88,6 @@ "Settings" : "Rregullime", "Saving..." : "Po ruhet …", "seconds ago" : "sekonda më parë", - "Couldn't send reset email. Please contact your administrator." : "S’u dërgua dot email-i i ricaktimit. Ju lutemi, lidhuni me përgjegjësin tuaj.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Lidhja për ricaktimin e fjalëkalimi tuaj u dërgua tek email-i juaj. Nëse nuk e merrni brenda një kohe të arsyeshme, kontrolloni dosjet e postës së padëshirueshme/postës së pavlerë.<br>Nëse s’është as aty, pyetni përgjegjësin tuaj lokal.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Kartelat tuaja janë të fshehtëzuara. Nëse s’keni aktivizuar kyçin e rimarrjeve, nuk do të ketë ndonjë rrugë për të marrë sërish të dhënat tuaja pasi të jetë ricaktuar fjalëkalimi juaj.<br />Nëse s’jeni i sigurt se ç’duhet bërë, ju lutemi, përpara se të vazhdoni, lidhuni me përgjegjësin tuaj. <br />Doni vërtet të vazhdoni?", "I know what I'm doing" : "E di se ç’bëj", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "Ndajeni me përdorues, grupe ose përdorues të largët …", "Warning" : "Kujdes", "Error while sending notification" : "Gabim gjatë dërgimit të njoftimit", + "Delete" : "Fshije", "The object type is not specified." : "S’është specifikuar lloji i objektit.", "Enter new" : "Jep të ri", - "Delete" : "Fshije", "Add" : "Shtoni", "Edit tags" : "Përpunoni etiketa", "Error loading dialog template: {error}" : "Gabim gjatë ngarkimit të gjedhes së dialogut: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "Përditësimi qe i pasuksesshëm. ", "The update was successful. There were warnings." : "Përditësimi qe i suksesshëm. Pati sinjalizime.", "The update was successful. Redirecting you to ownCloud now." : "Përditësimi qe i suksesshëm. Po ridrejtoheni te ownCloud-i.", - "Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm", - "Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar", - "Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.", - "%s password reset" : "U ricaktua fjalëkalimi për %s", - "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", - "New password" : "Fjalëkalim i ri", - "New Password" : "Fjalëkalim i Ri", - "Reset password" : "Ricaktoni fjalëkalimin", "Searching other places" : "Po kërkohet në vende të tjera", "No search results in other folders" : "S’u gjetën përfundime në dosje të tjera", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} përfundim kërkimi në një tjetër dosje","{count} përfundime kërkimi në dosje të tjera"], @@ -269,6 +265,10 @@ "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", + "Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}", + "New password" : "Fjalëkalim i ri", + "New Password" : "Fjalëkalim i Ri", + "Reset password" : "Ricaktoni fjalëkalimin", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", "This means only administrators can use the instance." : "Kjo do të thotë që instancën mund ta përdorin vetëm administratorët.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Nëse ky mesazh shfaqet vazhdimisht ose u shfaq papritmas, lidhuni me përgjegjësin e sistemit.", diff --git a/core/l10n/sr.js b/core/l10n/sr.js index d3e4830e27b..2be75c88cea 100644 --- a/core/l10n/sr.js +++ b/core/l10n/sr.js @@ -22,6 +22,10 @@ OC.L10N.register( "No crop data provided" : "Нема података о опсецању", "No valid crop data provided" : "Нема података о опсецању", "Crop is not square" : "Опсецање није квадрат", + "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", + "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", + "%s password reset" : "%s лозинка ресетована", + "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "Sunday" : "недеља", "Monday" : "понедељак", "Tuesday" : "уторак", @@ -70,7 +74,6 @@ OC.L10N.register( "Settings" : "Поставке", "Saving..." : "Уписујем...", "seconds ago" : "пре пар секунди", - "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Веза за ресетовање лозинке је послата на вашу е-адресу. Ако је не примите ускоро, проверите фасцикле за нежељену пошту.<br>Ако није ни тамо, контактирајте вашег администратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Фајлови су вам шифровани. Ако нисте укључили кључ за опоравак, нећете моћи да повратите податке након ресетовања лозинке.<br />Ако нисте сигурни шта да радите, контактирајте администратора пре него што наставите.<br />Да ли желите да наставите?", "I know what I'm doing" : "Знам шта радим", @@ -144,9 +147,9 @@ OC.L10N.register( "Share with users or groups …" : "Дели са корисницима или групама...", "Share with users, groups or remote users …" : "Дели са корисницима, групама или удаљеним корисницима...", "Warning" : "Упозорење", + "Delete" : "Обриши", "The object type is not specified." : "Тип објекта није наведен.", "Enter new" : "Унесите нови", - "Delete" : "Обриши", "Add" : "Додај", "Edit tags" : "Уреди ознаке", "Error loading dialog template: {error}" : "Грешка при учитавању шаблона дијалога: {error}", @@ -163,13 +166,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Ажурирање није успело.", "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.", "The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.", - "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", - "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", - "%s password reset" : "%s лозинка ресетована", - "Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}", - "New password" : "Нова лозинка", - "New Password" : "Нова лозинка", - "Reset password" : "Ресетуј лозинку", "Searching other places" : "Претражујем остала места", "Personal" : "Лично", "Users" : "Корисници", @@ -237,6 +233,10 @@ OC.L10N.register( "Please try again or contact your administrator." : "Покушајте поново или контактирајте вашег администратора.", "Log in" : "Пријава", "Alternative Logins" : "Алтернативне пријаве", + "Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}", + "New password" : "Нова лозинка", + "New Password" : "Нова лозинка", + "Reset password" : "Ресетуј лозинку", "This ownCloud instance is currently in single user mode." : "Овај оунКлауд тренутно ради у режиму једног корисника.", "This means only administrators can use the instance." : "То значи да га могу користити само администратори.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте администратора ако се порука понавља или се неочекивано појавила.", diff --git a/core/l10n/sr.json b/core/l10n/sr.json index a25a96de7c1..e5da6dde36a 100644 --- a/core/l10n/sr.json +++ b/core/l10n/sr.json @@ -20,6 +20,10 @@ "No crop data provided" : "Нема података о опсецању", "No valid crop data provided" : "Нема података о опсецању", "Crop is not square" : "Опсецање није квадрат", + "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", + "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", + "%s password reset" : "%s лозинка ресетована", + "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "Sunday" : "недеља", "Monday" : "понедељак", "Tuesday" : "уторак", @@ -68,7 +72,6 @@ "Settings" : "Поставке", "Saving..." : "Уписујем...", "seconds ago" : "пре пар секунди", - "Couldn't send reset email. Please contact your administrator." : "Не могу да пошаљем е-пошту за ресетовање лозинке. Контактирајте администратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Веза за ресетовање лозинке је послата на вашу е-адресу. Ако је не примите ускоро, проверите фасцикле за нежељену пошту.<br>Ако није ни тамо, контактирајте вашег администратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Фајлови су вам шифровани. Ако нисте укључили кључ за опоравак, нећете моћи да повратите податке након ресетовања лозинке.<br />Ако нисте сигурни шта да радите, контактирајте администратора пре него што наставите.<br />Да ли желите да наставите?", "I know what I'm doing" : "Знам шта радим", @@ -142,9 +145,9 @@ "Share with users or groups …" : "Дели са корисницима или групама...", "Share with users, groups or remote users …" : "Дели са корисницима, групама или удаљеним корисницима...", "Warning" : "Упозорење", + "Delete" : "Обриши", "The object type is not specified." : "Тип објекта није наведен.", "Enter new" : "Унесите нови", - "Delete" : "Обриши", "Add" : "Додај", "Edit tags" : "Уреди ознаке", "Error loading dialog template: {error}" : "Грешка при учитавању шаблона дијалога: {error}", @@ -161,13 +164,6 @@ "The update was unsuccessful. " : "Ажурирање није успело.", "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.", "The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.", - "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", - "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", - "%s password reset" : "%s лозинка ресетована", - "Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}", - "New password" : "Нова лозинка", - "New Password" : "Нова лозинка", - "Reset password" : "Ресетуј лозинку", "Searching other places" : "Претражујем остала места", "Personal" : "Лично", "Users" : "Корисници", @@ -235,6 +231,10 @@ "Please try again or contact your administrator." : "Покушајте поново или контактирајте вашег администратора.", "Log in" : "Пријава", "Alternative Logins" : "Алтернативне пријаве", + "Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}", + "New password" : "Нова лозинка", + "New Password" : "Нова лозинка", + "Reset password" : "Ресетуј лозинку", "This ownCloud instance is currently in single user mode." : "Овај оунКлауд тренутно ради у режиму једног корисника.", "This means only administrators can use the instance." : "То значи да га могу користити само администратори.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте администратора ако се порука понавља или се неочекивано појавила.", diff --git a/core/l10n/sr@latin.js b/core/l10n/sr@latin.js index 6b589324a9b..bb6d1bdf050 100644 --- a/core/l10n/sr@latin.js +++ b/core/l10n/sr@latin.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "Neispravna slika", "No temporary profile picture available, try again" : "Nije dostupna privremena slika profila, pokušajte ponovo", "No crop data provided" : "Nisu dati podaci za sečenje slike", + "Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja", + "Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.", + "%s password reset" : "%s lozinka ponovo postavljena", + "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "Sunday" : "Nedelja", "Monday" : "Ponedeljak", "Tuesday" : "Utorak", @@ -54,7 +58,6 @@ OC.L10N.register( "Settings" : "Podešavanja", "Saving..." : "Snimam...", "seconds ago" : "Pre par sekundi", - "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link za ponovno postavljanje Vaše lozinke je poslat na Vašu e-mail adresu. Ako ga ne primite u razumnom roku, proverite fascikle za neželjenu poštu.<br>Ako ga nema ni tamo, kontaktirajte Vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaši fajlovi su šifrovani. Ako nista omogućili ključ za povrat fajlova, neće biti načina da dobijete ponovo svoje podatke posle promene lozinke.<br />Ako niste sigurni šta da radite, molimo Vas da kontaktirate Vašeg administratora pre nego što nastavite.<br />Da li zaista želite da nastavite?", "I know what I'm doing" : "Znam šta radim", @@ -120,9 +123,9 @@ OC.L10N.register( "access control" : "kontrola pristupa", "Share" : "Podeli", "Warning" : "Upozorenje", + "Delete" : "Obriši", "The object type is not specified." : "Tip objekta nije zadan.", "Enter new" : "Unesite novi", - "Delete" : "Obriši", "Add" : "Dodaj", "Edit tags" : "Uredi oznake", "Error loading dialog template: {error}" : "Greška pri učitavanju obrasca dijaloga: {error}", @@ -136,13 +139,6 @@ OC.L10N.register( "Please reload the page." : "Molimo, ponovo učitajte stranu.", "The update was unsuccessful. " : "Osvežavanje je uspelo.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspelo. Prosleđivanje na ownCloud.", - "Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja", - "Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.", - "%s password reset" : "%s lozinka ponovo postavljena", - "Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova lozinka", - "Reset password" : "Resetuj lozinku", "Personal" : "Lično", "Users" : "Korisnici", "Apps" : "Programi", @@ -196,6 +192,10 @@ OC.L10N.register( "Please contact your administrator." : "Molimo Vas da kontaktirate Vašeg administratora.", "Log in" : "Prijavi se", "Alternative Logins" : "Alternativne prijave", + "Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova lozinka", + "Reset password" : "Resetuj lozinku", "This ownCloud instance is currently in single user mode." : "Ova instanca ownCloud-a je trenutno u režimu rada jednog korisnika.", "This means only administrators can use the instance." : "Ovo znači da samo administratori mogu da koriste ovu instancu.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte Vašeg sistem administratora ako se ova poruka često ili iznenada pojavljuje.", diff --git a/core/l10n/sr@latin.json b/core/l10n/sr@latin.json index 44f10846fec..ef036b25c3a 100644 --- a/core/l10n/sr@latin.json +++ b/core/l10n/sr@latin.json @@ -11,6 +11,10 @@ "Invalid image" : "Neispravna slika", "No temporary profile picture available, try again" : "Nije dostupna privremena slika profila, pokušajte ponovo", "No crop data provided" : "Nisu dati podaci za sečenje slike", + "Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja", + "Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.", + "%s password reset" : "%s lozinka ponovo postavljena", + "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "Sunday" : "Nedelja", "Monday" : "Ponedeljak", "Tuesday" : "Utorak", @@ -52,7 +56,6 @@ "Settings" : "Podešavanja", "Saving..." : "Snimam...", "seconds ago" : "Pre par sekundi", - "Couldn't send reset email. Please contact your administrator." : "Nemoguće slanje e-mail-a za ponovno postavljanje lozinke. Molimo Vas kontaktirajte Vašeg administratora", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Link za ponovno postavljanje Vaše lozinke je poslat na Vašu e-mail adresu. Ako ga ne primite u razumnom roku, proverite fascikle za neželjenu poštu.<br>Ako ga nema ni tamo, kontaktirajte Vašeg lokalnog administratora.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vaši fajlovi su šifrovani. Ako nista omogućili ključ za povrat fajlova, neće biti načina da dobijete ponovo svoje podatke posle promene lozinke.<br />Ako niste sigurni šta da radite, molimo Vas da kontaktirate Vašeg administratora pre nego što nastavite.<br />Da li zaista želite da nastavite?", "I know what I'm doing" : "Znam šta radim", @@ -118,9 +121,9 @@ "access control" : "kontrola pristupa", "Share" : "Podeli", "Warning" : "Upozorenje", + "Delete" : "Obriši", "The object type is not specified." : "Tip objekta nije zadan.", "Enter new" : "Unesite novi", - "Delete" : "Obriši", "Add" : "Dodaj", "Edit tags" : "Uredi oznake", "Error loading dialog template: {error}" : "Greška pri učitavanju obrasca dijaloga: {error}", @@ -134,13 +137,6 @@ "Please reload the page." : "Molimo, ponovo učitajte stranu.", "The update was unsuccessful. " : "Osvežavanje je uspelo.", "The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspelo. Prosleđivanje na ownCloud.", - "Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja", - "Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.", - "%s password reset" : "%s lozinka ponovo postavljena", - "Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}", - "New password" : "Nova lozinka", - "New Password" : "Nova lozinka", - "Reset password" : "Resetuj lozinku", "Personal" : "Lično", "Users" : "Korisnici", "Apps" : "Programi", @@ -194,6 +190,10 @@ "Please contact your administrator." : "Molimo Vas da kontaktirate Vašeg administratora.", "Log in" : "Prijavi se", "Alternative Logins" : "Alternativne prijave", + "Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}", + "New password" : "Nova lozinka", + "New Password" : "Nova lozinka", + "Reset password" : "Resetuj lozinku", "This ownCloud instance is currently in single user mode." : "Ova instanca ownCloud-a je trenutno u režimu rada jednog korisnika.", "This means only administrators can use the instance." : "Ovo znači da samo administratori mogu da koriste ovu instancu.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktirajte Vašeg sistem administratora ako se ova poruka često ili iznenada pojavljuje.", diff --git a/core/l10n/sv.js b/core/l10n/sv.js index 99c106887fa..127fc6f421b 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -13,6 +13,10 @@ OC.L10N.register( "Invalid image" : "Ogiltig bild", "No temporary profile picture available, try again" : "Ingen temporär profilbild finns tillgänglig, försök igen", "No crop data provided" : "Ingen beskärdata har angivits", + "Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token", + "Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.", + "%s password reset" : "%s återställ lösenord", + "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "Sunday" : "Söndag", "Monday" : "Måndag", "Tuesday" : "Tisdag", @@ -54,7 +58,6 @@ OC.L10N.register( "Settings" : "Inställningar", "Saving..." : "Sparar...", "seconds ago" : "sekunder sedan", - "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?", "I know what I'm doing" : "Jag är säker på vad jag gör", @@ -124,9 +127,9 @@ OC.L10N.register( "Share with users or groups …" : "Dela med användare eller grupper ...", "Share with users, groups or remote users …" : "Dela med användare, grupper eller fjärranvändare ...", "Warning" : "Varning", + "Delete" : "Radera", "The object type is not specified." : "Objekttypen är inte specificerad.", "Enter new" : "Skriv nytt", - "Delete" : "Radera", "Add" : "Lägg till", "Edit tags" : "Editera taggar", "Error loading dialog template: {error}" : "Fel under laddning utav dialog mall: {fel}", @@ -142,13 +145,6 @@ OC.L10N.register( "Please reload the page." : "Vänligen ladda om sidan.", "The update was unsuccessful. " : "Uppdateringen misslyckades.", "The update was successful. Redirecting you to ownCloud now." : "Uppdateringen lyckades. Du omdirigeras nu till OwnCloud.", - "Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token", - "Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.", - "%s password reset" : "%s återställ lösenord", - "Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}", - "New password" : "Nytt lösenord", - "New Password" : "Nytt lösenord", - "Reset password" : "Återställ lösenordet", "Personal" : "Personligt", "Users" : "Användare", "Apps" : "Program", @@ -204,6 +200,10 @@ OC.L10N.register( "Please contact your administrator." : "Kontakta din administratör.", "Log in" : "Logga in", "Alternative Logins" : "Alternativa inloggningar", + "Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}", + "New password" : "Nytt lösenord", + "New Password" : "Nytt lösenord", + "Reset password" : "Återställ lösenordet", "This ownCloud instance is currently in single user mode." : "Denna ownCloud instans är för närvarande i enanvändarläge", "This means only administrators can use the instance." : "Detta betyder att endast administartörer kan använda instansen.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hör av dig till din system administratör ifall detta meddelande fortsätter eller visas oväntat.", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index 2e0651647f5..9471f940575 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -11,6 +11,10 @@ "Invalid image" : "Ogiltig bild", "No temporary profile picture available, try again" : "Ingen temporär profilbild finns tillgänglig, försök igen", "No crop data provided" : "Ingen beskärdata har angivits", + "Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token", + "Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.", + "%s password reset" : "%s återställ lösenord", + "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "Sunday" : "Söndag", "Monday" : "Måndag", "Tuesday" : "Tisdag", @@ -52,7 +56,6 @@ "Settings" : "Inställningar", "Saving..." : "Sparar...", "seconds ago" : "sekunder sedan", - "Couldn't send reset email. Please contact your administrator." : "Kunde inte skicka återställningsmail. Vänligen kontakta din administratör.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Länken för att återställa ditt lösenord har skickats till din e-mail. Om du inte mottar något inom kort, kontrollera spam/skräpkorgen.<br>Om det inte finns något där, vänligen kontakta din lokala administratör.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dina filer är krypterade. Om du inte angett någon återställningsnyckel, kommer det att vara omöjligt att få tillbaka dina data efter att lösenordet är återställt..<br />Om du är osäker på vad du ska göra, vänligen kontakta din administratör innan du fortsätter.<br />Är du verkligen helt säker på att du vill fortsätta?", "I know what I'm doing" : "Jag är säker på vad jag gör", @@ -122,9 +125,9 @@ "Share with users or groups …" : "Dela med användare eller grupper ...", "Share with users, groups or remote users …" : "Dela med användare, grupper eller fjärranvändare ...", "Warning" : "Varning", + "Delete" : "Radera", "The object type is not specified." : "Objekttypen är inte specificerad.", "Enter new" : "Skriv nytt", - "Delete" : "Radera", "Add" : "Lägg till", "Edit tags" : "Editera taggar", "Error loading dialog template: {error}" : "Fel under laddning utav dialog mall: {fel}", @@ -140,13 +143,6 @@ "Please reload the page." : "Vänligen ladda om sidan.", "The update was unsuccessful. " : "Uppdateringen misslyckades.", "The update was successful. Redirecting you to ownCloud now." : "Uppdateringen lyckades. Du omdirigeras nu till OwnCloud.", - "Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token", - "Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.", - "%s password reset" : "%s återställ lösenord", - "Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}", - "New password" : "Nytt lösenord", - "New Password" : "Nytt lösenord", - "Reset password" : "Återställ lösenordet", "Personal" : "Personligt", "Users" : "Användare", "Apps" : "Program", @@ -202,6 +198,10 @@ "Please contact your administrator." : "Kontakta din administratör.", "Log in" : "Logga in", "Alternative Logins" : "Alternativa inloggningar", + "Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}", + "New password" : "Nytt lösenord", + "New Password" : "Nytt lösenord", + "Reset password" : "Återställ lösenordet", "This ownCloud instance is currently in single user mode." : "Denna ownCloud instans är för närvarande i enanvändarläge", "This means only administrators can use the instance." : "Detta betyder att endast administartörer kan använda instansen.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Hör av dig till din system administratör ifall detta meddelande fortsätter eller visas oväntat.", diff --git a/core/l10n/ta_LK.js b/core/l10n/ta_LK.js index 47339a42287..d1e487248b4 100644 --- a/core/l10n/ta_LK.js +++ b/core/l10n/ta_LK.js @@ -68,12 +68,9 @@ OC.L10N.register( "access control" : "கட்டுப்பாடான அணுகல்", "Share" : "பகிர்வு", "Warning" : "எச்சரிக்கை", - "The object type is not specified." : "பொருள் வகை குறிப்பிடப்படவில்லை.", "Delete" : "நீக்குக", + "The object type is not specified." : "பொருள் வகை குறிப்பிடப்படவில்லை.", "Add" : "சேர்க்க", - "Use the following link to reset your password: {link}" : "உங்கள் கடவுச்சொல்லை மீளமைக்க பின்வரும் இணைப்பை பயன்படுத்தவும் : {இணைப்பு}", - "New password" : "புதிய கடவுச்சொல்", - "Reset password" : "மீளமைத்த கடவுச்சொல்", "Personal" : "தனிப்பட்ட", "Users" : "பயனாளர்", "Apps" : "செயலிகள்", @@ -92,6 +89,9 @@ OC.L10N.register( "Finish setup" : "அமைப்பை முடிக்க", "Log out" : "விடுபதிகை செய்க", "Search" : "தேடுதல்", - "Log in" : "புகுபதிகை" + "Log in" : "புகுபதிகை", + "Use the following link to reset your password: {link}" : "உங்கள் கடவுச்சொல்லை மீளமைக்க பின்வரும் இணைப்பை பயன்படுத்தவும் : {இணைப்பு}", + "New password" : "புதிய கடவுச்சொல்", + "Reset password" : "மீளமைத்த கடவுச்சொல்" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ta_LK.json b/core/l10n/ta_LK.json index cbe0c8b9df7..b23fd2acad2 100644 --- a/core/l10n/ta_LK.json +++ b/core/l10n/ta_LK.json @@ -66,12 +66,9 @@ "access control" : "கட்டுப்பாடான அணுகல்", "Share" : "பகிர்வு", "Warning" : "எச்சரிக்கை", - "The object type is not specified." : "பொருள் வகை குறிப்பிடப்படவில்லை.", "Delete" : "நீக்குக", + "The object type is not specified." : "பொருள் வகை குறிப்பிடப்படவில்லை.", "Add" : "சேர்க்க", - "Use the following link to reset your password: {link}" : "உங்கள் கடவுச்சொல்லை மீளமைக்க பின்வரும் இணைப்பை பயன்படுத்தவும் : {இணைப்பு}", - "New password" : "புதிய கடவுச்சொல்", - "Reset password" : "மீளமைத்த கடவுச்சொல்", "Personal" : "தனிப்பட்ட", "Users" : "பயனாளர்", "Apps" : "செயலிகள்", @@ -90,6 +87,9 @@ "Finish setup" : "அமைப்பை முடிக்க", "Log out" : "விடுபதிகை செய்க", "Search" : "தேடுதல்", - "Log in" : "புகுபதிகை" + "Log in" : "புகுபதிகை", + "Use the following link to reset your password: {link}" : "உங்கள் கடவுச்சொல்லை மீளமைக்க பின்வரும் இணைப்பை பயன்படுத்தவும் : {இணைப்பு}", + "New password" : "புதிய கடவுச்சொல்", + "Reset password" : "மீளமைத்த கடவுச்சொல்" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/te.js b/core/l10n/te.js index f2be12f12da..6483cd82ee1 100644 --- a/core/l10n/te.js +++ b/core/l10n/te.js @@ -35,11 +35,11 @@ OC.L10N.register( "Warning" : "హెచ్చరిక", "Delete" : "తొలగించు", "Add" : "చేర్చు", - "New password" : "కొత్త సంకేతపదం", "Personal" : "వ్యక్తిగతం", "Users" : "వాడుకరులు", "Help" : "సహాయం", "Username" : "వాడుకరి పేరు", - "Log out" : "నిష్క్రమించు" + "Log out" : "నిష్క్రమించు", + "New password" : "కొత్త సంకేతపదం" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/te.json b/core/l10n/te.json index f165c3f457f..d0b93b5d059 100644 --- a/core/l10n/te.json +++ b/core/l10n/te.json @@ -33,11 +33,11 @@ "Warning" : "హెచ్చరిక", "Delete" : "తొలగించు", "Add" : "చేర్చు", - "New password" : "కొత్త సంకేతపదం", "Personal" : "వ్యక్తిగతం", "Users" : "వాడుకరులు", "Help" : "సహాయం", "Username" : "వాడుకరి పేరు", - "Log out" : "నిష్క్రమించు" + "Log out" : "నిష్క్రమించు", + "New password" : "కొత్త సంకేతపదం" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index 21421278ba1..3085541026a 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "ไม่มีการครอบตัดข้อมูลที่ระบุ", "No valid crop data provided" : "ไม่ได้ระบุข้อมูลการครอบตัดที่ถูกต้อง", "Crop is not square" : "การครอบตัดไม่เป็นสี่เหลี่ยม", + "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", + "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", + "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", + "%s password reset" : "%s ตั้งรหัสผ่านใหม่", + "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "Sunday" : "วันอาทิตย์", "Monday" : "วันจันทร์", "Tuesday" : "วันอังคาร", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "ตั้งค่า", "Saving..." : "กำลังบันทึกข้อมูล...", "seconds ago" : "วินาที ก่อนหน้านี้", - "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <br>ทั้งนี้หากหาอีเมลไม่พบกรุณาติดต่อผู้ดูแลระบบ", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ไฟล์ของคุณจะถูกเข้ารหัส หากคุณยังไม่ได้เปิดใช้งานรหัสการกู้คืน คุณจะได้รับข้อมูลของคุณกลับมาหลังจากที่รหัสผ่านของคุณถูกรีเซ็ต<br /> หากคุณไม่แน่ใจว่าควรทำอย่างไรโปรดติดต่อผู้ดูแลระบบของคุณก่อนที่คุณจะดำเนินการต่อไป <br /> คุณต้องการดำเนินการต่อ?", "I know what I'm doing" : "ฉันรู้ว่าฉันกำลังทำอะไรอยู่", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "แชร์กับผู้ใช้กลุ่มหรือผู้ใช้ระยะไกล ...", "Warning" : "คำเตือน", "Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน", + "Delete" : "ลบ", "The object type is not specified." : "ชนิดของวัตถุยังไม่ได้รับการระบุ", "Enter new" : "ใส่ข้อมูลใหม่", - "Delete" : "ลบ", "Add" : "เพิ่ม", "Edit tags" : "แก้ไขแท็ก", "Error loading dialog template: {error}" : "เกิดข้อผิดพลาดขณะโหลดไดอะล็อกแม่แบบ: {error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "อัพเดทไม่สำเร็จ", "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", "The update was successful. Redirecting you to ownCloud now." : "การอัพเดทเสร็จเรียบร้อย กำลังเปลี่ยนเส้นทางไปที่ ownCloud อยู่ในขณะนี้", - "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", - "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", - "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", - "%s password reset" : "%s ตั้งรหัสผ่านใหม่", - "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", - "New password" : "รหัสผ่านใหม่", - "New Password" : "รหัสผ่านใหม่", - "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "Searching other places" : "กำลังค้นหาสถานที่อื่นๆ", "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "รหัสผ่านผิดพลาด", "Stay logged in" : "กำลังอยู่ในระบบ", "Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ", + "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", + "New password" : "รหัสผ่านใหม่", + "New Password" : "รหัสผ่านใหม่", + "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "This ownCloud instance is currently in single user mode." : "ขณะนี้ ownCloud อยู่ในโหมดผู้ใช้คนเดียว", "This means only administrators can use the instance." : "ซึ่งหมายความว่าผู้ดูแลระบบสามารถใช้อินสแตนซ์", "Contact your system administrator if this message persists or appeared unexpectedly." : "ติดต่อผู้ดูแลระบบของคุณหากข้อความนี้ยังคงมีอยู่หรือปรากฏโดยไม่คาดคิด", diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index d276bea4332..742b5733d8c 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -33,6 +33,12 @@ "No crop data provided" : "ไม่มีการครอบตัดข้อมูลที่ระบุ", "No valid crop data provided" : "ไม่ได้ระบุข้อมูลการครอบตัดที่ถูกต้อง", "Crop is not square" : "การครอบตัดไม่เป็นสี่เหลี่ยม", + "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", + "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", + "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", + "%s password reset" : "%s ตั้งรหัสผ่านใหม่", + "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "Sunday" : "วันอาทิตย์", "Monday" : "วันจันทร์", "Tuesday" : "วันอังคาร", @@ -82,7 +88,6 @@ "Settings" : "ตั้งค่า", "Saving..." : "กำลังบันทึกข้อมูล...", "seconds ago" : "วินาที ก่อนหน้านี้", - "Couldn't send reset email. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาติดต่อผู้ดูแลระบบ", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "ลิงค์ที่ใช้สำหรับตั้งค่ารหัสผ่านใหม่ ของคุณ ได้ถูกส่งไปยังอีเมลของคุณ หากคุณยังไม่ได้รับอีกเมล ลองไปดูที่โฟลเดอร์ สแปม/ถังขยะ ในอีเมลของคุณ <br>ทั้งนี้หากหาอีเมลไม่พบกรุณาติดต่อผู้ดูแลระบบ", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "ไฟล์ของคุณจะถูกเข้ารหัส หากคุณยังไม่ได้เปิดใช้งานรหัสการกู้คืน คุณจะได้รับข้อมูลของคุณกลับมาหลังจากที่รหัสผ่านของคุณถูกรีเซ็ต<br /> หากคุณไม่แน่ใจว่าควรทำอย่างไรโปรดติดต่อผู้ดูแลระบบของคุณก่อนที่คุณจะดำเนินการต่อไป <br /> คุณต้องการดำเนินการต่อ?", "I know what I'm doing" : "ฉันรู้ว่าฉันกำลังทำอะไรอยู่", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "แชร์กับผู้ใช้กลุ่มหรือผู้ใช้ระยะไกล ...", "Warning" : "คำเตือน", "Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน", + "Delete" : "ลบ", "The object type is not specified." : "ชนิดของวัตถุยังไม่ได้รับการระบุ", "Enter new" : "ใส่ข้อมูลใหม่", - "Delete" : "ลบ", "Add" : "เพิ่ม", "Edit tags" : "แก้ไขแท็ก", "Error loading dialog template: {error}" : "เกิดข้อผิดพลาดขณะโหลดไดอะล็อกแม่แบบ: {error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "อัพเดทไม่สำเร็จ", "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", "The update was successful. Redirecting you to ownCloud now." : "การอัพเดทเสร็จเรียบร้อย กำลังเปลี่ยนเส้นทางไปที่ ownCloud อยู่ในขณะนี้", - "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", - "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", - "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", - "%s password reset" : "%s ตั้งรหัสผ่านใหม่", - "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", - "New password" : "รหัสผ่านใหม่", - "New Password" : "รหัสผ่านใหม่", - "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "Searching other places" : "กำลังค้นหาสถานที่อื่นๆ", "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", "_{count} search result in another folder_::_{count} search results in other folders_" : ["ค้นหาพบ {count} ผลลัพธ์ในโฟลเดอร์อื่นๆ"], @@ -269,6 +265,10 @@ "Wrong password." : "รหัสผ่านผิดพลาด", "Stay logged in" : "กำลังอยู่ในระบบ", "Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ", + "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", + "New password" : "รหัสผ่านใหม่", + "New Password" : "รหัสผ่านใหม่", + "Reset password" : "เปลี่ยนรหัสผ่านใหม่", "This ownCloud instance is currently in single user mode." : "ขณะนี้ ownCloud อยู่ในโหมดผู้ใช้คนเดียว", "This means only administrators can use the instance." : "ซึ่งหมายความว่าผู้ดูแลระบบสามารถใช้อินสแตนซ์", "Contact your system administrator if this message persists or appeared unexpectedly." : "ติดต่อผู้ดูแลระบบของคุณหากข้อความนี้ยังคงมีอยู่หรือปรากฏโดยไม่คาดคิด", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index 52729dd19a8..dae3c8c3f44 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "Kesme verisi sağlanmamış", "No valid crop data provided" : "Geçerli kırpma verisi sağlanmadı", "Crop is not square" : "Kırpma kare değil", + "Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı", + "Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı", + "Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.", + "%s password reset" : "%s parola sıfırlama", + "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "Sunday" : "Pazar", "Monday" : "Pazartesi", "Tuesday" : "Salı", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "Ayarlar", "Saving..." : "Kaydediliyor...", "seconds ago" : "saniyeler önce", - "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?", "I know what I'm doing" : "Ne yaptığımı biliyorum", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Warning" : "Uyarı", "Error while sending notification" : "Bildirim gönderilirken hata", + "Delete" : "Sil", "The object type is not specified." : "Nesne türü belirtilmemiş.", "Enter new" : "Yeni girin", - "Delete" : "Sil", "Add" : "Ekle", "Edit tags" : "Etiketleri düzenle", "Error loading dialog template: {error}" : "İletişim şablonu yüklenirken hata: {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Güncelleştirme başarısız.", "The update was successful. There were warnings." : "Güncelleme başarılı. Uyarılar mevcut.", "The update was successful. Redirecting you to ownCloud now." : "Güncelleme başarılı. Şimdi ownCloud'a yönlendiriliyorsunuz.", - "Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı", - "Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı", - "Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.", - "%s password reset" : "%s parola sıfırlama", - "Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}", - "New password" : "Yeni parola", - "New Password" : "Yeni Parola", - "Reset password" : "Parolayı sıfırla", "Searching other places" : "Diğer konumlarda aranıyor", "No search results in other folders" : "Diğer klasörlerde arama sonucu yok", "_{count} search result in another folder_::_{count} search results in other folders_" : ["Diğer klasörlerde {count} arama sonucu","Diğer bir klasörde {count} arama sonucu"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "Hatalı parola. Sıfırlansın mı?", "Stay logged in" : "Bağlı kal", "Alternative Logins" : "Alternatif Girişler", + "Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}", + "New password" : "Yeni parola", + "New Password" : "Yeni Parola", + "Reset password" : "Parolayı sıfırla", "This ownCloud instance is currently in single user mode." : "Bu ownCloud örneği şu anda tek kullanıcı kipinde.", "This means only administrators can use the instance." : "Bu, örneği sadece yöneticiler kullanabilir demektir.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Eğer bu ileti görünmeye devam ederse veya beklenmedik şekilde ortaya çıkmışsa sistem yöneticinizle iletişime geçin.", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 6b4b26c6a5d..7e80ca7f196 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -28,6 +28,11 @@ "No crop data provided" : "Kesme verisi sağlanmamış", "No valid crop data provided" : "Geçerli kırpma verisi sağlanmadı", "Crop is not square" : "Kırpma kare değil", + "Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı", + "Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı", + "Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.", + "%s password reset" : "%s parola sıfırlama", + "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "Sunday" : "Pazar", "Monday" : "Pazartesi", "Tuesday" : "Salı", @@ -76,7 +81,6 @@ "Settings" : "Ayarlar", "Saving..." : "Kaydediliyor...", "seconds ago" : "saniyeler önce", - "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Parolanızı değiştirme bağlantısı e-posta adresinize gönderildi. Makul bir süre içerisinde almadıysanız spam/gereksiz klasörlerini kontrol ediniz.<br>Bu konumlarda da yoksa yerel sistem yöneticinize sorunuz.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Kurtarma anahtarını etkinleştirmemişseniz, parola sıfırlama işleminden sonra verilerinize erişmeniz imkansız olacak.<br />Ne yaptığınızdan emin değilseniz, devam etmeden önce sistem yöneticiniz ile iletişime geçin.<br />Gerçekten devam etmek istiyor musunuz?", "I know what I'm doing" : "Ne yaptığımı biliyorum", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Warning" : "Uyarı", "Error while sending notification" : "Bildirim gönderilirken hata", + "Delete" : "Sil", "The object type is not specified." : "Nesne türü belirtilmemiş.", "Enter new" : "Yeni girin", - "Delete" : "Sil", "Add" : "Ekle", "Edit tags" : "Etiketleri düzenle", "Error loading dialog template: {error}" : "İletişim şablonu yüklenirken hata: {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "Güncelleştirme başarısız.", "The update was successful. There were warnings." : "Güncelleme başarılı. Uyarılar mevcut.", "The update was successful. Redirecting you to ownCloud now." : "Güncelleme başarılı. Şimdi ownCloud'a yönlendiriliyorsunuz.", - "Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı", - "Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı", - "Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.", - "%s password reset" : "%s parola sıfırlama", - "Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}", - "New password" : "Yeni parola", - "New Password" : "Yeni Parola", - "Reset password" : "Parolayı sıfırla", "Searching other places" : "Diğer konumlarda aranıyor", "No search results in other folders" : "Diğer klasörlerde arama sonucu yok", "_{count} search result in another folder_::_{count} search results in other folders_" : ["Diğer klasörlerde {count} arama sonucu","Diğer bir klasörde {count} arama sonucu"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "Hatalı parola. Sıfırlansın mı?", "Stay logged in" : "Bağlı kal", "Alternative Logins" : "Alternatif Girişler", + "Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}", + "New password" : "Yeni parola", + "New Password" : "Yeni Parola", + "Reset password" : "Parolayı sıfırla", "This ownCloud instance is currently in single user mode." : "Bu ownCloud örneği şu anda tek kullanıcı kipinde.", "This means only administrators can use the instance." : "Bu, örneği sadece yöneticiler kullanabilir demektir.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Eğer bu ileti görünmeye devam ederse veya beklenmedik şekilde ortaya çıkmışsa sistem yöneticinizle iletişime geçin.", diff --git a/core/l10n/ug.js b/core/l10n/ug.js index ae8b001ef37..2cfce3ed699 100644 --- a/core/l10n/ug.js +++ b/core/l10n/ug.js @@ -55,7 +55,6 @@ OC.L10N.register( "Warning" : "ئاگاھلاندۇرۇش", "Delete" : "ئۆچۈر", "Add" : "قوش", - "New password" : "يېڭى ئىم", "Personal" : "شەخسىي", "Users" : "ئىشلەتكۈچىلەر", "Apps" : "ئەپلەر", @@ -63,6 +62,7 @@ OC.L10N.register( "Username" : "ئىشلەتكۈچى ئاتى", "Finish setup" : "تەڭشەك تامام", "Log out" : "تىزىمدىن چىق", - "Search" : "ئىزدە" + "Search" : "ئىزدە", + "New password" : "يېڭى ئىم" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ug.json b/core/l10n/ug.json index f61d52d0d5a..414a0573390 100644 --- a/core/l10n/ug.json +++ b/core/l10n/ug.json @@ -53,7 +53,6 @@ "Warning" : "ئاگاھلاندۇرۇش", "Delete" : "ئۆچۈر", "Add" : "قوش", - "New password" : "يېڭى ئىم", "Personal" : "شەخسىي", "Users" : "ئىشلەتكۈچىلەر", "Apps" : "ئەپلەر", @@ -61,6 +60,7 @@ "Username" : "ئىشلەتكۈچى ئاتى", "Finish setup" : "تەڭشەك تامام", "Log out" : "تىزىمدىن چىق", - "Search" : "ئىزدە" + "Search" : "ئىزدە", + "New password" : "يېڭى ئىم" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/uk.js b/core/l10n/uk.js index 8d8d09e37ea..93bb91588d5 100644 --- a/core/l10n/uk.js +++ b/core/l10n/uk.js @@ -23,6 +23,11 @@ OC.L10N.register( "No crop data provided" : "Не вказана інформація про кадрування", "No valid crop data provided" : "Не вказані коректні дані про кадрування", "Crop is not square" : "Кадр не є квадратом", + "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", + "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", + "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", + "%s password reset" : "%s скидання паролю", + "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "Sunday" : "Неділя", "Monday" : "Понеділок", "Tuesday" : "Вівторок", @@ -71,7 +76,6 @@ OC.L10N.register( "Settings" : "Налаштування", "Saving..." : "Збереження...", "seconds ago" : "секунди тому", - "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?", "I know what I'm doing" : "Я знаю що роблю", @@ -146,9 +150,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...", "Warning" : "Попередження", "Error while sending notification" : "Помилка при надсиланні повідомлення", + "Delete" : "Видалити", "The object type is not specified." : "Не визначено тип об'єкту.", "Enter new" : "Введіть новий", - "Delete" : "Видалити", "Add" : "Додати", "Edit tags" : "Редагувати мітки", "Error loading dialog template: {error}" : "Помилка при завантаженні шаблону діалогу: {error}", @@ -165,14 +169,6 @@ OC.L10N.register( "The update was unsuccessful. " : "Оновлення завершилось невдачею.", "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.", "The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.", - "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", - "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", - "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", - "%s password reset" : "%s скидання паролю", - "Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}", - "New password" : "Новий пароль", - "New Password" : "Новий пароль", - "Reset password" : "Скинути пароль", "Searching other places" : "Йде пошук в інших місцях", "No search results in other folders" : "В інших теках нічого не знайдено", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"], @@ -243,6 +239,10 @@ OC.L10N.register( "Log in" : "Увійти", "Wrong password. Reset it?" : "Невірний пароль. Скинути його?", "Alternative Logins" : "Альтернативні імена користувача", + "Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}", + "New password" : "Новий пароль", + "New Password" : "Новий пароль", + "Reset password" : "Скинути пароль", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.", "This means only administrators can use the instance." : "Це означає, що тільки адміністратори можуть використовувати сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до вашого системного адміністратора якщо це повідомлення не зникає або з'являється несподівано.", diff --git a/core/l10n/uk.json b/core/l10n/uk.json index e329ae9b175..f3df0d6d691 100644 --- a/core/l10n/uk.json +++ b/core/l10n/uk.json @@ -21,6 +21,11 @@ "No crop data provided" : "Не вказана інформація про кадрування", "No valid crop data provided" : "Не вказані коректні дані про кадрування", "Crop is not square" : "Кадр не є квадратом", + "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", + "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", + "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", + "%s password reset" : "%s скидання паролю", + "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "Sunday" : "Неділя", "Monday" : "Понеділок", "Tuesday" : "Вівторок", @@ -69,7 +74,6 @@ "Settings" : "Налаштування", "Saving..." : "Збереження...", "seconds ago" : "секунди тому", - "Couldn't send reset email. Please contact your administrator." : "Не можу надіслати email для скидання. Будь ласка, зверніться до вашого адміністратора.", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Посилання для скидання вашого паролю було надіслано на ваш email. Якщо ви не отримали його найближчим часом, перевірте теку зі спамом.<br>Якщо і там немає, спитайте вашого місцевого адміністратора.", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Ваші файли зашифровані. Якщо ви не зробили ключ відновлення, після скидання паролю відновити ваші дані буде неможливо.<br /> Якщо ви не знаєте, що робити, будь ласка, зверніться до адміністратора перед продовженням.<br /> Ви дійсно хочете продовжити?", "I know what I'm doing" : "Я знаю що роблю", @@ -144,9 +148,9 @@ "Share with users, groups or remote users …" : "Поширити серед локальних чи віддалених користувачів або груп ...", "Warning" : "Попередження", "Error while sending notification" : "Помилка при надсиланні повідомлення", + "Delete" : "Видалити", "The object type is not specified." : "Не визначено тип об'єкту.", "Enter new" : "Введіть новий", - "Delete" : "Видалити", "Add" : "Додати", "Edit tags" : "Редагувати мітки", "Error loading dialog template: {error}" : "Помилка при завантаженні шаблону діалогу: {error}", @@ -163,14 +167,6 @@ "The update was unsuccessful. " : "Оновлення завершилось невдачею.", "The update was successful. There were warnings." : "Оновлення виконалось успішно, але були попередження.", "The update was successful. Redirecting you to ownCloud now." : "Оновлення виконалось успішно. Перенаправляємо вас на ownCloud.", - "Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним", - "Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів", - "Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.", - "%s password reset" : "%s скидання паролю", - "Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}", - "New password" : "Новий пароль", - "New Password" : "Новий пароль", - "Reset password" : "Скинути пароль", "Searching other places" : "Йде пошук в інших місцях", "No search results in other folders" : "В інших теках нічого не знайдено", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} результат пошуку в інших теках","{count} результатів пошуку в інших теках","{count} результатів пошуку в інших теках"], @@ -241,6 +237,10 @@ "Log in" : "Увійти", "Wrong password. Reset it?" : "Невірний пароль. Скинути його?", "Alternative Logins" : "Альтернативні імена користувача", + "Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}", + "New password" : "Новий пароль", + "New Password" : "Новий пароль", + "Reset password" : "Скинути пароль", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.", "This means only administrators can use the instance." : "Це означає, що тільки адміністратори можуть використовувати сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Зверніться до вашого системного адміністратора якщо це повідомлення не зникає або з'являється несподівано.", diff --git a/core/l10n/ur_PK.js b/core/l10n/ur_PK.js index 487a197cf8b..9aebc5c8c4b 100644 --- a/core/l10n/ur_PK.js +++ b/core/l10n/ur_PK.js @@ -77,16 +77,13 @@ OC.L10N.register( "access control" : "اسیس کنٹرول", "Share" : "اشتراک", "Warning" : "انتباہ", + "Delete" : "حذف کریں", "The object type is not specified." : "اس چیز کی قسم کی وضاحت نہیں", "Enter new" : "جدید درج کریں", - "Delete" : "حذف کریں", "Add" : "شامل کریں", "Edit tags" : "ترمیم ٹیگز", "Please reload the page." : "براہ مہربانی صفحہ دوبارہ لوڈ کریں.", "The update was successful. Redirecting you to ownCloud now." : "اپ ڈیٹ کامیاب تھی۔ اپ کو اون کلوڈ سے منسلک کیا جا رہا ہے", - "Use the following link to reset your password: {link}" : "اپنا پاسورڈ ری سیٹ کرنے کے لیے اس لنک پر کلک کریں۔ {link}", - "New password" : "نیا پاسورڈ", - "Reset password" : "ری سیٹ پاسورڈ", "Personal" : "شخصی", "Users" : "صارفین", "Apps" : "ایپز", @@ -111,6 +108,9 @@ OC.L10N.register( "Search" : "تلاش", "Log in" : "لاگ ان", "Alternative Logins" : "متبادل لاگ ان ", + "Use the following link to reset your password: {link}" : "اپنا پاسورڈ ری سیٹ کرنے کے لیے اس لنک پر کلک کریں۔ {link}", + "New password" : "نیا پاسورڈ", + "Reset password" : "ری سیٹ پاسورڈ", "Thank you for your patience." : "آپ کے صبر کا شکریہ" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ur_PK.json b/core/l10n/ur_PK.json index 7411d6cb71a..9cd39ff64cd 100644 --- a/core/l10n/ur_PK.json +++ b/core/l10n/ur_PK.json @@ -75,16 +75,13 @@ "access control" : "اسیس کنٹرول", "Share" : "اشتراک", "Warning" : "انتباہ", + "Delete" : "حذف کریں", "The object type is not specified." : "اس چیز کی قسم کی وضاحت نہیں", "Enter new" : "جدید درج کریں", - "Delete" : "حذف کریں", "Add" : "شامل کریں", "Edit tags" : "ترمیم ٹیگز", "Please reload the page." : "براہ مہربانی صفحہ دوبارہ لوڈ کریں.", "The update was successful. Redirecting you to ownCloud now." : "اپ ڈیٹ کامیاب تھی۔ اپ کو اون کلوڈ سے منسلک کیا جا رہا ہے", - "Use the following link to reset your password: {link}" : "اپنا پاسورڈ ری سیٹ کرنے کے لیے اس لنک پر کلک کریں۔ {link}", - "New password" : "نیا پاسورڈ", - "Reset password" : "ری سیٹ پاسورڈ", "Personal" : "شخصی", "Users" : "صارفین", "Apps" : "ایپز", @@ -109,6 +106,9 @@ "Search" : "تلاش", "Log in" : "لاگ ان", "Alternative Logins" : "متبادل لاگ ان ", + "Use the following link to reset your password: {link}" : "اپنا پاسورڈ ری سیٹ کرنے کے لیے اس لنک پر کلک کریں۔ {link}", + "New password" : "نیا پاسورڈ", + "Reset password" : "ری سیٹ پاسورڈ", "Thank you for your patience." : "آپ کے صبر کا شکریہ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/vi.js b/core/l10n/vi.js index 9cc2fe7d762..07324117cd0 100644 --- a/core/l10n/vi.js +++ b/core/l10n/vi.js @@ -10,6 +10,7 @@ OC.L10N.register( "Invalid image" : "Hình ảnh không hợp lệ", "No temporary profile picture available, try again" : "Ảnh cá nhân tạm thời không có giá trị, hãy thử lại", "No crop data provided" : "Không có dữ liệu nguồn được cung cấp", + "%s password reset" : "%s thiết lập lại mật khẩu", "Sunday" : "Chủ nhật", "Monday" : "Thứ 2", "Tuesday" : "Thứ 3", @@ -96,19 +97,15 @@ OC.L10N.register( "access control" : "quản lý truy cập", "Share" : "Chia sẻ", "Warning" : "Cảnh báo", + "Delete" : "Xóa", "The object type is not specified." : "Loại đối tượng không được chỉ định.", "Enter new" : "Nhập mới", - "Delete" : "Xóa", "Add" : "Thêm", "Edit tags" : "Sửa thẻ", "Error loading dialog template: {error}" : "Lỗi khi tải mẫu hội thoại: {error}", "No tags selected for deletion." : "Không có thẻ nào được chọn để xóa", "Please reload the page." : "Vui lòng tải lại trang.", "The update was successful. Redirecting you to ownCloud now." : "Cập nhật thành công .Hệ thống sẽ đưa bạn tới ownCloud.", - "%s password reset" : "%s thiết lập lại mật khẩu", - "Use the following link to reset your password: {link}" : "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}", - "New password" : "Mật khẩu mới", - "Reset password" : "Khôi phục mật khẩu", "Personal" : "Cá nhân", "Users" : "Người dùng", "Apps" : "Ứng dụng", @@ -142,6 +139,9 @@ OC.L10N.register( "Please contact your administrator." : "Vui lòng liên hệ với quản trị viên.", "Log in" : "Đăng nhập", "Alternative Logins" : "Đăng nhập khác", + "Use the following link to reset your password: {link}" : "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}", + "New password" : "Mật khẩu mới", + "Reset password" : "Khôi phục mật khẩu", "This ownCloud instance is currently in single user mode." : "OwnCloud trong trường hợp này đang ở chế độ người dùng duy nhất.", "This means only administrators can use the instance." : "Điều này có nghĩa chỉ có người quản trị có thể sử dụng trong trường hợp này.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Liên hệ với người quản trị nếu lỗi này vẫn tồn tại hoặc xuất hiện bất ngờ.", diff --git a/core/l10n/vi.json b/core/l10n/vi.json index f4118935fd1..e315f150037 100644 --- a/core/l10n/vi.json +++ b/core/l10n/vi.json @@ -8,6 +8,7 @@ "Invalid image" : "Hình ảnh không hợp lệ", "No temporary profile picture available, try again" : "Ảnh cá nhân tạm thời không có giá trị, hãy thử lại", "No crop data provided" : "Không có dữ liệu nguồn được cung cấp", + "%s password reset" : "%s thiết lập lại mật khẩu", "Sunday" : "Chủ nhật", "Monday" : "Thứ 2", "Tuesday" : "Thứ 3", @@ -94,19 +95,15 @@ "access control" : "quản lý truy cập", "Share" : "Chia sẻ", "Warning" : "Cảnh báo", + "Delete" : "Xóa", "The object type is not specified." : "Loại đối tượng không được chỉ định.", "Enter new" : "Nhập mới", - "Delete" : "Xóa", "Add" : "Thêm", "Edit tags" : "Sửa thẻ", "Error loading dialog template: {error}" : "Lỗi khi tải mẫu hội thoại: {error}", "No tags selected for deletion." : "Không có thẻ nào được chọn để xóa", "Please reload the page." : "Vui lòng tải lại trang.", "The update was successful. Redirecting you to ownCloud now." : "Cập nhật thành công .Hệ thống sẽ đưa bạn tới ownCloud.", - "%s password reset" : "%s thiết lập lại mật khẩu", - "Use the following link to reset your password: {link}" : "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}", - "New password" : "Mật khẩu mới", - "Reset password" : "Khôi phục mật khẩu", "Personal" : "Cá nhân", "Users" : "Người dùng", "Apps" : "Ứng dụng", @@ -140,6 +137,9 @@ "Please contact your administrator." : "Vui lòng liên hệ với quản trị viên.", "Log in" : "Đăng nhập", "Alternative Logins" : "Đăng nhập khác", + "Use the following link to reset your password: {link}" : "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}", + "New password" : "Mật khẩu mới", + "Reset password" : "Khôi phục mật khẩu", "This ownCloud instance is currently in single user mode." : "OwnCloud trong trường hợp này đang ở chế độ người dùng duy nhất.", "This means only administrators can use the instance." : "Điều này có nghĩa chỉ có người quản trị có thể sử dụng trong trường hợp này.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Liên hệ với người quản trị nếu lỗi này vẫn tồn tại hoặc xuất hiện bất ngờ.", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 255628f351e..26301771c38 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -30,6 +30,11 @@ OC.L10N.register( "No crop data provided" : "没有提供相应数据", "No valid crop data provided" : "没有提供有效的裁剪数据", "Crop is not square" : "裁剪的不是正方形", + "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码", + "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期", + "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。", + "%s password reset" : "重置 %s 的密码", + "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "Sunday" : "星期日", "Monday" : "星期一", "Tuesday" : "星期二", @@ -78,7 +83,6 @@ OC.L10N.register( "Settings" : "设置", "Saving..." : "保存中...", "seconds ago" : "几秒前", - "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?", "I know what I'm doing" : "我知道我在做什么", @@ -156,9 +160,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "分享给其他用户、组或远程用户 ...", "Warning" : "警告", "Error while sending notification" : "发送通知时出现错误", + "Delete" : "删除", "The object type is not specified." : "未指定对象类型。", "Enter new" : "输入新...", - "Delete" : "删除", "Add" : "增加", "Edit tags" : "编辑标签", "Error loading dialog template: {error}" : "加载对话框模板出错: {error}", @@ -177,14 +181,6 @@ OC.L10N.register( "The update was unsuccessful. " : "升级未成功", "The update was successful. There were warnings." : "更新成功。有警告。", "The update was successful. Redirecting you to ownCloud now." : "更新成功。正在重定向至 ownCloud。", - "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码", - "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期", - "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。", - "%s password reset" : "重置 %s 的密码", - "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}", - "New password" : "新密码", - "New Password" : "新密码", - "Reset password" : "重置密码", "Searching other places" : "搜索其他地方", "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果", "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"], @@ -256,6 +252,10 @@ OC.L10N.register( "Wrong password. Reset it?" : "密码错误。要重置么?", "Stay logged in" : "保持登录", "Alternative Logins" : "其他登录方式", + "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}", + "New password" : "新密码", + "New Password" : "新密码", + "Reset password" : "重置密码", "This ownCloud instance is currently in single user mode." : "当前ownCloud实例运行在单用户模式下。", "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。", "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index bf9f6b2ad60..21c58ddfe89 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -28,6 +28,11 @@ "No crop data provided" : "没有提供相应数据", "No valid crop data provided" : "没有提供有效的裁剪数据", "Crop is not square" : "裁剪的不是正方形", + "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码", + "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期", + "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。", + "%s password reset" : "重置 %s 的密码", + "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "Sunday" : "星期日", "Monday" : "星期一", "Tuesday" : "星期二", @@ -76,7 +81,6 @@ "Settings" : "设置", "Saving..." : "保存中...", "seconds ago" : "几秒前", - "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件,请联系管理员。", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "密码重置邮件已经发送到您的电子邮箱中。如果您长时间没能收到邮件,请检查您的垃圾/广告邮件箱。<br>如果未能收到邮件请联系管理员。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的文件已被加密。如果您没有启用恢复密钥,密码重置后您将无法取回您的文件。<br />在继续之前,如果有疑问请联系您的管理员。<br />确认继续?", "I know what I'm doing" : "我知道我在做什么", @@ -154,9 +158,9 @@ "Share with users, groups or remote users …" : "分享给其他用户、组或远程用户 ...", "Warning" : "警告", "Error while sending notification" : "发送通知时出现错误", + "Delete" : "删除", "The object type is not specified." : "未指定对象类型。", "Enter new" : "输入新...", - "Delete" : "删除", "Add" : "增加", "Edit tags" : "编辑标签", "Error loading dialog template: {error}" : "加载对话框模板出错: {error}", @@ -175,14 +179,6 @@ "The update was unsuccessful. " : "升级未成功", "The update was successful. There were warnings." : "更新成功。有警告。", "The update was successful. Redirecting you to ownCloud now." : "更新成功。正在重定向至 ownCloud。", - "Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码", - "Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期", - "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。", - "%s password reset" : "重置 %s 的密码", - "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}", - "New password" : "新密码", - "New Password" : "新密码", - "Reset password" : "重置密码", "Searching other places" : "搜索其他地方", "No search results in other folders" : "在其他文件夹中没有得到任何搜索结果", "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他文件夹中找到 {count} 条搜索结果"], @@ -254,6 +250,10 @@ "Wrong password. Reset it?" : "密码错误。要重置么?", "Stay logged in" : "保持登录", "Alternative Logins" : "其他登录方式", + "Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}", + "New password" : "新密码", + "New Password" : "新密码", + "Reset password" : "重置密码", "This ownCloud instance is currently in single user mode." : "当前ownCloud实例运行在单用户模式下。", "This means only administrators can use the instance." : "这意味着只有管理员才能在实例上操作。", "Contact your system administrator if this message persists or appeared unexpectedly." : "如果这个消息一直存在或不停出现,请联系你的系统管理员。", diff --git a/core/l10n/zh_HK.js b/core/l10n/zh_HK.js index b9791794e65..61734553208 100644 --- a/core/l10n/zh_HK.js +++ b/core/l10n/zh_HK.js @@ -51,10 +51,6 @@ OC.L10N.register( "Delete" : "刪除", "Add" : "加入", "The update was successful. Redirecting you to ownCloud now." : "更新成功, 正", - "Use the following link to reset your password: {link}" : "請用以下連結重設你的密碼: {link}", - "New password" : "新密碼", - "New Password" : "新密碼", - "Reset password" : "重設密碼", "Personal" : "個人", "Users" : "用戶", "Apps" : "軟件", @@ -68,6 +64,10 @@ OC.L10N.register( "Database name" : "資料庫名稱", "Log out" : "登出", "Search" : "尋找", - "Log in" : "登入" + "Log in" : "登入", + "Use the following link to reset your password: {link}" : "請用以下連結重設你的密碼: {link}", + "New password" : "新密碼", + "New Password" : "新密碼", + "Reset password" : "重設密碼" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/zh_HK.json b/core/l10n/zh_HK.json index 7cb0e9e001e..b3e6714c27e 100644 --- a/core/l10n/zh_HK.json +++ b/core/l10n/zh_HK.json @@ -49,10 +49,6 @@ "Delete" : "刪除", "Add" : "加入", "The update was successful. Redirecting you to ownCloud now." : "更新成功, 正", - "Use the following link to reset your password: {link}" : "請用以下連結重設你的密碼: {link}", - "New password" : "新密碼", - "New Password" : "新密碼", - "Reset password" : "重設密碼", "Personal" : "個人", "Users" : "用戶", "Apps" : "軟件", @@ -66,6 +62,10 @@ "Database name" : "資料庫名稱", "Log out" : "登出", "Search" : "尋找", - "Log in" : "登入" + "Log in" : "登入", + "Use the following link to reset your password: {link}" : "請用以下連結重設你的密碼: {link}", + "New password" : "新密碼", + "New Password" : "新密碼", + "Reset password" : "重設密碼" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index cda5c1031df..02dfd6019a0 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -35,6 +35,12 @@ OC.L10N.register( "No crop data provided" : "未設定剪裁", "No valid crop data provided" : "未提供有效的剪裁設定", "Crop is not square" : "剪裁設定不是正方形", + "Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效", + "Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期", + "Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員。", + "%s password reset" : "%s 密碼重設", + "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "Sunday" : "週日", "Monday" : "週一", "Tuesday" : "週二", @@ -84,7 +90,6 @@ OC.L10N.register( "Settings" : "設定", "Saving..." : "儲存中...", "seconds ago" : "幾秒前", - "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "重設密碼的連結已經 email 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的檔案是加密的,如果您沒有啟用救援金鑰,當您重設密碼之後將無法存取您的資料。<br/>如果不確定該怎麼做,請聯絡您的系統管理員。<br/>您確定要繼續嗎?", "I know what I'm doing" : "我知道我在幹嘛", @@ -169,9 +174,9 @@ OC.L10N.register( "Share with users, groups or remote users …" : "與用戶,群組或是遠端使用者分享 ...", "Warning" : "警告", "Error while sending notification" : "發送通知錯誤", + "Delete" : "刪除", "The object type is not specified." : "未指定物件類型", "Enter new" : "輸入新的", - "Delete" : "刪除", "Add" : "增加", "Edit tags" : "編輯標籤", "Error loading dialog template: {error}" : "載入對話樣板出錯:{error}", @@ -190,15 +195,6 @@ OC.L10N.register( "The update was unsuccessful. " : "更新失敗", "The update was successful. There were warnings." : "更新成功,有警告訊息", "The update was successful. Redirecting you to ownCloud now." : "升級成功,正將您重新導向至 ownCloud 。", - "Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效", - "Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期", - "Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員。", - "%s password reset" : "%s 密碼重設", - "Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}", - "New password" : "新密碼", - "New Password" : "新密碼", - "Reset password" : "重設密碼", "Searching other places" : "搜尋其他位置", "No search results in other folders" : "在其他資料夾中沒有找到", "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他資料夾中有 {count} 比結果"], @@ -271,6 +267,10 @@ OC.L10N.register( "Wrong password." : "密碼錯誤", "Stay logged in" : "保持登入狀態", "Alternative Logins" : "其他登入方法", + "Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}", + "New password" : "新密碼", + "New Password" : "新密碼", + "Reset password" : "重設密碼", "This ownCloud instance is currently in single user mode." : "這個 ownCloud 伺服器目前運作於單一使用者模式", "This means only administrators can use the instance." : "這表示只有系統管理員能夠使用", "Contact your system administrator if this message persists or appeared unexpectedly." : "若這個訊息持續出現,請聯絡系統管理員", diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index 0af10c399f2..5c9ac6f058c 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -33,6 +33,12 @@ "No crop data provided" : "未設定剪裁", "No valid crop data provided" : "未提供有效的剪裁設定", "Crop is not square" : "剪裁設定不是正方形", + "Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效", + "Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期", + "Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員。", + "%s password reset" : "%s 密碼重設", + "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "Sunday" : "週日", "Monday" : "週一", "Tuesday" : "週二", @@ -82,7 +88,6 @@ "Settings" : "設定", "Saving..." : "儲存中...", "seconds ago" : "幾秒前", - "Couldn't send reset email. Please contact your administrator." : "無法寄送重設 email ,請聯絡系統管理員", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "重設密碼的連結已經 email 至你的信箱,如果你在一段時間內沒收到,請檢查垃圾郵件資料夾,如果還是找不到,請聯絡系統管理員。", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "您的檔案是加密的,如果您沒有啟用救援金鑰,當您重設密碼之後將無法存取您的資料。<br/>如果不確定該怎麼做,請聯絡您的系統管理員。<br/>您確定要繼續嗎?", "I know what I'm doing" : "我知道我在幹嘛", @@ -167,9 +172,9 @@ "Share with users, groups or remote users …" : "與用戶,群組或是遠端使用者分享 ...", "Warning" : "警告", "Error while sending notification" : "發送通知錯誤", + "Delete" : "刪除", "The object type is not specified." : "未指定物件類型", "Enter new" : "輸入新的", - "Delete" : "刪除", "Add" : "增加", "Edit tags" : "編輯標籤", "Error loading dialog template: {error}" : "載入對話樣板出錯:{error}", @@ -188,15 +193,6 @@ "The update was unsuccessful. " : "更新失敗", "The update was successful. There were warnings." : "更新成功,有警告訊息", "The update was successful. Redirecting you to ownCloud now." : "升級成功,正將您重新導向至 ownCloud 。", - "Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效", - "Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期", - "Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確", - "Could not send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員。", - "%s password reset" : "%s 密碼重設", - "Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}", - "New password" : "新密碼", - "New Password" : "新密碼", - "Reset password" : "重設密碼", "Searching other places" : "搜尋其他位置", "No search results in other folders" : "在其他資料夾中沒有找到", "_{count} search result in another folder_::_{count} search results in other folders_" : ["在其他資料夾中有 {count} 比結果"], @@ -269,6 +265,10 @@ "Wrong password." : "密碼錯誤", "Stay logged in" : "保持登入狀態", "Alternative Logins" : "其他登入方法", + "Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}", + "New password" : "新密碼", + "New Password" : "新密碼", + "Reset password" : "重設密碼", "This ownCloud instance is currently in single user mode." : "這個 ownCloud 伺服器目前運作於單一使用者模式", "This means only administrators can use the instance." : "這表示只有系統管理員能夠使用", "Contact your system administrator if this message persists or appeared unexpectedly." : "若這個訊息持續出現,請聯絡系統管理員", diff --git a/core/lostpassword/css/lostpassword.css b/core/lostpassword/css/lostpassword.css deleted file mode 100644 index b7f7023648d..00000000000 --- a/core/lostpassword/css/lostpassword.css +++ /dev/null @@ -1,31 +0,0 @@ -#body-login -input[type="text"]#user{ - padding-right: 20px; - padding-left: 41px; -} - -#body-login -input[type="submit"] { - text-align: center; - width: 170px; - height: 45px; - padding-top: 7px; - padding-bottom: 7px; -} - -#body-login input[type="submit"]#submit { - width: 280px; -} - -#body-login .update { - text-align: left; -} - -#body-login .update, -#body-login .error { - margin: 10px 0 5px 0; -} - -#user { - width: 226px !important; -} diff --git a/core/register_command.php b/core/register_command.php index a7dd7414790..5f9a2675873 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -36,7 +36,8 @@ $application->add(new OC\Core\Command\App\CheckCode($infoParser)); $application->add(new OC\Core\Command\L10n\CreateJs()); $application->add(new \OC\Core\Command\Integrity\SignApp( \OC::$server->getIntegrityCodeChecker(), - new \OC\IntegrityCheck\Helpers\FileAccessHelper() + new \OC\IntegrityCheck\Helpers\FileAccessHelper(), + \OC::$server->getURLGenerator() )); $application->add(new \OC\Core\Command\Integrity\SignCore( \OC::$server->getIntegrityCodeChecker(), @@ -44,10 +45,10 @@ $application->add(new \OC\Core\Command\Integrity\SignCore( )); if (\OC::$server->getConfig()->getSystemValue('installed', false)) { - $application->add(new OC\Core\Command\App\Disable()); - $application->add(new OC\Core\Command\App\Enable()); + $application->add(new OC\Core\Command\App\Disable(\OC::$server->getAppManager())); + $application->add(new OC\Core\Command\App\Enable(\OC::$server->getAppManager())); $application->add(new OC\Core\Command\App\GetPath()); - $application->add(new OC\Core\Command\App\ListApps()); + $application->add(new OC\Core\Command\App\ListApps(\OC::$server->getAppManager())); $application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig())); $application->add(new OC\Core\Command\Background\WebCron(\OC::$server->getConfig())); diff --git a/core/shipped.json b/core/shipped.json index 28e99c4feba..5dd8700bf1a 100644 --- a/core/shipped.json +++ b/core/shipped.json @@ -28,6 +28,7 @@ "password_policy", "provisioning_api", "sharepoint", + "systemtags", "templateeditor", "updater", "user_external", diff --git a/core/lostpassword/templates/email.php b/core/templates/lostpassword/email.php index 3ca424d5294..3ca424d5294 100644 --- a/core/lostpassword/templates/email.php +++ b/core/templates/lostpassword/email.php diff --git a/core/lostpassword/templates/resetpassword.php b/core/templates/lostpassword/resetpassword.php index 22dd2fc13b7..49ced424648 100644 --- a/core/lostpassword/templates/resetpassword.php +++ b/core/templates/lostpassword/resetpassword.php @@ -22,7 +22,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -style('lostpassword', 'resetpassword'); +style('core', 'lostpassword/resetpassword'); script('core', 'lostpassword'); ?> diff --git a/db_structure.xml b/db_structure.xml index cfda315e3c2..99bfa519b40 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -127,6 +127,93 @@ </table> + <!-- a list of all mounted storage per user, populated on filesystem setup --> + <table> + + <name>*dbprefix*mounts</name> + + <declaration> + + <field> + <name>id</name> + <type>integer</type> + <default>0</default> + <notnull>true</notnull> + <autoincrement>1</autoincrement> + <length>4</length> + </field> + + <field> + <name>storage_id</name> + <type>integer</type> + <notnull>true</notnull> + </field> + + <!-- fileid of the root of the mount, foreign key: oc_filecache.fileid --> + <field> + <name>root_id</name> + <type>integer</type> + <notnull>true</notnull> + </field> + + <field> + <name>user_id</name> + <type>text</type> + <notnull>true</notnull> + <length>64</length> + </field> + + <field> + <name>mount_point</name> + <type>text</type> + <notnull>true</notnull> + <length>4000</length> + </field> + + <index> + <name>mounts_user_index</name> + <unique>false</unique> + <field> + <name>user_id</name> + <sorting>ascending</sorting> + </field> + </index> + + <index> + <name>mounts_storage_index</name> + <unique>false</unique> + <field> + <name>storage_id</name> + <sorting>ascending</sorting> + </field> + </index> + + <index> + <name>mounts_root_index</name> + <unique>false</unique> + <field> + <name>root_id</name> + <sorting>ascending</sorting> + </field> + </index> + + <index> + <name>mounts_user_root_index</name> + <unique>true</unique> + <field> + <name>user_id</name> + <sorting>ascending</sorting> + </field> + <field> + <name>root_id</name> + <sorting>ascending</sorting> + </field> + </index> + + </declaration> + + </table> + <table> <!-- diff --git a/lib/base.php b/lib/base.php index b7118e02458..970eabce6af 100644 --- a/lib/base.php +++ b/lib/base.php @@ -826,7 +826,7 @@ class OC { $setupHelper = new OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(), \OC::$server->getSecureRandom()); - $controller = new OC\Core\Setup\Controller($setupHelper); + $controller = new OC\Core\Controller\SetupController($setupHelper); $controller->run($_POST); exit(); } diff --git a/lib/l10n/he.js b/lib/l10n/he.js index da1a90cf266..5d7236a7604 100644 --- a/lib/l10n/he.js +++ b/lib/l10n/he.js @@ -1,10 +1,30 @@ OC.L10N.register( "lib", { + "Cannot write into \"config\" directory!" : "לא ניתן לכתוב לתיקיית \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "בדרך כלל ניתן לפתור את הבעיה על ידי כך שנותנים ל- webserver הרשאות כניסה לתיקיית confg", + "See %s" : "ניתן לראות %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "בדרך כלל ניתן לפתור את הבעיה על ידי כך ש- %s נותן ל- webserver הרשאות כניסה לתיקיית config %s.", + "Sample configuration detected" : "התגלתה דוגמת תצורה", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php", + "PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.", + "PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.", + "Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s", + "The command line tool %s could not be found" : "כלי שורת הפקודה %s לא אותר", + "The library %s is not available." : "הספריה %s אינה זמינה.", + "Library %s with a version higher than %s is required - available version %s." : "ספריה %s בגרסה גבוהה מ- %s נדרשת - גרסה זמינה %s.", + "Library %s with a version lower than %s is required - available version %s." : "ספריה %s בגרסה נמוכה מ- %s נדרשת - גרסה זמינה %s.", + "Following platforms are supported: %s" : "הפלטפורמות הבאות נתמכות: %s", + "ownCloud %s or higher is required." : "נדרש ownCloud %s ומעלה.", + "ownCloud %s or lower is required." : "נדרש ownCloud %s ומטה.", "Help" : "עזרה", "Personal" : "אישי", "Users" : "משתמשים", "Admin" : "מנהל", + "Recommended" : "מומלץ", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "היישום \"%s\" לא ניתן להתקנה כיוון שאינו תואם לגרסה זו של ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "היישום \"%s\" לא ניתן להתקנה כיוון שיחסי התלות הבאים אינם מתקיימים: %s", + "No app name specified" : "לא הוגדר שם יישום", "Unknown filetype" : "סוג קובץ לא מוכר", "Invalid image" : "תמונה לא חוקית", "today" : "היום", @@ -15,25 +35,47 @@ OC.L10N.register( "_%n year ago_::_%n years ago_" : ["לפני %n שנה","לפני %n שנים"], "seconds ago" : "שניות", "web services under your control" : "שירותי רשת תחת השליטה שלך", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "מודול עם זהות: %s אינו קיים. יש לאפשר את זה בהגדרות היישומים או ליצור קשר עם המנהל.", "Empty filename is not allowed" : "שם קובץ ריק אינו מאושר", + "Dot files are not allowed" : "קבצי Dot אינם מותרים", + "4-byte characters are not supported in file names" : "תווי 4-byte אינם נתמכים בשמות קבצים", + "File name is a reserved word" : "שם קובץ הנו מילה שמורה", "File name contains at least one invalid character" : "שם קובץ כולל לפחות תו אחד לא חוקי", "File name is too long" : "שם קובץ ארוך מדי", + "File is currently busy, please try again later" : "הקובץ בשימוש כרגע, יש לנסות שוב מאוחר יותר", "Can't read file" : "לא ניתן לקרוא קובץ", "App directory already exists" : "תיקיית יישום כבר קיימת", + "Can't create app folder. Please fix permissions. %s" : "לא ניתן ליצור תיקיית יישום. יש לתקן הרשאות. %s", + "Archive does not contain a directory named %s" : "הארכיב לא כולל שם תיקייה %s", + "No source specified when installing app" : "לא נקבע מקור בתהליך התקנת היישום", + "No href specified when installing app from http" : "לא נקבע href בתהליך התקנת היישום מהאינטרנט", + "No path specified when installing app from local file" : "לא נקבע נתיב בתהליך התקנת היישום מקובץ מקומי", + "Archives of type %s are not supported" : "ארכיבים מסוג %s אינם נתמכים", + "Failed to open archive when installing app" : "פתיחת ארכיב נכשלה בתהליך התקנת היישום", + "App does not provide an info.xml file" : "היישום לא סיפק קובץ info.xml", "Application is not enabled" : "יישומים אינם מופעלים", "Authentication error" : "שגיאת הזדהות", "Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.", "Unknown user" : "משתמש לא ידוע", + "%s enter the database username." : "%s נכנס למסד נתוני שמות המשתמשים.", + "%s enter the database name." : "%s נכנס למסד נתוני השמות.", "DB Error: \"%s\"" : "שגיאת מסד נתונים: \"%s\"", "Set an admin username." : "קביעת שם משתמש מנהל", "Set an admin password." : "קביעת סיסמת מנהל", "%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«", "%s via %s" : "%s על בסיס %s", + "Expiration date is in the past" : "תאריך תפוגה הנו בעבר", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", "Apps" : "יישומים", "A valid username must be provided" : "יש לספק שם משתמש תקני", "A valid password must be provided" : "יש לספק ססמה תקנית", + "Cannot write into \"apps\" directory" : "לא ניתן לכתוב לתיקיית \"apps\"", + "PHP module %s not installed." : "מודול PHP %s אינו מותקן.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "זה ככל הנראה נגרם על ידי מאיץ/מטמון כמו Zend OPcache או eAccelerator.", - "Storage not available" : "אחסון לא זמין" + "Storage unauthorized. %s" : "אחסון לא מורשה. %s", + "Storage incomplete configuration. %s" : "תצורה לא מושלמת של האחסון. %s", + "Storage connection error. %s" : "שגיאת חיבור אחסון. %s", + "Storage not available" : "אחסון לא זמין", + "Storage connection timeout. %s" : "פסק זמן חיבור אחסון. %s" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/he.json b/lib/l10n/he.json index c1b4cf95086..69e8a16657a 100644 --- a/lib/l10n/he.json +++ b/lib/l10n/he.json @@ -1,8 +1,28 @@ { "translations": { + "Cannot write into \"config\" directory!" : "לא ניתן לכתוב לתיקיית \"config\"!", + "This can usually be fixed by giving the webserver write access to the config directory" : "בדרך כלל ניתן לפתור את הבעיה על ידי כך שנותנים ל- webserver הרשאות כניסה לתיקיית confg", + "See %s" : "ניתן לראות %s", + "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "בדרך כלל ניתן לפתור את הבעיה על ידי כך ש- %s נותן ל- webserver הרשאות כניסה לתיקיית config %s.", + "Sample configuration detected" : "התגלתה דוגמת תצורה", + "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php", + "PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.", + "PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.", + "Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s", + "The command line tool %s could not be found" : "כלי שורת הפקודה %s לא אותר", + "The library %s is not available." : "הספריה %s אינה זמינה.", + "Library %s with a version higher than %s is required - available version %s." : "ספריה %s בגרסה גבוהה מ- %s נדרשת - גרסה זמינה %s.", + "Library %s with a version lower than %s is required - available version %s." : "ספריה %s בגרסה נמוכה מ- %s נדרשת - גרסה זמינה %s.", + "Following platforms are supported: %s" : "הפלטפורמות הבאות נתמכות: %s", + "ownCloud %s or higher is required." : "נדרש ownCloud %s ומעלה.", + "ownCloud %s or lower is required." : "נדרש ownCloud %s ומטה.", "Help" : "עזרה", "Personal" : "אישי", "Users" : "משתמשים", "Admin" : "מנהל", + "Recommended" : "מומלץ", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "היישום \"%s\" לא ניתן להתקנה כיוון שאינו תואם לגרסה זו של ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "היישום \"%s\" לא ניתן להתקנה כיוון שיחסי התלות הבאים אינם מתקיימים: %s", + "No app name specified" : "לא הוגדר שם יישום", "Unknown filetype" : "סוג קובץ לא מוכר", "Invalid image" : "תמונה לא חוקית", "today" : "היום", @@ -13,25 +33,47 @@ "_%n year ago_::_%n years ago_" : ["לפני %n שנה","לפני %n שנים"], "seconds ago" : "שניות", "web services under your control" : "שירותי רשת תחת השליטה שלך", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "מודול עם זהות: %s אינו קיים. יש לאפשר את זה בהגדרות היישומים או ליצור קשר עם המנהל.", "Empty filename is not allowed" : "שם קובץ ריק אינו מאושר", + "Dot files are not allowed" : "קבצי Dot אינם מותרים", + "4-byte characters are not supported in file names" : "תווי 4-byte אינם נתמכים בשמות קבצים", + "File name is a reserved word" : "שם קובץ הנו מילה שמורה", "File name contains at least one invalid character" : "שם קובץ כולל לפחות תו אחד לא חוקי", "File name is too long" : "שם קובץ ארוך מדי", + "File is currently busy, please try again later" : "הקובץ בשימוש כרגע, יש לנסות שוב מאוחר יותר", "Can't read file" : "לא ניתן לקרוא קובץ", "App directory already exists" : "תיקיית יישום כבר קיימת", + "Can't create app folder. Please fix permissions. %s" : "לא ניתן ליצור תיקיית יישום. יש לתקן הרשאות. %s", + "Archive does not contain a directory named %s" : "הארכיב לא כולל שם תיקייה %s", + "No source specified when installing app" : "לא נקבע מקור בתהליך התקנת היישום", + "No href specified when installing app from http" : "לא נקבע href בתהליך התקנת היישום מהאינטרנט", + "No path specified when installing app from local file" : "לא נקבע נתיב בתהליך התקנת היישום מקובץ מקומי", + "Archives of type %s are not supported" : "ארכיבים מסוג %s אינם נתמכים", + "Failed to open archive when installing app" : "פתיחת ארכיב נכשלה בתהליך התקנת היישום", + "App does not provide an info.xml file" : "היישום לא סיפק קובץ info.xml", "Application is not enabled" : "יישומים אינם מופעלים", "Authentication error" : "שגיאת הזדהות", "Token expired. Please reload page." : "פג תוקף. נא לטעון שוב את הדף.", "Unknown user" : "משתמש לא ידוע", + "%s enter the database username." : "%s נכנס למסד נתוני שמות המשתמשים.", + "%s enter the database name." : "%s נכנס למסד נתוני השמות.", "DB Error: \"%s\"" : "שגיאת מסד נתונים: \"%s\"", "Set an admin username." : "קביעת שם משתמש מנהל", "Set an admin password." : "קביעת סיסמת מנהל", "%s shared »%s« with you" : "%s שיתף/שיתפה איתך את »%s«", "%s via %s" : "%s על בסיס %s", + "Expiration date is in the past" : "תאריך תפוגה הנו בעבר", "Could not find category \"%s\"" : "לא ניתן למצוא את הקטגוריה „%s“", "Apps" : "יישומים", "A valid username must be provided" : "יש לספק שם משתמש תקני", "A valid password must be provided" : "יש לספק ססמה תקנית", + "Cannot write into \"apps\" directory" : "לא ניתן לכתוב לתיקיית \"apps\"", + "PHP module %s not installed." : "מודול PHP %s אינו מותקן.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "זה ככל הנראה נגרם על ידי מאיץ/מטמון כמו Zend OPcache או eAccelerator.", - "Storage not available" : "אחסון לא זמין" + "Storage unauthorized. %s" : "אחסון לא מורשה. %s", + "Storage incomplete configuration. %s" : "תצורה לא מושלמת של האחסון. %s", + "Storage connection error. %s" : "שגיאת חיבור אחסון. %s", + "Storage not available" : "אחסון לא זמין", + "Storage connection timeout. %s" : "פסק זמן חיבור אחסון. %s" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js index 6843d0832a0..a38f6bd5f39 100644 --- a/lib/l10n/pt_PT.js +++ b/lib/l10n/pt_PT.js @@ -53,6 +53,7 @@ OC.L10N.register( "Archives of type %s are not supported" : "Arquivos do tipo %s não são suportados", "Failed to open archive when installing app" : "Ocorreu um erro ao abrir o ficheiro de instalação desta aplicação", "App does not provide an info.xml file" : "A aplicação não disponibiliza um ficheiro info.xml", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Assinatura não foi verificada. Contate o desenvolvedor da aplicação e verifique o painel de administrador.", "App can't be installed because of not allowed code in the App" : "A aplicação não pode ser instalado devido a código não permitido dentro da aplicação", "App can't be installed because it is not compatible with this version of ownCloud" : "A aplicação não pode ser instalada por não ser compatível com esta versão do ownCloud", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Esta aplicação não pode ser instalada por que contém o tag <shipped>true</shipped> que só é permitido para aplicações nativas", @@ -84,13 +85,16 @@ OC.L10N.register( "Sharing %s failed, because the backend does not allow shares from type %i" : "A partilha de %s falhou porque a interface não permite as partilhas do tipo %i", "Sharing %s failed, because the file does not exist" : "A partilha de %s falhou, porque o ficheiro não existe", "You are not allowed to share %s" : "Não está autorizado a partilhar %s", + "Sharing %s failed, because you can not share with yourself" : "A partilha de %s falhou, porque não é possível partilhar consigo mesmo", "Sharing %s failed, because the user %s does not exist" : "A partilha %s falhou, porque o utilizador %s nao existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "A partilha %s falhou, porque o utilizador %s não pertence a nenhum dos grupos que %s é membro de", "Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s", + "Sharing %s failed, because this item is already shared with user %s" : "A partilha de %s falhou, porque este item já está a ser partilhado com o utilizador %s", "Sharing %s failed, because the group %s does not exist" : "A partilha %s falhou, porque o grupo %s não existe", "Sharing %s failed, because %s is not a member of the group %s" : "A partilha %s falhou, porque o utilizador %s não é membro do grupo %s", "You need to provide a password to create a public link, only protected links are allowed" : "Necessita de fornecer a senha para criar um link publico, só são permitidos links protegidos", "Sharing %s failed, because sharing with links is not allowed" : "A partilha de %s falhou, porque partilhar com links não é permitido", + "Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.", "Share type %s is not valid for %s" : "O tipo de partilha %s não é válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Definir permissões para %s falhou, porque as permissões excedem as permissões concedidas a %s", @@ -106,6 +110,9 @@ OC.L10N.register( "Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros", + "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s", + "Expiration date is in the past" : "A data de expiração está no passado", + "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro", "Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"", "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", @@ -114,6 +121,7 @@ OC.L10N.register( "The username is already being used" : "O nome de utilizador já está a ser usado", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.", "Microsoft Windows Platform is not supported" : "A plataforma Microsoft Windows não é suportada", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Executar um Servidor ownCloud na plataforma Microsoft Windows não é suportado. Nós sugerimos que use um servidor Linux numa máquina virtual se não tiver opção parar migrar o servidor por si mesmo. Encontre pacotes Linux, assim como imagens de máquinas virtuais prontas a correr em <a href=\"%s\">%s</a>. Parar migrar instalações existentes para Linux, poderás encontrar algumas dicas e um script de migração na <a href=\"%s\">nossa documentação</a>.", "Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"", "Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Isto pode ser normalmente resolvido %sdando ao servidor web direito de escrita para o directório de aplicação%s ou desactivando a loja de aplicações no ficheiro de configuração.", @@ -126,6 +134,9 @@ OC.L10N.register( "PHP module %s not installed." : "O modulo %s PHP não está instalado.", "PHP setting \"%s\" is not set to \"%s\"." : "Configuração PHP \"%s\" não está definida para \"%s\".", "Adjusting this setting in php.ini will make ownCloud run again" : "Ajustar esta configuração no php.ini fará com que o ownCloud funcione de novo", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload está configurado para \"%s\" invés do valor habitual de \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para corrigir este problema altere o <code>mbstring.func_overload</code> para <code>0</code> no seu php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado a remover blocos doc em linha. Isto vai tornar algumas aplicações básicas inacessíveis.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.", "PHP modules have been installed, but they are still listed as missing?" : "Os módulos PHP foram instalados, mas eles ainda estão listados como desaparecidos?", "Please ask your server administrator to restart the web server." : "Pro favor pergunte ao seu administrador do servidor para reiniciar o servidor da internet.", @@ -138,6 +149,10 @@ OC.L10N.register( "Data directory (%s) is invalid" : "Directoria data (%s) é invalida", "Please check that the data directory contains a file \".ocdata\" in its root." : "Por favor verifique que a directoria data contem um ficheiro \".ocdata\" na sua raiz.", "Could not obtain lock type %d on \"%s\"." : "Não foi possível obter o tipo de bloqueio %d em \"%s\".", - "Storage not available" : "Armazenamento indisposinvel" + "Storage unauthorized. %s" : "Armazenamento desautorizado. %s", + "Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s", + "Storage connection error. %s" : "Erro de ligação ao armazenamento. %s", + "Storage not available" : "Armazenamento indisposinvel", + "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json index 43449a30557..0a0e8f69dbb 100644 --- a/lib/l10n/pt_PT.json +++ b/lib/l10n/pt_PT.json @@ -51,6 +51,7 @@ "Archives of type %s are not supported" : "Arquivos do tipo %s não são suportados", "Failed to open archive when installing app" : "Ocorreu um erro ao abrir o ficheiro de instalação desta aplicação", "App does not provide an info.xml file" : "A aplicação não disponibiliza um ficheiro info.xml", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Assinatura não foi verificada. Contate o desenvolvedor da aplicação e verifique o painel de administrador.", "App can't be installed because of not allowed code in the App" : "A aplicação não pode ser instalado devido a código não permitido dentro da aplicação", "App can't be installed because it is not compatible with this version of ownCloud" : "A aplicação não pode ser instalada por não ser compatível com esta versão do ownCloud", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Esta aplicação não pode ser instalada por que contém o tag <shipped>true</shipped> que só é permitido para aplicações nativas", @@ -82,13 +83,16 @@ "Sharing %s failed, because the backend does not allow shares from type %i" : "A partilha de %s falhou porque a interface não permite as partilhas do tipo %i", "Sharing %s failed, because the file does not exist" : "A partilha de %s falhou, porque o ficheiro não existe", "You are not allowed to share %s" : "Não está autorizado a partilhar %s", + "Sharing %s failed, because you can not share with yourself" : "A partilha de %s falhou, porque não é possível partilhar consigo mesmo", "Sharing %s failed, because the user %s does not exist" : "A partilha %s falhou, porque o utilizador %s nao existe", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "A partilha %s falhou, porque o utilizador %s não pertence a nenhum dos grupos que %s é membro de", "Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s", + "Sharing %s failed, because this item is already shared with user %s" : "A partilha de %s falhou, porque este item já está a ser partilhado com o utilizador %s", "Sharing %s failed, because the group %s does not exist" : "A partilha %s falhou, porque o grupo %s não existe", "Sharing %s failed, because %s is not a member of the group %s" : "A partilha %s falhou, porque o utilizador %s não é membro do grupo %s", "You need to provide a password to create a public link, only protected links are allowed" : "Necessita de fornecer a senha para criar um link publico, só são permitidos links protegidos", "Sharing %s failed, because sharing with links is not allowed" : "A partilha de %s falhou, porque partilhar com links não é permitido", + "Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.", "Share type %s is not valid for %s" : "O tipo de partilha %s não é válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Definir permissões para %s falhou, porque as permissões excedem as permissões concedidas a %s", @@ -104,6 +108,9 @@ "Sharing %s failed, because resharing is not allowed" : "A partilha %s falhou, porque repartilhar não é permitido", "Sharing %s failed, because the sharing backend for %s could not find its source" : "A partilha %s falhou porque a partilha da interface para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "A partilha %s falhou, devido ao ficheiro não poder ser encontrado na cache de ficheiros", + "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s", + "Expiration date is in the past" : "A data de expiração está no passado", + "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro", "Could not find category \"%s\"" : "Não foi encontrado a categoria \"%s\"", "Apps" : "Apps", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"" : "Apenas os seguintes caracteres são permitidos no nome de utilizador: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-\"", @@ -112,6 +119,7 @@ "The username is already being used" : "O nome de utilizador já está a ser usado", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhuma base de dados de drivers (sqlite, mysql, or postgresql) instaladas.", "Microsoft Windows Platform is not supported" : "A plataforma Microsoft Windows não é suportada", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Executar um Servidor ownCloud na plataforma Microsoft Windows não é suportado. Nós sugerimos que use um servidor Linux numa máquina virtual se não tiver opção parar migrar o servidor por si mesmo. Encontre pacotes Linux, assim como imagens de máquinas virtuais prontas a correr em <a href=\"%s\">%s</a>. Parar migrar instalações existentes para Linux, poderás encontrar algumas dicas e um script de migração na <a href=\"%s\">nossa documentação</a>.", "Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"", "Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Isto pode ser normalmente resolvido %sdando ao servidor web direito de escrita para o directório de aplicação%s ou desactivando a loja de aplicações no ficheiro de configuração.", @@ -124,6 +132,9 @@ "PHP module %s not installed." : "O modulo %s PHP não está instalado.", "PHP setting \"%s\" is not set to \"%s\"." : "Configuração PHP \"%s\" não está definida para \"%s\".", "Adjusting this setting in php.ini will make ownCloud run again" : "Ajustar esta configuração no php.ini fará com que o ownCloud funcione de novo", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload está configurado para \"%s\" invés do valor habitual de \"0\"", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para corrigir este problema altere o <code>mbstring.func_overload</code> para <code>0</code> no seu php.ini", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado a remover blocos doc em linha. Isto vai tornar algumas aplicações básicas inacessíveis.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.", "PHP modules have been installed, but they are still listed as missing?" : "Os módulos PHP foram instalados, mas eles ainda estão listados como desaparecidos?", "Please ask your server administrator to restart the web server." : "Pro favor pergunte ao seu administrador do servidor para reiniciar o servidor da internet.", @@ -136,6 +147,10 @@ "Data directory (%s) is invalid" : "Directoria data (%s) é invalida", "Please check that the data directory contains a file \".ocdata\" in its root." : "Por favor verifique que a directoria data contem um ficheiro \".ocdata\" na sua raiz.", "Could not obtain lock type %d on \"%s\"." : "Não foi possível obter o tipo de bloqueio %d em \"%s\".", - "Storage not available" : "Armazenamento indisposinvel" + "Storage unauthorized. %s" : "Armazenamento desautorizado. %s", + "Storage incomplete configuration. %s" : "Configuração incompleta do armazenamento. %s", + "Storage connection error. %s" : "Erro de ligação ao armazenamento. %s", + "Storage not available" : "Armazenamento indisposinvel", + "Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index fcb6d9b42bc..87ba4c57482 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -56,6 +56,7 @@ OC.L10N.register( "Archives of type %s are not supported" : "Архивы %s не поддерживаются", "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения", "App does not provide an info.xml file" : "Приложение не имеет файла info.xml", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.", "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.", "App can't be installed because it is not compatible with this version of ownCloud" : "Приложение невозможно установить. Не совместимо с текущей версией ownCloud.", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.", diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index 79c53f85ace..e249b187449 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -54,6 +54,7 @@ "Archives of type %s are not supported" : "Архивы %s не поддерживаются", "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения", "App does not provide an info.xml file" : "Приложение не имеет файла info.xml", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.", "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.", "App can't be installed because it is not compatible with this version of ownCloud" : "Приложение невозможно установить. Не совместимо с текущей версией ownCloud.", "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.", diff --git a/lib/private/app/dependencyanalyzer.php b/lib/private/app/dependencyanalyzer.php index ba2479ae7aa..0cf4bc72161 100644 --- a/lib/private/app/dependencyanalyzer.php +++ b/lib/private/app/dependencyanalyzer.php @@ -73,7 +73,7 @@ class DependencyAnalyzer { * 5.2.6.5 and 5.1 will be turned into 5.2 and 5.1 * @param string $first * @param string $second - * @return array first element is the first version, second element is the + * @return string[] first element is the first version, second element is the * second version */ private function normalizeVersions($first, $second) { diff --git a/lib/private/app/platformrepository.php b/lib/private/app/platformrepository.php index 730c67f45ee..7363b2a44b1 100644 --- a/lib/private/app/platformrepository.php +++ b/lib/private/app/platformrepository.php @@ -206,6 +206,9 @@ class PlatformRepository { throw new \UnexpectedValueException('Invalid version string "' . $version . '"' . $extraMessage); } + /** + * @param string $stability + */ private function expandStability($stability) { $stability = strtolower($stability); switch ($stability) { diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php index c2a2e0b4891..281e8ca7fef 100644 --- a/lib/private/comments/managerfactory.php +++ b/lib/private/comments/managerfactory.php @@ -22,11 +22,27 @@ namespace OC\Comments; use OCP\Comments\ICommentsManager; use OCP\Comments\ICommentsManagerFactory; - +use OCP\IServerContainer; class ManagerFactory implements ICommentsManagerFactory { /** + * Server container + * + * @var IServerContainer + */ + private $serverContainer; + + /** + * Constructor for the comments manager factory + * + * @param IServerContainer $serverContainer server container + */ + public function __construct(IServerContainer $serverContainer) { + $this->serverContainer = $serverContainer; + } + + /** * creates and returns an instance of the ICommentsManager * * @return ICommentsManager @@ -34,8 +50,8 @@ class ManagerFactory implements ICommentsManagerFactory { */ public function getManager() { return new Manager( - \OC::$server->getDatabaseConnection(), - \OC::$server->getLogger() + $this->serverContainer->getDatabaseConnection(), + $this->serverContainer->getLogger() ); } } diff --git a/lib/private/db/migrator.php b/lib/private/db/migrator.php index cd310bb75a5..7ca3f981358 100644 --- a/lib/private/db/migrator.php +++ b/lib/private/db/migrator.php @@ -52,7 +52,7 @@ class Migrator { protected $config; /** - * @param \Doctrine\DBAL\Connection $connection + * @param Connection $connection * @param ISecureRandom $random * @param IConfig $config */ diff --git a/lib/private/defaults.php b/lib/private/defaults.php index 1fa8352edc1..43e8c8082cc 100644 --- a/lib/private/defaults.php +++ b/lib/private/defaults.php @@ -261,6 +261,9 @@ class OC_Defaults { return $footer; } + /** + * @param string $key + */ public function buildDocLinkToKey($key) { if ($this->themeExist('buildDocLinkToKey')) { return $this->theme->buildDocLinkToKey($key); diff --git a/lib/private/files/cache/propagator.php b/lib/private/files/cache/propagator.php index 1e85a2ecc8b..50264e54d44 100644 --- a/lib/private/files/cache/propagator.php +++ b/lib/private/files/cache/propagator.php @@ -43,9 +43,10 @@ class Propagator implements IPropagator { /** * @param string $internalPath * @param int $time - * @return array[] all propagated cache entries + * @param int $sizeDifference number of bytes the file has grown + * @return array[] all propagated entries */ - public function propagateChange($internalPath, $time) { + public function propagateChange($internalPath, $time, $sizeDifference = 0) { $cache = $this->storage->getCache($internalPath); $parentId = $cache->getParentId($internalPath); @@ -58,7 +59,12 @@ class Propagator implements IPropagator { } $mtime = max($time, $entry['mtime']); - $cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path'])]); + if ($entry['size'] === -1) { + $newSize = -1; + } else { + $newSize = $entry['size'] + $sizeDifference; + } + $cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path']), 'size' => $newSize]); $parentId = $entry['parent']; } diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php index 1c50978a2e5..60daa323b4b 100644 --- a/lib/private/files/cache/scanner.php +++ b/lib/private/files/cache/scanner.php @@ -198,6 +198,7 @@ class Scanner extends BasicEmitter implements IScanner { if (!empty($newData)) { $data['fileid'] = $this->addToCache($file, $newData, $fileId); } + $data['oldSize'] = $cacheData['size']; // post-emit only if it was a file. By that we avoid counting/treating folders as files if ($data['mimetype'] !== 'httpd/unix-directory') { diff --git a/lib/private/files/cache/updater.php b/lib/private/files/cache/updater.php index 58d8e53cfd1..80ba704883e 100644 --- a/lib/private/files/cache/updater.php +++ b/lib/private/files/cache/updater.php @@ -118,9 +118,15 @@ class Updater implements IUpdater { } $data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false); + if (isset($data['oldSize']) && isset($data['size'])) { + $sizeDifference = $data['size'] - $data['oldSize']; + } else { + // scanner didn't provide size info, fallback to full size calculation + $sizeDifference = 0; + $this->cache->correctFolderSize($path, $data); + } $this->correctParentStorageMtime($path); - $this->cache->correctFolderSize($path, $data); - $this->propagator->propagateChange($path, $time); + $this->propagator->propagateChange($path, $time, $sizeDifference); } /** diff --git a/lib/private/files/config/cachedmountinfo.php b/lib/private/files/config/cachedmountinfo.php new file mode 100644 index 00000000000..dba07715edc --- /dev/null +++ b/lib/private/files/config/cachedmountinfo.php @@ -0,0 +1,107 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 OC\Files\Config; + +use OC\Files\Filesystem; +use OCP\Files\Config\ICachedMountInfo; +use OCP\Files\Node; +use OCP\IUser; + +class CachedMountInfo implements ICachedMountInfo { + /** + * @var IUser + */ + private $user; + + /** + * @var int + */ + private $storageId; + + /** + * @var int + */ + private $rootId; + + /** + * @var string + */ + private $mountPoint; + + /** + * CachedMountInfo constructor. + * + * @param IUser $user + * @param int $storageId + * @param int $rootId + * @param string $mountPoint + */ + public function __construct(IUser $user, $storageId, $rootId, $mountPoint) { + $this->user = $user; + $this->storageId = $storageId; + $this->rootId = $rootId; + $this->mountPoint = $mountPoint; + } + + /** + * @return IUser + */ + public function getUser() { + return $this->user; + } + + /** + * @return int the numeric storage id of the mount + */ + public function getStorageId() { + return $this->storageId; + } + + /** + * @return int the fileid of the root of the mount + */ + public function getRootId() { + return $this->rootId; + } + + /** + * @return Node the root node of the mount + */ + public function getMountPointNode() { + // TODO injection etc + Filesystem::initMountPoints($this->user->getUID()); + $userNode = \OC::$server->getUserFolder($this->user->getUID()); + $nodes = $userNode->getById($this->rootId); + if (count($nodes) > 0) { + return $nodes[0]; + } else { + return null; + } + } + + /** + * @return string the mount point of the mount for the user + */ + public function getMountPoint() { + return $this->mountPoint; + } +} diff --git a/lib/private/files/config/mountprovidercollection.php b/lib/private/files/config/mountprovidercollection.php index eb61ec3f5d5..499fa576fbc 100644 --- a/lib/private/files/config/mountprovidercollection.php +++ b/lib/private/files/config/mountprovidercollection.php @@ -26,6 +26,8 @@ use OC\Hooks\Emitter; use OC\Hooks\EmitterTrait; use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Config\IMountProvider; +use OCP\Files\Config\IUserMountCache; +use OCP\Files\Mount\IMountPoint; use OCP\Files\Storage\IStorageFactory; use OCP\IUser; @@ -43,10 +45,17 @@ class MountProviderCollection implements IMountProviderCollection, Emitter { private $loader; /** + * @var \OCP\Files\Config\IUserMountCache + */ + private $mountCache; + + /** * @param \OCP\Files\Storage\IStorageFactory $loader + * @param IUserMountCache $mountCache */ - public function __construct(IStorageFactory $loader) { + public function __construct(IStorageFactory $loader, IUserMountCache $mountCache) { $this->loader = $loader; + $this->mountCache = $mountCache; } /** @@ -77,4 +86,23 @@ class MountProviderCollection implements IMountProviderCollection, Emitter { $this->providers[] = $provider; $this->emit('\OC\Files\Config', 'registerMountProvider', [$provider]); } + + /** + * Cache mounts for user + * + * @param IUser $user + * @param IMountPoint[] $mountPoints + */ + public function registerMounts(IUser $user, array $mountPoints) { + $this->mountCache->registerMounts($user, $mountPoints); + } + + /** + * Get the mount cache which can be used to search for mounts without setting up the filesystem + * + * @return IUserMountCache + */ + public function getMountCache() { + return $this->mountCache; + } } diff --git a/lib/private/files/config/usermountcache.php b/lib/private/files/config/usermountcache.php new file mode 100644 index 00000000000..e3a494e93a1 --- /dev/null +++ b/lib/private/files/config/usermountcache.php @@ -0,0 +1,232 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 OC\Files\Config; + +use Doctrine\DBAL\Exception\UniqueConstraintViolationException; +use OCP\Files\Config\ICachedMountInfo; +use OCP\Files\Config\IUserMountCache; +use OCP\Files\Mount\IMountPoint; +use OCP\ICache; +use OCP\IDBConnection; +use OCP\ILogger; +use OCP\IUser; +use OCP\IUserManager; + +/** + * Cache mounts points per user in the cache so we can easilly look them up + */ +class UserMountCache implements IUserMountCache { + /** + * @var IDBConnection + */ + private $connection; + + /** + * @var IUserManager + */ + private $userManager; + + /** @var ICachedMountInfo[][] [$userId => [$cachedMountInfo, ....], ...] */ + private $mountsForUsers = []; + + /** + * @var ILogger + */ + private $logger; + + /** + * UserMountCache constructor. + * + * @param IDBConnection $connection + * @param IUserManager $userManager + * @param ILogger $logger + */ + public function __construct(IDBConnection $connection, IUserManager $userManager, ILogger $logger) { + $this->connection = $connection; + $this->userManager = $userManager; + $this->logger = $logger; + } + + public function registerMounts(IUser $user, array $mounts) { + // filter out non-proper storages coming from unit tests + $mounts = array_filter($mounts, function (IMountPoint $mount) { + return $mount->getStorage()->getCache(); + }); + /** @var ICachedMountInfo[] $newMounts */ + $newMounts = array_map(function (IMountPoint $mount) use ($user) { + $storage = $mount->getStorage(); + $rootId = (int)$storage->getCache()->getId(''); + $storageId = (int)$storage->getStorageCache()->getNumericId(); + // filter out any storages which aren't scanned yet since we aren't interested in files from those storages (yet) + if ($rootId === -1) { + return null; + } else { + return new CachedMountInfo($user, $storageId, $rootId, $mount->getMountPoint()); + } + }, $mounts); + $newMounts = array_values(array_filter($newMounts)); + + $cachedMounts = $this->getMountsForUser($user); + $mountDiff = function (ICachedMountInfo $mount1, ICachedMountInfo $mount2) { + // since we are only looking for mounts for a specific user comparing on root id is enough + return $mount1->getRootId() - $mount2->getRootId(); + }; + + /** @var ICachedMountInfo[] $addedMounts */ + $addedMounts = array_udiff($newMounts, $cachedMounts, $mountDiff); + /** @var ICachedMountInfo[] $removedMounts */ + $removedMounts = array_udiff($cachedMounts, $newMounts, $mountDiff); + + $changedMounts = array_uintersect($newMounts, $cachedMounts, function (ICachedMountInfo $mount1, ICachedMountInfo $mount2) { + // filter mounts with the same root id and different mountpoints + if ($mount1->getRootId() !== $mount2->getRootId()) { + return -1; + } + return ($mount1->getMountPoint() !== $mount2->getMountPoint()) ? 0 : 1; + }); + + foreach ($addedMounts as $mount) { + $this->addToCache($mount); + $this->mountsForUsers[$user->getUID()][] = $mount; + } + foreach ($removedMounts as $mount) { + $this->removeFromCache($mount); + $index = array_search($mount, $this->mountsForUsers[$user->getUID()]); + unset($this->mountsForUsers[$user->getUID()][$index]); + } + foreach ($changedMounts as $mount) { + $this->setMountPoint($mount); + } + } + + private function addToCache(ICachedMountInfo $mount) { + $this->connection->insertIfNotExist('*PREFIX*mounts', [ + 'storage_id' => $mount->getStorageId(), + 'root_id' => $mount->getRootId(), + 'user_id' => $mount->getUser()->getUID(), + 'mount_point' => $mount->getMountPoint() + ]); + } + + private function setMountPoint(ICachedMountInfo $mount) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->update('mounts') + ->set('mount_point', $builder->createNamedParameter($mount->getMountPoint())) + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) + ->andWhere($builder->expr()->eq('root_id', $builder->createNamedParameter($mount->getRootId(), \PDO::PARAM_INT))); + + $query->execute(); + } + + private function removeFromCache(ICachedMountInfo $mount) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID()))) + ->andWhere($builder->expr()->eq('root_id', $builder->createNamedParameter($mount->getRootId(), \PDO::PARAM_INT))); + $query->execute(); + } + + private function dbRowToMountInfo(array $row) { + $user = $this->userManager->get($row['user_id']); + return new CachedMountInfo($user, (int)$row['storage_id'], (int)$row['root_id'], $row['mount_point']); + } + + /** + * @param IUser $user + * @return ICachedMountInfo[] + */ + public function getMountsForUser(IUser $user) { + if (!isset($this->mountsForUsers[$user->getUID()])) { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') + ->from('mounts') + ->where($builder->expr()->eq('user_id', $builder->createPositionalParameter($user->getUID()))); + + $rows = $query->execute()->fetchAll(); + + $this->mountsForUsers[$user->getUID()] = array_map([$this, 'dbRowToMountInfo'], $rows); + } + return $this->mountsForUsers[$user->getUID()]; + } + + /** + * @param int $numericStorageId + * @return CachedMountInfo[] + */ + public function getMountsForStorageId($numericStorageId) { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') + ->from('mounts') + ->where($builder->expr()->eq('storage_id', $builder->createPositionalParameter($numericStorageId, \PDO::PARAM_INT))); + + $rows = $query->execute()->fetchAll(); + + return array_map([$this, 'dbRowToMountInfo'], $rows); + } + + /** + * @param int $rootFileId + * @return CachedMountInfo[] + */ + public function getMountsForRootId($rootFileId) { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select('storage_id', 'root_id', 'user_id', 'mount_point') + ->from('mounts') + ->where($builder->expr()->eq('root_id', $builder->createPositionalParameter($rootFileId, \PDO::PARAM_INT))); + + $rows = $query->execute()->fetchAll(); + + return array_map([$this, 'dbRowToMountInfo'], $rows); + } + + /** + * Remove all cached mounts for a user + * + * @param IUser $user + */ + public function removeUserMounts(IUser $user) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($user->getUID()))); + $query->execute(); + } + + public function removeUserStorageMount($storageId, $userId) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($userId))) + ->andWhere($builder->expr()->eq('storage_id', $builder->createNamedParameter($storageId, \PDO::PARAM_INT))); + $query->execute(); + } + + public function remoteStorageMounts($storageId) { + $builder = $this->connection->getQueryBuilder(); + + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('storage_id', $builder->createNamedParameter($storageId, \PDO::PARAM_INT))); + $query->execute(); + } +} diff --git a/lib/private/files/config/usermountcachelistener.php b/lib/private/files/config/usermountcachelistener.php new file mode 100644 index 00000000000..344bebe342d --- /dev/null +++ b/lib/private/files/config/usermountcachelistener.php @@ -0,0 +1,48 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 OC\Files\Config; + +use OC\User\Manager; +use OCP\Files\Config\IUserMountCache; + +/** + * Listen to hooks and update the mount cache as needed + */ +class UserMountCacheListener { + /** + * @var IUserMountCache + */ + private $userMountCache; + + /** + * UserMountCacheListener constructor. + * + * @param IUserMountCache $userMountCache + */ + public function __construct(IUserMountCache $userMountCache) { + $this->userMountCache = $userMountCache; + } + + public function listen(Manager $manager) { + $manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']); + } +} diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index ffe3a594ba8..9d4a2c0aa05 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -59,8 +59,10 @@ namespace OC\Files; use OC\Files\Config\MountProviderCollection; +use OC\Files\Mount\MountPoint; use OC\Files\Storage\StorageFactory; use OCP\Files\Config\IMountProvider; +use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; use OCP\IUserManager; @@ -412,7 +414,8 @@ class Filesystem { $homeStorage['arguments']['legacy'] = true; } - self::mount($homeStorage['class'], $homeStorage['arguments'], $user); + $mount = new MountPoint($homeStorage['class'], '/' . $user, $homeStorage['arguments'], self::getLoader()); + self::getMountManager()->addMount($mount); $home = \OC\Files\Filesystem::getStorage($user); @@ -424,6 +427,8 @@ class Filesystem { if ($userObject) { $mounts = $mountConfigManager->getMountsForUser($userObject); array_walk($mounts, array(self::$mounts, 'addMount')); + $mounts[] = $mount; + $mountConfigManager->registerMounts($userObject, $mounts); } self::listenForNewMountProviders($mountConfigManager, $userManager); diff --git a/lib/private/helper.php b/lib/private/helper.php index 3590eaee612..c387cd40a24 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -112,7 +112,7 @@ class OC_Helper { } $bytes = round($bytes / 1024, 0); if ($bytes < 1024) { - return "$bytes kB"; + return "$bytes KB"; } $bytes = round($bytes / 1024, 1); if ($bytes < 1024) { diff --git a/lib/private/integritycheck/checker.php b/lib/private/integritycheck/checker.php index 0cd01df7fe1..c256fe66d32 100644 --- a/lib/private/integritycheck/checker.php +++ b/lib/private/integritycheck/checker.php @@ -114,6 +114,7 @@ class Checker { * * @param string $folderToIterate * @return \RecursiveIteratorIterator + * @throws \Exception */ private function getFolderIterator($folderToIterate) { $dirItr = new \RecursiveDirectoryIterator( @@ -149,16 +150,33 @@ class Checker { } $relativeFileName = substr($filename, $baseDirectoryLength); + $relativeFileName = ltrim($relativeFileName, '/'); // Exclude signature.json files in the appinfo and root folder - if($relativeFileName === '/appinfo/signature.json') { + if($relativeFileName === 'appinfo/signature.json') { continue; } // Exclude signature.json files in the appinfo and core folder - if($relativeFileName === '/core/signature.json') { + if($relativeFileName === 'core/signature.json') { continue; } + // The .htaccess file in the root folder of ownCloud can contain + // custom content after the installation due to the fact that dynamic + // content is written into it at installation time as well. This + // includes for example the 404 and 403 instructions. + // Thus we ignore everything below the first occurrence of + // "#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####" and have the + // hash generated based on this. + if($filename === $this->environmentHelper->getServerRoot() . '/.htaccess') { + $fileContent = file_get_contents($filename); + $explodedArray = explode('#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####', $fileContent); + if(count($explodedArray) === 2) { + $hashes[$relativeFileName] = hash('sha512', $explodedArray[0]); + continue; + } + } + $hashes[$relativeFileName] = hash_file('sha512', $filename); } return $hashes; @@ -189,17 +207,19 @@ class Checker { } /** - * Write the signature of the specified app + * Write the signature of the app in the specified folder * - * @param string $appId + * @param string $path * @param X509 $certificate * @param RSA $privateKey * @throws \Exception */ - public function writeAppSignature($appId, + public function writeAppSignature($path, X509 $certificate, RSA $privateKey) { - $path = $this->appLocator->getAppPath($appId); + if(!is_dir($path)) { + throw new \Exception('Directory does not exist.'); + } $iterator = $this->getFolderIterator($path); $hashes = $this->generateHashes($iterator, $path); $signature = $this->createSignatureData($hashes, $certificate, $privateKey); diff --git a/lib/private/integritycheck/helpers/environmenthelper.php b/lib/private/integritycheck/helpers/environmenthelper.php index 8bddcb3d794..f56f07486c2 100644 --- a/lib/private/integritycheck/helpers/environmenthelper.php +++ b/lib/private/integritycheck/helpers/environmenthelper.php @@ -34,7 +34,7 @@ class EnvironmentHelper { * @return string */ public function getServerRoot() { - return \OC::$SERVERROOT; + return rtrim(\OC::$SERVERROOT, '/'); } /** diff --git a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php b/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php index efe7c114d9e..c3994197fc6 100644 --- a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php +++ b/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php @@ -35,6 +35,7 @@ class ExcludeFoldersByPathFilterIterator extends \RecursiveFilterIterator { $this->excludedFolders = array_merge([ rtrim(\OC::$server->getConfig()->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data'), '/'), rtrim(\OC::$SERVERROOT.'/themes', '/'), + rtrim(\OC::$SERVERROOT.'/config', '/'), ], $appFolders); } diff --git a/lib/private/memcache/apcu.php b/lib/private/memcache/apcu.php index 9000df65dcd..ddd16ae1202 100644 --- a/lib/private/memcache/apcu.php +++ b/lib/private/memcache/apcu.php @@ -60,7 +60,7 @@ class APCu extends Cache implements IMemcache { if(class_exists('\APCIterator')) { $iter = new \APCIterator('user', '/^' . $ns . '/', APC_ITER_KEY); } else { - $iter = new \APCUIterator('user', '/^' . $ns . '/', APC_ITER_KEY); + $iter = new \APCUIterator('/^' . $ns . '/', APC_ITER_KEY); } return apcu_delete($iter); } diff --git a/lib/private/notification/imanager.php b/lib/private/notification/imanager.php index 0e9504a1f6e..2f8e3ba39fc 100644 --- a/lib/private/notification/imanager.php +++ b/lib/private/notification/imanager.php @@ -43,10 +43,18 @@ interface IManager extends IApp, INotifier { /** * @param \Closure $service The service must implement INotifier, otherwise a * \InvalidArgumentException is thrown later + * @param \Closure $info An array with the keys 'id' and 'name' containing + * the app id and the app name * @return null - * @since 8.2.0 + * @since 8.2.0 - Parameter $info was added in 9.0.0 + */ + public function registerNotifier(\Closure $service, \Closure $info); + + /** + * @return array App ID => App Name + * @since 9.0.0 */ - public function registerNotifier(\Closure $service); + public function listNotifiers(); /** * @return INotification diff --git a/lib/private/notification/inotification.php b/lib/private/notification/inotification.php index 0a47b57aa11..921f0779b92 100644 --- a/lib/private/notification/inotification.php +++ b/lib/private/notification/inotification.php @@ -79,8 +79,7 @@ interface INotification { * @param string $id * @return $this * @throws \InvalidArgumentException if the object type or id is invalid - * @since 8.2.0 - * @changed 9.0.0 Type of $id changed to string + * @since 8.2.0 - 9.0.0: Type of $id changed to string */ public function setObject($type, $id); @@ -92,8 +91,7 @@ interface INotification { /** * @return string - * @since 8.2.0 - * @changed 9.0.0 Return type changed to string + * @since 8.2.0 - 9.0.0: Return type changed to string */ public function getObjectId(); diff --git a/lib/private/notification/manager.php b/lib/private/notification/manager.php index a8f1ec349ce..239b5bfe5c7 100644 --- a/lib/private/notification/manager.php +++ b/lib/private/notification/manager.php @@ -29,17 +29,25 @@ class Manager implements IManager { /** @var INotifier */ protected $notifiers; - /** @var \Closure */ + /** @var array[] */ + protected $notifiersInfo; + + /** @var \Closure[] */ protected $appsClosures; - /** @var \Closure */ + /** @var \Closure[] */ protected $notifiersClosures; + /** @var \Closure[] */ + protected $notifiersInfoClosures; + public function __construct() { $this->apps = []; $this->notifiers = []; + $this->notifiersInfo = []; $this->appsClosures = []; $this->notifiersClosures = []; + $this->notifiersInfoClosures = []; } /** @@ -56,12 +64,16 @@ class Manager implements IManager { /** * @param \Closure $service The service must implement INotifier, otherwise a * \InvalidArgumentException is thrown later + * @param \Closure $info An array with the keys 'id' and 'name' containing + * the app id and the app name * @return null - * @since 8.2.0 + * @since 8.2.0 - Parameter $info was added in 9.0.0 */ - public function registerNotifier(\Closure $service) { + public function registerNotifier(\Closure $service, \Closure $info) { $this->notifiersClosures[] = $service; + $this->notifiersInfoClosures[] = $info; $this->notifiers = []; + $this->notifiersInfo = []; } /** @@ -96,7 +108,7 @@ class Manager implements IManager { foreach ($this->notifiersClosures as $closure) { $notifier = $closure(); if (!($notifier instanceof INotifier)) { - throw new \InvalidArgumentException('The given notification app does not implement the INotifier interface'); + throw new \InvalidArgumentException('The given notifier does not implement the INotifier interface'); } $this->notifiers[] = $notifier; } @@ -105,6 +117,29 @@ class Manager implements IManager { } /** + * @return array[] + */ + public function listNotifiers() { + if (!empty($this->notifiersInfo)) { + return $this->notifiersInfo; + } + + $this->notifiersInfo = []; + foreach ($this->notifiersInfoClosures as $closure) { + $notifier = $closure(); + if (!is_array($notifier) || sizeof($notifier) !== 2 || !isset($notifier['id']) || !isset($notifier['name'])) { + throw new \InvalidArgumentException('The given notifier information is invalid'); + } + if (isset($this->notifiersInfo[$notifier['id']])) { + throw new \InvalidArgumentException('The given notifier ID ' . $notifier['id'] . ' is already in use'); + } + $this->notifiersInfo[$notifier['id']] = $notifier['name']; + } + + return $this->notifiersInfo; + } + + /** * @return INotification * @since 8.2.0 */ diff --git a/lib/private/notification/notification.php b/lib/private/notification/notification.php index 70b854e6d56..677658eb3e8 100644 --- a/lib/private/notification/notification.php +++ b/lib/private/notification/notification.php @@ -167,8 +167,7 @@ class Notification implements INotification { * @param string $id * @return $this * @throws \InvalidArgumentException if the object type or id is invalid - * @since 8.2.0 - * @changed 9.0.0 Type of $id changed to string + * @since 8.2.0 - 9.0.0: Type of $id changed to string */ public function setObject($type, $id) { if (!is_string($type) || $type === '' || isset($type[64])) { @@ -193,8 +192,7 @@ class Notification implements INotification { /** * @return string - * @since 8.2.0 - * @changed 9.0.0 Return type changed to string + * @since 8.2.0 - 9.0.0: Return type changed to string */ public function getObjectId() { return $this->objectId; diff --git a/lib/private/server.php b/lib/private/server.php index 7c4b7dad764..2497c056600 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -47,6 +47,8 @@ use OC\Diagnostics\EventLogger; use OC\Diagnostics\NullEventLogger; use OC\Diagnostics\NullQueryLogger; use OC\Diagnostics\QueryLogger; +use OC\Files\Config\UserMountCache; +use OC\Files\Config\UserMountCacheListener; use OC\Files\Node\HookConnector; use OC\Files\Node\Root; use OC\Files\View; @@ -137,18 +139,25 @@ class Server extends ServerContainer implements IServerContainer { return new Encryption\Keys\Storage($view, $util); }); - $this->registerService('TagMapper', function(Server $c) { + $this->registerService('TagMapper', function (Server $c) { return new TagMapper($c->getDatabaseConnection()); }); $this->registerService('TagManager', function (Server $c) { $tagMapper = $c->query('TagMapper'); return new TagManager($tagMapper, $c->getUserSession()); }); + $this->registerService('SystemTagManagerFactory', function (Server $c) { + $config = $c->getConfig(); + $factoryClass = $config->getSystemValue('systemtags.managerFactory', '\OC\SystemTag\ManagerFactory'); + /** @var \OC\SystemTag\ManagerFactory $factory */ + $factory = new $factoryClass($this); + return $factory; + }); $this->registerService('SystemTagManager', function (Server $c) { - return new SystemTag\SystemTagManager($c->getDatabaseConnection()); + return $c->query('SystemTagManagerFactory')->getManager(); }); $this->registerService('SystemTagObjectMapper', function (Server $c) { - return new SystemTag\SystemTagObjectMapper($c->getDatabaseConnection(), $c->getSystemTagManager()); + return $c->query('SystemTagManagerFactory')->getObjectMapper(); }); $this->registerService('RootFolder', function (Server $c) { // TODO: get user and user manager from container as well @@ -230,6 +239,10 @@ class Server extends ServerContainer implements IServerContainer { $userSession->listen('\OC\User', 'logout', function () { \OC_Hook::emit('OC_User', 'logout', array()); }); + $userSession->listen('\OC\User', 'changeUser', function ($user) { + /** @var $user \OC\User\User */ + \OC_Hook::emit('OC_User', 'changeUser', array('run' => true, 'user' => $user)); + }); return $userSession; }); $this->registerService('NavigationManager', function ($c) { @@ -266,13 +279,13 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('MemCacheFactory', function (Server $c) { $config = $c->getConfig(); - if($config->getSystemValue('installed', false) && !(defined('PHPUNIT_RUN') && PHPUNIT_RUN)) { + if ($config->getSystemValue('installed', false) && !(defined('PHPUNIT_RUN') && PHPUNIT_RUN)) { $v = \OC_App::getAppVersions(); $v['core'] = md5(file_get_contents(\OC::$SERVERROOT . '/version.php')); $version = implode(',', $v); $instanceId = \OC_Util::getInstanceId(); $path = \OC::$SERVERROOT; - $prefix = md5($instanceId.'-'.$version.'-'.$path); + $prefix = md5($instanceId . '-' . $version . '-' . $path); return new \OC\Memcache\Factory($prefix, $c->getLogger(), $config->getSystemValue('memcache.local', null), $config->getSystemValue('memcache.distributed', null), @@ -386,7 +399,7 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig() ); }); - $this->registerService('AppManager', function(Server $c) { + $this->registerService('AppManager', function (Server $c) { return new \OC\App\AppManager( $c->getUserSession(), $c->getAppConfig(), @@ -394,13 +407,13 @@ class Server extends ServerContainer implements IServerContainer { $c->getMemCacheFactory() ); }); - $this->registerService('DateTimeZone', function(Server $c) { + $this->registerService('DateTimeZone', function (Server $c) { return new DateTimeZone( $c->getConfig(), $c->getSession() ); }); - $this->registerService('DateTimeFormatter', function(Server $c) { + $this->registerService('DateTimeFormatter', function (Server $c) { $language = $c->getConfig()->getUserValue($c->getSession()->get('user_id'), 'core', 'lang', null); return new DateTimeFormatter( @@ -408,9 +421,16 @@ class Server extends ServerContainer implements IServerContainer { $c->getL10N('lib', $language) ); }); - $this->registerService('MountConfigManager', function () { + $this->registerService('UserMountCache', function (Server $c) { + $mountCache = new UserMountCache($c->getDatabaseConnection(), $c->getUserManager(), $c->getLogger()); + $listener = new UserMountCacheListener($mountCache); + $listener->listen($c->getUserManager()); + return $mountCache; + }); + $this->registerService('MountConfigManager', function (Server $c) { $loader = \OC\Files\Filesystem::getLoader(); - return new \OC\Files\Config\MountProviderCollection($loader); + $mountCache = $c->query('UserMountCache'); + return new \OC\Files\Config\MountProviderCollection($loader, $mountCache); }); $this->registerService('IniWrapper', function ($c) { return new IniGetWrapper(); @@ -482,14 +502,14 @@ class Server extends ServerContainer implements IServerContainer { $stream ); }); - $this->registerService('Mailer', function(Server $c) { + $this->registerService('Mailer', function (Server $c) { return new Mailer( $c->getConfig(), $c->getLogger(), new \OC_Defaults() ); }); - $this->registerService('OcsClient', function(Server $c) { + $this->registerService('OcsClient', function (Server $c) { return new OCSClient( $this->getHTTPClientService(), $this->getConfig(), @@ -511,24 +531,24 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService('MountManager', function () { return new \OC\Files\Mount\Manager(); }); - $this->registerService('MimeTypeDetector', function(Server $c) { + $this->registerService('MimeTypeDetector', function (Server $c) { return new \OC\Files\Type\Detection( $c->getURLGenerator(), \OC::$SERVERROOT . '/config/', \OC::$SERVERROOT . '/resources/config/' - ); + ); }); - $this->registerService('MimeTypeLoader', function(Server $c) { + $this->registerService('MimeTypeLoader', function (Server $c) { return new \OC\Files\Type\Loader( $c->getDatabaseConnection() ); }); - $this->registerService('NotificationManager', function() { + $this->registerService('NotificationManager', function () { return new Manager(); }); $this->registerService('CapabilitiesManager', function (Server $c) { $manager = new \OC\CapabilitiesManager(); - $manager->registerCapability(function() use ($c) { + $manager->registerCapability(function () use ($c) { return new \OC\OCS\CoreCapabilities($c->getConfig()); }); return $manager; @@ -537,10 +557,10 @@ class Server extends ServerContainer implements IServerContainer { $config = $c->getConfig(); $factoryClass = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); /** @var \OCP\Comments\ICommentsManagerFactory $factory */ - $factory = new $factoryClass(); + $factory = new $factoryClass($this); return $factory->getManager(); }); - $this->registerService('EventDispatcher', function() { + $this->registerService('EventDispatcher', function () { return new EventDispatcher(); }); $this->registerService('CryptoWrapper', function (Server $c) { @@ -572,7 +592,7 @@ class Server extends ServerContainer implements IServerContainer { $config = $c->getConfig(); $factoryClass = $config->getSystemValue('sharing.managerFactory', '\OC\Share20\ProviderFactory'); /** @var \OC\Share20\IProviderFactory $factory */ - $factory = new $factoryClass(); + $factory = new $factoryClass($this); $manager = new \OC\Share20\Manager( $c->getLogger(), @@ -934,6 +954,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Returns an instance of the db facade + * * @deprecated use getDatabaseConnection, will be removed in ownCloud 10 * @return \OCP\IDb */ @@ -943,6 +964,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Returns an instance of the HTTP helper class + * * @deprecated Use getHTTPClientService() * @return \OC\HTTPHelper */ @@ -1068,7 +1090,7 @@ class Server extends ServerContainer implements IServerContainer { /** * @return \OCP\Files\Config\IMountProviderCollection */ - public function getMountProviderCollection(){ + public function getMountProviderCollection() { return $this->query('MountConfigManager'); } @@ -1084,7 +1106,7 @@ class Server extends ServerContainer implements IServerContainer { /** * @return \OCP\Command\IBus */ - public function getCommandBus(){ + public function getCommandBus() { return $this->query('AsyncCommandBus'); } @@ -1184,6 +1206,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\BackendService */ public function getStoragesBackendService() { @@ -1192,6 +1215,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\GlobalStoragesService */ public function getGlobalStoragesService() { @@ -1200,6 +1224,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\UserGlobalStoragesService */ public function getUserGlobalStoragesService() { @@ -1208,6 +1233,7 @@ class Server extends ServerContainer implements IServerContainer { /** * Not a public API as of 8.2, wait for 9.0 + * * @return \OCA\Files_External\Service\UserStoragesService */ public function getUserStoragesService() { @@ -1221,4 +1247,5 @@ class Server extends ServerContainer implements IServerContainer { public function getShareManager() { return $this->query('ShareManager'); } + } diff --git a/lib/private/setup.php b/lib/private/setup.php index 7903b94ccde..a96dade0665 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -408,7 +408,7 @@ class Setup { \OC::$server->getSecureRandom()); $htaccessContent = file_get_contents($setupHelper->pathToHtaccess()); - $content = ''; + $content = "#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####\n"; if (strpos($htaccessContent, 'ErrorDocument 403') === false) { //custom 403 error page $content.= "\nErrorDocument 403 ".\OC::$WEBROOT."/core/templates/403.php"; diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php index f4c33d68b46..5d768a4bc4b 100644 --- a/lib/private/share20/defaultshareprovider.php +++ b/lib/private/share20/defaultshareprovider.php @@ -20,8 +20,11 @@ */ namespace OC\Share20; +use OC\Share20\Exception\InvalidShare; use OC\Share20\Exception\ShareNotFound; use OC\Share20\Exception\BackendError; +use OCP\Files\NotFoundException; +use OCP\IGroup; use OCP\IUser; use OCP\IGroupManager; use OCP\IUserManager; @@ -29,6 +32,8 @@ use OCP\Files\IRootFolder; use OCP\IDBConnection; use OCP\Files\Node; +use Doctrine\DBAL\Connection; + /** * Class DefaultShareProvider * @@ -95,10 +100,14 @@ class DefaultShareProvider implements IShareProvider { if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { //Set the UID of the user we share with - $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()->getUID())); + /** @var IUser $sharedWith */ + $sharedWith = $share->getSharedWith(); + $qb->setValue('share_with', $qb->createNamedParameter($sharedWith->getUID())); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { //Set the GID of the group we share with - $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()->getGID())); + /** @var IGroup $sharedWith */ + $sharedWith = $share->getSharedWith(); + $qb->setValue('share_with', $qb->createNamedParameter($sharedWith->getGID())); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { //Set the token of the share $qb->setValue('token', $qb->createNamedParameter($share->getToken())); @@ -152,7 +161,7 @@ class DefaultShareProvider implements IShareProvider { // Now fetch the inserted share and create a complete share object $qb = $this->dbConn->getQueryBuilder(); $qb->select('*') - ->from('*PREFIX*share') + ->from('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))); $cursor = $qb->execute(); @@ -233,15 +242,67 @@ class DefaultShareProvider implements IShareProvider { } /** - * Get all shares by the given user + * Get all shares by the given user. Sharetype and path can be used to filter. * * @param IUser $user * @param int $shareType + * @param \OCP\Files\File|\OCP\Files\Folder $node + * @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator + * @param int $limit The maximum number of shares to be returned, -1 for all shares * @param int $offset - * @param int $limit * @return Share[] */ - public function getShares(IUser $user, $shareType, $offset, $limit) { + public function getSharesBy(IUser $user, $shareType, $node, $reshares, $limit, $offset) { + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share'); + + $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType))); + + /** + * Reshares for this user are shares where they are the owner. + */ + if ($reshares === false) { + //Special case for old shares created via the web UI + $or1 = $qb->expr()->andX( + $qb->expr()->eq('uid_owner', $qb->createNamedParameter($user->getUID())), + $qb->expr()->isNull('uid_initiator') + ); + + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($user->getUID())), + $or1 + ) + ); + } else { + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->eq('uid_owner', $qb->createNamedParameter($user->getUID())), + $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($user->getUID())) + ) + ); + } + + if ($node !== null) { + $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId()))); + } + + if ($limit !== -1) { + $qb->setMaxResults($limit); + } + + $qb->setFirstResult($offset); + $qb->orderBy('id'); + + $cursor = $qb->execute(); + $shares = []; + while($data = $cursor->fetch()) { + $shares[] = $this->createShare($data); + } + $cursor->closeCursor(); + + return $shares; } /** @@ -277,7 +338,11 @@ class DefaultShareProvider implements IShareProvider { throw new ShareNotFound(); } - $share = $this->createShare($data); + try { + $share = $this->createShare($data); + } catch (InvalidShare $e) { + throw new ShareNotFound(); + } return $share; } @@ -313,21 +378,125 @@ class DefaultShareProvider implements IShareProvider { /** * Get shared with the given user * - * @param IUser $user - * @param int $shareType - * @param Share + * @param IUser $user get shares where this user is the recipient + * @param int $shareType \OCP\Share::SHARE_TYPE_USER or \OCP\Share::SHARE_TYPE_GROUP are supported + * @param int $limit The maximum number of shares, -1 for all + * @param int $offset + * @return IShare[] + * @throws BackendError */ - public function getSharedWithMe(IUser $user, $shareType = null) { + public function getSharedWith(IUser $user, $shareType, $limit, $offset) { + /** @var Share[] $shares */ + $shares = []; + + if ($shareType === \OCP\Share::SHARE_TYPE_USER) { + //Get shares directly with this user + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share'); + + // Order by id + $qb->orderBy('id'); + + // Set limit and offset + if ($limit !== -1) { + $qb->setMaxResults($limit); + } + $qb->setFirstResult($offset); + + $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER))); + $qb->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($user->getUID()))); + + $cursor = $qb->execute(); + + while($data = $cursor->fetch()) { + $shares[] = $this->createShare($data); + } + $cursor->closeCursor(); + + } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) { + $allGroups = $this->groupManager->getUserGroups($user); + + $start = 0; + while(true) { + $groups = array_slice($allGroups, $start, 100); + $start += 100; + + if ($groups === []) { + break; + } + + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share') + ->orderBy('id') + ->setFirstResult(0); + + if ($limit !== -1) { + $qb->setMaxResults($limit - count($shares)); + } + + $groups = array_map(function(IGroup $group) { return $group->getGID(); }, $groups); + + $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))); + $qb->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter( + $groups, + Connection::PARAM_STR_ARRAY + ))); + + $cursor = $qb->execute(); + while($data = $cursor->fetch()) { + if ($offset > 0) { + $offset--; + continue; + } + $shares[] = $this->createShare($data); + } + $cursor->closeCursor(); + } + + /* + * Resolve all group shares to user specific shares + * TODO: Optmize this! + */ + $shares = array_map([$this, 'resolveGroupShare'], $shares); + } else { + throw new BackendError('Invalid backend'); + } + + + return $shares; } /** - * Get a share by token and if present verify the password + * Get a share by token * * @param string $token - * @param string $password - * @param Share + * @return IShare + * @throws ShareNotFound */ - public function getShareByToken($token, $password = null) { + public function getShareByToken($token) { + $qb = $this->dbConn->getQueryBuilder(); + + $cursor = $qb->select('*') + ->from('share') + ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))) + ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token))) + ->execute(); + + $data = $cursor->fetch(); + + if ($data === false) { + throw new ShareNotFound(); + } + + try { + $share = $this->createShare($data); + } catch (InvalidShare $e) { + throw new ShareNotFound(); + } + + return $share; } /** @@ -335,6 +504,7 @@ class DefaultShareProvider implements IShareProvider { * * @param mixed[] $data * @return Share + * @throws InvalidShare */ private function createShare($data) { $share = new Share(); @@ -346,31 +516,45 @@ class DefaultShareProvider implements IShareProvider { ->setMailSend((bool)$data['mail_send']); if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { - $share->setSharedWith($this->userManager->get($data['share_with'])); + $sharedWith = $this->userManager->get($data['share_with']); + if ($sharedWith === null) { + throw new InvalidShare(); + } + $share->setSharedWith($sharedWith); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { - $share->setSharedWith($this->groupManager->get($data['share_with'])); + $sharedWith = $this->groupManager->get($data['share_with']); + if ($sharedWith === null) { + throw new InvalidShare(); + } + $share->setSharedWith($sharedWith); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { $share->setPassword($data['share_with']); $share->setToken($data['token']); - } else { - $share->setSharedWith($data['share_with']); } if ($data['uid_initiator'] === null) { //OLD SHARE - $share->setSharedBy($this->userManager->get($data['uid_owner'])); - $folder = $this->rootFolder->getUserFolder($share->getSharedBy()->getUID()); - $path = $folder->getById((int)$data['file_source'])[0]; + $sharedBy = $this->userManager->get($data['uid_owner']); + if ($sharedBy === null) { + throw new InvalidShare(); + } + $share->setSharedBy($sharedBy); + $path = $this->getNode($share->getSharedBy(), (int)$data['file_source']); $owner = $path->getOwner(); $share->setShareOwner($owner); } else { //New share! - $share->setSharedBy($this->userManager->get($data['uid_initiator'])); - $share->setShareOwner($this->userManager->get($data['uid_owner'])); + $sharedBy = $this->userManager->get($data['uid_initiator']); + $shareOwner = $this->userManager->get($data['uid_owner']); + if ($sharedBy === null || $shareOwner === null) { + throw new InvalidShare(); + } + $share->setSharedBy($sharedBy); + $share->setShareOwner($shareOwner); } - $path = $this->rootFolder->getUserFolder($share->getShareOwner()->getUID())->getById((int)$data['file_source'])[0]; + $path = $this->getNode($share->getShareOwner(), (int)$data['file_source']); $share->setPath($path); if ($data['expiration'] !== null) { @@ -383,4 +567,55 @@ class DefaultShareProvider implements IShareProvider { return $share; } + /** + * Get the node with file $id for $user + * + * @param IUser $user + * @param int $id + * @return \OCP\Files\File|\OCP\Files\Folder + * @throws InvalidShare + */ + private function getNode(IUser $user, $id) { + try { + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + } catch (NotFoundException $e) { + throw new InvalidShare(); + } + + $nodes = $userFolder->getById($id); + + if (empty($nodes)) { + throw new InvalidShare(); + } + + return $nodes[0]; + } + + /** + * Resolve a group share to a user specific share + * Thus if the user moved their group share make sure this is properly reflected here. + * + * @param Share $share + * @return Share Returns the updated share if one was found else return the original share. + */ + private function resolveGroupShare(Share $share) { + $qb = $this->dbConn->getQueryBuilder(); + + $stmt = $qb->select('*') + ->from('share') + ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId()))) + ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))) + ->execute(); + + $data = $stmt->fetch(); + $stmt->closeCursor(); + + if ($data !== false) { + $share->setPermissions($data['permissions']); + $share->setTarget($data['file_target']); + } + + return $share; + } + }
\ No newline at end of file diff --git a/lib/private/share20/exception/invalidshare.php b/lib/private/share20/exception/invalidshare.php new file mode 100644 index 00000000000..c176e4424ba --- /dev/null +++ b/lib/private/share20/exception/invalidshare.php @@ -0,0 +1,25 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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 OC\Share20\Exception; + +class InvalidShare extends \Exception { + +} diff --git a/lib/private/share20/iproviderfactory.php b/lib/private/share20/iproviderfactory.php index 9dabe2f6134..b38666978db 100644 --- a/lib/private/share20/iproviderfactory.php +++ b/lib/private/share20/iproviderfactory.php @@ -21,6 +21,7 @@ namespace OC\Share20; use OC\Share20\Exception\ProviderException; +use OCP\IServerContainer; /** * Interface IProviderFactory @@ -31,6 +32,12 @@ use OC\Share20\Exception\ProviderException; interface IProviderFactory { /** + * IProviderFactory constructor. + * @param IServerContainer $serverContainer + */ + public function __construct(IServerContainer $serverContainer); + + /** * @param string $id * @return IShareProvider * @throws ProviderException diff --git a/lib/private/share20/ishareprovider.php b/lib/private/share20/ishareprovider.php index d1f82557a5f..36d0f10c7f1 100644 --- a/lib/private/share20/ishareprovider.php +++ b/lib/private/share20/ishareprovider.php @@ -62,11 +62,13 @@ interface IShareProvider { * * @param IUser $user * @param int $shareType + * @param \OCP\Files\File|\OCP\Files\Folder $node + * @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator + * @param int $limit The maximum number of shares to be returned, -1 for all shares * @param int $offset - * @param int $limit * @return Share[] */ - public function getShares(IUser $user, $shareType, $offset, $limit); + public function getSharesBy(IUser $user, $shareType, $node, $reshares, $limit, $offset); /** * Get share by id @@ -96,18 +98,20 @@ interface IShareProvider { /** * Get shared with the given user * - * @param IUser $user + * @param IUser $user get shares where this user is the recipient * @param int $shareType + * @param int $limit The max number of entries returned, -1 for all + * @param int $offset * @param Share */ - public function getSharedWithMe(IUser $user, $shareType = null); + public function getSharedWith(IUser $user, $shareType, $limit, $offset); /** - * Get a share by token and if present verify the password + * Get a share by token * * @param string $token - * @param string $password - * @param Share + * @return IShare + * @throws ShareNotFound */ - public function getShareByToken($token, $password = null); + public function getShareByToken($token); } diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php index 035026b47ea..3935307b977 100644 --- a/lib/private/share20/manager.php +++ b/lib/private/share20/manager.php @@ -605,14 +605,43 @@ class Manager { \OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams); } + /** - * Retrieve all shares by the current user + * Get shares shared by (initiated) by the provided user. * - * @param int $page - * @param int $perPage - * @return Share[] + * @param IUser $user + * @param int $shareType + * @param \OCP\Files\File|\OCP\Files\Folder $path + * @param bool $reshares + * @param int $limit The maximum number of returned results, -1 for all results + * @param int $offset + * @return IShare[] */ - public function getShares($page=0, $perPage=50) { + public function getSharesBy(IUser $user, $shareType, $path = null, $reshares = false, $limit = 50, $offset = 0) { + if ($path !== null && + !($path instanceof \OCP\Files\File) && + !($path instanceof \OCP\Files\Folder)) { + throw new \InvalidArgumentException('invalid path'); + } + + $provider = $this->factory->getProviderForType($shareType); + + return $provider->getSharesBy($user, $shareType, $path, $reshares, $limit, $offset); + } + + /** + * Get shares shared with $user. + * + * @param IUser $user + * @param int $shareType + * @param int $limit The maximum number of shares returned, -1 for all + * @param int $offset + * @return IShare[] + */ + public function getSharedWith(IUser $user, $shareType, $limit = 50, $offset = 0) { + $provider = $this->factory->getProviderForType($shareType); + + return $provider->getSharedWith($user, $shareType, $limit, $offset); } /** @@ -650,28 +679,50 @@ class Manager { } /** - * Get all shares that are shared with the current user + * Get the share by token possible with password * - * @param int $shareType - * @param int $page - * @param int $perPage + * @param string $token + * @return Share * - * @return Share[] + * @throws ShareNotFound */ - public function getSharedWithMe($shareType = null, $page=0, $perPage=50) { + public function getShareByToken($token) { + $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_LINK); + + $share = $provider->getShareByToken($token); + + //TODO check if share expired + + return $share; } /** - * Get the share by token possible with password + * Verify the password of a public share * - * @param string $token + * @param IShare $share * @param string $password - * - * @return Share - * - * @throws ShareNotFound + * @return bool */ - public function getShareByToken($token, $password=null) { + public function checkPassword(IShare $share, $password) { + if ($share->getShareType() !== \OCP\Share::SHARE_TYPE_LINK) { + //TODO maybe exception? + return false; + } + + if ($password === null || $share->getPassword() === null) { + return false; + } + + $newHash = ''; + if (!$this->hasher->verify($password, $share->getPassword(), $newHash)) { + return false; + } + + if (!empty($newHash)) { + //TODO update hash! + } + + return true; } /** diff --git a/lib/private/share20/providerfactory.php b/lib/private/share20/providerfactory.php index 178db262d10..2e5282c1eb4 100644 --- a/lib/private/share20/providerfactory.php +++ b/lib/private/share20/providerfactory.php @@ -21,6 +21,7 @@ namespace OC\Share20; use OC\Share20\Exception\ProviderException; +use OCP\IServerContainer; /** * Class ProviderFactory @@ -29,10 +30,20 @@ use OC\Share20\Exception\ProviderException; */ class ProviderFactory implements IProviderFactory { + /** @var IServerContainer */ + private $serverContainer; /** @var DefaultShareProvider */ private $defaultProvider = null; /** + * IProviderFactory constructor. + * @param IServerContainer $serverContainer + */ + public function __construct(IServerContainer $serverContainer) { + $this->serverContainer = $serverContainer; + } + + /** * Create the default share provider. * * @return DefaultShareProvider @@ -40,10 +51,10 @@ class ProviderFactory implements IProviderFactory { protected function defaultShareProvider() { if ($this->defaultProvider === null) { $this->defaultProvider = new DefaultShareProvider( - \OC::$server->getDatabaseConnection(), - \OC::$server->getUserManager(), - \OC::$server->getGroupManager(), - \OC::$server->getRootFolder() + $this->serverContainer->getDatabaseConnection(), + $this->serverContainer->getUserManager(), + $this->serverContainer->getGroupManager(), + $this->serverContainer->getRootFolder() ); } diff --git a/lib/private/systemtag/managerfactory.php b/lib/private/systemtag/managerfactory.php new file mode 100644 index 00000000000..7b7b9558b04 --- /dev/null +++ b/lib/private/systemtag/managerfactory.php @@ -0,0 +1,78 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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 OC\SystemTag; + +use OCP\SystemTag\ISystemTagManagerFactory; +use OCP\SystemTag\ISystemTagManager; +use OC\SystemTag\SystemTagManager; +use OC\SystemTag\SystemTagObjectMapper; +use OCP\IServerContainer; + +/** + * Default factory class for system tag managers + * + * @package OCP\SystemTag + * @since 9.0.0 + */ +class ManagerFactory implements ISystemTagManagerFactory { + + /** + * Server container + * + * @var IServerContainer + */ + private $serverContainer; + + /** + * Constructor for the system tag manager factory + * + * @param IServerContainer $serverContainer server container + */ + public function __construct(IServerContainer $serverContainer) { + $this->serverContainer = $serverContainer; + } + + /** + * Creates and returns an instance of the system tag manager + * + * @return ISystemTagManager + * @since 9.0.0 + */ + public function getManager() { + return new SystemTagManager( + $this->serverContainer->getDatabaseConnection() + ); + } + + /** + * Creates and returns an instance of the system tag object + * mapper + * + * @return ISystemTagObjectMapper + * @since 9.0.0 + */ + public function getObjectMapper() { + return new SystemTagObjectMapper( + $this->serverContainer->getDatabaseConnection(), + $this->getManager() + ); + } +} diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 2aafe98cef2..b547f981616 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -44,6 +44,7 @@ use OCP\IConfig; * - postDelete(\OC\User\User $user) * - preCreateUser(string $uid, string $password) * - postCreateUser(\OC\User\User $user, string $password) + * - change(\OC\User\User $user) * * @package OC\User */ diff --git a/lib/private/user/user.php b/lib/private/user/user.php index c2a6acc7664..5b8bb6947a5 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -137,8 +137,13 @@ class User implements IUser { public function setDisplayName($displayName) { $displayName = trim($displayName); if ($this->backend->implementsActions(\OC_User_Backend::SET_DISPLAYNAME) && !empty($displayName)) { - $this->displayName = $displayName; $result = $this->backend->setDisplayName($this->uid, $displayName); + if ($result) { + $this->displayName = $displayName; + if ($this->emitter) { + $this->emitter->emit('\OC\User', 'changeUser', array($this)); + } + } return $result !== false; } else { return false; @@ -146,6 +151,24 @@ class User implements IUser { } /** + * set the email address of the user + * + * @param string|null $mailAddress + * @return void + * @since 9.0.0 + */ + public function setEMailAddress($mailAddress) { + if($mailAddress === '') { + $this->config->deleteUserValue($this->uid, 'settings', 'email'); + } else { + $this->config->setUserValue($this->uid, 'settings', 'email', $mailAddress); + } + if ($this->emitter) { + $this->emitter->emit('\OC\User', 'changeUser', array($this)); + } + } + + /** * returns the timestamp of the user's last login or 0 if the user did never * login * @@ -365,4 +388,5 @@ class User implements IUser { return $url; } + } diff --git a/lib/public/activity/iextension.php b/lib/public/activity/iextension.php index b76cdc7af29..b00dbdda20a 100644 --- a/lib/public/activity/iextension.php +++ b/lib/public/activity/iextension.php @@ -57,8 +57,7 @@ interface IExtension { * 'desc' => "translated string description for the setting" * 'methods' => [self::METHOD_*], * ] - * @since 8.0.0 - * @changed 8.2.0 - Added support to allow limiting notifications to certain methods + * @since 8.0.0 - 8.2.0: Added support to allow limiting notifications to certain methods */ public function getNotificationTypes($languageCode); diff --git a/lib/public/activity/imanager.php b/lib/public/activity/imanager.php index b79ec115450..0b97f8a07ed 100644 --- a/lib/public/activity/imanager.php +++ b/lib/public/activity/imanager.php @@ -118,8 +118,7 @@ interface IManager { * 'desc' => "translated string description for the setting" * 'methods' => [\OCP\Activity\IExtension::METHOD_*], * ] - * @since 8.0.0 - * @changed 8.2.0 - Added support to allow limiting notifications to certain methods + * @since 8.0.0 - 8.2.0: Added support to allow limiting notifications to certain methods */ public function getNotificationTypes($languageCode); diff --git a/lib/public/comments/icommentsmanagerfactory.php b/lib/public/comments/icommentsmanagerfactory.php index 03a2b16b310..2e71719019c 100644 --- a/lib/public/comments/icommentsmanagerfactory.php +++ b/lib/public/comments/icommentsmanagerfactory.php @@ -20,6 +20,8 @@ */ namespace OCP\Comments; +use OCP\IServerContainer; + /** * Interface ICommentsManagerFactory * @@ -32,6 +34,14 @@ namespace OCP\Comments; interface ICommentsManagerFactory { /** + * Constructor for the comments manager factory + * + * @param IServerContainer $serverContainer server container + * @since 9.0.0 + */ + public function __construct(IServerContainer $serverContainer); + + /** * creates and returns an instance of the ICommentsManager * * @return ICommentsManager diff --git a/lib/public/files/config/icachedmountinfo.php b/lib/public/files/config/icachedmountinfo.php new file mode 100644 index 00000000000..a587427f1f2 --- /dev/null +++ b/lib/public/files/config/icachedmountinfo.php @@ -0,0 +1,62 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 OCP\Files\Config; + +use OCP\Files\Node; +use OCP\IUser; + +/** + * Holds information about a mount for a user + * + * @since 9.0.0 + */ +interface ICachedMountInfo { + /** + * @return IUser + * @since 9.0.0 + */ + public function getUser(); + + /** + * @return int the numeric storage id of the mount + * @since 9.0.0 + */ + public function getStorageId(); + + /** + * @return int the fileid of the root of the mount + * @since 9.0.0 + */ + public function getRootId(); + + /** + * @return Node the root node of the mount + * @since 9.0.0 + */ + public function getMountPointNode(); + + /** + * @return string the mount point of the mount for the user + * @since 9.0.0 + */ + public function getMountPoint(); +} diff --git a/lib/public/files/config/imountprovidercollection.php b/lib/public/files/config/imountprovidercollection.php index 43b4bd0ce00..39da61812a9 100644 --- a/lib/public/files/config/imountprovidercollection.php +++ b/lib/public/files/config/imountprovidercollection.php @@ -22,6 +22,7 @@ namespace OCP\Files\Config; +use OCP\Files\Mount\IMountPoint; use OCP\IUser; /** @@ -45,4 +46,12 @@ interface IMountProviderCollection { * @since 8.0.0 */ public function registerProvider(IMountProvider $provider); + + /** + * Get the mount cache which can be used to search for mounts without setting up the filesystem + * + * @return IUserMountCache + * @since 9.0.0 + */ + public function getMountCache(); } diff --git a/lib/public/files/config/iusermountcache.php b/lib/public/files/config/iusermountcache.php new file mode 100644 index 00000000000..f722ad16310 --- /dev/null +++ b/lib/public/files/config/iusermountcache.php @@ -0,0 +1,89 @@ +<?php +/** + * @author Robin Appelman <icewind@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 OCP\Files\Config; + +use OCP\Files\Mount\IMountPoint; +use OCP\IUser; + +/** + * Cache mounts points per user in the cache so we can easily look them up + * + * @since 9.0.0 + */ +interface IUserMountCache { + /** + * Register mounts for a user to the cache + * + * @param IUser $user + * @param IMountPoint[] $mounts + * @since 9.0.0 + */ + public function registerMounts(IUser $user, array $mounts); + + /** + * @param IUser $user + * @return ICachedMountInfo[] + * @since 9.0.0 + */ + public function getMountsForUser(IUser $user); + + /** + * @param int $numericStorageId + * @return ICachedMountInfo[] + * @since 9.0.0 + */ + public function getMountsForStorageId($numericStorageId); + + /** + * @param int $rootFileId + * @return ICachedMountInfo[] + * @since 9.0.0 + */ + public function getMountsForRootId($rootFileId); + + /** + * Remove all cached mounts for a user + * + * @param IUser $user + * @since 9.0.0 + */ + public function removeUserMounts(IUser $user); + + /** + * Remove all mounts for a user and storage + * + * @param $storageId + * @param string $userId + * @return mixed + * @since 9.0.0 + */ + public function removeUserStorageMount($storageId, $userId); + + /** + * Remove all cached mounts for a storage + * + * @param $storageId + * @return mixed + * @since 9.0.0 + */ + public function remoteStorageMounts($storageId); +} diff --git a/lib/public/files/storagenotavailableexception.php b/lib/public/files/storagenotavailableexception.php index cb674cd663a..4572a69f047 100644 --- a/lib/public/files/storagenotavailableexception.php +++ b/lib/public/files/storagenotavailableexception.php @@ -34,8 +34,7 @@ use OC\HintException; /** * Storage is temporarily not available - * @since 6.0.0 - * @changed 8.2.1 based on HintException + * @since 6.0.0 - since 8.2.1 based on HintException */ class StorageNotAvailableException extends HintException { diff --git a/lib/public/iuser.php b/lib/public/iuser.php index 06921a1ee23..454d45eae76 100644 --- a/lib/public/iuser.php +++ b/lib/public/iuser.php @@ -169,4 +169,13 @@ interface IUser { * @since 9.0.0 */ public function getCloudId(); + + /** + * set the email address of the user + * + * @param string|null $mailAddress + * @return void + * @since 9.0.0 + */ + public function setEMailAddress($mailAddress); } diff --git a/lib/public/systemtag/isystemtagmanagerfactory.php b/lib/public/systemtag/isystemtagmanagerfactory.php new file mode 100644 index 00000000000..ad7467633b1 --- /dev/null +++ b/lib/public/systemtag/isystemtagmanagerfactory.php @@ -0,0 +1,59 @@ +<?php +/** + * @author Vincent Petry <pvince81@owncloud.com> + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @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 OCP\SystemTag; + +use OCP\IServerContainer; + +/** + * Interface ISystemTagManagerFactory + * + * Factory interface for system tag managers + * + * @package OCP\SystemTag + * @since 9.0.0 + */ +interface ISystemTagManagerFactory { + + /** + * Constructor for the system tag manager factory + * + * @param IServerContainer $serverContainer server container + * @since 9.0.0 + */ + public function __construct(IServerContainer $serverContainer); + + /** + * creates and returns an instance of the system tag manager + * + * @return ISystemTagManager + * @since 9.0.0 + */ + public function getManager(); + + /** + * creates and returns an instance of the system tag object + * mapper + * + * @return ISystemTagObjectMapper + * @since 9.0.0 + */ + public function getObjectMapper(); +} diff --git a/settings/controller/userscontroller.php b/settings/controller/userscontroller.php index 695d72cfb5a..17629fe924f 100644 --- a/settings/controller/userscontroller.php +++ b/settings/controller/userscontroller.php @@ -373,7 +373,7 @@ class UsersController extends Controller { * Send new user mail only if a mail is set */ if($email !== '') { - $this->config->setUserValue($username, 'settings', 'email', $email); + $user->setEMailAddress($email); // data for the mail template $mailData = array( @@ -545,11 +545,7 @@ class UsersController extends Controller { } // delete user value if email address is empty - if($mailAddress === '') { - $this->config->deleteUserValue($id, 'settings', 'email'); - } else { - $this->config->setUserValue($id, 'settings', 'email', $mailAddress); - } + $user->setEMailAddress($mailAddress); return new DataResponse( array( diff --git a/settings/css/settings.css b/settings/css/settings.css index 0c6c9820ea9..9e98960a715 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -362,7 +362,6 @@ span.version { } .app-dependencies { - margin-top: 10px; color: #ce3702; } diff --git a/settings/js/apps.js b/settings/js/apps.js index 3078e4fda33..b6f6363a992 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -153,6 +153,11 @@ OC.Settings.Apps = OC.Settings.Apps || { } app.firstExperimental = firstExperimental; + if (!app.preview) { + app.preview = OC.imagePath('core', 'default-app-icon'); + app.previewAsIcon = true; + } + var html = template(app); if (selector) { selector.html(html); diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index 353bba43c10..bfde736e027 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -28,7 +28,9 @@ OC.L10N.register( "Unable to change password" : "Não foi possível alterar a sua palavra-passe ", "Enabled" : "Ativada", "Not enabled" : "Desativada", + "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicações via loja de aplicações ou Partilha de Nuvem Federada", "Federated Cloud Sharing" : "Partilha de Cloud Federada", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está a usar uma versão %s desatualizada (%s). Por favor, atualize o seu sistema operativo ou algumas funcionalidades como %s não funcionarão corretamente.", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)", "Migration Completed" : "Migração Concluída", "Group already exists." : "O grupo já existe.", @@ -62,6 +64,8 @@ OC.L10N.register( "All" : "Todos", "No apps found for your version" : "Nenhuma aplicação encontrada para a sua versão", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "As apps oficiais são desenvolvidas por e na comunidade da ownCloud. Elas oferecem funcionalidade central para a ownCloud e está pronta para uma utilização na produção.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.", "Update to %s" : "Actualizar para %s", "Please wait...." : "Por favor, aguarde...", "Error while disabling app" : "Ocorreu um erro enquanto desativava a app", @@ -74,7 +78,9 @@ OC.L10N.register( "Uninstalling ...." : "A desinstalar....", "Error while uninstalling app" : "Ocorreu um erro durante a desinstalação da app", "Uninstall" : "Desinstalar", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "A aplicação foi ativada, mas precisa de ser atualizada. Você será redirecionado para a página de atualização em 5 segundos.", "App update" : "Atualizar App", + "No apps found for \"{query}\"" : "Não foram encontradas aplicações para \"{query}\"", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor, envie um certificado PEM codificado em ASCII.", "Valid until {date}" : "Válida até {date}", "Delete" : "Apagar", @@ -114,17 +120,22 @@ OC.L10N.register( "NT LAN Manager" : "Gestor de REDE NT", "SSL" : "SSL", "TLS" : "TLS", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php não parece estar bem instalado para consultar variáveis de ambiente do sistema. O teste com getenv(\"PATH\") apenas devolveu uma resposta em branco.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor, verifique a <a target=\"_blank\" href=\"%s\">documentação de instalação ↗</a> para notas de configuração do php e configuração php do seu servidor, especialmente quando utiliza php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "A configuração Só-de-Leitura foi ativada. Isto evita definir algumas configurações através da interface da Web. Além disso, o ficheiro precisa de ser definido gravável manualmente para cada atualização.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado a remover blocos doc em linha. Isto vai fazer algumas aplicações basicas inacessíveis.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "O seu servidor está a correr Microsoft Windows. Nós recomendamos Linux para uma experiência de utilizador optimizada.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s abaixo da versão %2$s está instalado. Por motivos de estabilidade e desempenho, recomendamos que atualize para a nova versão %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "O Módulo PHP 'fileinfo' não se encontra instalado/activado. É fortemente recomendado que active este módulo para obter os melhores resultado com a detecção dos tipos de mime.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Bloqueio de arquivos transacionais está desativado, isto poderá levar a problemas com condições de corrida. Ative 'filelocking.enabled' no config.php para evitar estes problemas. Consulte a <a target=\"_blank\" href=\"%s\">documentação ↗</a> para mais informação.", "System locale can not be set to a one which supports UTF-8." : "Não é possível definir a internacionalização do sistema para um que suporte o UTF-8.", "This means that there might be problems with certain characters in file names." : "Isto significa que podem haver problemas com alguns caracteres nos nomes dos ficheiros.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós recomendamos fortemente que instale no seu sistema os pacotes necessários para suportar uma das seguintes locallidades: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não está instalada na raiz do domínio e usa o sistema cron, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" no ficheiro config.php para o caminho webroot da sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cronjob via CLI. Os seguintes erros técnicos apareceram:", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verifique se existe algum erro ou aviso no <a href=\"#log-section\">log</a>.", + "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", "Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha", "Allow users to share via link" : "Permitir que os utilizadores partilhem através do link", @@ -140,14 +151,25 @@ OC.L10N.register( "Allow users to send mail notification for shared files to other users" : "Autorizar utilizadores a enviarem notificações de email acerca de ficheiros partilhados a outros utilizadores", "Exclude groups from sharing" : "Excluir grupos das partilhas", "These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir o auto-completar de nome de utilizador no diálogo da partilha. Se isto for desativado, será necessário preencher o nome de utilizador completo.", "Last cron job execution: %s." : "Última execução de cron job: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.", "Cron was not executed yet!" : "Cron ainda não foi executado!", "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.", + "Enable server-side encryption" : "Ativar encriptação do lado do servidor", + "Please read carefully before activating server-side encryption: " : "Por favor, leia cuidadosamente antes de ativar a encriptação do lado do servidor:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez ativada a encriptação, todos os ficheiros carregados para o servidor a partir deste ponto serão encriptados pelo servidor. Só será possível desativar a encriptação numa data mais tarde se o módulo de encriptação ativo suportar essa função, assim como todas as pré-condições (e.g. definir chave de recuperação) sejam cumpridas.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "A encriptação por si só não garante a segurança do sistema. Por favor, consulte a documentação ownCloud para mais informação acerca de como funciona a aplicação de encriptação, assim como os casos de uso suportados.", + "Be aware that encryption always increases the file size." : "Tenha em conta que a encriptação aumenta sempre o tamanho do ficheiro.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "É sempre bom criar cópias de segurança regulares dos seus dados, em caso de encriptação tenha a certeza de que faz cópia das chaves de encriptação em conjunto com os seus dados.", + "This is the final warning: Do you really want to enable encryption?" : "Este é o aviso final: quer mesmo ativar a encriptação?", "Enable encryption" : "Ative a encriptação", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nenhum módulo de encriptação carregador, por favor ative um módulo de encriptação no menu das aplicações.", "Select default encryption module:" : "Selecionar o módulo de encriptação predefinido:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, ative o \"Módulo de encriptação padrão\" e execute 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova.", "Start migration" : "Iniciar migração", "This is used for sending out notifications." : "Isto é utilizado para enviar notificações", "Send mode" : "Modo de Envio", @@ -168,6 +190,7 @@ OC.L10N.register( "More" : "Mais", "Less" : "Menos", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "O logfile é maior que 100MB. O download do mesmo poderá demorar algum tempo!", + "What to log" : "Fazer log do quê?", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é utilizado como uma base de dados. Para instalações maiores nós recomendamos que mude para uma interface de base de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente se estiver a pensar em dar uso ao cliente desktop para sincronizar os seus ficheiros no seu computador.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro tipo de base de dados, use a ferramenta de comando de linha: 'occ db:convert-type', ou seja a <a target=\"_blank\" href=\"%s\">documentação↗</a>.", @@ -188,10 +211,13 @@ OC.L10N.register( "Admin documentation" : "Documentação do Administrador", "Show description …" : "Mostrar descrição ...", "Hide description …" : "Esconder descrição ...", + "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Esta aplicação não tem uma versão mínima de ownCloud atribuída. Isto será um erro no ownCloud 11 e seguintes.", + "This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Esta aplicação não tem uma versão máxima de ownCloud atribuída. Isto será um erro no ownCloud 11 e seguintes.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:", "Enable only for specific groups" : "Activar só para grupos específicos", "Uninstall App" : "Desinstalar aplicação", "Enable experimental apps" : "Ativar apps experimentais", + "SSL Root Certificates" : "Certificados SSL Root", "Common Name" : "Nome Comum", "Valid until" : "Válido até", "Issued By" : "Emitido Por", @@ -205,14 +231,20 @@ OC.L10N.register( "Forum" : "Fórum", "Issue tracker" : "Pesquisador de problemad", "Commercial support" : "Suporte Comercial", + "You are using <strong>%s</strong> of <strong>%s</strong>" : "Está a usar <strong>%s</strong> de <strong>%s</strong>", "Profile picture" : "Foto do perfil", "Upload new" : "Carregar novo", + "Select from Files" : "Seleccione dos Ficheiros", "Remove image" : "Remover imagem", + "png or jpg, max. 20 MB" : "png ou jpg, máx. 20 MB", + "Picture provided by original account" : "Imagem fornecida pela conta original", "Cancel" : "Cancelar", + "Choose as profile picture" : "Escolher como fotografia de perfil", "Full name" : "Nome completo", "No display name set" : "Nenhum nome display estabelecido", "Email" : "Email", "Your email address" : "O seu endereço de email", + "For password recovery and notifications" : "Para recuperação da palavra-passe e notificações", "No email address set" : "Nenhum endereço de email estabelecido", "You are member of the following groups:" : "Você é membro dos seguintes grupos:", "Password" : "Palavra-passe", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 6fee277cf55..62cf7aeab25 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -26,7 +26,9 @@ "Unable to change password" : "Não foi possível alterar a sua palavra-passe ", "Enabled" : "Ativada", "Not enabled" : "Desativada", + "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicações via loja de aplicações ou Partilha de Nuvem Federada", "Federated Cloud Sharing" : "Partilha de Cloud Federada", + "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL está a usar uma versão %s desatualizada (%s). Por favor, atualize o seu sistema operativo ou algumas funcionalidades como %s não funcionarão corretamente.", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)", "Migration Completed" : "Migração Concluída", "Group already exists." : "O grupo já existe.", @@ -60,6 +62,8 @@ "All" : "Todos", "No apps found for your version" : "Nenhuma aplicação encontrada para a sua versão", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "As apps oficiais são desenvolvidas por e na comunidade da ownCloud. Elas oferecem funcionalidade central para a ownCloud e está pronta para uma utilização na produção.", + "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.", "Update to %s" : "Actualizar para %s", "Please wait...." : "Por favor, aguarde...", "Error while disabling app" : "Ocorreu um erro enquanto desativava a app", @@ -72,7 +76,9 @@ "Uninstalling ...." : "A desinstalar....", "Error while uninstalling app" : "Ocorreu um erro durante a desinstalação da app", "Uninstall" : "Desinstalar", + "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "A aplicação foi ativada, mas precisa de ser atualizada. Você será redirecionado para a página de atualização em 5 segundos.", "App update" : "Atualizar App", + "No apps found for \"{query}\"" : "Não foram encontradas aplicações para \"{query}\"", "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ocorreu um erro. Por favor, envie um certificado PEM codificado em ASCII.", "Valid until {date}" : "Válida até {date}", "Delete" : "Apagar", @@ -112,17 +118,22 @@ "NT LAN Manager" : "Gestor de REDE NT", "SSL" : "SSL", "TLS" : "TLS", + "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php não parece estar bem instalado para consultar variáveis de ambiente do sistema. O teste com getenv(\"PATH\") apenas devolveu uma resposta em branco.", + "Please check the <a target=\"_blank\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor, verifique a <a target=\"_blank\" href=\"%s\">documentação de instalação ↗</a> para notas de configuração do php e configuração php do seu servidor, especialmente quando utiliza php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "A configuração Só-de-Leitura foi ativada. Isto evita definir algumas configurações através da interface da Web. Além disso, o ficheiro precisa de ser definido gravável manualmente para cada atualização.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado a remover blocos doc em linha. Isto vai fazer algumas aplicações basicas inacessíveis.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto é provavelmente causado por uma cache/acelerador como o Zend OPcache or eAcelerador.", "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "O seu servidor está a correr Microsoft Windows. Nós recomendamos Linux para uma experiência de utilizador optimizada.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "%1$s abaixo da versão %2$s está instalado. Por motivos de estabilidade e desempenho, recomendamos que atualize para a nova versão %1$s.", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "O Módulo PHP 'fileinfo' não se encontra instalado/activado. É fortemente recomendado que active este módulo para obter os melhores resultado com a detecção dos tipos de mime.", + "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Bloqueio de arquivos transacionais está desativado, isto poderá levar a problemas com condições de corrida. Ative 'filelocking.enabled' no config.php para evitar estes problemas. Consulte a <a target=\"_blank\" href=\"%s\">documentação ↗</a> para mais informação.", "System locale can not be set to a one which supports UTF-8." : "Não é possível definir a internacionalização do sistema para um que suporte o UTF-8.", "This means that there might be problems with certain characters in file names." : "Isto significa que podem haver problemas com alguns caracteres nos nomes dos ficheiros.", "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós recomendamos fortemente que instale no seu sistema os pacotes necessários para suportar uma das seguintes locallidades: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não está instalada na raiz do domínio e usa o sistema cron, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" no ficheiro config.php para o caminho webroot da sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cronjob via CLI. Os seguintes erros técnicos apareceram:", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verifique se existe algum erro ou aviso no <a href=\"#log-section\">log</a>.", + "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", "Allow apps to use the Share API" : "Permitir que os utilizadores usem a API de partilha", "Allow users to share via link" : "Permitir que os utilizadores partilhem através do link", @@ -138,14 +149,25 @@ "Allow users to send mail notification for shared files to other users" : "Autorizar utilizadores a enviarem notificações de email acerca de ficheiros partilhados a outros utilizadores", "Exclude groups from sharing" : "Excluir grupos das partilhas", "These groups will still be able to receive shares, but not to initiate them." : "Estes grupos poderão receber partilhas, mas não poderão iniciá-las.", + "Allow username autocompletion in share dialog. If this is disabled the full username needs to be entered." : "Permitir o auto-completar de nome de utilizador no diálogo da partilha. Se isto for desativado, será necessário preencher o nome de utilizador completo.", "Last cron job execution: %s." : "Última execução de cron job: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução de cron job: %s. Algo está errado.", "Cron was not executed yet!" : "Cron ainda não foi executado!", "Execute one task with each page loaded" : "Executar uma tarefa com cada página carregada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registado num serviço webcron para chamar a página cron.php por http a cada 15 minutos.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço sistema cron para ligar o ficheiro cron.php a cada 15 minutos.", + "Enable server-side encryption" : "Ativar encriptação do lado do servidor", + "Please read carefully before activating server-side encryption: " : "Por favor, leia cuidadosamente antes de ativar a encriptação do lado do servidor:", + "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez ativada a encriptação, todos os ficheiros carregados para o servidor a partir deste ponto serão encriptados pelo servidor. Só será possível desativar a encriptação numa data mais tarde se o módulo de encriptação ativo suportar essa função, assim como todas as pré-condições (e.g. definir chave de recuperação) sejam cumpridas.", + "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "A encriptação por si só não garante a segurança do sistema. Por favor, consulte a documentação ownCloud para mais informação acerca de como funciona a aplicação de encriptação, assim como os casos de uso suportados.", + "Be aware that encryption always increases the file size." : "Tenha em conta que a encriptação aumenta sempre o tamanho do ficheiro.", + "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "É sempre bom criar cópias de segurança regulares dos seus dados, em caso de encriptação tenha a certeza de que faz cópia das chaves de encriptação em conjunto com os seus dados.", + "This is the final warning: Do you really want to enable encryption?" : "Este é o aviso final: quer mesmo ativar a encriptação?", "Enable encryption" : "Ative a encriptação", + "No encryption module loaded, please enable an encryption module in the app menu." : "Nenhum módulo de encriptação carregador, por favor ative um módulo de encriptação no menu das aplicações.", "Select default encryption module:" : "Selecionar o módulo de encriptação predefinido:", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, ative o \"Módulo de encriptação padrão\" e execute 'occ encryption:migrate'", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova.", "Start migration" : "Iniciar migração", "This is used for sending out notifications." : "Isto é utilizado para enviar notificações", "Send mode" : "Modo de Envio", @@ -166,6 +188,7 @@ "More" : "Mais", "Less" : "Menos", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "O logfile é maior que 100MB. O download do mesmo poderá demorar algum tempo!", + "What to log" : "Fazer log do quê?", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite é utilizado como uma base de dados. Para instalações maiores nós recomendamos que mude para uma interface de base de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente se estiver a pensar em dar uso ao cliente desktop para sincronizar os seus ficheiros no seu computador.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro tipo de base de dados, use a ferramenta de comando de linha: 'occ db:convert-type', ou seja a <a target=\"_blank\" href=\"%s\">documentação↗</a>.", @@ -186,10 +209,13 @@ "Admin documentation" : "Documentação do Administrador", "Show description …" : "Mostrar descrição ...", "Hide description …" : "Esconder descrição ...", + "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Esta aplicação não tem uma versão mínima de ownCloud atribuída. Isto será um erro no ownCloud 11 e seguintes.", + "This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Esta aplicação não tem uma versão máxima de ownCloud atribuída. Isto será um erro no ownCloud 11 e seguintes.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicação não pode ser instalada porque as seguintes dependências não podem ser realizadas:", "Enable only for specific groups" : "Activar só para grupos específicos", "Uninstall App" : "Desinstalar aplicação", "Enable experimental apps" : "Ativar apps experimentais", + "SSL Root Certificates" : "Certificados SSL Root", "Common Name" : "Nome Comum", "Valid until" : "Válido até", "Issued By" : "Emitido Por", @@ -203,14 +229,20 @@ "Forum" : "Fórum", "Issue tracker" : "Pesquisador de problemad", "Commercial support" : "Suporte Comercial", + "You are using <strong>%s</strong> of <strong>%s</strong>" : "Está a usar <strong>%s</strong> de <strong>%s</strong>", "Profile picture" : "Foto do perfil", "Upload new" : "Carregar novo", + "Select from Files" : "Seleccione dos Ficheiros", "Remove image" : "Remover imagem", + "png or jpg, max. 20 MB" : "png ou jpg, máx. 20 MB", + "Picture provided by original account" : "Imagem fornecida pela conta original", "Cancel" : "Cancelar", + "Choose as profile picture" : "Escolher como fotografia de perfil", "Full name" : "Nome completo", "No display name set" : "Nenhum nome display estabelecido", "Email" : "Email", "Your email address" : "O seu endereço de email", + "For password recovery and notifications" : "Para recuperação da palavra-passe e notificações", "No email address set" : "Nenhum endereço de email estabelecido", "You are member of the following groups:" : "Você é membro dos seguintes grupos:", "Password" : "Palavra-passe", diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js index 27e85252e0e..85dcd38a006 100644 --- a/settings/l10n/sl.js +++ b/settings/l10n/sl.js @@ -160,7 +160,7 @@ OC.L10N.register( "Less" : "Manj", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Datoteeka dnevniškega zapisa je večja od 100MB. Prenos lahko traja dlje!", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena baza je SQLite. Za večje namestitve priporočamo prehod na drugačno bazo.", - "How to do backups" : "Kako napraviti varnostne kopije", + "How to do backups" : "Kako ustvariti varnostne kopije", "Advanced monitoring" : "Napredno sledenje", "Performance tuning" : "Optimizacija izvajanja", "Improving the config.php" : "Izboljšanje config.php", @@ -172,13 +172,15 @@ OC.L10N.register( "by" : "od", "licensed" : "licencirano", "Documentation:" : "Dokumentacija:", - "User documentation" : "Uporabniška navodila", - "Show description …" : "Prikaži opis...", - "Hide description …" : "Skrij opis...", + "User documentation" : "Uporabniška dokumentacija", + "Admin documentation" : "Skrbniška dokumentacija", + "Show description …" : "Pokaži opis ...", + "Hide description …" : "Skrij opis ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Programa ni mogoče namestiti zaradi nerešenih odvisnosti:", "Enable only for specific groups" : "Omogoči le za posamezne skupine", "Uninstall App" : "Odstrani program", "Enable experimental apps" : "Omogoči testne aplikacije", + "SSL Root Certificates" : "Korenska potrdila SSL", "Common Name" : "Splošno ime", "Valid until" : "Veljavno do", "Issued By" : "Izdajatelj", @@ -187,14 +189,17 @@ OC.L10N.register( "Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Pozdravljeni,<br><br>samo sporočamo, da imate %s račun.<br><br>Vaše uporabniško ime: %s<br>Dostop: <a href=\"%s\">%s</a><br><br>", "Cheers!" : "Na zdravje!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Pozdravljeni,\n\nsamo sporočamo, da imate %s račun.\n\nVaše uporabniško ime: %s\nDostop: %s\n", - "Administrator documentation" : "Skrbniška navodila", - "Online documentation" : "Dokumentacija na spletu", + "Administrator documentation" : "Skrbniška dokumentacija", + "Online documentation" : "Spletna dokumentacija", "Forum" : "Forum", "Issue tracker" : "Spremljanje težav", "Commercial support" : "Komercialna podpora", + "You are using <strong>%s</strong> of <strong>%s</strong>" : "Uporabljate <strong>%s</strong> od <strong>%s</strong>", "Profile picture" : "Slika profila", "Upload new" : "Pošlji novo", + "Select from Files" : "Izbor iz datotek", "Remove image" : "Odstrani sliko", + "png or jpg, max. 20 MB" : "png ali jpg, največ. 20 MB", "Cancel" : "Prekliči", "Full name" : "Polno ime", "No display name set" : "Ime za prikaz ni bilo nastavljeno", diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json index b1ca152b15b..ba0af1292f0 100644 --- a/settings/l10n/sl.json +++ b/settings/l10n/sl.json @@ -158,7 +158,7 @@ "Less" : "Manj", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Datoteeka dnevniškega zapisa je večja od 100MB. Prenos lahko traja dlje!", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena baza je SQLite. Za večje namestitve priporočamo prehod na drugačno bazo.", - "How to do backups" : "Kako napraviti varnostne kopije", + "How to do backups" : "Kako ustvariti varnostne kopije", "Advanced monitoring" : "Napredno sledenje", "Performance tuning" : "Optimizacija izvajanja", "Improving the config.php" : "Izboljšanje config.php", @@ -170,13 +170,15 @@ "by" : "od", "licensed" : "licencirano", "Documentation:" : "Dokumentacija:", - "User documentation" : "Uporabniška navodila", - "Show description …" : "Prikaži opis...", - "Hide description …" : "Skrij opis...", + "User documentation" : "Uporabniška dokumentacija", + "Admin documentation" : "Skrbniška dokumentacija", + "Show description …" : "Pokaži opis ...", + "Hide description …" : "Skrij opis ...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Programa ni mogoče namestiti zaradi nerešenih odvisnosti:", "Enable only for specific groups" : "Omogoči le za posamezne skupine", "Uninstall App" : "Odstrani program", "Enable experimental apps" : "Omogoči testne aplikacije", + "SSL Root Certificates" : "Korenska potrdila SSL", "Common Name" : "Splošno ime", "Valid until" : "Veljavno do", "Issued By" : "Izdajatelj", @@ -185,14 +187,17 @@ "Hey there,<br><br>just letting you know that you now have an %s account.<br><br>Your username: %s<br>Access it: <a href=\"%s\">%s</a><br><br>" : "Pozdravljeni,<br><br>samo sporočamo, da imate %s račun.<br><br>Vaše uporabniško ime: %s<br>Dostop: <a href=\"%s\">%s</a><br><br>", "Cheers!" : "Na zdravje!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Pozdravljeni,\n\nsamo sporočamo, da imate %s račun.\n\nVaše uporabniško ime: %s\nDostop: %s\n", - "Administrator documentation" : "Skrbniška navodila", - "Online documentation" : "Dokumentacija na spletu", + "Administrator documentation" : "Skrbniška dokumentacija", + "Online documentation" : "Spletna dokumentacija", "Forum" : "Forum", "Issue tracker" : "Spremljanje težav", "Commercial support" : "Komercialna podpora", + "You are using <strong>%s</strong> of <strong>%s</strong>" : "Uporabljate <strong>%s</strong> od <strong>%s</strong>", "Profile picture" : "Slika profila", "Upload new" : "Pošlji novo", + "Select from Files" : "Izbor iz datotek", "Remove image" : "Odstrani sliko", + "png or jpg, max. 20 MB" : "png ali jpg, največ. 20 MB", "Cancel" : "Prekliči", "Full name" : "Polno ime", "No display name set" : "Ime za prikaz ni bilo nastavljeno", diff --git a/tests/core/avatar/avatarcontrollertest.php b/tests/core/controller/avatarcontrollertest.php index 9e46e1782af..8e5e58904a7 100644 --- a/tests/core/avatar/avatarcontrollertest.php +++ b/tests/core/controller/avatarcontrollertest.php @@ -18,7 +18,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ -namespace OC\Core\Avatar; +namespace OC\Core\Controller; use OC; use OC\Core\Application; @@ -45,7 +45,7 @@ function is_uploaded_file($filename) { * * @group DB * - * @package OC\Core\Avatar + * @package OC\Core\Controller */ class AvatarControllerTest extends \Test\TestCase { use UserTrait; diff --git a/tests/core/lostpassword/controller/lostcontrollertest.php b/tests/core/controller/lostcontrollertest.php index 0843d82da3f..44bc539247f 100644 --- a/tests/core/lostpassword/controller/lostcontrollertest.php +++ b/tests/core/controller/lostcontrollertest.php @@ -19,7 +19,7 @@ * */ -namespace OC\Core\LostPassword\Controller; +namespace OC\Core\Controller; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Utility\ITimeFactory; @@ -36,7 +36,7 @@ use PHPUnit_Framework_MockObject_MockObject; /** * Class LostControllerTest * - * @package OC\Core\LostPassword\Controller + * @package OC\Core\Controller */ class LostControllerTest extends \PHPUnit_Framework_TestCase { @@ -124,8 +124,8 @@ class LostControllerTest extends \PHPUnit_Framework_TestCase { ->will($this->returnValue('https://ownCloud.com/index.php/lostpassword/')); $response = $this->lostController->resetform($token, $userId); - $expectedResponse = new TemplateResponse('core/lostpassword', - 'resetpassword', + $expectedResponse = new TemplateResponse('core', + 'lostpassword/resetpassword', array( 'link' => 'https://ownCloud.com/index.php/lostpassword/', ), diff --git a/tests/data/integritycheck/htaccessUnmodified/.htaccess b/tests/data/integritycheck/htaccessUnmodified/.htaccess new file mode 100644 index 00000000000..9bcb05db96c --- /dev/null +++ b/tests/data/integritycheck/htaccessUnmodified/.htaccess @@ -0,0 +1 @@ +# Start of valid file
\ No newline at end of file diff --git a/tests/data/integritycheck/htaccessUnmodified/subfolder/.htaccess b/tests/data/integritycheck/htaccessUnmodified/subfolder/.htaccess new file mode 100644 index 00000000000..33d4437c928 --- /dev/null +++ b/tests/data/integritycheck/htaccessUnmodified/subfolder/.htaccess @@ -0,0 +1,4 @@ +# Start of valid file +#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### + +# Content that should change the hash in the root folder
\ No newline at end of file diff --git a/tests/data/integritycheck/htaccessWithInvalidModifiedContent/.htaccess b/tests/data/integritycheck/htaccessWithInvalidModifiedContent/.htaccess new file mode 100644 index 00000000000..d3c2f69f120 --- /dev/null +++ b/tests/data/integritycheck/htaccessWithInvalidModifiedContent/.htaccess @@ -0,0 +1,5 @@ +# Start of valid file +#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### +# Content that should not modify the hash +#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### +# but it does because it is twice
\ No newline at end of file diff --git a/tests/data/integritycheck/htaccessWithValidModifiedContent/.htaccess b/tests/data/integritycheck/htaccessWithValidModifiedContent/.htaccess new file mode 100644 index 00000000000..33d4437c928 --- /dev/null +++ b/tests/data/integritycheck/htaccessWithValidModifiedContent/.htaccess @@ -0,0 +1,4 @@ +# Start of valid file +#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### + +# Content that should change the hash in the root folder
\ No newline at end of file diff --git a/tests/data/integritycheck/htaccessWithValidModifiedContent/subfolder/.htaccess b/tests/data/integritycheck/htaccessWithValidModifiedContent/subfolder/.htaccess new file mode 100644 index 00000000000..33d4437c928 --- /dev/null +++ b/tests/data/integritycheck/htaccessWithValidModifiedContent/subfolder/.htaccess @@ -0,0 +1,4 @@ +# Start of valid file +#### DO NOT CHANGE ANYTHING ABOVE THIS LINE #### + +# Content that should change the hash in the root folder
\ No newline at end of file diff --git a/tests/karma.config.js b/tests/karma.config.js index df09ee1b310..467b270b350 100644 --- a/tests/karma.config.js +++ b/tests/karma.config.js @@ -83,6 +83,16 @@ module.exports = function(config) { testFiles: ['apps/files_versions/tests/js/**/*.js'] }, { + name: 'systemtags', + srcFiles: [ + // need to enforce loading order... + 'apps/systemtags/js/app.js', + 'apps/systemtags/js/systemtagsinfoview.js', + 'apps/systemtags/js/filesplugin.js' + ], + testFiles: ['apps/systemtags/tests/js/**/*.js'] + }, + { name: 'settings', srcFiles: [ 'settings/js/apps.js', diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php index 0880e7e1282..92b784bf8ea 100644 --- a/tests/lib/cache/file.php +++ b/tests/lib/cache/file.php @@ -87,7 +87,9 @@ class FileCache extends \Test_Cache { } protected function tearDown() { - $this->instance->remove('hack', 'hack'); + if ($this->instance) { + $this->instance->remove('hack', 'hack'); + } \OC_User::setUserId($this->user); \OC::$server->getConfig()->setSystemValue('cachedirectory', $this->datadir); diff --git a/tests/lib/command/integrity/SignAppTest.php b/tests/lib/command/integrity/SignAppTest.php index b7c34585c5c..44a644c45df 100644 --- a/tests/lib/command/integrity/SignAppTest.php +++ b/tests/lib/command/integrity/SignAppTest.php @@ -23,6 +23,7 @@ namespace Test\Command\Integrity; use OC\Core\Command\Integrity\SignApp; use OC\IntegrityCheck\Checker; use OC\IntegrityCheck\Helpers\FileAccessHelper; +use OCP\IURLGenerator; use Test\TestCase; class SignAppTest extends TestCase { @@ -32,6 +33,8 @@ class SignAppTest extends TestCase { private $signApp; /** @var FileAccessHelper */ private $fileAccessHelper; + /** @var IURLGenerator */ + private $urlGenerator; public function setUp() { parent::setUp(); @@ -39,20 +42,23 @@ class SignAppTest extends TestCase { ->disableOriginalConstructor()->getMock(); $this->fileAccessHelper = $this->getMockBuilder('\OC\IntegrityCheck\Helpers\FileAccessHelper') ->disableOriginalConstructor()->getMock(); + $this->urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor()->getMock(); $this->signApp = new SignApp( $this->checker, - $this->fileAccessHelper + $this->fileAccessHelper, + $this->urlGenerator ); } - public function testExecuteWithMissingAppId() { + public function testExecuteWithMissingPath() { $inputInterface = $this->getMock('\Symfony\Component\Console\Input\InputInterface'); $outputInterface = $this->getMock('\Symfony\Component\Console\Output\OutputInterface'); $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue(null)); $inputInterface ->expects($this->at(1)) @@ -68,7 +74,7 @@ class SignAppTest extends TestCase { $outputInterface ->expects($this->at(0)) ->method('writeln') - ->with('--appId, --privateKey and --certificate are required.'); + ->with('This command requires the --path, --privateKey and --certificate.'); $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); } @@ -80,7 +86,7 @@ class SignAppTest extends TestCase { $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue('AppId')); $inputInterface ->expects($this->at(1)) @@ -94,9 +100,9 @@ class SignAppTest extends TestCase { ->will($this->returnValue('Certificate')); $outputInterface - ->expects($this->at(0)) - ->method('writeln') - ->with('--appId, --privateKey and --certificate are required.'); + ->expects($this->at(0)) + ->method('writeln') + ->with('This command requires the --path, --privateKey and --certificate.'); $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); } @@ -108,7 +114,7 @@ class SignAppTest extends TestCase { $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue('AppId')); $inputInterface ->expects($this->at(1)) @@ -124,7 +130,7 @@ class SignAppTest extends TestCase { $outputInterface ->expects($this->at(0)) ->method('writeln') - ->with('--appId, --privateKey and --certificate are required.'); + ->with('This command requires the --path, --privateKey and --certificate.'); $this->invokePrivate($this->signApp, 'execute', [$inputInterface, $outputInterface]); } @@ -136,7 +142,7 @@ class SignAppTest extends TestCase { $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue('AppId')); $inputInterface ->expects($this->at(1)) @@ -170,7 +176,7 @@ class SignAppTest extends TestCase { $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue('AppId')); $inputInterface ->expects($this->at(1)) @@ -209,7 +215,7 @@ class SignAppTest extends TestCase { $inputInterface ->expects($this->at(0)) ->method('getOption') - ->with('appId') + ->with('path') ->will($this->returnValue('AppId')); $inputInterface ->expects($this->at(1)) diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php index 837bcb10585..ff8dfd3a259 100644 --- a/tests/lib/comments/fakefactory.php +++ b/tests/lib/comments/fakefactory.php @@ -2,11 +2,16 @@ namespace Test\Comments; +use OCP\IServerContainer; + /** * Class FakeFactory */ class FakeFactory implements \OCP\Comments\ICommentsManagerFactory { + public function __construct(IServerContainer $serverContainer) { + } + public function getManager() { return new FakeManager(); } diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php index 248de683253..cc2eebb64d1 100644 --- a/tests/lib/comments/manager.php +++ b/tests/lib/comments/manager.php @@ -50,7 +50,7 @@ class Test_Comments_Manager extends TestCase } protected function getManager() { - $factory = new \OC\Comments\ManagerFactory(); + $factory = new \OC\Comments\ManagerFactory(\OC::$server); return $factory->getManager(); } diff --git a/tests/lib/contacts/localadressbook.php b/tests/lib/contacts/localadressbook.php index e5c43460835..ad3c088e3cd 100644 --- a/tests/lib/contacts/localadressbook.php +++ b/tests/lib/contacts/localadressbook.php @@ -47,6 +47,9 @@ class Test_LocalAddressBook extends \Test\TestCase class SimpleUserForTesting implements IUser { + private $uid; + private $displayName; + public function __construct($uid, $displayName) { $this->uid = $uid; @@ -105,4 +108,7 @@ class SimpleUserForTesting implements IUser { public function getCloudId() { } + + public function setEMailAddress($mailAddress) { + } } diff --git a/tests/lib/files/config/usermountcache.php b/tests/lib/files/config/usermountcache.php new file mode 100644 index 00000000000..26449b5dd23 --- /dev/null +++ b/tests/lib/files/config/usermountcache.php @@ -0,0 +1,257 @@ +<?php +/** + * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Files\Config; + +use OC\Files\Mount\MountPoint; +use OC\Files\Storage\Temporary; +use OC\Log; +use OC\User\Manager; +use OCP\Files\Config\ICachedMountInfo; +use OCP\IDBConnection; +use OCP\IUserManager; +use Test\TestCase; +use Test\Util\User\Dummy; + +/** + * @group DB + */ +class UserMountCache extends TestCase { + /** + * @var IDBConnection + */ + private $connection; + + /** + * @var IUserManager + */ + private $userManager; + + /** + * @var \OC\Files\Config\UserMountCache + */ + private $cache; + + public function setUp() { + $this->connection = \OC::$server->getDatabaseConnection(); + $this->userManager = new Manager(null); + $userBackend = new Dummy(); + $userBackend->createUser('u1', ''); + $userBackend->createUser('u2', ''); + $this->userManager->registerBackend($userBackend); + $this->cache = new \OC\Files\Config\UserMountCache($this->connection, $this->userManager, $this->getMock('\OC\Log')); + } + + public function tearDown() { + $builder = $this->connection->getQueryBuilder(); + + $builder->delete('mounts')->execute(); + } + + private function getStorage($storageId, $rootId) { + $storageCache = $this->getMockBuilder('\OC\Files\Cache\Storage') + ->disableOriginalConstructor() + ->getMock(); + $storageCache->expects($this->any()) + ->method('getNumericId') + ->will($this->returnValue($storageId)); + + $cache = $this->getMockBuilder('\OC\Files\Cache\Cache') + ->disableOriginalConstructor() + ->getMock(); + $cache->expects($this->any()) + ->method('getId') + ->will($this->returnValue($rootId)); + + $storage = $this->getMockBuilder('\OC\Files\Storage\Storage') + ->disableOriginalConstructor() + ->getMock(); + $storage->expects($this->any()) + ->method('getStorageCache') + ->will($this->returnValue($storageCache)); + $storage->expects($this->any()) + ->method('getCache') + ->will($this->returnValue($cache)); + + return $storage; + } + + private function clearCache() { + $this->invokePrivate($this->cache, 'mountsForUsers', [[]]); + } + + public function testNewMounts() { + $user = $this->userManager->get('u1'); + + $storage = $this->getStorage(10, 20); + $mount = new MountPoint($storage, '/asd/'); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user); + + $this->assertCount(1, $cachedMounts); + $cachedMount = $cachedMounts[0]; + $this->assertEquals('/asd/', $cachedMount->getMountPoint()); + $this->assertEquals($user, $cachedMount->getUser()); + $this->assertEquals($storage->getCache()->getId(''), $cachedMount->getRootId()); + $this->assertEquals($storage->getStorageCache()->getNumericId(), $cachedMount->getStorageId()); + } + + public function testSameMounts() { + $user = $this->userManager->get('u1'); + + $storage = $this->getStorage(10, 20); + $mount = new MountPoint($storage, '/asd/'); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user); + + $this->assertCount(1, $cachedMounts); + $cachedMount = $cachedMounts[0]; + $this->assertEquals('/asd/', $cachedMount->getMountPoint()); + $this->assertEquals($user, $cachedMount->getUser()); + $this->assertEquals($storage->getCache()->getId(''), $cachedMount->getRootId()); + $this->assertEquals($storage->getStorageCache()->getNumericId(), $cachedMount->getStorageId()); + } + + public function testRemoveMounts() { + $user = $this->userManager->get('u1'); + + $storage = $this->getStorage(10, 20); + $mount = new MountPoint($storage, '/asd/'); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $this->cache->registerMounts($user, []); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user); + + $this->assertCount(0, $cachedMounts); + } + + public function testChangeMounts() { + $user = $this->userManager->get('u1'); + + $storage = $this->getStorage(10, 20); + $mount = new MountPoint($storage, '/foo/'); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $this->cache->registerMounts($user, [$mount]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user); + + $this->assertCount(1, $cachedMounts); + $cachedMount = $cachedMounts[0]; + $this->assertEquals('/foo/', $cachedMount->getMountPoint()); + } + + public function testGetMountsForUser() { + $user1 = $this->userManager->get('u1'); + $user2 = $this->userManager->get('u2'); + + $mount1 = new MountPoint($this->getStorage(1, 2), '/foo/'); + $mount2 = new MountPoint($this->getStorage(3, 4), '/bar/'); + + $this->cache->registerMounts($user1, [$mount1, $mount2]); + $this->cache->registerMounts($user2, [$mount2]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForUser($user1); + + $this->assertCount(2, $cachedMounts); + $this->assertEquals('/foo/', $cachedMounts[0]->getMountPoint()); + $this->assertEquals($user1, $cachedMounts[0]->getUser()); + $this->assertEquals(2, $cachedMounts[0]->getRootId()); + $this->assertEquals(1, $cachedMounts[0]->getStorageId()); + + $this->assertEquals('/bar/', $cachedMounts[1]->getMountPoint()); + $this->assertEquals($user1, $cachedMounts[1]->getUser()); + $this->assertEquals(4, $cachedMounts[1]->getRootId()); + $this->assertEquals(3, $cachedMounts[1]->getStorageId()); + } + + public function testGetMountsByStorageId() { + $user1 = $this->userManager->get('u1'); + $user2 = $this->userManager->get('u2'); + + $mount1 = new MountPoint($this->getStorage(1, 2), '/foo/'); + $mount2 = new MountPoint($this->getStorage(3, 4), '/bar/'); + + $this->cache->registerMounts($user1, [$mount1, $mount2]); + $this->cache->registerMounts($user2, [$mount2]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForStorageId(3); + usort($cachedMounts, function (ICachedMountInfo $a, ICachedMountInfo $b) { + return strcmp($a->getUser()->getUID(), $b->getUser()->getUID()); + }); + + $this->assertCount(2, $cachedMounts); + + $this->assertEquals('/bar/', $cachedMounts[0]->getMountPoint()); + $this->assertEquals($user1, $cachedMounts[0]->getUser()); + $this->assertEquals(4, $cachedMounts[0]->getRootId()); + $this->assertEquals(3, $cachedMounts[0]->getStorageId()); + + $this->assertEquals('/bar/', $cachedMounts[1]->getMountPoint()); + $this->assertEquals($user2, $cachedMounts[1]->getUser()); + $this->assertEquals(4, $cachedMounts[1]->getRootId()); + $this->assertEquals(3, $cachedMounts[1]->getStorageId()); + } + + public function testGetMountsByRootId() { + $user1 = $this->userManager->get('u1'); + $user2 = $this->userManager->get('u2'); + + $mount1 = new MountPoint($this->getStorage(1, 2), '/foo/'); + $mount2 = new MountPoint($this->getStorage(3, 4), '/bar/'); + + $this->cache->registerMounts($user1, [$mount1, $mount2]); + $this->cache->registerMounts($user2, [$mount2]); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForRootId(4); + usort($cachedMounts, function (ICachedMountInfo $a, ICachedMountInfo $b) { + return strcmp($a->getUser()->getUID(), $b->getUser()->getUID()); + }); + + $this->assertCount(2, $cachedMounts); + + $this->assertEquals('/bar/', $cachedMounts[0]->getMountPoint()); + $this->assertEquals($user1, $cachedMounts[0]->getUser()); + $this->assertEquals(4, $cachedMounts[0]->getRootId()); + $this->assertEquals(3, $cachedMounts[0]->getStorageId()); + + $this->assertEquals('/bar/', $cachedMounts[1]->getMountPoint()); + $this->assertEquals($user2, $cachedMounts[1]->getUser()); + $this->assertEquals(4, $cachedMounts[1]->getRootId()); + $this->assertEquals(3, $cachedMounts[1]->getStorageId()); + } +} diff --git a/tests/lib/helper.php b/tests/lib/helper.php index c2620896157..89a981e6e23 100644 --- a/tests/lib/helper.php +++ b/tests/lib/helper.php @@ -21,7 +21,7 @@ class Test_Helper extends \Test\TestCase { { return array( array('0 B', 0), - array('1 kB', 1024), + array('1 KB', 1024), array('9.5 MB', 10000000), array('1.3 GB', 1395864371), array('465.7 GB', 500000000000), @@ -63,7 +63,7 @@ class Test_Helper extends \Test\TestCase { function providesComputerFileSize(){ return [ [0.0, "0 B"], - [1024.0, "1 kB"], + [1024.0, "1 KB"], [1395864371.0, '1.3 GB'], [9961472.0, "9.5 MB"], [500041567437.0, "465.7 GB"], diff --git a/tests/lib/integritycheck/checkertest.php b/tests/lib/integritycheck/checkertest.php index eee9299e6af..dec3ea84a64 100644 --- a/tests/lib/integritycheck/checkertest.php +++ b/tests/lib/integritycheck/checkertest.php @@ -77,7 +77,7 @@ class CheckerTest extends TestCase { /** * @expectedException \Exception - * @expectedExceptionMessage Directory name must not be empty. + * @expectedExceptionMessage Directory does not exist. */ public function testWriteAppSignatureOfNotExistingApp() { $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/SomeApp.crt'); @@ -98,11 +98,6 @@ class CheckerTest extends TestCase { "signature": "Y5yvXvcGHVPuRRatKVDUONWq1FpLXugZd6Km\/+aEHsQj7coVl9FeMj9OsWamBf7yRIw3dtNLguTLlAA9QAv\/b0uHN3JnbNZN+dwFOve4NMtqXfSDlWftqKN00VS+RJXpG1S2IIx9Poyp2NoghL\/5AuTv4GHiNb7zU\/DT\/kt71pUGPgPR6IIFaE+zHOD96vjYkrH+GfWZzKR0FCdLib9yyNvk+EGrcjKM6qjs2GKfS\/XFjj\/\/neDnh\/0kcPuKE3ZbofnI4TIDTv0CGqvOp7PtqVNc3Vy\/UKa7uF1PT0MAUKMww6EiMUSFZdUVP4WWF0Y72W53Qdtf1hrAZa2kfKyoK5kd7sQmCSKUPSU8978AUVZlBtTRlyT803IKwMV0iHMkw+xYB1sN2FlHup\/DESADqxhdgYuK35bCPvgkb4SBe4B8Voz\/izTvcP7VT5UvkYdAO+05\/jzdaHEmzmsD92CFfvX0q8O\/Y\/29ubftUJsqcHeMDKgcR4eZOE8+\/QVc\/89QO6WnKNuNuV+5bybO6g6PAdC9ZPsCvnihS61O2mwRXHLR3jv2UleFWm+lZEquPKtkhi6SLtDiijA4GV6dmS+dzujSLb7hGeD5o1plZcZ94uhWljl+QIp82+zU\/lYB1Zfr4Mb4e+V7r2gv7Fbv7y6YtjE2GIQwRhC5jq56bD0ZB+I=", "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEwTCCAqmgAwIBAgIUWv0iujufs5lUr0svCf\/qTQvoyKAwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIyNDk1M1oXDTE2MTEwMzIyNDk1M1owEjEQMA4GA1UEAwwHU29tZUFwcDCCAiIw\r\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK8q0x62agGSRBqeWsaeEwFfepMk\r\nF8cAobMMi50qHCv9IrOn\/ZH9l52xBrbIkErVmRjmly0d4JhD8Ymhidsh9ONKYl\/j\r\n+ishsZDM8eNNdp3Ew+fEYVvY1W7mR1qU24NWj0bzVsClI7hvPVIuw7AjfBDq1C5+\r\nA+ZSLSXYvOK2cEWjdxQfuNZwEZSjmA63DUllBIrm35IaTvfuyhU6BW9yHZxmb8+M\r\nw0xDv30D5UkE\/2N7Pa\/HQJLxCR+3zKibRK3nUyRDLSXxMkU9PnFNaPNX59VPgyj4\r\nGB1CFSToldJVPF4pzh7p36uGXZVxs8m3LFD4Ol8mhi7jkxDZjqFN46gzR0r23Py6\r\ndol9vfawGIoUwp9LvL0S7MvdRY0oazLXwClLP4OQ17zpSMAiCj7fgNT661JamPGj\r\nt5O7Zn2wA7I4ddDS\/HDTWCu98Zwc9fHIpsJPgCZ9awoqxi4Mnf7Pk9g5nnXhszGC\r\ncxxIASQKM+GhdzoRxKknax2RzUCwCzcPRtCj8AQT\/x\/mqN3PfRmlnFBNACUw9bpZ\r\nSOoNq2pCF9igftDWpSIXQ38pVpKLWowjjg3DVRmVKBgivHnUnVLyzYBahHPj0vaz\r\ntFtUFRaqXDnt+4qyUGyrT5h5pjZaTcHIcSB4PiarYwdVvgslgwnQzOUcGAzRWBD4\r\n6jV2brP5vFY3g6iPAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBACTY3CCHC+Z28gCf\r\nFWGKQ3wAKs+k4+0yoti0qm2EKX7rSGQ0PHSas6uW79WstC4Rj+DYkDtIhGMSg8FS\r\nHVGZHGBCc0HwdX+BOAt3zi4p7Sf3oQef70\/4imPoKxbAVCpd\/cveVcFyDC19j1yB\r\nBapwu87oh+muoeaZxOlqQI4UxjBlR\/uRSMhOn2UGauIr3dWJgAF4pGt7TtIzt+1v\r\n0uA6FtN1Y4R5O8AaJPh1bIG0CVvFBE58esGzjEYLhOydgKFnEP94kVPgJD5ds9C3\r\npPhEpo1dRpiXaF7WGIV1X6DI\/ipWvfrF7CEy6I\/kP1InY\/vMDjQjeDnJ\/VrXIWXO\r\nyZvHXVaN\/m+1RlETsH7YO\/QmxRue9ZHN3gvvWtmpCeA95sfpepOk7UcHxHZYyQbF\r\n49\/au8j+5tsr4A83xzsT1JbcKRxkAaQ7WDJpOnE5O1+H0fB+BaLakTg6XX9d4Fo7\r\n7Gin7hVWX7pL+JIyxMzME3LhfI61+CRcqZQIrpyaafUziPQbWIPfEs7h8tCOWyvW\r\nUO8ZLervYCB3j44ivkrxPlcBklDCqqKKBzDP9dYOtS\/P4RB1NkHA9+NTvmBpTonS\r\nSFXdg9fFMD7VfjDE3Vnk+8DWkVH5wBYowTAD7w9Wuzr7DumiAULexnP\/Y7xwxLv7\r\n4B+pXTAcRK0zECDEaX3npS8xWzrB\r\n-----END CERTIFICATE-----" }'; - $this->appLocator - ->expects($this->once()) - ->method('getAppPath') - ->with('SomeExistingApp') - ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/app/')); $this->fileAccessHelper ->expects($this->once()) ->method('file_put_contents') @@ -117,7 +112,7 @@ class CheckerTest extends TestCase { $rsa->loadKey($rsaPrivateKey); $x509 = new X509(); $x509->loadX509($keyBundle); - $this->checker->writeAppSignature('SomeExistingApp', $x509, $rsa); + $this->checker->writeAppSignature(\OC::$SERVERROOT . '/tests/data/integritycheck/app/', $x509, $rsa); } public function testVerifyAppSignatureWithoutSignatureData() { @@ -473,6 +468,95 @@ class CheckerTest extends TestCase { $this->checker->writeCoreSignature($x509, $rsa); } + public function testWriteCoreSignatureWithUnmodifiedHtaccess() { + $expectedSignatureFileData = '{ + "hashes": { + ".htaccess": "dc479770a6232061e04a768ee1f9133fdb3aea7b3a99f7105b0e0b6197474733e8d14b5b2bbad054e6b62a410fe5d0b3d790242dee1e0f11274af2100f5289e2", + "subfolder\/.htaccess": "2c57b1e25050e11dc3ae975832f378c452159f7b69f818e47eeeafadd6ba568517461dcb4d843b90b906cd7c89d161bc1b89dff8e3ae0eb6f5088508c47befd1" + }, + "signature": "nRtR377DB\/I\/4hmh9q3elMQYfSHnQFlNtjchNgrdfmUQqVmgkU\/4qgGyxDqYkV8mSMbH2gYysfP42nx\/3zSo7n0dBYDfU87Q6f96Cv597vEV27do8CaBkEk8Xjn2SxhHw8hVxracvE2OBAPxk0H3sRp\/cQBgjoXpju4kQin0N5E+DEJMh7Sp+u8aKoFpb+2FaAZJFn\/hnqxLTlVi2nyDxGL3U0eobWY+jWH9XPt52v3Hyh8TDhcAnQ1cN30B8Jn2+jkrm8ib+buchaCXHk0cPX72xuPECdwOEKLCBNrJa3FGSvO1zWiecnCgxCXgt+R8hUgsVPTsbrdFY2YRJGIhHndYZL98XzgG7cw85SnnMMe2SulzeL7xANGF8qiEVyiC7x83bbj5xOkeM\/CUTajrLBO3vyZ23KKOxvskjgI0t+Zw1zFsl+sYW0\/O\/V5WzPOwMwV8+iApQ8k9gEMiYQg98QLEMYnSohncmp0Z9qx2qFcQuHLcKJVa1J6wGtE\/EHR\/4d0aYPd6IRjg+qshCJmdzud\/12xjpGTl+BT0Hi0VsU5o7ZMi7WhmukZmmv8u0uZsvKREQNATm4cO4WCkYySt5O9gZEJOF+jjgeynDoAh09lyrNXIgMpM9ufm\/XEG\/I\/f2zIwbAUc6J6qks5OuYlJzW5vscTiOKhwcGZU9WBLgh0=", + "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEvjCCAqagAwIBAgIUc\/0FxYrsgSs9rDxp03EJmbjN0NwwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIxMDMzM1oXDTE2MTEwMzIxMDMzM1owDzENMAsGA1UEAwwEY29yZTCCAiIwDQYJ\r\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBALb6EgHpkAqZbO5vRO8XSh7G7XGWHw5s\r\niOf4RwPXR6SE9bWZEm\/b72SfWk\/\/J6AbrD8WiOzBuT\/ODy6k5T1arEdHO+Pux0W1\r\nMxYJJI4kH74KKgMpC0SB0Rt+8WrMqV1r3hhJ46df6Xr\/xolP3oD+eLbShPcblhdS\r\nVtkZEkoev8Sh6L2wDCeHDyPxzvj1w2dTdGVO9Kztn0xIlyfEBakqvBWtcxyi3Ln0\r\nklnxlMx3tPDUE4kqvpia9qNiB1AN2PV93eNr5\/2riAzIssMFSCarWCx0AKYb54+d\r\nxLpcYFyqPJ0ydBCkF78DD45RCZet6PNYkdzgbqlUWEGGomkuDoJbBg4wzgzO0D77\r\nH87KFhYW8tKFFvF1V3AHl\/sFQ9tDHaxM9Y0pZ2jPp\/ccdiqnmdkBxBDqsiRvHvVB\r\nCn6qpb4vWGFC7vHOBfYspmEL1zLlKXZv3ezMZEZw7O9ZvUP3VO\/wAtd2vUW8UFiq\r\ns2v1QnNLN6jNh51obcwmrBvWhJy9vQIdtIjQbDxqWTHh1zUSrw9wrlklCBZ\/zrM0\r\ni8nfCFwTxWRxp3H9KoECzO\/zS5R5KIS7s3\/wq\/w9T2Ie4rcecgXwDizwnn0C\/aKc\r\nbDIjujpL1s9HO05pcD\/V3wKcPZ1izymBkmMyIbL52iRVN5FTVHeZdXPpFuq+CTQJ\r\nQ238lC+A\/KOVAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoKTnh8RfJV4sQItVC2\r\nAvfJagkrIqZ3iiQTUBQGTKBsTnAqE1H7QgUSV9vSd+8rgvHkyZsRjmtyR1e3A6Ji\r\noNCXUbExC\/0iCPUqdHZIVb+Lc\/vWuv4ByFMybGPydgtLoEUX2ZrKFWmcgZFDUSRd\r\n9Uj26vtUhCC4bU4jgu6hIrR9IuxOBLQUxGTRZyAcXvj7obqRAEZwFAKQgFpfpqTb\r\nH+kjcbZSaAlLVSF7vBc1syyI8RGYbqpwvtREqJtl5IEIwe6huEqJ3zPnlP2th\/55\r\ncf3Fovj6JJgbb9XFxrdnsOsDOu\/tpnaRWlvv5ib4+SzG5wWFT5UUEo4Wg2STQiiX\r\nuVSRQxK1LE1yg84bs3NZk9FSQh4B8vZVuRr5FaJsZZkwlFlhRO\/\/+TJtXRbyNgsf\r\noMRZGi8DLGU2SGEAHcRH\/QZHq\/XDUWVzdxrSBYcy7GSpT7UDVzGv1rEJUrn5veP1\r\n0KmauAqtiIaYRm4f6YBsn0INcZxzIPZ0p8qFtVZBPeHhvQtvOt0iXI\/XUxEWOa2F\r\nK2EqhErgMK\/N07U1JJJay5tYZRtvkGq46oP\/5kQG8hYST0MDK6VihJoPpvCmAm4E\r\npEYKQ96x6A4EH9Y9mZlYozH\/eqmxPbTK8n89\/p7Ydun4rI+B2iiLnY8REWWy6+UQ\r\nV204fGUkJqW5CrKy3P3XvY9X\r\n-----END CERTIFICATE-----" +}'; + $this->environmentHelper + ->expects($this->any()) + ->method('getServerRoot') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/htaccessUnmodified/')); + $this->fileAccessHelper + ->expects($this->once()) + ->method('file_put_contents') + ->with( + \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessUnmodified//core/signature.json', + $expectedSignatureFileData + ); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/core.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/core.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeCoreSignature($x509, $rsa); + } + + public function testWriteCoreSignatureWithInvalidModifiedHtaccess() { + $expectedSignatureFileData = '{ + "hashes": { + ".htaccess": "4a54273dc8d697b2ca615acf2ae2c1ee3c1c643492cb04f42b10984fa9aacff1420dc829fd82f93ad3476fbd0cdab0251142c887dc8f872d03e39a3a3eb6d381" + }, + "signature": "qpDddYGgAKNR3TszOgjPXRphUl2P9Ym5OQaetltocgZASGDkOun5D64+1D0QJRKb4SG2+48muxGOHyL2Ngos4NUrrSR+SIkywZacay82YQBCEdr7\/4MjW1WHRPjvboLwEJwViw0EdAjsWRpD68aPnzUGrGsy2BsCo06P5iwjk9cXcHxdjC9R39npvoC3QNvQ2jmNIbh1Lc4U97dbb+CsXEQCLU1OSa9p3q6cEFV98Easwt7uF\/DzHK+CbeZlxVZ0DwLh2\/ylT1PyGou8QC1b3vKAnPjLWMO+UsCPpCKhk3C5pV+5etQ8puGd+0x2t5tEU+qXxLzek91zWNC+rqgC\/WlqLKbwPb\/BCHs4zLGV55Q2fEQmT21x0KCUELdPs4dBnYP4Ox5tEDugtJujWFzOHzoY6gGa\/BY\/78pSZXmq9o8dWkBEtioWWvaNZ1rM0ddE83GBlBTgjigi9Ay1D++bUW\/FCBB7CMk6qyNlV81H+cBuIEODw2aymmkM9LLDD2Qbmvo8gHEPRjiQxPC5OpDlcdSNiL+zcxVxeuX4FpT+9xzz\/\/DRONhufxRpsbuCOMxd96RW7y9U2N2Uxb3Bzn\/BIqEayUUsdgZjfaGcXXYKR+chu\/LOwNYN6RlnLsgqL\/dhGKwlRVKXw1RA2\/af\/CpqyR7uVP6al1YJo\/YJ+5XJ6zE=", + "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEvjCCAqagAwIBAgIUc\/0FxYrsgSs9rDxp03EJmbjN0NwwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIxMDMzM1oXDTE2MTEwMzIxMDMzM1owDzENMAsGA1UEAwwEY29yZTCCAiIwDQYJ\r\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBALb6EgHpkAqZbO5vRO8XSh7G7XGWHw5s\r\niOf4RwPXR6SE9bWZEm\/b72SfWk\/\/J6AbrD8WiOzBuT\/ODy6k5T1arEdHO+Pux0W1\r\nMxYJJI4kH74KKgMpC0SB0Rt+8WrMqV1r3hhJ46df6Xr\/xolP3oD+eLbShPcblhdS\r\nVtkZEkoev8Sh6L2wDCeHDyPxzvj1w2dTdGVO9Kztn0xIlyfEBakqvBWtcxyi3Ln0\r\nklnxlMx3tPDUE4kqvpia9qNiB1AN2PV93eNr5\/2riAzIssMFSCarWCx0AKYb54+d\r\nxLpcYFyqPJ0ydBCkF78DD45RCZet6PNYkdzgbqlUWEGGomkuDoJbBg4wzgzO0D77\r\nH87KFhYW8tKFFvF1V3AHl\/sFQ9tDHaxM9Y0pZ2jPp\/ccdiqnmdkBxBDqsiRvHvVB\r\nCn6qpb4vWGFC7vHOBfYspmEL1zLlKXZv3ezMZEZw7O9ZvUP3VO\/wAtd2vUW8UFiq\r\ns2v1QnNLN6jNh51obcwmrBvWhJy9vQIdtIjQbDxqWTHh1zUSrw9wrlklCBZ\/zrM0\r\ni8nfCFwTxWRxp3H9KoECzO\/zS5R5KIS7s3\/wq\/w9T2Ie4rcecgXwDizwnn0C\/aKc\r\nbDIjujpL1s9HO05pcD\/V3wKcPZ1izymBkmMyIbL52iRVN5FTVHeZdXPpFuq+CTQJ\r\nQ238lC+A\/KOVAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoKTnh8RfJV4sQItVC2\r\nAvfJagkrIqZ3iiQTUBQGTKBsTnAqE1H7QgUSV9vSd+8rgvHkyZsRjmtyR1e3A6Ji\r\noNCXUbExC\/0iCPUqdHZIVb+Lc\/vWuv4ByFMybGPydgtLoEUX2ZrKFWmcgZFDUSRd\r\n9Uj26vtUhCC4bU4jgu6hIrR9IuxOBLQUxGTRZyAcXvj7obqRAEZwFAKQgFpfpqTb\r\nH+kjcbZSaAlLVSF7vBc1syyI8RGYbqpwvtREqJtl5IEIwe6huEqJ3zPnlP2th\/55\r\ncf3Fovj6JJgbb9XFxrdnsOsDOu\/tpnaRWlvv5ib4+SzG5wWFT5UUEo4Wg2STQiiX\r\nuVSRQxK1LE1yg84bs3NZk9FSQh4B8vZVuRr5FaJsZZkwlFlhRO\/\/+TJtXRbyNgsf\r\noMRZGi8DLGU2SGEAHcRH\/QZHq\/XDUWVzdxrSBYcy7GSpT7UDVzGv1rEJUrn5veP1\r\n0KmauAqtiIaYRm4f6YBsn0INcZxzIPZ0p8qFtVZBPeHhvQtvOt0iXI\/XUxEWOa2F\r\nK2EqhErgMK\/N07U1JJJay5tYZRtvkGq46oP\/5kQG8hYST0MDK6VihJoPpvCmAm4E\r\npEYKQ96x6A4EH9Y9mZlYozH\/eqmxPbTK8n89\/p7Ydun4rI+B2iiLnY8REWWy6+UQ\r\nV204fGUkJqW5CrKy3P3XvY9X\r\n-----END CERTIFICATE-----" +}'; + $this->environmentHelper + ->expects($this->any()) + ->method('getServerRoot') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithInvalidModifiedContent/')); + $this->fileAccessHelper + ->expects($this->once()) + ->method('file_put_contents') + ->with( + \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithInvalidModifiedContent//core/signature.json', + $expectedSignatureFileData + ); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/core.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/core.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeCoreSignature($x509, $rsa); + } + + public function testWriteCoreSignatureWithValidModifiedHtaccess() { + $expectedSignatureFileData = '{ + "hashes": { + ".htaccess": "a232e6a616c40635d0220e47ebaade40348aadf141a67a331b8870b8fae056584e52fe8b56c49468ee17b58f92cbcd269dc30ae598d6206e97f7d8bb00a766c6", + "subfolder\/.htaccess": "2c57b1e25050e11dc3ae975832f378c452159f7b69f818e47eeeafadd6ba568517461dcb4d843b90b906cd7c89d161bc1b89dff8e3ae0eb6f5088508c47befd1" + }, + "signature": "LNHvrAFg7NJL9h8TanIFmiI3xnmNRz8pltVgRJpnQTqLJCkhZWV5+poHIii\/\/dI4NhBijsoN0AAJckf1KFzyeI2rOk3w+niaOEXX7khoJDgbxuz0kwN13Bxa1A6j0cMFqm9IIWet0JK9MKaL8K\/n3CzNYovXhRBdJsYTQVWvkaY5KMQgTP2roqgaLBABfI8+fuZVnKie1D737UJ3LhxesEtqr9mJEUSdYuN1QpaScdv7bMkX7xTcg02T5Ljs4F0KsKSME43Pzxm33qCQ\/Gyfsz\/iNKHYQztg9wPkSanbqvFnDtHhcIhKBsETCbNuBZqBk0AwYCupLIJTjC6SShHc4TtWiv834wtSmc1fYfzrsq7gJalJifFAaeGemzFwkePFlVqjdYc63KSqK8ut0jEcjKPAmJ+5NCUoxc8iASMJCesf31mzUPlw1L9LCBMA0aywDqkZYK4tJHZYMvXc4UkSs19OuAzUbXMoVHsJ03ftfC02gpg4hqZDSiBqYuyKMvt2xuutTA+xQcl3fQGUuNdSmBqUFm0D5cCvT10aZPNUXA2cnS+89u58QSxO1wEZJCYKOrDvX1oqOyJs\/c8GNip3LwheIF2KB8\/Zh83h8ZncDxuesAzq89IjV815K3P1G\/kSVPhvQapw1KMLu9rBDZ3FVvQw8K8fg5a7opBrK2ggGds=", + "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEvjCCAqagAwIBAgIUc\/0FxYrsgSs9rDxp03EJmbjN0NwwDQYJKoZIhvcNAQEF\r\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTEw\r\nMzIxMDMzM1oXDTE2MTEwMzIxMDMzM1owDzENMAsGA1UEAwwEY29yZTCCAiIwDQYJ\r\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBALb6EgHpkAqZbO5vRO8XSh7G7XGWHw5s\r\niOf4RwPXR6SE9bWZEm\/b72SfWk\/\/J6AbrD8WiOzBuT\/ODy6k5T1arEdHO+Pux0W1\r\nMxYJJI4kH74KKgMpC0SB0Rt+8WrMqV1r3hhJ46df6Xr\/xolP3oD+eLbShPcblhdS\r\nVtkZEkoev8Sh6L2wDCeHDyPxzvj1w2dTdGVO9Kztn0xIlyfEBakqvBWtcxyi3Ln0\r\nklnxlMx3tPDUE4kqvpia9qNiB1AN2PV93eNr5\/2riAzIssMFSCarWCx0AKYb54+d\r\nxLpcYFyqPJ0ydBCkF78DD45RCZet6PNYkdzgbqlUWEGGomkuDoJbBg4wzgzO0D77\r\nH87KFhYW8tKFFvF1V3AHl\/sFQ9tDHaxM9Y0pZ2jPp\/ccdiqnmdkBxBDqsiRvHvVB\r\nCn6qpb4vWGFC7vHOBfYspmEL1zLlKXZv3ezMZEZw7O9ZvUP3VO\/wAtd2vUW8UFiq\r\ns2v1QnNLN6jNh51obcwmrBvWhJy9vQIdtIjQbDxqWTHh1zUSrw9wrlklCBZ\/zrM0\r\ni8nfCFwTxWRxp3H9KoECzO\/zS5R5KIS7s3\/wq\/w9T2Ie4rcecgXwDizwnn0C\/aKc\r\nbDIjujpL1s9HO05pcD\/V3wKcPZ1izymBkmMyIbL52iRVN5FTVHeZdXPpFuq+CTQJ\r\nQ238lC+A\/KOVAgMBAAEwDQYJKoZIhvcNAQEFBQADggIBAGoKTnh8RfJV4sQItVC2\r\nAvfJagkrIqZ3iiQTUBQGTKBsTnAqE1H7QgUSV9vSd+8rgvHkyZsRjmtyR1e3A6Ji\r\noNCXUbExC\/0iCPUqdHZIVb+Lc\/vWuv4ByFMybGPydgtLoEUX2ZrKFWmcgZFDUSRd\r\n9Uj26vtUhCC4bU4jgu6hIrR9IuxOBLQUxGTRZyAcXvj7obqRAEZwFAKQgFpfpqTb\r\nH+kjcbZSaAlLVSF7vBc1syyI8RGYbqpwvtREqJtl5IEIwe6huEqJ3zPnlP2th\/55\r\ncf3Fovj6JJgbb9XFxrdnsOsDOu\/tpnaRWlvv5ib4+SzG5wWFT5UUEo4Wg2STQiiX\r\nuVSRQxK1LE1yg84bs3NZk9FSQh4B8vZVuRr5FaJsZZkwlFlhRO\/\/+TJtXRbyNgsf\r\noMRZGi8DLGU2SGEAHcRH\/QZHq\/XDUWVzdxrSBYcy7GSpT7UDVzGv1rEJUrn5veP1\r\n0KmauAqtiIaYRm4f6YBsn0INcZxzIPZ0p8qFtVZBPeHhvQtvOt0iXI\/XUxEWOa2F\r\nK2EqhErgMK\/N07U1JJJay5tYZRtvkGq46oP\/5kQG8hYST0MDK6VihJoPpvCmAm4E\r\npEYKQ96x6A4EH9Y9mZlYozH\/eqmxPbTK8n89\/p7Ydun4rI+B2iiLnY8REWWy6+UQ\r\nV204fGUkJqW5CrKy3P3XvY9X\r\n-----END CERTIFICATE-----" +}'; + $this->environmentHelper + ->expects($this->any()) + ->method('getServerRoot') + ->will($this->returnValue(\OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithValidModifiedContent')); + $this->fileAccessHelper + ->expects($this->once()) + ->method('file_put_contents') + ->with( + \OC::$SERVERROOT . '/tests/data/integritycheck/htaccessWithValidModifiedContent/core/signature.json', + $expectedSignatureFileData + ); + + $keyBundle = file_get_contents(__DIR__ .'/../../data/integritycheck/core.crt'); + $rsaPrivateKey = file_get_contents(__DIR__ .'/../../data/integritycheck/core.key'); + $rsa = new RSA(); + $rsa->loadKey($rsaPrivateKey); + $x509 = new X509(); + $x509->loadX509($keyBundle); + $this->checker->writeCoreSignature($x509, $rsa); + } + public function testVerifyCoreSignatureWithoutSignatureData() { $this->environmentHelper ->expects($this->once()) diff --git a/tests/lib/notification/managertest.php b/tests/lib/notification/managertest.php index fa2a0586f90..1f411bc74ee 100644 --- a/tests/lib/notification/managertest.php +++ b/tests/lib/notification/managertest.php @@ -82,15 +82,23 @@ class ManagerTest extends TestCase { }; $this->assertEquals([], $this->invokePrivate($this->manager, 'getNotifiers')); + $this->assertEquals([], $this->invokePrivate($this->manager, 'listNotifiers')); - $this->manager->registerNotifier($closure); + $this->manager->registerNotifier($closure, function() { + return ['id' => 'test1', 'name' => 'Test One']; + }); $this->assertEquals([$notifier], $this->invokePrivate($this->manager, 'getNotifiers')); + $this->assertEquals(['test1' => 'Test One'], $this->invokePrivate($this->manager, 'listNotifiers')); $this->assertEquals([$notifier], $this->invokePrivate($this->manager, 'getNotifiers')); + $this->assertEquals(['test1' => 'Test One'], $this->invokePrivate($this->manager, 'listNotifiers')); - $this->manager->registerNotifier($closure); + $this->manager->registerNotifier($closure, function() { + return ['id' => 'test2', 'name' => 'Test Two']; + }); $this->assertEquals([$notifier, $notifier], $this->invokePrivate($this->manager, 'getNotifiers')); + $this->assertEquals(['test1' => 'Test One', 'test2' => 'Test Two'], $this->invokePrivate($this->manager, 'listNotifiers')); } /** @@ -105,11 +113,68 @@ class ManagerTest extends TestCase { return $app; }; - $this->manager->registerNotifier($closure); + $this->manager->registerNotifier($closure, function() { + return ['id' => 'test1', 'name' => 'Test One']; + }); $this->invokePrivate($this->manager, 'getNotifiers'); } + public function dataRegisterNotifierInfoInvalid() { + return [ + [null], + ['No array'], + [['id' => 'test1', 'name' => 'Test One', 'size' => 'Invalid']], + [['no-id' => 'test1', 'name' => 'Test One']], + [['id' => 'test1', 'no-name' => 'Test One']], + ]; + } + + /** + * @dataProvider dataRegisterNotifierInfoInvalid + * @expectedException \InvalidArgumentException + * @param mixed $data + */ + public function testRegisterNotifierInfoInvalid($data) { + $app = $this->getMockBuilder('OC\Notification\IApp') + ->disableOriginalConstructor() + ->getMock(); + + $closure = function() use ($app) { + return $app; + }; + + $this->manager->registerNotifier($closure, function() use ($data) { + return $data; + }); + + $this->manager->listNotifiers(); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The given notifier ID test1 is already in use + */ + public function testRegisterNotifierInfoDuplicate() { + $app = $this->getMockBuilder('OC\Notification\IApp') + ->disableOriginalConstructor() + ->getMock(); + + $closure = function() use ($app) { + return $app; + }; + + $this->manager->registerNotifier($closure, function() { + return ['id' => 'test1', 'name' => 'Test One']; + }); + + $this->manager->registerNotifier($closure, function() { + return ['id' => 'test1', 'name' => 'Test One']; + }); + + $this->manager->listNotifiers(); + } + public function testCreateNotification() { $action = $this->manager->createNotification(); $this->assertInstanceOf('OC\Notification\INotification', $action); @@ -201,9 +266,13 @@ class ManagerTest extends TestCase { $this->manager->registerNotifier(function() use ($notifier) { return $notifier; + }, function() { + return ['id' => 'test1', 'name' => 'Test One']; }); $this->manager->registerNotifier(function() use ($notifier2) { return $notifier2; + }, function() { + return ['id' => 'test2', 'name' => 'Test Two']; }); $this->assertEquals($notification2, $this->manager->prepare($notification, 'en')); @@ -232,6 +301,8 @@ class ManagerTest extends TestCase { $this->manager->registerNotifier(function() use ($notifier) { return $notifier; + }, function() { + return ['id' => 'test1', 'name' => 'Test One']; }); $this->manager->prepare($notification, 'de'); @@ -257,6 +328,8 @@ class ManagerTest extends TestCase { $this->manager->registerNotifier(function() use ($notifier) { return $notifier; + }, function() { + return ['id' => 'test1', 'name' => 'Test One']; }); $this->assertEquals($notification, $this->manager->prepare($notification, 'de')); diff --git a/tests/lib/server.php b/tests/lib/server.php index 44e1aac5cce..684e6a97361 100644 --- a/tests/lib/server.php +++ b/tests/lib/server.php @@ -155,6 +155,9 @@ class Server extends \Test\TestCase { ['TempManager', '\OC\TempManager'], ['TempManager', '\OCP\ITempManager'], ['TrustedDomainHelper', '\OC\Security\TrustedDomainHelper'], + + ['SystemTagManager', '\OCP\SystemTag\ISystemTagManager'], + ['SystemTagObjectMapper', '\OCP\SystemTag\ISystemTagObjectMapper'], ]; } diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php index 4db6b2b14e7..812c6ecc27e 100644 --- a/tests/lib/share20/defaultshareprovidertest.php +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -37,13 +37,13 @@ class DefaultShareProviderTest extends \Test\TestCase { /** @var IDBConnection */ protected $dbConn; - /** @var IUserManager */ + /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */ protected $userManager; - /** @var IGroupManager */ + /** @var IGroupManager | \PHPUnit_Framework_MockObject_MockObject */ protected $groupManager; - /** @var IRootFolder */ + /** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */ protected $rootFolder; /** @var DefaultShareProvider */ @@ -92,16 +92,7 @@ class DefaultShareProviderTest extends \Test\TestCase { ]); $qb->execute(); - // Get the id - $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('id') - ->from('share') - ->setMaxResults(1) - ->orderBy('id', 'DESC') - ->execute(); - $id = $cursor->fetch(); - $id = $id['id']; - $cursor->closeCursor(); + $id = $qb->getLastInsertId(); $sharedWith = $this->getMock('OCP\IUser'); $sharedBy = $this->getMock('OCP\IUser'); @@ -165,15 +156,7 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertEquals(1, $qb->execute()); // Get the id - $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('id') - ->from('share') - ->setMaxResults(1) - ->orderBy('id', 'DESC') - ->execute(); - $id = $cursor->fetch(); - $id = $id['id']; - $cursor->closeCursor(); + $id = $qb->getLastInsertId(); $sharedWith = $this->getMock('OCP\IGroup'); $sharedBy = $this->getMock('OCP\IUser'); @@ -242,16 +225,7 @@ class DefaultShareProviderTest extends \Test\TestCase { ]); $this->assertEquals(1, $qb->execute()); - // Get the id - $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('id') - ->from('share') - ->setMaxResults(1) - ->orderBy('id', 'DESC') - ->execute(); - $id = $cursor->fetch(); - $id = $id['id']; - $cursor->closeCursor(); + $id = $qb->getLastInsertId(); $sharedBy = $this->getMock('OCP\IUser'); $sharedBy->method('getUID')->willReturn('sharedBy'); @@ -311,17 +285,7 @@ class DefaultShareProviderTest extends \Test\TestCase { ]); $this->assertEquals(1, $qb->execute()); - // Get the id - $qb = $this->dbConn->getQueryBuilder(); - $cursor = $qb->select('id') - ->from('share') - ->setMaxResults(1) - ->orderBy('id', 'DESC') - ->execute(); - $id = $cursor->fetch(); - $id = $id['id']; - $cursor->closeCursor(); - + $id = $qb->getLastInsertId(); $share = $this->getMock('OC\Share20\IShare'); $share->method('getId')->willReturn($id); @@ -721,4 +685,442 @@ class DefaultShareProviderTest extends \Test\TestCase { $this->assertSame('token', $share2->getToken()); $this->assertEquals($expireDate, $share2->getExpirationDate()); } + + public function testGetShareByToken() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK), + 'share_with' => $qb->expr()->literal('password'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + 'token' => $qb->expr()->literal('secrettoken'), + ]); + $qb->execute(); + $id = $qb->getLastInsertId(); + + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $initiator], + ['shareOwner', $owner], + ])); + + $file = $this->getMock('\OCP\Files\File'); + + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getShareByToken('secrettoken'); + $this->assertEquals($id, $share->getId()); + $this->assertSame($owner, $share->getShareOwner()); + $this->assertSame($initiator, $share->getSharedBy()); + $this->assertSame('secrettoken', $share->getToken()); + $this->assertSame('password', $share->getPassword()); + $this->assertSame(null, $share->getSharedWith()); + } + + /** + * @expectedException \OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByTokenNotFound() { + $this->provider->getShareByToken('invalidtoken'); + } + + public function testGetSharedWithUser() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id = $qb->getLastInsertId(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith2'), + 'uid_owner' => $qb->expr()->literal('shareOwner2'), + 'uid_initiator' => $qb->expr()->literal('sharedBy2'), + 'item_type' => $qb->expr()->literal('file2'), + 'file_source' => $qb->expr()->literal(43), + 'file_target' => $qb->expr()->literal('myTarget2'), + 'permissions' => $qb->expr()->literal(14), + ]); + $this->assertEquals(1, $qb->execute()); + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('sharedWith'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['sharedWith', $user], + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + + $file = $this->getMock('\OCP\Files\File'); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getSharedWith($user, \OCP\Share::SHARE_TYPE_USER, 1 , 0); + $this->assertCount(1, $share); + + $share = $share[0]; + $this->assertEquals($id, $share->getId()); + $this->assertEquals($user, $share->getSharedWith()); + $this->assertEquals($owner, $share->getShareOwner()); + $this->assertEquals($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + } + + public function testGetSharedWithGroup() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner2'), + 'uid_initiator' => $qb->expr()->literal('sharedBy2'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(43), + 'file_target' => $qb->expr()->literal('myTarget2'), + 'permissions' => $qb->expr()->literal(14), + ]); + $this->assertEquals(1, $qb->execute()); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id = $qb->getLastInsertId(); + + $groups = []; + foreach(range(0, 100) as $i) { + $group = $this->getMock('\OCP\IGroup'); + $group->method('getGID')->willReturn('group'.$i); + $groups[] = $group; + } + + $group = $this->getMock('\OCP\IGroup'); + $group->method('getGID')->willReturn('sharedWith'); + $groups[] = $group; + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('sharedWith'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + $this->groupManager->method('getUserGroups')->with($user)->willReturn($groups); + $this->groupManager->method('get')->with('sharedWith')->willReturn($group); + + $file = $this->getMock('\OCP\Files\File'); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getSharedWith($user, \OCP\Share::SHARE_TYPE_GROUP, 20 , 1); + $this->assertCount(1, $share); + + $share = $share[0]; + $this->assertEquals($id, $share->getId()); + $this->assertEquals($group, $share->getSharedWith()); + $this->assertEquals($owner, $share->getShareOwner()); + $this->assertEquals($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_GROUP, $share->getShareType()); + } + + public function testGetSharedWithGroupUserModified() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id = $qb->getLastInsertId(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(2), + 'share_with' => $qb->expr()->literal('user'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('userTarget'), + 'permissions' => $qb->expr()->literal(0), + 'parent' => $qb->expr()->literal($id), + ]); + $this->assertEquals(1, $qb->execute()); + + $group = $this->getMock('\OCP\IGroup'); + $group->method('getGID')->willReturn('sharedWith'); + $groups = [$group]; + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('user'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + $this->groupManager->method('getUserGroups')->with($user)->willReturn($groups); + $this->groupManager->method('get')->with('sharedWith')->willReturn($group); + + $file = $this->getMock('\OCP\Files\File'); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getSharedWith($user, \OCP\Share::SHARE_TYPE_GROUP, -1, 0); + $this->assertCount(1, $share); + + $share = $share[0]; + $this->assertEquals($id, $share->getId()); + $this->assertEquals($group, $share->getSharedWith()); + $this->assertEquals($owner, $share->getShareOwner()); + $this->assertEquals($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_GROUP, $share->getShareType()); + $this->assertEquals(0, $share->getPermissions()); + $this->assertEquals('userTarget', $share->getTarget()); + } + + public function testGetSharesBy() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id = $qb->getLastInsertId(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy2'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('userTarget'), + 'permissions' => $qb->expr()->literal(0), + 'parent' => $qb->expr()->literal($id), + ]); + $this->assertEquals(1, $qb->execute()); + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('sharedWith'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['sharedWith', $user], + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + + $file = $this->getMock('\OCP\Files\File'); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getSharesBy($initiator, \OCP\Share::SHARE_TYPE_USER, null, false, 1, 0); + $this->assertCount(1, $share); + + $share = $share[0]; + $this->assertEquals($id, $share->getId()); + $this->assertEquals($user, $share->getSharedWith()); + $this->assertEquals($owner, $share->getShareOwner()); + $this->assertEquals($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals('myTarget', $share->getTarget()); + } + + public function testGetSharesNode() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id = $qb->getLastInsertId(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(43), + 'file_target' => $qb->expr()->literal('userTarget'), + 'permissions' => $qb->expr()->literal(0), + 'parent' => $qb->expr()->literal($id), + ]); + $this->assertEquals(1, $qb->execute()); + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('sharedWith'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['sharedWith', $user], + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + + $file = $this->getMock('\OCP\Files\File'); + $file->method('getId')->willReturn(42); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $share = $this->provider->getSharesBy($initiator, \OCP\Share::SHARE_TYPE_USER, $file, false, 1, 0); + $this->assertCount(1, $share); + + $share = $share[0]; + $this->assertEquals($id, $share->getId()); + $this->assertEquals($user, $share->getSharedWith()); + $this->assertEquals($owner, $share->getShareOwner()); + $this->assertEquals($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals('myTarget', $share->getTarget()); + } + + public function testGetSharesReshare() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('shareOwner'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('myTarget'), + 'permissions' => $qb->expr()->literal(13), + ]); + $this->assertEquals(1, $qb->execute()); + $id1 = $qb->getLastInsertId(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('shareOwner'), + 'uid_initiator' => $qb->expr()->literal('sharedBy'), + 'item_type' => $qb->expr()->literal('file'), + 'file_source' => $qb->expr()->literal(42), + 'file_target' => $qb->expr()->literal('userTarget'), + 'permissions' => $qb->expr()->literal(0), + ]); + $this->assertEquals(1, $qb->execute()); + $id2 = $qb->getLastInsertId(); + + $user = $this->getMock('\OCP\IUser'); + $user->method('getUID')->willReturn('sharedWith'); + $owner = $this->getMock('\OCP\IUser'); + $owner->method('getUID')->willReturn('shareOwner'); + $initiator = $this->getMock('\OCP\IUser'); + $initiator->method('getUID')->willReturn('sharedBy'); + + $this->userManager->method('get')->willReturnMap([ + ['sharedWith', $user], + ['shareOwner', $owner], + ['sharedBy', $initiator], + ]); + + $file = $this->getMock('\OCP\Files\File'); + $file->method('getId')->willReturn(42); + $this->rootFolder->method('getUserFolder')->with('shareOwner')->will($this->returnSelf()); + $this->rootFolder->method('getById')->with(42)->willReturn([$file]); + + $shares = $this->provider->getSharesBy($owner, \OCP\Share::SHARE_TYPE_USER, null, true, -1, 0); + $this->assertCount(2, $shares); + + $share = $shares[0]; + $this->assertEquals($id1, $share->getId()); + $this->assertSame($user, $share->getSharedWith()); + $this->assertSame($owner, $share->getShareOwner()); + $this->assertSame($owner, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals('myTarget', $share->getTarget()); + + $share = $shares[1]; + $this->assertEquals($id2, $share->getId()); + $this->assertSame($user, $share->getSharedWith()); + $this->assertSame($owner, $share->getShareOwner()); + $this->assertSame($initiator, $share->getSharedBy()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals(0, $share->getPermissions()); + $this->assertEquals('userTarget', $share->getTarget()); + } } diff --git a/tests/lib/share20/managertest.php b/tests/lib/share20/managertest.php index bfee9c39593..28303d3152f 100644 --- a/tests/lib/share20/managertest.php +++ b/tests/lib/share20/managertest.php @@ -86,7 +86,7 @@ class ManagerTest extends \Test\TestCase { return vsprintf($text, $parameters); })); - $this->factory = new DummyFactory(); + $this->factory = new DummyFactory(\OC::$server); $this->manager = new Manager( $this->logger, @@ -1478,6 +1478,71 @@ class ManagerTest extends \Test\TestCase { $manager->createShare($share); } + + public function testGetShareByToken() { + $factory = $this->getMock('\OC\Share20\IProviderFactory'); + + $manager = new Manager( + $this->logger, + $this->config, + $this->secureRandom, + $this->hasher, + $this->mountManager, + $this->groupManager, + $this->l, + $factory + ); + + $share = $this->getMock('\OC\Share20\IShare'); + + $factory->expects($this->once()) + ->method('getProviderForType') + ->with(\OCP\Share::SHARE_TYPE_LINK) + ->willReturn($this->defaultProvider); + + $this->defaultProvider->expects($this->once()) + ->method('getShareByToken') + ->with('token') + ->willReturn($share); + + $ret = $manager->getShareByToken('token'); + $this->assertSame($share, $ret); + } + + public function testCheckPasswordNoLinkShare() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_USER); + $this->assertFalse($this->manager->checkPassword($share, 'password')); + } + + public function testCheckPasswordNoPassword() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK); + $this->assertFalse($this->manager->checkPassword($share, 'password')); + + $share->method('getPassword')->willReturn('password'); + $this->assertFalse($this->manager->checkPassword($share, null)); + } + + public function testCheckPasswordInvalidPassword() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK); + $share->method('getPassword')->willReturn('password'); + + $this->hasher->method('verify')->with('invalidpassword', 'password', '')->willReturn(false); + + $this->assertFalse($this->manager->checkPassword($share, 'invalidpassword')); + } + + public function testCheckPasswordValidPassword() { + $share = $this->getMock('\OC\Share20\IShare'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK); + $share->method('getPassword')->willReturn('passwordHash'); + + $this->hasher->method('verify')->with('password', 'passwordHash', '')->willReturn(true); + + $this->assertTrue($this->manager->checkPassword($share, 'password')); + } } class DummyPassword { @@ -1499,6 +1564,10 @@ class DummyFactory implements IProviderFactory { /** @var IShareProvider */ private $provider; + public function __construct(\OCP\IServerContainer $serverContainer) { + + } + /** * @param IShareProvider $provider */ diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php index 1f613edc4e6..a8d688d9c88 100644 --- a/tests/lib/user/user.php +++ b/tests/lib/user/user.php @@ -342,7 +342,8 @@ class User extends \Test\TestCase { $backend->expects($this->once()) ->method('setDisplayName') - ->with('foo','Foo'); + ->with('foo','Foo') + ->willReturn(true); $user = new \OC\User\User('foo', $backend); $this->assertTrue($user->setDisplayName('Foo')); diff --git a/tests/settings/controller/EncryptionControllerTest.php b/tests/settings/controller/EncryptionControllerTest.php index 2446b8c7b9e..a3bb4c45a27 100644 --- a/tests/settings/controller/EncryptionControllerTest.php +++ b/tests/settings/controller/EncryptionControllerTest.php @@ -90,6 +90,9 @@ class EncryptionControllerTest extends TestCase { } public function testStartMigrationSuccessful() { + // we need to be able to autoload the class we're mocking + \OC::$loader->addValidRoot(\OC_App::getAppPath('encryption')); + $migration = $this->getMockBuilder('\\OCA\\Encryption\\Migration') ->disableOriginalConstructor()->getMock(); $this->encryptionController diff --git a/tests/settings/controller/userscontrollertest.php b/tests/settings/controller/userscontrollertest.php index e1e3c4d4b6b..38fc1ee6102 100644 --- a/tests/settings/controller/userscontrollertest.php +++ b/tests/settings/controller/userscontrollertest.php @@ -1679,11 +1679,11 @@ class UsersControllerTest extends \Test\TestCase { */ public function setEmailAddressData() { return [ - /* mailAddress, isValid, expectsUpdate, expectsDelete, canChangeDisplayName, responseCode */ - [ '', true, false, true, true, Http::STATUS_OK ], - [ 'foo@local', true, true, false, true, Http::STATUS_OK], - [ 'foo@bar@local', false, false, false, true, Http::STATUS_UNPROCESSABLE_ENTITY], - [ 'foo@local', true, false, false, false, Http::STATUS_FORBIDDEN], + /* mailAddress, isValid, expectsUpdate, canChangeDisplayName, responseCode */ + [ '', true, true, true, Http::STATUS_OK ], + [ 'foo@local', true, true, true, Http::STATUS_OK], + [ 'foo@bar@local', false, false, true, Http::STATUS_UNPROCESSABLE_ENTITY], + [ 'foo@local', true, false, false, Http::STATUS_FORBIDDEN], ]; } @@ -1695,7 +1695,7 @@ class UsersControllerTest extends \Test\TestCase { * @param bool $expectsUpdate * @param bool $expectsDelete */ - public function testSetEmailAddress($mailAddress, $isValid, $expectsUpdate, $expectsDelete, $canChangeDisplayName, $responseCode) { + public function testSetEmailAddress($mailAddress, $isValid, $expectsUpdate, $canChangeDisplayName, $responseCode) { $this->container['IsAdmin'] = true; $user = $this->getMockBuilder('\OC\User\User') @@ -1708,6 +1708,13 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->any()) ->method('canChangeDisplayName') ->will($this->returnValue($canChangeDisplayName)); + $user + ->expects($expectsUpdate ? $this->once() : $this->never()) + ->method('setEMailAddress') + ->with( + $this->equalTo($mailAddress) + ); + $this->container['UserSession'] ->expects($this->atLeastOnce()) ->method('getUser') @@ -1730,26 +1737,6 @@ class UsersControllerTest extends \Test\TestCase { ->will($this->returnValue($user)); } - $this->container['Config'] - ->expects(($expectsUpdate) ? $this->once() : $this->never()) - ->method('setUserValue') - ->with( - $this->equalTo($user->getUID()), - $this->equalTo('settings'), - $this->equalTo('email'), - $this->equalTo($mailAddress) - - ); - $this->container['Config'] - ->expects(($expectsDelete) ? $this->once() : $this->never()) - ->method('deleteUserValue') - ->with( - $this->equalTo($user->getUID()), - $this->equalTo('settings'), - $this->equalTo('email') - - ); - $response = $this->container['UsersController']->setMailAddress($user->getUID(), $mailAddress); $this->assertSame($responseCode, $response->getStatus()); diff --git a/version.php b/version.php index 5fdb132421e..a82e4ad1c0f 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(9, 0, 0, 6); +$OC_Version = array(9, 0, 0, 7); // The human readable string $OC_VersionString = '9.0 pre alpha'; |