diff options
215 files changed, 2907 insertions, 1022 deletions
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index 04344e83fde..8dea6684742 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -48,7 +48,7 @@ $principalBackend = new Principal( 'principals/' ); $db = \OC::$server->getDatabaseConnection(); -$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager()); +$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager(), \OC::$server->getEventDispatcher()); $debugging = \OC::$server->getConfig()->getSystemValue('debug', false); @@ -81,7 +81,7 @@ if ($debugging) { $server->addPlugin(new \Sabre\DAV\Sync\Plugin()); $server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin()); -$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(\OC::$server->getLogger())); +$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(new \OCA\DAV\CardDAV\PhotoCache(\OC::$server->getAppDataDir('dav-photocache')))); $server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger())); // And off we go! diff --git a/apps/dav/l10n/pt_BR.js b/apps/dav/l10n/pt_BR.js index 731bc73c782..bafe878a8d7 100644 --- a/apps/dav/l10n/pt_BR.js +++ b/apps/dav/l10n/pt_BR.js @@ -4,7 +4,7 @@ OC.L10N.register( "Calendar" : "Calendário", "Todos" : "Tarefas", "{actor} created calendar {calendar}" : "{actor} criou o calendário {calendar}", - "You created calendar {calendar}" : "Voce criou o calendário {calendar}", + "You created calendar {calendar}" : "Você criou o calendário {calendar}", "{actor} deleted calendar {calendar}" : "{actor} excluiu o calendário {calendar}", "You deleted calendar {calendar}" : "Você excluiu o calendário {calendar}", "{actor} updated calendar {calendar}" : "{actor} atualizou o calendário {calendar}", diff --git a/apps/dav/l10n/pt_BR.json b/apps/dav/l10n/pt_BR.json index 75efd572620..d434ef77752 100644 --- a/apps/dav/l10n/pt_BR.json +++ b/apps/dav/l10n/pt_BR.json @@ -2,7 +2,7 @@ "Calendar" : "Calendário", "Todos" : "Tarefas", "{actor} created calendar {calendar}" : "{actor} criou o calendário {calendar}", - "You created calendar {calendar}" : "Voce criou o calendário {calendar}", + "You created calendar {calendar}" : "Você criou o calendário {calendar}", "{actor} deleted calendar {calendar}" : "{actor} excluiu o calendário {calendar}", "You deleted calendar {calendar}" : "Você excluiu o calendário {calendar}", "{actor} updated calendar {calendar}" : "{actor} atualizou o calendário {calendar}", diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index b4f16f3cadf..5d89324d4a9 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -24,11 +24,13 @@ */ namespace OCA\DAV\AppInfo; +use OC\AppFramework\Utility\SimpleContainer; use OCA\DAV\CalDAV\Activity\Backend; use OCA\DAV\CalDAV\Activity\Provider\Event; use OCA\DAV\CalDAV\BirthdayService; use OCA\DAV\Capabilities; use OCA\DAV\CardDAV\ContactsManager; +use OCA\DAV\CardDAV\PhotoCache; use OCA\DAV\CardDAV\SyncService; use OCA\DAV\HookManager; use \OCP\AppFramework\App; @@ -44,10 +46,19 @@ class Application extends App { public function __construct() { parent::__construct('dav'); + $container = $this->getContainer(); + $server = $container->getServer(); + + $container->registerService(PhotoCache::class, function(SimpleContainer $s) use ($server) { + return new PhotoCache( + $server->getAppDataDir('dav-photocache') + ); + }); + /* * Register capabilities */ - $this->getContainer()->registerCapability(Capabilities::class); + $container->registerCapability(Capabilities::class); } /** @@ -101,6 +112,19 @@ class Application extends App { } }); + $clearPhotoCache = function($event) { + if ($event instanceof GenericEvent) { + /** @var PhotoCache $p */ + $p = $this->getContainer()->query(PhotoCache::class); + $p->delete( + $event->getArgument('addressBookId'), + $event->getArgument('cardUri') + ); + } + }; + $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $clearPhotoCache); + $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $clearPhotoCache); + $dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) { $user = $event->getSubject(); $syncService = $this->getContainer()->query(SyncService::class); diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php index a216e4e078b..9c56398b14c 100644 --- a/apps/dav/lib/CalDAV/Calendar.php +++ b/apps/dav/lib/CalDAV/Calendar.php @@ -145,11 +145,16 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable { ]; } - if ($this->isShared()) { + $acl = $this->caldavBackend->applyShareAcl($this->getResourceId(), $acl); + + if (!$this->isShared()) { return $acl; } - return $this->caldavBackend->applyShareAcl($this->getResourceId(), $acl); + $allowedPrincipals = [$this->getOwner(), parent::getOwner(), 'principals/system/public']; + return array_filter($acl, function($rule) use ($allowedPrincipals) { + return in_array($rule['principal'], $allowedPrincipals); + }); } public function getChildACL() { diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 5deb648fa7f..983220c6ba0 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -93,7 +93,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { public function __construct(IDBConnection $db, Principal $principalBackend, IUserManager $userManager, - EventDispatcherInterface $dispatcher = null) { + EventDispatcherInterface $dispatcher) { $this->db = $db; $this->principalBackend = $principalBackend; $this->userManager = $userManager; @@ -612,13 +612,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 1); $this->updateProperties($addressBookId, $cardUri, $cardData); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::createCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri, - 'cardData' => $cardData])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::createCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri, + 'cardData' => $cardData])); return '"' . $etag . '"'; } @@ -664,13 +662,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 2); $this->updateProperties($addressBookId, $cardUri, $cardData); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::updateCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri, - 'cardData' => $cardData])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::updateCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri, + 'cardData' => $cardData])); return '"' . $etag . '"'; } @@ -696,12 +692,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 3); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri])); if ($ret === 1) { if ($cardId !== null) { diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php index 3ad7983451b..747c879ecd4 100644 --- a/apps/dav/lib/CardDAV/ImageExportPlugin.php +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -22,25 +22,28 @@ namespace OCA\DAV\CardDAV; +use OCP\Files\NotFoundException; use OCP\ILogger; use Sabre\CardDAV\Card; use Sabre\DAV\Server; use Sabre\DAV\ServerPlugin; use Sabre\HTTP\RequestInterface; use Sabre\HTTP\ResponseInterface; -use Sabre\VObject\Parameter; -use Sabre\VObject\Property\Binary; -use Sabre\VObject\Reader; class ImageExportPlugin extends ServerPlugin { /** @var Server */ protected $server; - /** @var ILogger */ - private $logger; + /** @var PhotoCache */ + private $cache; - public function __construct(ILogger $logger) { - $this->logger = $logger; + /** + * ImageExportPlugin constructor. + * + * @param PhotoCache $cache + */ + public function __construct(PhotoCache $cache) { + $this->cache = $cache; } /** @@ -49,8 +52,7 @@ class ImageExportPlugin extends ServerPlugin { * @param Server $server * @return void */ - function initialize(Server $server) { - + public function initialize(Server $server) { $this->server = $server; $this->server->on('method:GET', [$this, 'httpGet'], 90); } @@ -60,9 +62,9 @@ class ImageExportPlugin extends ServerPlugin { * * @param RequestInterface $request * @param ResponseInterface $response - * @return bool|void + * @return bool */ - function httpGet(RequestInterface $request, ResponseInterface $response) { + public function httpGet(RequestInterface $request, ResponseInterface $response) { $queryParams = $request->getQueryParameters(); // TODO: in addition to photo we should also add logo some point in time @@ -70,6 +72,8 @@ class ImageExportPlugin extends ServerPlugin { return true; } + $size = isset($queryParams['size']) ? (int)$queryParams['size'] : -1; + $path = $request->getPath(); $node = $this->server->tree->getNodeForPath($path); @@ -85,90 +89,28 @@ class ImageExportPlugin extends ServerPlugin { $aclPlugin->checkPrivileges($path, '{DAV:}read'); } - if ($result = $this->getPhoto($node)) { - // Allow caching - $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); - $response->setHeader('Etag', $node->getETag() ); - $response->setHeader('Pragma', 'public'); + // Fetch addressbook + $addressbookpath = explode('/', $path); + array_pop($addressbookpath); + $addressbookpath = implode('/', $addressbookpath); + /** @var AddressBook $addressbook */ + $addressbook = $this->server->tree->getNodeForPath($addressbookpath); - $response->setHeader('Content-Type', $result['Content-Type']); + $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); + $response->setHeader('Etag', $node->getETag() ); + $response->setHeader('Pragma', 'public'); + + try { + $file = $this->cache->get($addressbook->getResourceId(), $node->getName(), $size, $node); + $response->setHeader('Content-Type', $file->getMimeType()); $response->setHeader('Content-Disposition', 'attachment'); $response->setStatus(200); - $response->setBody($result['body']); - - // Returning false to break the event chain - return false; + $response->setBody($file->getContent()); + } catch (NotFoundException $e) { + $response->setStatus(404); } - return true; - } - function getPhoto(Card $node) { - // TODO: this is kind of expensive - load carddav data from database and parse it - // we might want to build up a cache one day - try { - $vObject = $this->readCard($node->get()); - if (!$vObject->PHOTO) { - return false; - } - - $photo = $vObject->PHOTO; - $type = $this->getType($photo); - - $val = $photo->getValue(); - if ($photo->getValueType() === 'URI') { - $parsed = \Sabre\URI\parse($val); - //only allow data:// - if ($parsed['scheme'] !== 'data') { - return false; - } - if (substr_count($parsed['path'], ';') === 1) { - list($type,) = explode(';', $parsed['path']); - } - $val = file_get_contents($val); - } - - $allowedContentTypes = [ - 'image/png', - 'image/jpeg', - 'image/gif', - ]; - - if(!in_array($type, $allowedContentTypes, true)) { - $type = 'application/octet-stream'; - } - - return [ - 'Content-Type' => $type, - 'body' => $val - ]; - } catch(\Exception $ex) { - $this->logger->logException($ex); - } return false; } - - private function readCard($cardData) { - return Reader::read($cardData); - } - - /** - * @param Binary $photo - * @return Parameter - */ - private function getType($photo) { - $params = $photo->parameters(); - if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) { - /** @var Parameter $typeParam */ - $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE']; - $type = $typeParam->getValue(); - - if (strpos($type, 'image/') === 0) { - return $type; - } else { - return 'image/' . strtolower($type); - } - } - return ''; - } } diff --git a/apps/dav/lib/CardDAV/PhotoCache.php b/apps/dav/lib/CardDAV/PhotoCache.php new file mode 100644 index 00000000000..c9625914263 --- /dev/null +++ b/apps/dav/lib/CardDAV/PhotoCache.php @@ -0,0 +1,246 @@ +<?php + +namespace OCA\DAV\CardDAV; + +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use Sabre\CardDAV\Card; +use Sabre\VObject\Property\Binary; +use Sabre\VObject\Reader; + +class PhotoCache { + + /** @var IAppData $appData */ + protected $appData; + + /** + * PhotoCache constructor. + * + * @param IAppData $appData + */ + public function __construct(IAppData $appData) { + $this->appData = $appData; + } + + /** + * @param int $addressBookId + * @param string $cardUri + * @param int $size + * @param Card $card + * + * @return ISimpleFile + * @throws NotFoundException + */ + public function get($addressBookId, $cardUri, $size, Card $card) { + $folder = $this->getFolder($addressBookId, $cardUri); + + if ($this->isEmpty($folder)) { + $this->init($folder, $card); + } + + if (!$this->hasPhoto($folder)) { + throw new NotFoundException(); + } + + if ($size !== -1) { + $size = 2 ** ceil(log($size) / log(2)); + } + + return $this->getFile($folder, $size); + } + + /** + * @param ISimpleFolder $folder + * @return bool + */ + private function isEmpty(ISimpleFolder $folder) { + return $folder->getDirectoryListing() === []; + } + + /** + * @param ISimpleFolder $folder + * @param Card $card + */ + private function init(ISimpleFolder $folder, Card $card) { + $data = $this->getPhoto($card); + + if ($data === false) { + $folder->newFile('nophoto'); + } else { + switch ($data['Content-Type']) { + case 'image/png': + $ext = 'png'; + break; + case 'image/jpeg': + $ext = 'jpg'; + break; + case 'image/gif': + $ext = 'gif'; + break; + } + $file = $folder->newFile('photo.' . $ext); + $file->putContent($data['body']); + } + } + + private function hasPhoto(ISimpleFolder $folder) { + return !$folder->fileExists('nophoto'); + } + + private function getFile(ISimpleFolder $folder, $size) { + $ext = $this->getExtension($folder); + + if ($size === -1) { + $path = 'photo.' . $ext; + } else { + $path = 'photo.' . $size . '.' . $ext; + } + + try { + $file = $folder->getFile($path); + } catch (NotFoundException $e) { + if ($size <= 0) { + throw new NotFoundException; + } + + $photo = new \OC_Image(); + /** @var ISimpleFile $file */ + $file = $folder->getFile('photo.' . $ext); + $photo->loadFromData($file->getContent()); + + $ratio = $photo->width() / $photo->height(); + if ($ratio < 1) { + $ratio = 1/$ratio; + } + $size = (int)($size * $ratio); + + if ($size !== -1) { + $photo->resize($size); + } + try { + $file = $folder->newFile($path); + $file->putContent($photo->data()); + } catch (NotPermittedException $e) { + + } + } + + return $file; + } + + + /** + * @param int $addressBookId + * @param string $cardUri + * @return ISimpleFolder + */ + private function getFolder($addressBookId, $cardUri) { + $hash = md5($addressBookId . ' ' . $cardUri); + try { + return $this->appData->getFolder($hash); + } catch (NotFoundException $e) { + return $this->appData->newFolder($hash); + } + } + + /** + * Get the extension of the avatar. If there is no avatar throw Exception + * + * @param ISimpleFolder $folder + * @return string + * @throws NotFoundException + */ + private function getExtension(ISimpleFolder $folder) { + if ($folder->fileExists('photo.jpg')) { + return 'jpg'; + } elseif ($folder->fileExists('photo.png')) { + return 'png'; + } elseif ($folder->fileExists('photo.gif')) { + return 'gif'; + } + throw new NotFoundException; + } + + private function getPhoto(Card $node) { + try { + $vObject = $this->readCard($node->get()); + if (!$vObject->PHOTO) { + return false; + } + + $photo = $vObject->PHOTO; + $type = $this->getType($photo); + + $val = $photo->getValue(); + if ($photo->getValueType() === 'URI') { + $parsed = \Sabre\URI\parse($val); + //only allow data:// + if ($parsed['scheme'] !== 'data') { + return false; + } + if (substr_count($parsed['path'], ';') === 1) { + list($type,) = explode(';', $parsed['path']); + } + $val = file_get_contents($val); + } + + $allowedContentTypes = [ + 'image/png', + 'image/jpeg', + 'image/gif', + ]; + + if(!in_array($type, $allowedContentTypes, true)) { + $type = 'application/octet-stream'; + } + + return [ + 'Content-Type' => $type, + 'body' => $val + ]; + } catch(\Exception $ex) { + + } + return false; + } + + /** + * @param string $cardData + * @return \Sabre\VObject\Document + */ + private function readCard($cardData) { + return Reader::read($cardData); + } + + /** + * @param Binary $photo + * @return string + */ + private function getType(Binary $photo) { + $params = $photo->parameters(); + if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) { + /** @var Parameter $typeParam */ + $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE']; + $type = $typeParam->getValue(); + + if (strpos($type, 'image/') === 0) { + return $type; + } else { + return 'image/' . strtolower($type); + } + } + return ''; + } + + /** + * @param int $addressBookId + * @param string $cardUri + */ + public function delete($addressBookId, $cardUri) { + $folder = $this->getFolder($addressBookId, $cardUri); + $folder->delete(); + } +} diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index 435f47ee561..cb5a2ab8123 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -30,9 +30,11 @@ */ namespace OCA\DAV\Connector\Sabre; +use OC\Files\View; use OCA\DAV\Connector\Sabre\Exception\Forbidden; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCP\Files\FileInfo; use OCP\Files\ForbiddenException; use OCP\Files\InvalidPathException; use OCP\Files\StorageNotAvailableException; @@ -76,7 +78,7 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node * @param ObjectTree|null $tree * @param \OCP\Share\IManager $shareManager */ - public function __construct($view, $info, $tree = null, $shareManager = null) { + public function __construct(View $view, FileInfo $info, $tree = null, $shareManager = null) { parent::__construct($view, $info, $shareManager); $this->tree = $tree; } diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 4c426dd1052..30eeaaacf63 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -343,6 +343,9 @@ class FilesPlugin extends ServerPlugin { $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) { return $node->getSize(); }); + $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) { + return $node->getFileInfo()->getMountPoint()->getMountType(); + }); } if ($node instanceof \OCA\DAV\Connector\Sabre\Node) { @@ -383,10 +386,6 @@ class FilesPlugin extends ServerPlugin { return $node->getSize(); }); } - - $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) { - return $node->getFileInfo()->getMountPoint()->getMountType(); - }); } /** diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php index 3e2204cf661..06933f53e76 100644 --- a/apps/dav/lib/Connector/Sabre/Node.php +++ b/apps/dav/lib/Connector/Sabre/Node.php @@ -34,7 +34,9 @@ namespace OCA\DAV\Connector\Sabre; use OC\Files\Mount\MoveableMount; +use OC\Files\View; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; +use OCP\Files\FileInfo; use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IManager; @@ -77,7 +79,7 @@ abstract class Node implements \Sabre\DAV\INode { * @param \OCP\Files\FileInfo $info * @param IManager $shareManager */ - public function __construct($view, $info, IManager $shareManager = null) { + public function __construct(View $view, FileInfo $info, IManager $shareManager = null) { $this->fileView = $view; $this->path = $this->fileView->getRelativePath($info->getPath()); $this->info = $info; diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 5b0715b0dad..df5b0ea05b6 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -30,6 +30,7 @@ namespace OCA\DAV; use OCA\DAV\CalDAV\Schedule\IMipPlugin; use OCA\DAV\CardDAV\ImageExportPlugin; +use OCA\DAV\CardDAV\PhotoCache; use OCA\DAV\Comments\CommentsPlugin; use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; @@ -137,7 +138,7 @@ class Server { // addressbook plugins $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); $this->server->addPlugin(new VCFExportPlugin()); - $this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger())); + $this->server->addPlugin(new ImageExportPlugin(new PhotoCache(\OC::$server->getAppDataDir('dav-photocache')))); // system tags plugins $this->server->addPlugin(new SystemTagPlugin( diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php index 4ede886d31e..cf295f01065 100644 --- a/apps/dav/tests/unit/CalDAV/CalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php @@ -246,6 +246,7 @@ class CalendarTest extends TestCase { ]); $backend->expects($this->any())->method('getCalendarObject') ->willReturn($calObject2)->with(666, 'event-2'); + $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1); $calendarInfo = [ 'principaluri' => 'user2', @@ -333,6 +334,7 @@ EOD; ]); $backend->expects($this->any())->method('getCalendarObject') ->willReturn($calObject1)->with(666, 'event-1'); + $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1); $calendarInfo = [ '{http://owncloud.org/ns}owner-principal' => $isShared ? 'user1' : 'user2', diff --git a/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php b/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php index 6b2bf58d392..03cbf71d6ca 100644 --- a/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php @@ -51,6 +51,7 @@ class PublicCalendarTest extends CalendarTest { ]); $backend->expects($this->any())->method('getCalendarObject') ->willReturn($calObject2)->with(666, 'event-2'); + $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1); $calendarInfo = [ '{http://owncloud.org/ns}owner-principal' => 'user2', @@ -135,6 +136,7 @@ EOD; ]); $backend->expects($this->any())->method('getCalendarObject') ->willReturn($calObject1)->with(666, 'event-1'); + $backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1); $calendarInfo = [ '{http://owncloud.org/ns}owner-principal' => 'user1', diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index c108432d65b..f3a271a2db2 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -34,9 +34,12 @@ use OCA\DAV\Connector\Sabre\Principal; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\IL10N; +use OCP\IUserManager; use Sabre\DAV\PropPatch; use Sabre\VObject\Component\VCard; use Sabre\VObject\Property\Text; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; use Test\TestCase; /** @@ -54,9 +57,12 @@ class CardDavBackendTest extends TestCase { /** @var Principal | \PHPUnit_Framework_MockObject_MockObject */ private $principal; - /** @var \OCP\IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ private $userManager; + /** @var EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $dispatcher; + /** @var IDBConnection */ private $db; @@ -73,9 +79,7 @@ class CardDavBackendTest extends TestCase { public function setUp() { parent::setUp(); - $this->userManager = $this->getMockBuilder('OCP\IUserManager') - ->disableOriginalConstructor() - ->getMock(); + $this->userManager = $this->createMock(IUserManager::class); $this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal') ->disableOriginalConstructor() ->setMethods(['getPrincipalByPath', 'getGroupMembership']) @@ -88,11 +92,11 @@ class CardDavBackendTest extends TestCase { $this->principal->method('getGroupMembership') ->withAnyParameters() ->willReturn([self::UNIT_TEST_GROUP]); + $this->dispatcher = $this->createMock(EventDispatcherInterface::class); $this->db = \OC::$server->getDatabaseConnection(); - $this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, null); - + $this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, $this->dispatcher); // start every test with a empty cards_properties and cards table $query = $this->db->getQueryBuilder(); $query->delete('cards_properties')->execute(); @@ -172,7 +176,7 @@ class CardDavBackendTest extends TestCase { /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties', 'purgeProperties'])->getMock(); // create a new address book @@ -185,6 +189,16 @@ class CardDavBackendTest extends TestCase { // updateProperties is expected twice, once for createCard and once for updateCard $backend->expects($this->at(0))->method('updateProperties')->with($bookId, $uri, ''); $backend->expects($this->at(1))->method('updateProperties')->with($bookId, $uri, '***'); + + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::createCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri && + $e->getArgument('cardData') === ''; + })); + // create a card $backend->createCard($bookId, $uri, ''); @@ -203,11 +217,28 @@ class CardDavBackendTest extends TestCase { $this->assertArrayHasKey('size', $card); $this->assertEquals('', $card['carddata']); + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri && + $e->getArgument('cardData') === '***'; + })); + // update the card $backend->updateCard($bookId, $uri, '***'); $card = $backend->getCard($bookId, $uri); $this->assertEquals('***', $card['carddata']); + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri; + })); + // delete the card $backend->expects($this->once())->method('purgeProperties')->with($bookId, $card['id']); $backend->deleteCard($bookId, $uri); @@ -218,7 +249,7 @@ class CardDavBackendTest extends TestCase { public function testMultiCard() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties'])->getMock(); // create a new address book @@ -264,7 +295,7 @@ class CardDavBackendTest extends TestCase { public function testDeleteWithoutCard() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods([ 'getCardId', 'addChange', @@ -304,7 +335,7 @@ class CardDavBackendTest extends TestCase { public function testSyncSupport() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties'])->getMock(); // create a new address book @@ -363,7 +394,7 @@ class CardDavBackendTest extends TestCase { $cardId = 2; $backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['getCardId'])->getMock(); $backend->expects($this->any())->method('getCardId')->willReturn($cardId); diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php index ed311e79f4a..e773e41ba5e 100644 --- a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php +++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php @@ -25,9 +25,13 @@ namespace OCA\DAV\Tests\unit\CardDAV; +use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\ImageExportPlugin; -use OCP\ILogger; +use OCA\DAV\CardDAV\PhotoCache; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; use Sabre\CardDAV\Card; +use Sabre\DAV\Node; use Sabre\DAV\Server; use Sabre\DAV\Tree; use Sabre\HTTP\RequestInterface; @@ -36,32 +40,32 @@ use Test\TestCase; class ImageExportPluginTest extends TestCase { - /** @var ResponseInterface | \PHPUnit_Framework_MockObject_MockObject */ + /** @var ResponseInterface|\PHPUnit_Framework_MockObject_MockObject */ private $response; - /** @var RequestInterface | \PHPUnit_Framework_MockObject_MockObject */ + /** @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject */ private $request; - /** @var ImageExportPlugin | \PHPUnit_Framework_MockObject_MockObject */ + /** @var ImageExportPlugin|\PHPUnit_Framework_MockObject_MockObject */ private $plugin; /** @var Server */ private $server; - /** @var Tree | \PHPUnit_Framework_MockObject_MockObject */ + /** @var Tree|\PHPUnit_Framework_MockObject_MockObject */ private $tree; - /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */ - private $logger; + /** @var PhotoCache|\PHPUnit_Framework_MockObject_MockObject */ + private $cache; function setUp() { parent::setUp(); - $this->request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')->getMock(); - $this->response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')->getMock(); - $this->server = $this->getMockBuilder('Sabre\DAV\Server')->getMock(); - $this->tree = $this->getMockBuilder('Sabre\DAV\Tree')->disableOriginalConstructor()->getMock(); + $this->request = $this->createMock(RequestInterface::class); + $this->response = $this->createMock(ResponseInterface::class); + $this->server = $this->createMock(Server::class); + $this->tree = $this->createMock(Tree::class); $this->server->tree = $this->tree; - $this->logger = $this->getMockBuilder('\OCP\ILogger')->getMock(); + $this->cache = $this->createMock(PhotoCache::class); - $this->plugin = $this->getMockBuilder('OCA\DAV\CardDAV\ImageExportPlugin') + $this->plugin = $this->getMockBuilder(ImageExportPlugin::class) ->setMethods(['getPhoto']) - ->setConstructorArgs([$this->logger]) + ->setConstructorArgs([$this->cache]) ->getMock(); $this->plugin->initialize($this->server); } @@ -84,126 +88,115 @@ class ImageExportPluginTest extends TestCase { ]; } - public function testNotACard() { - $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); - $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); - $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn(null); + public function testNoCard() { + $this->request->method('getQueryParameters') + ->willReturn([ + 'photo' + ]); + $this->request->method('getPath') + ->willReturn('user/book/card'); + + $node = $this->createMock(Node::class); + $this->tree->method('getNodeForPath') + ->with('user/book/card') + ->willReturn($node); + $result = $this->plugin->httpGet($this->request, $this->response); $this->assertTrue($result); } + public function dataTestCard() { + return [ + [null, false], + [null, true], + [32, false], + [32, true], + ]; + } + /** - * @dataProvider providesCardWithOrWithoutPhoto - * @param bool $expected - * @param array $getPhotoResult + * @dataProvider dataTestCard + * + * @param $size + * @param bool $photo */ - public function testCardWithOrWithoutPhoto($expected, $getPhotoResult) { - $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); - $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); + public function testCard($size, $photo) { + $query = ['photo' => null]; + if ($size !== null) { + $query['size'] = $size; + } + + $this->request->method('getQueryParameters') + ->willReturn($query); + $this->request->method('getPath') + ->willReturn('user/book/card'); - $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); + $card = $this->createMock(Card::class); $card->method('getETag') ->willReturn('"myEtag"'); - $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn($card); - - $this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult); - - if (!$expected) { - $this->response - ->expects($this->at(0)) - ->method('setHeader') - ->with('Cache-Control', 'private, max-age=3600, must-revalidate'); - $this->response - ->expects($this->at(1)) - ->method('setHeader') - ->with('Etag', '"myEtag"'); - $this->response - ->expects($this->at(2)) + $card->method('getName') + ->willReturn('card'); + $book = $this->createMock(AddressBook::class); + $book->method('getResourceId') + ->willReturn(1); + + $this->tree->method('getNodeForPath') + ->willReturnCallback(function($path) use ($card, $book) { + if ($path === 'user/book/card') { + return $card; + } else if ($path === 'user/book') { + return $book; + } + $this->fail(); + }); + + $this->response->expects($this->at(0)) + ->method('setHeader') + ->with('Cache-Control', 'private, max-age=3600, must-revalidate'); + $this->response->expects($this->at(1)) + ->method('setHeader') + ->with('Etag', '"myEtag"'); + $this->response->expects($this->at(2)) + ->method('setHeader') + ->with('Pragma', 'public'); + + $size = $size === null ? -1 : $size; + + if ($photo) { + $file = $this->createMock(ISimpleFile::class); + $file->method('getMimeType') + ->willReturn('imgtype'); + $file->method('getContent') + ->willReturn('imgdata'); + + $this->cache->method('get') + ->with(1, 'card', $size, $card) + ->willReturn($file); + + $this->response->expects($this->at(3)) ->method('setHeader') - ->with('Pragma', 'public'); - $this->response - ->expects($this->at(3)) - ->method('setHeader') - ->with('Content-Type', $getPhotoResult['Content-Type']); - $this->response - ->expects($this->at(4)) + ->with('Content-Type', 'imgtype'); + $this->response->expects($this->at(4)) ->method('setHeader') ->with('Content-Disposition', 'attachment'); - $this->response - ->expects($this->once()) - ->method('setStatus'); - $this->response - ->expects($this->once()) - ->method('setBody'); + + $this->response->expects($this->once()) + ->method('setStatus') + ->with(200); + $this->response->expects($this->once()) + ->method('setBody') + ->with('imgdata'); + + } else { + $this->cache->method('get') + ->with(1, 'card', $size, $card) + ->willThrowException(new NotFoundException()); + $this->response->expects($this->once()) + ->method('setStatus') + ->with(404); } $result = $this->plugin->httpGet($this->request, $this->response); - $this->assertEquals($expected, $result); - } - - public function providesCardWithOrWithoutPhoto() { - return [ - [true, null], - [false, ['Content-Type' => 'image/jpeg', 'body' => '1234']], - ]; - } - - /** - * @dataProvider providesPhotoData - * @param $expected - * @param $cardData - */ - public function testGetPhoto($expected, $cardData) { - /** @var Card | \PHPUnit_Framework_MockObject_MockObject $card */ - $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); - $card->expects($this->once())->method('get')->willReturn($cardData); - - $this->plugin = new ImageExportPlugin($this->logger); - $this->plugin->initialize($this->server); - - $result = $this->plugin->getPhoto($card); - $this->assertEquals($expected, $result); - } - - public function providesPhotoData() { - return [ - 'empty vcard' => [ - false, - '' - ], - 'vcard without PHOTO' => [ - false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n" - ], - 'vcard 3 with PHOTO' => [ - [ - 'Content-Type' => 'image/jpeg', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n" - ], - 'vcard 3 with PHOTO URL' => [ - false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO' => [ - [ - 'Content-Type' => 'image/jpeg', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO URL' => [ - false, - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO AND INVALID MIMEtYPE' => [ - [ - 'Content-Type' => 'application/octet-stream', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/svg;base64,MTIzNDU=\r\nEND:VCARD\r\n" - ], - ]; + $this->assertFalse($result); } } diff --git a/apps/encryption/l10n/pt_BR.js b/apps/encryption/l10n/pt_BR.js index e0954a6bc1f..4d768482881 100644 --- a/apps/encryption/l10n/pt_BR.js +++ b/apps/encryption/l10n/pt_BR.js @@ -29,11 +29,11 @@ OC.L10N.register( "Missing Signature" : "Assinatura faltante", "one-time password for server-side-encryption" : "senha de uso único para criptografia 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." : "Este arquivo não pode ser descriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "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 arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "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 '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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", + "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 '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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", "Cheers!" : "Saudações!", - "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 \"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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", + "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 \"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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encrypt the home storage" : "Criptografar a pasta de armazenamento home", diff --git a/apps/encryption/l10n/pt_BR.json b/apps/encryption/l10n/pt_BR.json index 85982d7769d..9cebb7d437e 100644 --- a/apps/encryption/l10n/pt_BR.json +++ b/apps/encryption/l10n/pt_BR.json @@ -27,11 +27,11 @@ "Missing Signature" : "Assinatura faltante", "one-time password for server-side-encryption" : "senha de uso único para criptografia 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." : "Este arquivo não pode ser descriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "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 arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "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 '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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", + "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 '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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", "Cheers!" : "Saudações!", - "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 \"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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", + "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 \"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 habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encrypt the home storage" : "Criptografar a pasta de armazenamento home", diff --git a/apps/federatedfilesharing/l10n/nb.js b/apps/federatedfilesharing/l10n/nb.js index f9b8907b49b..20edbf22fb3 100644 --- a/apps/federatedfilesharing/l10n/nb.js +++ b/apps/federatedfilesharing/l10n/nb.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky", "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "Open documentation" : "Åpne dokumentasjonen", + "Adjust how people can share between servers." : "Juster hvordan folk kan dele mellom tjenere.", "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne tjeneren sender delinger til andre tjenere", "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne tjeneren mottar delinger fra andre tjenere", "Search global and public address book for users and let local users publish their data" : "Søk i verdensomspennende og offentlig adressebok for brukere og la lokale brukere offentliggjøre deres data", "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker Nextcloud, ownCloud eller Pydio! Bare putt deres federerte sky-ID i delingsdialogvinduet. Det ser ut som person.sky.eksempel.no", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", + "Share it so your friends can share files with you:" : "Del den slik at venner kan dele filer med deg:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", diff --git a/apps/federatedfilesharing/l10n/nb.json b/apps/federatedfilesharing/l10n/nb.json index 4da7e25bfe7..711905c7d19 100644 --- a/apps/federatedfilesharing/l10n/nb.json +++ b/apps/federatedfilesharing/l10n/nb.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky", "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "Open documentation" : "Åpne dokumentasjonen", + "Adjust how people can share between servers." : "Juster hvordan folk kan dele mellom tjenere.", "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne tjeneren sender delinger til andre tjenere", "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne tjeneren mottar delinger fra andre tjenere", "Search global and public address book for users and let local users publish their data" : "Søk i verdensomspennende og offentlig adressebok for brukere og la lokale brukere offentliggjøre deres data", "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker Nextcloud, ownCloud eller Pydio! Bare putt deres federerte sky-ID i delingsdialogvinduet. Det ser ut som person.sky.eksempel.no", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", + "Share it so your friends can share files with you:" : "Del den slik at venner kan dele filer med deg:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", diff --git a/apps/federatedfilesharing/l10n/pt_BR.js b/apps/federatedfilesharing/l10n/pt_BR.js index 13d1b1641e3..eb83f18e8a8 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.js +++ b/apps/federatedfilesharing/l10n/pt_BR.js @@ -29,10 +29,10 @@ OC.L10N.register( "File is already shared with %s" : "O arquivo já é compartilhado com %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartilhamento %s falhou, não foi possível encontrar %s. Talvez o servidor esteja inacessível ou esteja sendo utilizado um certificado de auto-assinatura", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", - "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Voce recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", - "You received \"%3$s\" as a remote share from %1$s" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s", - "You received {share} as a remote share from {user}" : "Voce recebeu {share} como um compartilhamento remoto de {user}", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Você recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s", + "You received {share} as a remote share from {user}" : "Você recebeu {share} como um compartilhamento remoto de {user}", "Accept" : "Aceitar", "Decline" : "Rejeitar", "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud, veja %s", diff --git a/apps/federatedfilesharing/l10n/pt_BR.json b/apps/federatedfilesharing/l10n/pt_BR.json index 108c8f4fb25..f9e43729086 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.json +++ b/apps/federatedfilesharing/l10n/pt_BR.json @@ -27,10 +27,10 @@ "File is already shared with %s" : "O arquivo já é compartilhado com %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartilhamento %s falhou, não foi possível encontrar %s. Talvez o servidor esteja inacessível ou esteja sendo utilizado um certificado de auto-assinatura", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", - "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Voce recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", - "You received \"%3$s\" as a remote share from %1$s" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s", - "You received {share} as a remote share from {user}" : "Voce recebeu {share} como um compartilhamento remoto de {user}", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Você recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s", + "You received {share} as a remote share from {user}" : "Você recebeu {share} como um compartilhamento remoto de {user}", "Accept" : "Aceitar", "Decline" : "Rejeitar", "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud, veja %s", diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js index 4931870f4b1..961a085525a 100644 --- a/apps/federatedfilesharing/l10n/ru.js +++ b/apps/federatedfilesharing/l10n/ru.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ", "Federated Cloud Sharing" : "Федерация облачных хранилищ", "Open documentation" : "Открыть документацию", + "Adjust how people can share between servers." : "Настройте общий доступ между серверами.", "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", "Search global and public address book for users and let local users publish their data" : "Поиск пользователей в глобальной и общедоступной адресной книге и резрешение публикации своих данных локальным пользователям ", "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можно поделиться с любым пользователем Nextcloud, ownCloud или Pydio! Просто введите его идентификатор федеративного облачного хранилища в диалоге предоставления общего доступа. Идектификатор указывается в виде «person@cloud.example.com».", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", + "Share it so your friends can share files with you:" : "Сообщите его друзьям, что бы они могли поделиться с вами файлами:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", diff --git a/apps/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json index bfdf89b87f9..750703137ca 100644 --- a/apps/federatedfilesharing/l10n/ru.json +++ b/apps/federatedfilesharing/l10n/ru.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ", "Federated Cloud Sharing" : "Федерация облачных хранилищ", "Open documentation" : "Открыть документацию", + "Adjust how people can share between servers." : "Настройте общий доступ между серверами.", "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", "Search global and public address book for users and let local users publish their data" : "Поиск пользователей в глобальной и общедоступной адресной книге и резрешение публикации своих данных локальным пользователям ", "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можно поделиться с любым пользователем Nextcloud, ownCloud или Pydio! Просто введите его идентификатор федеративного облачного хранилища в диалоге предоставления общего доступа. Идектификатор указывается в виде «person@cloud.example.com».", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", + "Share it so your friends can share files with you:" : "Сообщите его друзьям, что бы они могли поделиться с вами файлами:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index db85caf65fa..187ede8c0bd 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -92,6 +92,12 @@ initialized: false, /** + * Wheater the file list was already shown once + * @type boolean + */ + shown: false, + + /** * Number of files per page * * @return {int} page size @@ -557,7 +563,10 @@ * Event handler when leaving previously hidden state */ _onShow: function(e) { - this.reload(); + if (this.shown) { + this.reload(); + } + this.shown = true; }, /** diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 718f1fba0f9..2b241a5e4bf 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -52,7 +52,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", - "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n escondidos"], + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"], "New" : "Nuevo", diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 9245d75fdd4..b68e2e3f096 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -50,7 +50,7 @@ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", - "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n escondidos"], + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"], "New" : "Nuevo", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 4a5a57eccd1..aea171dbf8b 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -69,6 +69,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", + "Copy direct link (only works for users who have access to this file/folder)" : "Copia link diretto (funziona solo per utenti che hanno accesso a questo file / cartella)", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", @@ -120,6 +121,7 @@ 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.", + "No favorites yet" : "Nessun preferito ancora", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Shared with you" : "Condivisi con te", "Shared with others" : "Condivisi con altri", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 1ee5b76efdf..b328763425d 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -67,6 +67,7 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", + "Copy direct link (only works for users who have access to this file/folder)" : "Copia link diretto (funziona solo per utenti che hanno accesso a questo file / cartella)", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", @@ -118,6 +119,7 @@ "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.", + "No favorites yet" : "Nessun preferito ancora", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Shared with you" : "Condivisi con te", "Shared with others" : "Condivisi con altri", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 0008e239b4f..9efb56cec1e 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -12,7 +12,7 @@ OC.L10N.register( "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", "Upload cancelled." : "Envio cancelado.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais", "Not enough free space" : "Espaço livre insuficiente", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 0a288976a10..f185237235c 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -10,7 +10,7 @@ "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", "Upload cancelled." : "Envio cancelado.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais", "Not enough free space" : "Espaço livre insuficiente", diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index 934aa054fb6..6b403e7fa85 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -1509,6 +1509,12 @@ describe('OCA.Files.FileList tests', function() { }); it('reloads the list when leaving hidden state', function() { var reloadStub = sinon.stub(fileList, 'reload'); + + // First show should not trigger + $('#app-content-files').trigger(new $.Event('show')); + expect(reloadStub.calledOnce).toEqual(false); + + // Second show should! $('#app-content-files').trigger(new $.Event('show')); expect(reloadStub.calledOnce).toEqual(true); reloadStub.restore(); diff --git a/apps/files_external/js/app.js b/apps/files_external/js/app.js index d3ce2010ecd..859a820f14c 100644 --- a/apps/files_external/js/app.js +++ b/apps/files_external/js/app.js @@ -35,7 +35,7 @@ OCA.External.App = { ); this._extendFileList(this.fileList); - this.fileList.appName = t('files_external', 'External storage'); + this.fileList.appName = t('files_external', 'External storages'); return this.fileList; }, @@ -111,4 +111,3 @@ $(document).ready(function() { } /* End Status Manager */ }); - diff --git a/apps/files_external/js/mountsfilelist.js b/apps/files_external/js/mountsfilelist.js index 35aef751fef..3beee6f73b2 100644 --- a/apps/files_external/js/mountsfilelist.js +++ b/apps/files_external/js/mountsfilelist.js @@ -28,7 +28,7 @@ FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, /** @lends OCA.External.FileList.prototype */ { - appName: 'External storage', + appName: 'External storages', /** * @private diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 3f3cc25b6c2..34e488e865d 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -40,13 +40,13 @@ OC.L10N.register( "Credentials saving failed" : "A gravação das credenciais falhou", "Credentials required" : "Credenciais são requeridas", "Storage with ID \"%d\" not found" : "A armazenagem com a ID \"%d\" não foi encontrada", - "Invalid backend or authentication mechanism class" : "Backend ou classe de mecanismo de autenticação inválido", + "Invalid backend or authentication mechanism class" : "Plataforma de serviço ou classe de mecanismo de autenticação inválido", "Invalid mount point" : "Ponto de montagem inválido", "Objectstore forbidden" : "Proibido armazenamento de objetos", - "Invalid storage backend \"%s\"" : "Backend de armazenamento \"%s\" inválido", - "Not permitted to use backend \"%s\"" : "Não é permitido o uso de backend \"%s\"", + "Invalid storage backend \"%s\"" : "Plataforma de serviço de armazenamento \"%s\" inválido", + "Not permitted to use backend \"%s\"" : "Não é permitido o uso da plataforma de serviço \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido usar o mecanismo de autenticação \"%s\"", - "Unsatisfied backend parameters" : "Parâmetros de backend não atendidos", + "Unsatisfied backend parameters" : "Parâmetros da plataforma de serviço não atendidos", "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -103,9 +103,9 @@ OC.L10N.register( "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 0475feb5d7b..7b8b9f7f14c 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -38,13 +38,13 @@ "Credentials saving failed" : "A gravação das credenciais falhou", "Credentials required" : "Credenciais são requeridas", "Storage with ID \"%d\" not found" : "A armazenagem com a ID \"%d\" não foi encontrada", - "Invalid backend or authentication mechanism class" : "Backend ou classe de mecanismo de autenticação inválido", + "Invalid backend or authentication mechanism class" : "Plataforma de serviço ou classe de mecanismo de autenticação inválido", "Invalid mount point" : "Ponto de montagem inválido", "Objectstore forbidden" : "Proibido armazenamento de objetos", - "Invalid storage backend \"%s\"" : "Backend de armazenamento \"%s\" inválido", - "Not permitted to use backend \"%s\"" : "Não é permitido o uso de backend \"%s\"", + "Invalid storage backend \"%s\"" : "Plataforma de serviço de armazenamento \"%s\" inválido", + "Not permitted to use backend \"%s\"" : "Não é permitido o uso da plataforma de serviço \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido usar o mecanismo de autenticação \"%s\"", - "Unsatisfied backend parameters" : "Parâmetros de backend não atendidos", + "Unsatisfied backend parameters" : "Parâmetros da plataforma de serviço não atendidos", "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -101,9 +101,9 @@ "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index bbd79994e39..e463a0d3c37 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -88,7 +88,7 @@ ?> <form data-can-create="<?php echo $canCreateMounts?'true':'false' ?>" id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>"> - <h2 data-anchor-name="external-storage"><?php p($l->t('External storage')); ?></h2> + <h2 data-anchor-name="external-storage"><?php p($l->t('External storages')); ?></h2> <?php if (isset($_['dependencies']) and ($_['dependencies']<>'') and $canCreateMounts) print_unescaped(''.$_['dependencies'].''); ?> <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'> <thead> diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js index c562b175b25..d81fb64acbb 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -45,7 +45,7 @@ OC.L10N.register( "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} expirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", - "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", + "You received a new remote share {file} from {user}" : "Você recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", @@ -56,12 +56,12 @@ OC.L10N.register( "Shared by {actor}" : "Compartilhado por {actor}", "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Você compartilhou {arquivo} com {user}", - "You removed {user} from {file}" : "Voce excluiu {user} de {file}", + "You removed {user} from {file}" : "Você excluiu {user} de {file}", "{actor} shared {file} with {user}" : "{actor} compartilhou {file} com {user}", "{actor} removed {user} from {file}" : "{actor} excluiu {user} de {file}", "{actor} shared {file} with you" : "{actor} compartilhou {file} com você", "{actor} removed you from {file}" : "{actor} excluiu você de {file}", - "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por e-mail ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", @@ -78,15 +78,15 @@ OC.L10N.register( "Public upload disabled by the administrator" : "O envio público foi desativado pelo administrador", "Public upload is only possible for publicly shared folders" : "O envio público só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser YYYY-MM-DD", - "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o serviço não permite ações de tipo %s", "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habilitado", "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", "Wrong or no update parameter given" : "O parâmetro da atualização fornecido está errado ou não existe", - "Can't change permissions for public share links" : "Não é possível alterar as permissões para links de compartilhamento público", - "Cannot increase permissions" : "Não é possível aumentar as permissões", + "Can't change permissions for public share links" : "Não foi possível alterar as permissões para links de compartilhamento público", + "Cannot increase permissions" : "Não foi possível aumentar as permissões", "%s is publicly shared" : "%s está compartilhado publicamente", "Share API is disabled" : "O compartilhamento de API está desabilitado.", "This share is password-protected" : "Este compartilhamento é protegido por senha", diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index 3d3d0ab784b..5fad4a144f8 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -43,7 +43,7 @@ "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} expirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", - "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", + "You received a new remote share {file} from {user}" : "Você recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", @@ -54,12 +54,12 @@ "Shared by {actor}" : "Compartilhado por {actor}", "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Você compartilhou {arquivo} com {user}", - "You removed {user} from {file}" : "Voce excluiu {user} de {file}", + "You removed {user} from {file}" : "Você excluiu {user} de {file}", "{actor} shared {file} with {user}" : "{actor} compartilhou {file} com {user}", "{actor} removed {user} from {file}" : "{actor} excluiu {user} de {file}", "{actor} shared {file} with you" : "{actor} compartilhou {file} com você", "{actor} removed you from {file}" : "{actor} excluiu você de {file}", - "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por e-mail ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", @@ -76,15 +76,15 @@ "Public upload disabled by the administrator" : "O envio público foi desativado pelo administrador", "Public upload is only possible for publicly shared folders" : "O envio público só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser YYYY-MM-DD", - "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o serviço não permite ações de tipo %s", "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habilitado", "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", "Wrong or no update parameter given" : "O parâmetro da atualização fornecido está errado ou não existe", - "Can't change permissions for public share links" : "Não é possível alterar as permissões para links de compartilhamento público", - "Cannot increase permissions" : "Não é possível aumentar as permissões", + "Can't change permissions for public share links" : "Não foi possível alterar as permissões para links de compartilhamento público", + "Cannot increase permissions" : "Não foi possível aumentar as permissões", "%s is publicly shared" : "%s está compartilhado publicamente", "Share API is disabled" : "O compartilhamento de API está desabilitado.", "This share is password-protected" : "Este compartilhamento é protegido por senha", diff --git a/apps/sharebymail/l10n/el.js b/apps/sharebymail/l10n/el.js index bcd7944b8ff..8d016e7b83b 100644 --- a/apps/sharebymail/l10n/el.js +++ b/apps/sharebymail/l10n/el.js @@ -5,6 +5,7 @@ OC.L10N.register( "Shared with {email}" : "Διαμοιράστηκε με {email}", "Shared with %1$s by %2$s" : "Διαμοιράστηκε με %1$s από %2$s", "Shared with {email} by {actor}" : "Διαμοιράστηκε με {email} από {actor}", + "Password for mail share sent to %1$s" : "Το συνθηματικό για το διαμοιρασμό μέσου ηλ. αλληλογραφίας έχει αποσταλλεί %1$s", "You shared %1$s with %2$s by mail" : "Διαμοιραστήκατε το %1$s με %2$s μέσω mail", "You shared {file} with {email} by mail" : "Διαμοιραστήκατε {file} με {email} μέσω mail", "%3$s shared %1$s with %2$s by mail" : "%3$s Διαμοιραστηκε %1$s με %2$s μέσω mail", diff --git a/apps/sharebymail/l10n/el.json b/apps/sharebymail/l10n/el.json index f5f4f5f88e6..7b6e88d93cc 100644 --- a/apps/sharebymail/l10n/el.json +++ b/apps/sharebymail/l10n/el.json @@ -3,6 +3,7 @@ "Shared with {email}" : "Διαμοιράστηκε με {email}", "Shared with %1$s by %2$s" : "Διαμοιράστηκε με %1$s από %2$s", "Shared with {email} by {actor}" : "Διαμοιράστηκε με {email} από {actor}", + "Password for mail share sent to %1$s" : "Το συνθηματικό για το διαμοιρασμό μέσου ηλ. αλληλογραφίας έχει αποσταλλεί %1$s", "You shared %1$s with %2$s by mail" : "Διαμοιραστήκατε το %1$s με %2$s μέσω mail", "You shared {file} with {email} by mail" : "Διαμοιραστήκατε {file} με {email} μέσω mail", "%3$s shared %1$s with %2$s by mail" : "%3$s Διαμοιραστηκε %1$s με %2$s μέσω mail", diff --git a/apps/sharebymail/l10n/es.js b/apps/sharebymail/l10n/es.js index e9ad5ec76ed..c03d4ea441a 100644 --- a/apps/sharebymail/l10n/es.js +++ b/apps/sharebymail/l10n/es.js @@ -5,11 +5,19 @@ OC.L10N.register( "Shared with {email}" : "Compartido con {email}", "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "Password for mail share sent to %1$s" : "Se ha enviado una contraseña para compartir por correo a %1$s", + "Password for mail share sent to {email}" : "Se ha enviado una contraseña para compartir por correo a {email}", + "Password for mail share sent to you" : "Se te ha enviado una contraseña para compartir por correo", "You shared %1$s with %2$s by mail" : "Has compartido %1$s con %2$s por correo", "You shared {file} with {email} by mail" : "Has compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s compartido %1$s con %2$s por correo", "{actor} shared {file} with {email} by mail" : "{actor} compartió {file} con {email} por correo electrónico", + "Password to access %1$s was sent to %2s" : "Se ha enviado a %2s una contraseña para acceder a %1$s ", + "Password to access {file} was sent to {email}" : "Se ha enviado a {email} una contraseña para acceder a {file}", + "Password to access %1$s was sent to you" : "Se te ha enviado una contraseña para acceder a %1$s", + "Password to access {file} was sent to you" : "Se te ha enviado una contraseña para acceder a {file}", "Sharing %s failed, this item is already shared with %s" : "Falló el compartir %s , este ítem ya se encontraba compartido con %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No podemos enviarte la contraseña autogenerada. Por favor, indica una dirección de correo electrónico válida en tu configuración personal y vuelve a intentarlo.", "Failed to send share by E-mail" : "Falló enviar recurso compartido por correo electrónico", "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", @@ -17,14 +25,20 @@ OC.L10N.register( "%s shared »%s« with you on behalf of %s." : "%s compartió »%s« con usted en nombre de %s.", "Click the button below to open it." : "Haga click en el botón debajo para abrirlo.", "Open »%s«" : "Abrir »%s«", + "%s via %s" : "%s por %s", "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", - "Password to access »%s«" : "Contraseña para acceder »%s«", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartió »%s« con usted. Debería haber recibido un mensaje de correo separado con un enlace para abrirlo.", + "Password to access »%s«" : "Contraseña para acceder »%s«", "It is protected with the following password: %s" : "Está protegido con la siguiente contraseña: %s", + "Password to access »%s« shared with %s" : "Se ha compartido con %s una contraseña para acceder a »%s«", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Usted acaba de compartir »%s« con %s. El recurso compartido ya fue enviado al destinatario. Debido a las reglas de seguridad definadas por el administrador de %s cada recurso compartido necesita ser protegido por una contraseña y no esta permitido que usted mande la contraseña directamente al destinatario. Por eso, usted necesita mandar la contraseña manualmente al destinatario.", + "This is the password: %s" : "Esta es la contraseña: %s", + "You can choose a different password at any time in the share dialog." : "Puedes elegir una contraseña diferente en cualquier momento en el diálogo de compartir.", "Could not find share" : "No se pudo encontrar el recurso compartido", "Share by mail" : "Enviado por correo electrónico", - "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite a los usuarios compartir un enlace personalizado a un archivo o carpeta enviándolo a una dirección de correo electrónico", "Send password by mail" : "Enviar contraseñas por email", + "Enforce password protection" : "Imponer la protección de contraseña", "Failed to create the E-mail" : "Falló crear el correo electrónico", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/es.json b/apps/sharebymail/l10n/es.json index 4e07a47d0ad..498c718e4d6 100644 --- a/apps/sharebymail/l10n/es.json +++ b/apps/sharebymail/l10n/es.json @@ -3,11 +3,19 @@ "Shared with {email}" : "Compartido con {email}", "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "Password for mail share sent to %1$s" : "Se ha enviado una contraseña para compartir por correo a %1$s", + "Password for mail share sent to {email}" : "Se ha enviado una contraseña para compartir por correo a {email}", + "Password for mail share sent to you" : "Se te ha enviado una contraseña para compartir por correo", "You shared %1$s with %2$s by mail" : "Has compartido %1$s con %2$s por correo", "You shared {file} with {email} by mail" : "Has compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s compartido %1$s con %2$s por correo", "{actor} shared {file} with {email} by mail" : "{actor} compartió {file} con {email} por correo electrónico", + "Password to access %1$s was sent to %2s" : "Se ha enviado a %2s una contraseña para acceder a %1$s ", + "Password to access {file} was sent to {email}" : "Se ha enviado a {email} una contraseña para acceder a {file}", + "Password to access %1$s was sent to you" : "Se te ha enviado una contraseña para acceder a %1$s", + "Password to access {file} was sent to you" : "Se te ha enviado una contraseña para acceder a {file}", "Sharing %s failed, this item is already shared with %s" : "Falló el compartir %s , este ítem ya se encontraba compartido con %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No podemos enviarte la contraseña autogenerada. Por favor, indica una dirección de correo electrónico válida en tu configuración personal y vuelve a intentarlo.", "Failed to send share by E-mail" : "Falló enviar recurso compartido por correo electrónico", "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", @@ -15,14 +23,20 @@ "%s shared »%s« with you on behalf of %s." : "%s compartió »%s« con usted en nombre de %s.", "Click the button below to open it." : "Haga click en el botón debajo para abrirlo.", "Open »%s«" : "Abrir »%s«", + "%s via %s" : "%s por %s", "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", - "Password to access »%s«" : "Contraseña para acceder »%s«", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartió »%s« con usted. Debería haber recibido un mensaje de correo separado con un enlace para abrirlo.", + "Password to access »%s«" : "Contraseña para acceder »%s«", "It is protected with the following password: %s" : "Está protegido con la siguiente contraseña: %s", + "Password to access »%s« shared with %s" : "Se ha compartido con %s una contraseña para acceder a »%s«", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Usted acaba de compartir »%s« con %s. El recurso compartido ya fue enviado al destinatario. Debido a las reglas de seguridad definadas por el administrador de %s cada recurso compartido necesita ser protegido por una contraseña y no esta permitido que usted mande la contraseña directamente al destinatario. Por eso, usted necesita mandar la contraseña manualmente al destinatario.", + "This is the password: %s" : "Esta es la contraseña: %s", + "You can choose a different password at any time in the share dialog." : "Puedes elegir una contraseña diferente en cualquier momento en el diálogo de compartir.", "Could not find share" : "No se pudo encontrar el recurso compartido", "Share by mail" : "Enviado por correo electrónico", - "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite a los usuarios compartir un enlace personalizado a un archivo o carpeta enviándolo a una dirección de correo electrónico", "Send password by mail" : "Enviar contraseñas por email", + "Enforce password protection" : "Imponer la protección de contraseña", "Failed to create the E-mail" : "Falló crear el correo electrónico", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/nl.js b/apps/sharebymail/l10n/nl.js index e62d1877980..97fb2e2b806 100644 --- a/apps/sharebymail/l10n/nl.js +++ b/apps/sharebymail/l10n/nl.js @@ -37,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Je kunt in de Delen-dialoog altijd een ander wachtwoord kiezen.", "Could not find share" : "Kon gedeeld niet vinden", "Share by mail" : "Gedeeld via een E-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Staat gebruikers toe om een gepersonaliseerde link of map te delen door een e-mailadres in te voegen.", "Send password by mail" : "Wachtwoord per E-mail verzenden", "Enforce password protection" : "Afdwingenwachtwoordbeveiliging", "Failed to create the E-mail" : "Opmaken van de e-mail is mislukt", diff --git a/apps/sharebymail/l10n/nl.json b/apps/sharebymail/l10n/nl.json index 429f57e4597..d6c8dffc795 100644 --- a/apps/sharebymail/l10n/nl.json +++ b/apps/sharebymail/l10n/nl.json @@ -35,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Je kunt in de Delen-dialoog altijd een ander wachtwoord kiezen.", "Could not find share" : "Kon gedeeld niet vinden", "Share by mail" : "Gedeeld via een E-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Staat gebruikers toe om een gepersonaliseerde link of map te delen door een e-mailadres in te voegen.", "Send password by mail" : "Wachtwoord per E-mail verzenden", "Enforce password protection" : "Afdwingenwachtwoordbeveiliging", "Failed to create the E-mail" : "Opmaken van de e-mail is mislukt", diff --git a/apps/sharebymail/l10n/pl.js b/apps/sharebymail/l10n/pl.js index c253f71d6a4..fc3059c5bd5 100644 --- a/apps/sharebymail/l10n/pl.js +++ b/apps/sharebymail/l10n/pl.js @@ -36,6 +36,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Możesz zmienić hasło w okienku współdzielenia w dowolnym momencie.", "Could not find share" : "Nie można odnaleźć współdzielonego obiektu", "Share by mail" : "Współdzielone e-mailem", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Umożliwia współdzielenie spersonalizowanego linku do pliku lub folderu, umieszczając go w wiadomości e-mail.", "Send password by mail" : "Wyślij hasło e-mailem", "Enforce password protection" : "Wymuś zabezpieczenie hasłem", "Failed to create the E-mail" : "Nie udało się utworzyć e-maila", diff --git a/apps/sharebymail/l10n/pl.json b/apps/sharebymail/l10n/pl.json index e8c9b080c6a..9d96dfa1117 100644 --- a/apps/sharebymail/l10n/pl.json +++ b/apps/sharebymail/l10n/pl.json @@ -34,6 +34,7 @@ "You can choose a different password at any time in the share dialog." : "Możesz zmienić hasło w okienku współdzielenia w dowolnym momencie.", "Could not find share" : "Nie można odnaleźć współdzielonego obiektu", "Share by mail" : "Współdzielone e-mailem", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Umożliwia współdzielenie spersonalizowanego linku do pliku lub folderu, umieszczając go w wiadomości e-mail.", "Send password by mail" : "Wyślij hasło e-mailem", "Enforce password protection" : "Wymuś zabezpieczenie hasłem", "Failed to create the E-mail" : "Nie udało się utworzyć e-maila", diff --git a/apps/sharebymail/l10n/pt_BR.js b/apps/sharebymail/l10n/pt_BR.js index edc96e08ef2..b7cf2a33e13 100644 --- a/apps/sharebymail/l10n/pt_BR.js +++ b/apps/sharebymail/l10n/pt_BR.js @@ -8,17 +8,17 @@ OC.L10N.register( "Password for mail share sent to %1$s" : "Senha para o correio compartilhado enviado para %1$s", "Password for mail share sent to {email}" : "Senha para o correio compartilhado enviado para {email}", "Password for mail share sent to you" : "Senha para o correio compartilhado enviado para você", - "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por email", - "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", - "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", - "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por e-mail", + "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por e-mail", + "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por e-mail", + "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por e-mail", "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", - "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", - "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um e-mail válido em sua configuração e tente novamente.", + "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por e-mail", "%s shared »%s« with you" : "%s compartilhou »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhou »%s« com você em nome de %s", "%s shared »%s« with you." : "%s compartilhou »%s« com você.", @@ -27,8 +27,8 @@ OC.L10N.register( "Open »%s«" : "Abrir »%s«", "%s via %s" : "%s via %s", "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", - "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um email com um link para acessá-lo.\n", - "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um email com um link para acessá-lo.", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um e-mail com um link para acessá-lo.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um e-mail com um link para acessá-lo.", "Password to access »%s«" : "Senha para acessar »%s«", "It is protected with the following password: %s" : "Está protegido com a seguinte senha: %s", "Password to access »%s« shared with %s" : "Senha para acessar »%s« compartilhado com %s", @@ -36,11 +36,11 @@ OC.L10N.register( "This is the password: %s" : "Essa é a senha: %s", "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "Share by mail" : "Compartilhamento por email", - "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", - "Send password by mail" : "Enviar senha por email", + "Share by mail" : "Compartilhamento por e-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", + "Send password by mail" : "Enviar senha por e-mail", "Enforce password protection" : "Reforce a proteção por senha", - "Failed to create the E-mail" : "Falhou ao criar o email", + "Failed to create the E-mail" : "Falhou ao criar o e-mail", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", "Cheers!" : "Saudações!", diff --git a/apps/sharebymail/l10n/pt_BR.json b/apps/sharebymail/l10n/pt_BR.json index 014f325a457..7b225bc7b11 100644 --- a/apps/sharebymail/l10n/pt_BR.json +++ b/apps/sharebymail/l10n/pt_BR.json @@ -6,17 +6,17 @@ "Password for mail share sent to %1$s" : "Senha para o correio compartilhado enviado para %1$s", "Password for mail share sent to {email}" : "Senha para o correio compartilhado enviado para {email}", "Password for mail share sent to you" : "Senha para o correio compartilhado enviado para você", - "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por email", - "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", - "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", - "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por e-mail", + "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por e-mail", + "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por e-mail", + "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por e-mail", "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", - "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", - "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um e-mail válido em sua configuração e tente novamente.", + "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por e-mail", "%s shared »%s« with you" : "%s compartilhou »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhou »%s« com você em nome de %s", "%s shared »%s« with you." : "%s compartilhou »%s« com você.", @@ -25,8 +25,8 @@ "Open »%s«" : "Abrir »%s«", "%s via %s" : "%s via %s", "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", - "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um email com um link para acessá-lo.\n", - "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um email com um link para acessá-lo.", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um e-mail com um link para acessá-lo.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um e-mail com um link para acessá-lo.", "Password to access »%s«" : "Senha para acessar »%s«", "It is protected with the following password: %s" : "Está protegido com a seguinte senha: %s", "Password to access »%s« shared with %s" : "Senha para acessar »%s« compartilhado com %s", @@ -34,11 +34,11 @@ "This is the password: %s" : "Essa é a senha: %s", "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "Share by mail" : "Compartilhamento por email", - "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", - "Send password by mail" : "Enviar senha por email", + "Share by mail" : "Compartilhamento por e-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", + "Send password by mail" : "Enviar senha por e-mail", "Enforce password protection" : "Reforce a proteção por senha", - "Failed to create the E-mail" : "Falhou ao criar o email", + "Failed to create the E-mail" : "Falhou ao criar o e-mail", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", "Cheers!" : "Saudações!", diff --git a/apps/sharebymail/l10n/ru.js b/apps/sharebymail/l10n/ru.js index c339c8a82a8..79cd6b68781 100644 --- a/apps/sharebymail/l10n/ru.js +++ b/apps/sharebymail/l10n/ru.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Вы предоставили общий доступ к {file} для {email} по email", "%3$s shared %1$s with %2$s by mail" : "%3$s предоставил общий доступ к %1$s для %2$s по email", "{actor} shared {file} with {email} by mail" : "{actor} предоставил общий доступ к {file} для {email} по email", + "Password to access %1$s was sent to %2s" : "Пароль для доступа к %1$s отправлен %2s", + "Password to access {file} was sent to {email}" : "Пароль для доступа к {file} отправлен {email}", + "Password to access %1$s was sent to you" : "Пароль для доступа к %1$s отправлен вам", + "Password to access {file} was sent to you" : "Пароль для доступа к {file} отправлен вам", "Sharing %s failed, this item is already shared with %s" : "Не удалось поделиться %s, к этому элементу уже предоставлен общий доступ для %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Не удаётся отправить вам автоматически созданный пароль. Укажите верный адрес email в своих личных настройках и попробуйте снова.", "Failed to send share by E-mail" : "Не удалось поделиться по e-mail", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой паорль в диалоге «Общий доступ».", "Could not find share" : "Не удалось найти общий ресурс", "Share by mail" : "Поделиться по почте", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Позволяет пользователям делиться персонализированной ссылкой на файл или каталог, введя адрес электронной почты.", "Send password by mail" : "Отправить пароль почтой", "Enforce password protection" : "Требовать защиту паролем", "Failed to create the E-mail" : "Не удалось создать e-mail", diff --git a/apps/sharebymail/l10n/ru.json b/apps/sharebymail/l10n/ru.json index 7e49354ab96..b541e33f98c 100644 --- a/apps/sharebymail/l10n/ru.json +++ b/apps/sharebymail/l10n/ru.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Вы предоставили общий доступ к {file} для {email} по email", "%3$s shared %1$s with %2$s by mail" : "%3$s предоставил общий доступ к %1$s для %2$s по email", "{actor} shared {file} with {email} by mail" : "{actor} предоставил общий доступ к {file} для {email} по email", + "Password to access %1$s was sent to %2s" : "Пароль для доступа к %1$s отправлен %2s", + "Password to access {file} was sent to {email}" : "Пароль для доступа к {file} отправлен {email}", + "Password to access %1$s was sent to you" : "Пароль для доступа к %1$s отправлен вам", + "Password to access {file} was sent to you" : "Пароль для доступа к {file} отправлен вам", "Sharing %s failed, this item is already shared with %s" : "Не удалось поделиться %s, к этому элементу уже предоставлен общий доступ для %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Не удаётся отправить вам автоматически созданный пароль. Укажите верный адрес email в своих личных настройках и попробуйте снова.", "Failed to send share by E-mail" : "Не удалось поделиться по e-mail", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой паорль в диалоге «Общий доступ».", "Could not find share" : "Не удалось найти общий ресурс", "Share by mail" : "Поделиться по почте", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Позволяет пользователям делиться персонализированной ссылкой на файл или каталог, введя адрес электронной почты.", "Send password by mail" : "Отправить пароль почтой", "Enforce password protection" : "Требовать защиту паролем", "Failed to create the E-mail" : "Не удалось создать e-mail", diff --git a/apps/systemtags/l10n/es.js b/apps/systemtags/l10n/es.js index b4527b90ee3..d380ab58271 100644 --- a/apps/systemtags/l10n/es.js +++ b/apps/systemtags/l10n/es.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "Se han modificado las <strong>etiquetas de sistema</strong> de un archivo", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crea y edita etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios.", + "Select tag …" : "Selecciona etiqueta...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/es.json b/apps/systemtags/l10n/es.json index 486e73ab5c5..51bb3668f6f 100644 --- a/apps/systemtags/l10n/es.json +++ b/apps/systemtags/l10n/es.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "Se han modificado las <strong>etiquetas de sistema</strong> de un archivo", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crea y edita etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios.", + "Select tag …" : "Selecciona etiqueta...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/ru.js b/apps/systemtags/l10n/ru.js index d32f7159dc0..f9dc271256d 100644 --- a/apps/systemtags/l10n/ru.js +++ b/apps/systemtags/l10n/ru.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (невидимые)", "<strong>System tags</strong> for a file have been modified" : "<strong>Системные метки</strong> файла были изменены", "Collaborative tags" : "Совместные метки", + "Create and edit collaborative tags. These tags affect all users." : "Создание и изменение меток совместной работы. Эти метки влияют на всех пользователей.", + "Select tag …" : "Выберите метку…", "Name" : "Имя", "Delete" : "Удалить", "Public" : "Открытый", diff --git a/apps/systemtags/l10n/ru.json b/apps/systemtags/l10n/ru.json index 84438433c52..47e123f28a6 100644 --- a/apps/systemtags/l10n/ru.json +++ b/apps/systemtags/l10n/ru.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (невидимые)", "<strong>System tags</strong> for a file have been modified" : "<strong>Системные метки</strong> файла были изменены", "Collaborative tags" : "Совместные метки", + "Create and edit collaborative tags. These tags affect all users." : "Создание и изменение меток совместной работы. Эти метки влияют на всех пользователей.", + "Select tag …" : "Выберите метку…", "Name" : "Имя", "Delete" : "Удалить", "Public" : "Открытый", diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css index 8cc3f0dfe14..e401d77e4b6 100644 --- a/apps/theming/css/settings-admin.css +++ b/apps/theming/css/settings-admin.css @@ -26,10 +26,20 @@ display: inline-block; visibility: hidden; } -#theming form .theme-undo { +form.uploadButton { + width: 356px; +} +#theming form .theme-undo, +#theming .theme-remove-bg { + cursor: pointer; + opacity: .3; + padding: 7px; + vertical-align: top; + display: inline-block; + float: right; position: relative; top: 4px; - left: 158px; + right: 0px; visibility: visible; } #theming input[type='text']:focus + .theme-undo, @@ -54,7 +64,8 @@ margin: 2px 0px; } -#theming .icon-upload { +#theming .icon-upload, +#theming .icon-loading-small { padding: 8px 20px; width: 20px; margin: 2px 0px; diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss index d2196362d3b..2a5a0e5cd46 100644 --- a/apps/theming/css/theming.scss +++ b/apps/theming/css/theming.scss @@ -45,12 +45,12 @@ #header .logo, #header .logo-icon { background-size: contain; - background-image: url(#{$image-logo}?v=#{$theming-cachebuster}); + background-image: url(#{$image-logo}); } #body-login, #firstrunwizard .firstrunwizard-header { - background-image: url(#{$image-login-background}?v=#{$theming-cachebuster}); + background-image: url(#{$image-login-background}); background-color: $color-primary; } @@ -64,4 +64,50 @@ input.primary { #body-login input.login { background-image: url('../../../core/img/actions/confirm.svg'); } +} + +// plain background color for login page +@if $image-login-plain == 'true' { + #body-login, #firstrunwizard .firstrunwizard-header, #theming-preview { + background-image: none !important; + background-color: $color-primary; + } + #body-login { + + a, label, p { + color: $color-primary-text !important; + } + + @if (lightness($color-primary) > 50) { + #submit { + border-color: nc-darken($color-primary, 20%); + background-color: nc-darken($color-primary, 20%); + } + #submit:hover { + border-color: nc-darken($color-primary, 10%); + background-color: nc-darken($color-primary, 10%); + } + input[type='checkbox'].checkbox--white + label:before { + border-color: nc-darken($color-primary, 40%) !important; + } + input[type='checkbox'].checkbox--white:not(:disabled):not(:checked) + label:hover:before, + input[type='checkbox'].checkbox--white:focus + label:before { + border-color: nc-darken($color-primary, 30%) !important; + } + input[type='checkbox'].checkbox--white:checked + label:before { + border-color: nc-darken($color-primary, 30%) !important; + background-image: url('../../../core/img/actions/checkbox-mark.svg'); + background-color: nc-darken($color-primary, 30%) !important; + } + } @else { + #submit { + border-color: nc-lighten($color-primary, 20%); + background-color: nc-lighten($color-primary, 20%); + } + #submit:hover { + border-color: nc-lighten($color-primary, 10%); + background-color: nc-lighten($color-primary, 10%); + } + } + } }
\ No newline at end of file diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js index 802f6e05c07..5d91892c007 100644 --- a/apps/theming/js/settings-admin.js +++ b/apps/theming/js/settings-admin.js @@ -35,6 +35,7 @@ function setThemingValue(setting, value) { OC.msg.finishedSaving('#theming_settings_msg', response); $('#theming_settings_loading').hide(); }); + } function preview(setting, value) { @@ -74,18 +75,13 @@ function preview(setting, value) { previewImageLogo.src = OC.getRootPath() + '/core/img/logo-icon.svg?v' + timestamp; } } - if (setting === 'backgroundMime') { - var previewImage = document.getElementById('theming-preview'); - if (value !== '') { - previewImage.style.backgroundImage = "url('" + OC.generateUrl('/apps/theming/loginbackground') + "?v" + timestamp + "')"; - } else { - previewImage.style.backgroundImage = "url('" + OC.getRootPath() + '/core/img/background.jpg?v' + timestamp + "')"; - } - } if (setting === 'name') { window.document.title = t('core', 'Admin') + " - " + value; } + + hideUndoButton(setting, value); + } function hideUndoButton(setting, value) { @@ -103,6 +99,14 @@ function hideUndoButton(setting, value) { } else { $('.theme-undo[data-setting=' + setting + ']').show(); } + + if(setting === 'backgroundMime' && value !== 'backgroundColor') { + $('.theme-remove-bg').show(); + } + if(setting === 'backgroundMime' && value === 'backgroundColor') { + $('.theme-remove-bg').hide(); + $('.theme-undo[data-setting=backgroundMime]').show(); + } } $(document).ready(function () { @@ -116,6 +120,7 @@ $(document).ready(function () { } hideUndoButton(setting, value); }); + var uploadParamsLogo = { pasteZone: null, dropZone: null, @@ -208,4 +213,16 @@ $(document).ready(function () { preview(setting, response.data.value); }); }); + + $('.theme-remove-bg').click(function() { + startLoading(); + $.post( + OC.generateUrl('/apps/theming/ajax/updateLogo'), {'backgroundColor' : true} + ).done(function(response) { + preview('backgroundMime', 'backgroundColor'); + }).fail(function(response) { + OC.msg.finishedSaving('#theming_settings_msg', response); + }); + }); + }); diff --git a/apps/theming/l10n/el.js b/apps/theming/l10n/el.js index 4bfd9bf3cf7..57f45818b3c 100644 --- a/apps/theming/l10n/el.js +++ b/apps/theming/l10n/el.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Φόρτωση προεπισκόπησης ...", "Saved" : "Αποθηκεύτηκαν", "Admin" : "Διαχειριστής", "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", diff --git a/apps/theming/l10n/el.json b/apps/theming/l10n/el.json index 9169c1e4ad3..3fd78ccd8fe 100644 --- a/apps/theming/l10n/el.json +++ b/apps/theming/l10n/el.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Φόρτωση προεπισκόπησης ...", "Saved" : "Αποθηκεύτηκαν", "Admin" : "Διαχειριστής", "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", diff --git a/apps/theming/l10n/en_GB.js b/apps/theming/l10n/en_GB.js new file mode 100644 index 00000000000..ed29a83eca3 --- /dev/null +++ b/apps/theming/l10n/en_GB.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "theming", + { + "Loading preview…" : "Loading preview…", + "Saved" : "Saved", + "Admin" : "Admin", + "a safe home for all your data" : "a safe home for all your data", + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "No file uploaded" : "No file uploaded", + "Unsupported image type" : "Unsupported image type", + "You are already using a custom theme" : "You are already using a custom theme", + "Theming" : "Theming", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Name" : "Name", + "reset to default" : "reset to default", + "Web address" : "Web address", + "Web address https://…" : "Web address https://…", + "Slogan" : "Slogan", + "Color" : "Colour", + "Logo" : "Logo", + "Upload new logo" : "Upload new logo", + "Login image" : "Login image", + "Upload new login background" : "Upload new login background", + "Log in image" : "Log in image" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/en_GB.json b/apps/theming/l10n/en_GB.json new file mode 100644 index 00000000000..27a4eb827bd --- /dev/null +++ b/apps/theming/l10n/en_GB.json @@ -0,0 +1,27 @@ +{ "translations": { + "Loading preview…" : "Loading preview…", + "Saved" : "Saved", + "Admin" : "Admin", + "a safe home for all your data" : "a safe home for all your data", + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "No file uploaded" : "No file uploaded", + "Unsupported image type" : "Unsupported image type", + "You are already using a custom theme" : "You are already using a custom theme", + "Theming" : "Theming", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Name" : "Name", + "reset to default" : "reset to default", + "Web address" : "Web address", + "Web address https://…" : "Web address https://…", + "Slogan" : "Slogan", + "Color" : "Colour", + "Logo" : "Logo", + "Upload new logo" : "Upload new logo", + "Login image" : "Login image", + "Upload new login background" : "Upload new login background", + "Log in image" : "Log in image" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/id.js b/apps/theming/l10n/id.js new file mode 100644 index 00000000000..fa6086692d6 --- /dev/null +++ b/apps/theming/l10n/id.js @@ -0,0 +1,24 @@ +OC.L10N.register( + "theming", + { + "Loading preview…" : "Memuat pratinjau", + "Saved" : "Disimpan", + "Admin" : "Admin", + "The given name is too long" : "Pemberian nama terlalu panjang", + "The given web address is too long" : "Pemberian alamat web terlalu panjang", + "The given slogan is too long" : "Pemberian slogan terlalu panjang", + "No file uploaded" : "Tidak ada file diunggah", + "Unsupported image type" : "Tipe gambar tidak bisa diterima", + "You are already using a custom theme" : "Anda telah siap menggunakan Tema Kustom", + "Theming" : "Tema", + "Name" : "Nama", + "reset to default" : "Atur ulang ke awal", + "Web address" : "Alamat Web", + "Web address https://…" : "Alamat Web https://...", + "Slogan" : "Slogan", + "Color" : "Warna", + "Logo" : "Logo", + "Upload new logo" : "Unggah Logo baru", + "Login image" : "Gambar ketika masuk" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/id.json b/apps/theming/l10n/id.json new file mode 100644 index 00000000000..65a83d56942 --- /dev/null +++ b/apps/theming/l10n/id.json @@ -0,0 +1,22 @@ +{ "translations": { + "Loading preview…" : "Memuat pratinjau", + "Saved" : "Disimpan", + "Admin" : "Admin", + "The given name is too long" : "Pemberian nama terlalu panjang", + "The given web address is too long" : "Pemberian alamat web terlalu panjang", + "The given slogan is too long" : "Pemberian slogan terlalu panjang", + "No file uploaded" : "Tidak ada file diunggah", + "Unsupported image type" : "Tipe gambar tidak bisa diterima", + "You are already using a custom theme" : "Anda telah siap menggunakan Tema Kustom", + "Theming" : "Tema", + "Name" : "Nama", + "reset to default" : "Atur ulang ke awal", + "Web address" : "Alamat Web", + "Web address https://…" : "Alamat Web https://...", + "Slogan" : "Slogan", + "Color" : "Warna", + "Logo" : "Logo", + "Upload new logo" : "Unggah Logo baru", + "Login image" : "Gambar ketika masuk" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/nb.js b/apps/theming/l10n/nb.js index f91176aa79e..eb1791bc07d 100644 --- a/apps/theming/l10n/nb.js +++ b/apps/theming/l10n/nb.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Laster forshåndsvisning...", "Saved" : "Lagret", "Admin" : "Admin", "a safe home for all your data" : "et trygt hjem for alle dine data", diff --git a/apps/theming/l10n/nb.json b/apps/theming/l10n/nb.json index 2dfb84f1a15..f8b274f31fd 100644 --- a/apps/theming/l10n/nb.json +++ b/apps/theming/l10n/nb.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Laster forshåndsvisning...", "Saved" : "Lagret", "Admin" : "Admin", "a safe home for all your data" : "et trygt hjem for alle dine data", diff --git a/apps/theming/l10n/nl.js b/apps/theming/l10n/nl.js index b4646d4f993..55db4422623 100644 --- a/apps/theming/l10n/nl.js +++ b/apps/theming/l10n/nl.js @@ -13,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Afbeeldingstype wordt niet ondersteund", "You are already using a custom theme" : "Je gebruikt al een maatwerkthema", "Theming" : "Thema's", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", "Name" : "Naam", "reset to default" : "herstellen naar standaard", "Web address" : "Webadres", diff --git a/apps/theming/l10n/nl.json b/apps/theming/l10n/nl.json index 83f500d0d82..7ac43b24ea7 100644 --- a/apps/theming/l10n/nl.json +++ b/apps/theming/l10n/nl.json @@ -11,6 +11,7 @@ "Unsupported image type" : "Afbeeldingstype wordt niet ondersteund", "You are already using a custom theme" : "Je gebruikt al een maatwerkthema", "Theming" : "Thema's", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", "Name" : "Naam", "reset to default" : "herstellen naar standaard", "Web address" : "Webadres", diff --git a/apps/theming/l10n/pt_BR.js b/apps/theming/l10n/pt_BR.js index 2b56768334b..32091d88542 100644 --- a/apps/theming/l10n/pt_BR.js +++ b/apps/theming/l10n/pt_BR.js @@ -6,7 +6,7 @@ OC.L10N.register( "Admin" : "Administrador", "a safe home for all your data" : "um lugar seguro para seus dados", "The given name is too long" : "O nome é muito longo", - "The given web address is too long" : "O endereço da Web fornecido é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", "The given slogan is too long" : "O slogan dado é muito longo", "The given color is invalid" : "A cor fornecida é inválida", "No file uploaded" : "Nenhum arquivo enviado", @@ -16,8 +16,8 @@ OC.L10N.register( "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível a todos os usuários.", "Name" : "Nome", "reset to default" : "restaurar ao padrão", - "Web address" : "Endereço da Web", - "Web address https://…" : "Endereço da Web https://...", + "Web address" : "Endereço web", + "Web address https://…" : "Endereço web https://...", "Slogan" : "Slogan", "Color" : "Cor", "Logo" : "Logotipo", diff --git a/apps/theming/l10n/pt_BR.json b/apps/theming/l10n/pt_BR.json index 4544daa7556..889e609f861 100644 --- a/apps/theming/l10n/pt_BR.json +++ b/apps/theming/l10n/pt_BR.json @@ -4,7 +4,7 @@ "Admin" : "Administrador", "a safe home for all your data" : "um lugar seguro para seus dados", "The given name is too long" : "O nome é muito longo", - "The given web address is too long" : "O endereço da Web fornecido é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", "The given slogan is too long" : "O slogan dado é muito longo", "The given color is invalid" : "A cor fornecida é inválida", "No file uploaded" : "Nenhum arquivo enviado", @@ -14,8 +14,8 @@ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível a todos os usuários.", "Name" : "Nome", "reset to default" : "restaurar ao padrão", - "Web address" : "Endereço da Web", - "Web address https://…" : "Endereço da Web https://...", + "Web address" : "Endereço web", + "Web address https://…" : "Endereço web https://...", "Slogan" : "Slogan", "Color" : "Cor", "Logo" : "Logotipo", diff --git a/apps/theming/l10n/ru.js b/apps/theming/l10n/ru.js index 2169af679f6..c0ea6d47203 100644 --- a/apps/theming/l10n/ru.js +++ b/apps/theming/l10n/ru.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Загружается предпросмотр…", "Saved" : "Сохранено", "Admin" : "Администратор", "a safe home for all your data" : "надежный дом для всех ваших данных", @@ -12,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Неподдерживаемый тип изображения", "You are already using a custom theme" : "Вы уже используете настраиваемую тему", "Theming" : "Темы оформления", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темы оформление позволяют легко настроить внешний вид вашего сервера и поддерживаемых клиентов. Это будет доступно для всех пользователей.", "Name" : "Название", "reset to default" : "сброс до настроек по-умолчанию", "Web address" : "Веб адрес", diff --git a/apps/theming/l10n/ru.json b/apps/theming/l10n/ru.json index fe15a6b5670..a054b5e7c14 100644 --- a/apps/theming/l10n/ru.json +++ b/apps/theming/l10n/ru.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Загружается предпросмотр…", "Saved" : "Сохранено", "Admin" : "Администратор", "a safe home for all your data" : "надежный дом для всех ваших данных", @@ -10,6 +11,7 @@ "Unsupported image type" : "Неподдерживаемый тип изображения", "You are already using a custom theme" : "Вы уже используете настраиваемую тему", "Theming" : "Темы оформления", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темы оформление позволяют легко настроить внешний вид вашего сервера и поддерживаемых клиентов. Это будет доступно для всех пользователей.", "Name" : "Название", "reset to default" : "сброс до настроек по-умолчанию", "Web address" : "Веб адрес", diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index faaff1f2174..225673079a3 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -185,6 +185,20 @@ class ThemingController extends Controller { * @return DataResponse */ public function updateLogo() { + $backgroundColor = $this->request->getParam('backgroundColor', false); + if($backgroundColor) { + $this->themingDefaults->set('backgroundMime', 'backgroundColor'); + return new DataResponse( + [ + 'data' => + [ + 'name' => 'backgroundColor', + 'message' => $this->l10n->t('Saved') + ], + 'status' => 'success' + ] + ); + } $newLogo = $this->request->getUploadedFile('uploadlogo'); $newBackgroundLogo = $this->request->getUploadedFile('upload-login-background'); if (empty($newLogo) && empty($newBackgroundLogo)) { diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 2935355f26d..0824a36ccdc 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -129,9 +129,10 @@ class ThemingDefaults extends \OC_Defaults { /** * Themed logo url * + * @param bool $useSvg Whether to point to the SVG image or a fallback * @return string */ - public function getLogo() { + public function getLogo($useSvg = true) { $logo = $this->config->getAppValue('theming', 'logoMime', false); $logoExists = true; @@ -144,7 +145,12 @@ class ThemingDefaults extends \OC_Defaults { $cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0'); if(!$logo || !$logoExists) { - return $this->urlGenerator->imagePath('core','logo.svg') . '?v=' . $cacheBusterCounter; + if($useSvg) { + $logo = $this->urlGenerator->imagePath('core', 'logo.svg'); + } else { + $logo = $this->urlGenerator->imagePath('core', 'logo.png'); + } + return $logo . '?v=' . $cacheBusterCounter; } return $this->urlGenerator->linkToRoute('theming.Theming.getLogo') . '?v=' . $cacheBusterCounter; @@ -165,11 +171,13 @@ class ThemingDefaults extends \OC_Defaults { $backgroundExists = false; } + $cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0'); + if(!$backgroundLogo || !$backgroundExists) { - return $this->urlGenerator->imagePath('core','background.jpg'); + return $this->urlGenerator->imagePath('core','background.jpg') . '?v=' . $cacheBusterCounter; } - return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground'); + return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground') . '?v=' . $cacheBusterCounter; } @@ -188,6 +196,7 @@ class ThemingDefaults extends \OC_Defaults { $variables['image-logo'] = "'".$this->urlGenerator->getAbsoluteURL($this->getLogo())."'"; $variables['image-login-background'] = "'".$this->urlGenerator->getAbsoluteURL($this->getBackground())."'"; + $variables['image-login-plain'] = 'false'; if ($this->config->getAppValue('theming', 'color', null) !== null) { if ($this->util->invertTextColor($this->getColorPrimary())) { @@ -198,6 +207,10 @@ class ThemingDefaults extends \OC_Defaults { $variables['color-primary'] = $this->getColorPrimary(); $variables['color-primary-text'] = $colorPrimaryText; } + + if ($this->config->getAppValue('theming', 'backgroundMime', null) === 'backgroundColor') { + $variables['image-login-plain'] = 'true'; + } $cache->set('getScssVariables', $variables); return $variables; } diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php index 858329eca48..858b916c932 100644 --- a/apps/theming/templates/settings-admin.php +++ b/apps/theming/templates/settings-admin.php @@ -67,7 +67,7 @@ style('theming', 'settings-admin'); </label> </div> <div> - <form class="uploadButton inlineblock" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> <input type="hidden" id="current-logoMime" name="current-logoMime" value="<?php p($_['logoMime']); ?>" /> <label for="uploadlogo"><span><?php p($l->t('Logo')) ?></span></label> <input id="uploadlogo" class="upload-logo-field" name="uploadlogo" type="file" /> @@ -76,16 +76,16 @@ style('theming', 'settings-admin'); </form> </div> <div> - <form class="uploadButton inlineblock" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> <input type="hidden" id="current-backgroundMime" name="current-backgroundMime" value="<?php p($_['backgroundMime']); ?>" /> <label for="upload-login-background"><span><?php p($l->t('Login image')) ?></span></label> <input id="upload-login-background" class="upload-logo-field" name="upload-login-background" type="file"> <label for="upload-login-background" class="button icon-upload svg" id="upload-login-background" title="<?php p($l->t("Upload new login background")) ?>"></label> <div data-setting="backgroundMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> + <div class="theme-remove-bg icon icon-delete" data-toggle="tooltip" data-original-title="<?php p($l->t('Remove background image')); ?>"></div> </form> </div> - - <div id="theming-preview" style="background-color:<?php p($_['color']);?>; background-image:url(<?php p($_['background']); ?>);"> + <div id="theming-preview"> <img src="<?php p($_['logo']); ?>" id="theming-preview-logo" /> </div> <?php } ?> diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index f22c317d73d..cbdb86d0358 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -152,11 +152,16 @@ class ThemingControllerTest extends TestCase { public function testUpdateLogoNoData() { $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn(null); @@ -179,6 +184,29 @@ class ThemingControllerTest extends TestCase { $this->assertEquals($expected, $this->themingController->updateLogo()); } + public function testUpdateBackgroundColor() { + $this->request + ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(true); + $this->themingDefaults + ->expects($this->once()) + ->method('set') + ->with('backgroundMime', 'backgroundColor'); + $expected = new DataResponse( + [ + 'data' => + [ + 'name' => 'backgroundColor', + 'message' => $this->l10n->t('Saved') + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->updateLogo()); + } + public function dataUpdateImages() { return [ [false], @@ -194,6 +222,11 @@ class ThemingControllerTest extends TestCase { touch($tmpLogo); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn([ @@ -202,7 +235,7 @@ class ThemingControllerTest extends TestCase { 'name' => 'logo.svg', ]); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn(null); @@ -259,11 +292,16 @@ class ThemingControllerTest extends TestCase { file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/desktopapp.png')); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn([ @@ -322,11 +360,16 @@ class ThemingControllerTest extends TestCase { file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/data.zip')); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn([ diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 736eeb3afc3..a7cb7790aa6 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -384,10 +384,15 @@ class ThemingDefaultsTest extends TestCase { ->method('getFolder') ->willThrowException(new NotFoundException()); $this->config - ->expects($this->once()) + ->expects($this->at(0)) ->method('getAppValue') ->with('theming', 'backgroundMime') ->willReturn(''); + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); $this->appData ->expects($this->once()) ->method('getFolder') @@ -397,7 +402,7 @@ class ThemingDefaultsTest extends TestCase { ->method('imagePath') ->with('core', 'background.jpg') ->willReturn('core-background'); - $this->assertEquals('core-background', $this->template->getBackground()); + $this->assertEquals('core-background?v=0', $this->template->getBackground()); } public function testGetBackgroundCustom() { @@ -410,18 +415,23 @@ class ThemingDefaultsTest extends TestCase { ->method('getFolder') ->willReturn($folder); $this->config - ->expects($this->once()) + ->expects($this->at(0)) ->method('getAppValue') ->with('theming', 'backgroundMime', false) ->willReturn('image/svg+xml'); + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); $this->urlGenerator->expects($this->once()) ->method('linkToRoute') ->with('theming.Theming.getLoginBackground') ->willReturn('custom-background'); - $this->assertEquals('custom-background', $this->template->getBackground()); + $this->assertEquals('custom-background?v=0', $this->template->getBackground()); } - public function testGetLogoDefault() { + private function getLogoHelper($withName, $useSvg) { $this->appData->expects($this->once()) ->method('getFolder') ->willThrowException(new NotFoundException()); @@ -442,9 +452,17 @@ class ThemingDefaultsTest extends TestCase { ->willThrowException(new \Exception()); $this->urlGenerator->expects($this->once()) ->method('imagePath') - ->with('core', 'logo.svg') + ->with('core', $withName) ->willReturn('core-logo'); - $this->assertEquals('core-logo' . '?v=0', $this->template->getLogo()); + $this->assertEquals('core-logo?v=0', $this->template->getLogo($useSvg)); + } + + public function testGetLogoDefaultWithSvg() { + $this->getLogoHelper('logo.svg', true); + } + + public function testGetLogoDefaultWithoutSvg() { + $this->getLogoHelper('logo.png', false); } public function testGetLogoCustom() { @@ -483,9 +501,10 @@ class ThemingDefaultsTest extends TestCase { $this->config->expects($this->at(1))->method('getAppValue')->with('theming', 'logoMime', false)->willReturn('jpeg'); $this->config->expects($this->at(2))->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('0'); $this->config->expects($this->at(3))->method('getAppValue')->with('theming', 'backgroundMime', false)->willReturn('jpeg'); - $this->config->expects($this->at(4))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); - $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(4))->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('0'); + $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); $this->config->expects($this->at(6))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(7))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); $this->util->expects($this->any())->method('invertTextColor')->with($this->defaults->getColorPrimary())->willReturn(false); $this->cache->expects($this->once())->method('get')->with('getScssVariables')->willReturn(null); @@ -512,9 +531,10 @@ class ThemingDefaultsTest extends TestCase { $expected = [ 'theming-cachebuster' => '\'0\'', 'image-logo' => "'absolute-custom-logo?v=0'", - 'image-login-background' => "'absolute-custom-background'", + 'image-login-background' => "'absolute-custom-background?v=0'", 'color-primary' => $this->defaults->getColorPrimary(), - 'color-primary-text' => '#ffffff' + 'color-primary-text' => '#ffffff', + 'image-login-plain' => 'false' ]; $this->assertEquals($expected, $this->template->getScssVariables()); diff --git a/apps/updatenotification/l10n/ca.js b/apps/updatenotification/l10n/ca.js index 920f2d68321..20a1fb22fe6 100644 --- a/apps/updatenotification/l10n/ca.js +++ b/apps/updatenotification/l10n/ca.js @@ -2,16 +2,24 @@ OC.L10N.register( "updatenotification", { "Update notifications" : "Notificacions d'actualització", + "Could not start updater, please try the manual update" : "No s'ha pogut iniciar actualitzador, provi l'actualització manual", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updated channel" : "Canal actualitzat", + "Channel updated" : "Canal actualitzat", + "The update server could not be reached since %d days to check for new updates." : "El servidor d'actualització no es va poder arribar des %d dies per comprovar si hi ha noves actualitzacions.", + "Please check the Nextcloud and server log files for errors." : "Si us plau, comproveu els fitxers de log del servidor i de Nextcloud per detectar errors.", + "Update to %1$s is available." : "Actualització per %1$s està disponible.", "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", - "Updater" : "Actualitzador", + "Update for {app} to version %s is available." : "Actualització per {app} a la versió %s està disponible.", "A new version is available: %s" : "Una nova versió està disponible: %s", "Open updater" : "Obrir actualitzador", + "Download now" : "Descarrega ara", "Your version is up to date." : "La teva versió està actualitzada.", "Checked on %s" : "Comprovat en %s", "Update channel:" : "Actualitzar canal:", "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", - "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:" + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available." : "Només notificació d'actualitzacions d'apps estan disponibles.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal d'actualització seleccionat deixa obsoletes les notificacions específiques del servidor.", + "The selected update channel does not support updates of the server." : "El canal d'actualització seleccionat no admet actualitzacions del servidor." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/ca.json b/apps/updatenotification/l10n/ca.json index 600e1292de3..ec4ccf23b5e 100644 --- a/apps/updatenotification/l10n/ca.json +++ b/apps/updatenotification/l10n/ca.json @@ -1,15 +1,23 @@ { "translations": { "Update notifications" : "Notificacions d'actualització", + "Could not start updater, please try the manual update" : "No s'ha pogut iniciar actualitzador, provi l'actualització manual", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updated channel" : "Canal actualitzat", + "Channel updated" : "Canal actualitzat", + "The update server could not be reached since %d days to check for new updates." : "El servidor d'actualització no es va poder arribar des %d dies per comprovar si hi ha noves actualitzacions.", + "Please check the Nextcloud and server log files for errors." : "Si us plau, comproveu els fitxers de log del servidor i de Nextcloud per detectar errors.", + "Update to %1$s is available." : "Actualització per %1$s està disponible.", "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", - "Updater" : "Actualitzador", + "Update for {app} to version %s is available." : "Actualització per {app} a la versió %s està disponible.", "A new version is available: %s" : "Una nova versió està disponible: %s", "Open updater" : "Obrir actualitzador", + "Download now" : "Descarrega ara", "Your version is up to date." : "La teva versió està actualitzada.", "Checked on %s" : "Comprovat en %s", "Update channel:" : "Actualitzar canal:", "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", - "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:" + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available." : "Només notificació d'actualitzacions d'apps estan disponibles.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal d'actualització seleccionat deixa obsoletes les notificacions específiques del servidor.", + "The selected update channel does not support updates of the server." : "El canal d'actualització seleccionat no admet actualitzacions del servidor." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/updatenotification/l10n/en_GB.js b/apps/updatenotification/l10n/en_GB.js index b26672b438e..cd32df87ae2 100644 --- a/apps/updatenotification/l10n/en_GB.js +++ b/apps/updatenotification/l10n/en_GB.js @@ -2,10 +2,17 @@ OC.L10N.register( "updatenotification", { "Update notifications" : "Update notifications", + "Could not start updater, please try the manual update" : "Could not start updater, please try the manual update", "{version} is available. Get more information on how to update." : "{version} is available. Get more information on how to update.", - "Nextcloud core" : "Nextcloud core", + "Channel updated" : "Channel updated", + "The update server could not be reached since %d days to check for new updates." : "The update server could not be reached since %d days to check for new updates.", + "Please check the Nextcloud and server log files for errors." : "Please check the Nextcloud and server log files for errors.", + "Update to %1$s is available." : "Update to %1$s is available.", "Update for %1$s to version %2$s is available." : "Update for %1$s to version %2$s is available.", + "Update for {app} to version %s is available." : "Update for {app} to version %s is available.", "A new version is available: %s" : "A new version is available: %s", + "Open updater" : "Open updater", + "Download now" : "Download now", "Your version is up to date." : "Your version is up to date.", "Checked on %s" : "Checked on %s", "Update channel:" : "Update channel:", @@ -13,7 +20,6 @@ OC.L10N.register( "Notify members of the following groups about available updates:" : "Notify members of the following groups about available updates:", "Only notification for app updates are available." : "Only notification for app updates are available.", "The selected update channel makes dedicated notifications for the server obsolete." : "The selected update channel makes dedicated notifications for the server obsolete.", - "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server.", - "Updater" : "Updater" + "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/en_GB.json b/apps/updatenotification/l10n/en_GB.json index 830650fcce3..f8c435efdb7 100644 --- a/apps/updatenotification/l10n/en_GB.json +++ b/apps/updatenotification/l10n/en_GB.json @@ -1,9 +1,16 @@ { "translations": { "Update notifications" : "Update notifications", + "Could not start updater, please try the manual update" : "Could not start updater, please try the manual update", "{version} is available. Get more information on how to update." : "{version} is available. Get more information on how to update.", - "Nextcloud core" : "Nextcloud core", + "Channel updated" : "Channel updated", + "The update server could not be reached since %d days to check for new updates." : "The update server could not be reached since %d days to check for new updates.", + "Please check the Nextcloud and server log files for errors." : "Please check the Nextcloud and server log files for errors.", + "Update to %1$s is available." : "Update to %1$s is available.", "Update for %1$s to version %2$s is available." : "Update for %1$s to version %2$s is available.", + "Update for {app} to version %s is available." : "Update for {app} to version %s is available.", "A new version is available: %s" : "A new version is available: %s", + "Open updater" : "Open updater", + "Download now" : "Download now", "Your version is up to date." : "Your version is up to date.", "Checked on %s" : "Checked on %s", "Update channel:" : "Update channel:", @@ -11,7 +18,6 @@ "Notify members of the following groups about available updates:" : "Notify members of the following groups about available updates:", "Only notification for app updates are available." : "Only notification for app updates are available.", "The selected update channel makes dedicated notifications for the server obsolete." : "The selected update channel makes dedicated notifications for the server obsolete.", - "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server.", - "Updater" : "Updater" + "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index cbdcafc58d6..70e505c18af 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -29,46 +29,26 @@ $helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig()); $configPrefixes = $helper->getServerConfigurationPrefixes(true); -$ldapWrapper = new OCA\User_LDAP\LDAP(); -$ocConfig = \OC::$server->getConfig(); -$notificationManager = \OC::$server->getNotificationManager(); -$notificationManager->registerNotifier(function() { - return new \OCA\User_LDAP\Notification\Notifier( - \OC::$server->getL10NFactory() - ); -}, function() { +if(count($configPrefixes) > 0) { + $ldapWrapper = new OCA\User_LDAP\LDAP(); + $ocConfig = \OC::$server->getConfig(); + $notificationManager = \OC::$server->getNotificationManager(); + $notificationManager->registerNotifier(function() { + return new \OCA\User_LDAP\Notification\Notifier( + \OC::$server->getL10NFactory() + ); + }, function() { $l = \OC::$server->getL10N('user_ldap'); return [ 'id' => 'user_ldap', 'name' => $l->t('LDAP user and group backend'), ]; -}); -if(count($configPrefixes) === 1) { - $dbc = \OC::$server->getDatabaseConnection(); - $userManager = new OCA\User_LDAP\User\Manager($ocConfig, - new OCA\User_LDAP\FilesystemHelper(), - new OCA\User_LDAP\LogWrapper(), - \OC::$server->getAvatarManager(), - new \OCP\Image(), - $dbc, - \OC::$server->getUserManager(), - $notificationManager - ); - $connector = new OCA\User_LDAP\Connection($ldapWrapper, $configPrefixes[0]); - $ldapAccess = new OCA\User_LDAP\Access($connector, $ldapWrapper, $userManager, $helper); + }); - $ldapAccess->setUserMapper(new OCA\User_LDAP\Mapping\UserMapping($dbc)); - $ldapAccess->setGroupMapper(new OCA\User_LDAP\Mapping\GroupMapping($dbc)); - $userBackend = new OCA\User_LDAP\User_LDAP($ldapAccess, $ocConfig, $notificationManager); - $groupBackend = new \OCA\User_LDAP\Group_LDAP($ldapAccess); -} else if(count($configPrefixes) > 1) { $userBackend = new OCA\User_LDAP\User_Proxy( $configPrefixes, $ldapWrapper, $ocConfig, $notificationManager ); $groupBackend = new OCA\User_LDAP\Group_Proxy($configPrefixes, $ldapWrapper); -} - -if(count($configPrefixes) > 0) { // register user backend OC_User::useBackend($userBackend); \OC::$server->getGroupManager()->addBackend($groupBackend); diff --git a/apps/user_ldap/l10n/el.js b/apps/user_ldap/l10n/el.js index 718eae40363..41924ab5ae6 100644 --- a/apps/user_ldap/l10n/el.js +++ b/apps/user_ldap/l10n/el.js @@ -12,6 +12,8 @@ OC.L10N.register( "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", + "Renewing …" : "Ανανέωση ...", + "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", "Weak password" : "Ασθενές συνηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Ισχυρό συνθηματικό", diff --git a/apps/user_ldap/l10n/el.json b/apps/user_ldap/l10n/el.json index 69a6729059c..dbc1da6a951 100644 --- a/apps/user_ldap/l10n/el.json +++ b/apps/user_ldap/l10n/el.json @@ -10,6 +10,8 @@ "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", + "Renewing …" : "Ανανέωση ...", + "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", "Weak password" : "Ασθενές συνηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Ισχυρό συνθηματικό", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index 48c4611adea..59556732058 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -12,6 +12,7 @@ OC.L10N.register( "No data specified" : "No se han especificado los datos", " Could not set configuration %s" : "No se pudo establecer la configuración %s", "Action does not exist" : "La acción no existe.", + "LDAP user and group backend" : "Motor de usuarios y grupos LDAP", "Renewing …" : "Renovando...", "Very weak password" : "Contraseña muy débil", "Weak password" : "Contraseña débil", @@ -50,12 +51,14 @@ OC.L10N.register( "An unspecified error occurred. Please check the settings and the log." : "Un error no especificado ocurrió. Por favor verifique las configuraciones y el registro.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de búsqueda es inválido, probablemente debido a problemas de sintáxis tales como números impares de paréntesis abiertos y cerrados. Por favor revíselos.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", "Please login with the new password" : "Por favor, entra con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará hoy.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña expirará dentro de %n día.","Tu contraseña expirará dentro de %n días."], "LDAP / AD integration" : "Integración LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index ad38d999b94..d3686ded22a 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -10,6 +10,7 @@ "No data specified" : "No se han especificado los datos", " Could not set configuration %s" : "No se pudo establecer la configuración %s", "Action does not exist" : "La acción no existe.", + "LDAP user and group backend" : "Motor de usuarios y grupos LDAP", "Renewing …" : "Renovando...", "Very weak password" : "Contraseña muy débil", "Weak password" : "Contraseña débil", @@ -48,12 +49,14 @@ "An unspecified error occurred. Please check the settings and the log." : "Un error no especificado ocurrió. Por favor verifique las configuraciones y el registro.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de búsqueda es inválido, probablemente debido a problemas de sintáxis tales como números impares de paréntesis abiertos y cerrados. Por favor revíselos.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", "Please login with the new password" : "Por favor, entra con la nueva contraseña", "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", "Your password will expire today." : "Tu contraseña expirará hoy.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña expirará dentro de %n día.","Tu contraseña expirará dentro de %n días."], "LDAP / AD integration" : "Integración LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js index 0154871b63a..624216e5775 100644 --- a/apps/user_ldap/l10n/pl.js +++ b/apps/user_ldap/l10n/pl.js @@ -88,6 +88,7 @@ OC.L10N.register( "Copy current configuration into new directory binding" : "Kopiuje aktualną konfigurację do nowej lokalizacji", "Delete the current configuration" : "Usuwa aktualną konfigurację", "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Protokół może zostać pominięty chyba, że wymagany jest protokół SSL. Jeśli tak, zacznij od ldaps://", "Port" : "Port", "Detect Port" : "Wykryj port", "User DN" : "Użytkownik DN", diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json index 23d520b45ab..05e542f4d71 100644 --- a/apps/user_ldap/l10n/pl.json +++ b/apps/user_ldap/l10n/pl.json @@ -86,6 +86,7 @@ "Copy current configuration into new directory binding" : "Kopiuje aktualną konfigurację do nowej lokalizacji", "Delete the current configuration" : "Usuwa aktualną konfigurację", "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Protokół może zostać pominięty chyba, że wymagany jest protokół SSL. Jeśli tak, zacznij od ldaps://", "Port" : "Port", "Detect Port" : "Wykryj port", "User DN" : "Użytkownik DN", diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 5242b928672..a70709df9d1 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -12,7 +12,7 @@ OC.L10N.register( "No data specified" : "Nenhum dado especificado", " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", - "LDAP user and group backend" : "Backend LDAP de usuário e grupo", + "LDAP user and group backend" : "Plataforma de serviço LDAP de usuário e grupo", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", "Weak password" : "Senha fraca", @@ -80,8 +80,8 @@ OC.L10N.register( "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite login com nome de usuário LDAP / AD, o qual é ou uid ou sAMAccountName e será detectado.", - "LDAP / AD Email Address:" : "Endereço de email LDAP / AD:", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de email. Email e mailPrimaryAddress serão permitidos.", + "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de e-mail. E-mail e mailPrimaryAddress serão permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a ser aplicado, quando o login for feito. %% UID substitui o nome do usuário na ação de login. Exemplo: \"uid=%% UID\"", "Test Loginname" : "Testar Loginname", @@ -129,7 +129,7 @@ OC.L10N.register( "Expert" : "Especialista", "Advanced" : "Avançado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> Os aplicativos user_ldap e user_webdavauth são incompatíveis e pode haver um comportamento inesperado. Por favor, peça ao administrador do sistema para desabilitar um deles.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e o backend não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e a plataforma de serviço não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", "Connection Settings" : "Configurações de conexão", "Configuration Active" : "Configuração em uso", "When unchecked, this configuration will be skipped." : "Quando desmarcada, esta configuração será ignorada.", @@ -173,8 +173,8 @@ OC.L10N.register( "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Cota.", - "Email Field" : "Campo de email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", + "Email Field" : "Campo de e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o e-mail do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra de Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index db0dd00c381..0e523b59143 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -10,7 +10,7 @@ "No data specified" : "Nenhum dado especificado", " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", - "LDAP user and group backend" : "Backend LDAP de usuário e grupo", + "LDAP user and group backend" : "Plataforma de serviço LDAP de usuário e grupo", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", "Weak password" : "Senha fraca", @@ -78,8 +78,8 @@ "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite login com nome de usuário LDAP / AD, o qual é ou uid ou sAMAccountName e será detectado.", - "LDAP / AD Email Address:" : "Endereço de email LDAP / AD:", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de email. Email e mailPrimaryAddress serão permitidos.", + "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de e-mail. E-mail e mailPrimaryAddress serão permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a ser aplicado, quando o login for feito. %% UID substitui o nome do usuário na ação de login. Exemplo: \"uid=%% UID\"", "Test Loginname" : "Testar Loginname", @@ -127,7 +127,7 @@ "Expert" : "Especialista", "Advanced" : "Avançado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> Os aplicativos user_ldap e user_webdavauth são incompatíveis e pode haver um comportamento inesperado. Por favor, peça ao administrador do sistema para desabilitar um deles.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e o backend não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e a plataforma de serviço não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", "Connection Settings" : "Configurações de conexão", "Configuration Active" : "Configuração em uso", "When unchecked, this configuration will be skipped." : "Quando desmarcada, esta configuração será ignorada.", @@ -171,8 +171,8 @@ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Cota.", - "Email Field" : "Campo de email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", + "Email Field" : "Campo de e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o e-mail do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra de Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js index 036f78ea9b3..ff5702c3634 100644 --- a/apps/user_ldap/l10n/ru.js +++ b/apps/user_ldap/l10n/ru.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", "Please login with the new password" : "Войдите в систему со своим новым паролем", + "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", + "Your password will expire today." : "Сегодня истекает срок действия пароля.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP / AD integration" : "Интеграция LDAP / AD", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json index 0b61ca441cd..448a36cb396 100644 --- a/apps/user_ldap/l10n/ru.json +++ b/apps/user_ldap/l10n/ru.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", "Please login with the new password" : "Войдите в систему со своим новым паролем", + "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", + "Your password will expire today." : "Сегодня истекает срок действия пароля.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP / AD integration" : "Интеграция LDAP / AD", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], diff --git a/apps/workflowengine/l10n/ca.js b/apps/workflowengine/l10n/ca.js new file mode 100644 index 00000000000..c8de2819b34 --- /dev/null +++ b/apps/workflowengine/l10n/ca.js @@ -0,0 +1,73 @@ +OC.L10N.register( + "workflowengine", + { + "Saved" : "Desat", + "Saving failed:" : "Error al desar", + "File MIME type" : "Tipus MIME d\\'arxiu", + "is" : "és", + "is not" : "no és", + "matches" : "coincidències", + "does not match" : "No hi ha coincidències", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Mida d\\'arxiu (pujar)", + "less" : "menys", + "less or equals" : "menor o igual", + "greater or equals" : "major o igual", + "greater" : "superior", + "File system tag" : "Etiqueta del sistema de fitxers", + "is tagged with" : "està estiquetat amb", + "is not tagged with" : "no està etiquetat amb", + "Select tag…" : "Selecciona etiqueta...", + "Request remote address" : "Demanar adreça remota", + "matches IPv4" : "coincidències IPv4", + "does not match IPv4" : "No hi ha coincidencies IPv4", + "matches IPv6" : "Coincidències IPv6", + "does not match IPv6" : "No hi ha coincidències IPv6", + "Request time" : "Temps d'espera", + "between" : "entre", + "not between" : "no entre", + "Start" : "Comença", + "End" : "Finalitza", + "Select timezone…" : "Selecciona zona horaria", + "Request URL" : "URL de la petició", + "Predefined URLs" : "URLs predefinits", + "Files WebDAV" : "Arxius WebDAV", + "Request user agent" : "Agent d\\'usuari de la petició", + "Sync clients" : "Sincronitzar clients", + "Android client" : "Client android", + "iOS client" : "Client iOS", + "Desktop client" : "Client d'escriptori", + "User group membership" : "Pertinença a grup d'usuaris", + "is member of" : "és membre de", + "is not member of" : "no és membre de", + "The given operator is invalid" : "L\\'operador donat no és vàlid", + "The given regular expression is invalid" : "L\\'expresió regular donada no és vàlida", + "The given file size is invalid" : "El tamany de fitxer donat no és vàlid", + "The given tag id is invalid" : "L\\'Id d'etiqueta donat no és vàlid", + "The given IP range is invalid" : "El rang d\\'IPs donat no és vàlid", + "The given IP range is not valid for IPv4" : "El rang d\\'IP donat no és vàlid per IPv4", + "The given IP range is not valid for IPv6" : "El rang d\\'IP donat no és vàlid per IPv6", + "The given time span is invalid" : "El rang de temps donat no és vàlid", + "The given start time is invalid" : "El temps d\\'inici donat no és vàlid", + "The given end time is invalid" : "El temps de finalització donat no és vàlid", + "The given group does not exist" : "El grup donat no existeix", + "Check %s is invalid or does not exist" : "Comprovació %s no és vàlida o no existeix", + "Operation #%s does not exist" : "L\\'operació #%s no existeix", + "Operation %s does not exist" : "L\\'operació %s no existeix", + "Operation %s is invalid" : "L\\'operació %s no és vàlida", + "Check %s does not exist" : "Comprovació %s no existeix", + "Check %s is invalid" : "Comprovació %s no és vàlid", + "Check #%s does not exist" : "Comprovació #%s no existeix", + "Workflow" : "Flux de treball", + "Open documentation" : "Obrir documentació", + "Add rule group" : "Afegeix una regla de grup", + "Short rule description" : "Descripció breu de regla", + "Add rule" : "Afegir regla", + "Reset" : "Resetejar", + "Save" : "Desa", + "Saving…" : "Desant...", + "Loading…" : "Carregant...", + "Successfully saved" : "S\\'ha desat correctament", + "File mime type" : "Tipus mime de l\\'arxiu" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/workflowengine/l10n/ca.json b/apps/workflowengine/l10n/ca.json new file mode 100644 index 00000000000..d142823c0bb --- /dev/null +++ b/apps/workflowengine/l10n/ca.json @@ -0,0 +1,71 @@ +{ "translations": { + "Saved" : "Desat", + "Saving failed:" : "Error al desar", + "File MIME type" : "Tipus MIME d\\'arxiu", + "is" : "és", + "is not" : "no és", + "matches" : "coincidències", + "does not match" : "No hi ha coincidències", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Mida d\\'arxiu (pujar)", + "less" : "menys", + "less or equals" : "menor o igual", + "greater or equals" : "major o igual", + "greater" : "superior", + "File system tag" : "Etiqueta del sistema de fitxers", + "is tagged with" : "està estiquetat amb", + "is not tagged with" : "no està etiquetat amb", + "Select tag…" : "Selecciona etiqueta...", + "Request remote address" : "Demanar adreça remota", + "matches IPv4" : "coincidències IPv4", + "does not match IPv4" : "No hi ha coincidencies IPv4", + "matches IPv6" : "Coincidències IPv6", + "does not match IPv6" : "No hi ha coincidències IPv6", + "Request time" : "Temps d'espera", + "between" : "entre", + "not between" : "no entre", + "Start" : "Comença", + "End" : "Finalitza", + "Select timezone…" : "Selecciona zona horaria", + "Request URL" : "URL de la petició", + "Predefined URLs" : "URLs predefinits", + "Files WebDAV" : "Arxius WebDAV", + "Request user agent" : "Agent d\\'usuari de la petició", + "Sync clients" : "Sincronitzar clients", + "Android client" : "Client android", + "iOS client" : "Client iOS", + "Desktop client" : "Client d'escriptori", + "User group membership" : "Pertinença a grup d'usuaris", + "is member of" : "és membre de", + "is not member of" : "no és membre de", + "The given operator is invalid" : "L\\'operador donat no és vàlid", + "The given regular expression is invalid" : "L\\'expresió regular donada no és vàlida", + "The given file size is invalid" : "El tamany de fitxer donat no és vàlid", + "The given tag id is invalid" : "L\\'Id d'etiqueta donat no és vàlid", + "The given IP range is invalid" : "El rang d\\'IPs donat no és vàlid", + "The given IP range is not valid for IPv4" : "El rang d\\'IP donat no és vàlid per IPv4", + "The given IP range is not valid for IPv6" : "El rang d\\'IP donat no és vàlid per IPv6", + "The given time span is invalid" : "El rang de temps donat no és vàlid", + "The given start time is invalid" : "El temps d\\'inici donat no és vàlid", + "The given end time is invalid" : "El temps de finalització donat no és vàlid", + "The given group does not exist" : "El grup donat no existeix", + "Check %s is invalid or does not exist" : "Comprovació %s no és vàlida o no existeix", + "Operation #%s does not exist" : "L\\'operació #%s no existeix", + "Operation %s does not exist" : "L\\'operació %s no existeix", + "Operation %s is invalid" : "L\\'operació %s no és vàlida", + "Check %s does not exist" : "Comprovació %s no existeix", + "Check %s is invalid" : "Comprovació %s no és vàlid", + "Check #%s does not exist" : "Comprovació #%s no existeix", + "Workflow" : "Flux de treball", + "Open documentation" : "Obrir documentació", + "Add rule group" : "Afegeix una regla de grup", + "Short rule description" : "Descripció breu de regla", + "Add rule" : "Afegir regla", + "Reset" : "Resetejar", + "Save" : "Desa", + "Saving…" : "Desant...", + "Loading…" : "Carregant...", + "Successfully saved" : "S\\'ha desat correctament", + "File mime type" : "Tipus mime de l\\'arxiu" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/workflowengine/l10n/fr.js b/apps/workflowengine/l10n/fr.js index afe164def4f..5fb2ff3f410 100644 --- a/apps/workflowengine/l10n/fr.js +++ b/apps/workflowengine/l10n/fr.js @@ -26,7 +26,7 @@ OC.L10N.register( "Request time" : "Temps de requête", "between" : "entre", "not between" : "en dehors de", - "Start" : "Commencer", + "Start" : "Démarrer", "End" : "Fin", "Select timezone…" : "Sélectionner le fuseau horaire...", "Request URL" : "Demande d'URL", diff --git a/apps/workflowengine/l10n/fr.json b/apps/workflowengine/l10n/fr.json index 7cee1e0107a..cdf39458889 100644 --- a/apps/workflowengine/l10n/fr.json +++ b/apps/workflowengine/l10n/fr.json @@ -24,7 +24,7 @@ "Request time" : "Temps de requête", "between" : "entre", "not between" : "en dehors de", - "Start" : "Commencer", + "Start" : "Démarrer", "End" : "Fin", "Select timezone…" : "Sélectionner le fuseau horaire...", "Request URL" : "Demande d'URL", diff --git a/config/config.sample.php b/config/config.sample.php index d106d03f602..9f2ede88169 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -1235,16 +1235,23 @@ $CONFIG = array( 'sqlite.journal_mode' => 'DELETE', /** - * If this setting is set to true MySQL can handle 4 byte characters instead of - * 3 byte characters - * + * During setup, if requirements are met (see below), this setting is set to true + * and MySQL can handle 4 byte characters instead of 3 byte characters. + * + * If you want to convert an existing 3-byte setup into a 4-byte setup please + * set the parameters in MySQL as mentioned below and run the migration command: + * ./occ db:convert-mysql-charset + * The config setting will be set automatically after a successful run. + * + * Consult the documentation for more details. + * * MySQL requires a special setup for longer indexes (> 767 bytes) which are * needed: * * [mysqld] - * innodb_large_prefix=true - * innodb_file_format=barracuda - * innodb_file_per_table=true + * innodb_large_prefix=ON + * innodb_file_format=Barracuda + * innodb_file_per_table=ON * * Tables will be created with * * character set: utf8mb4 @@ -1257,8 +1264,6 @@ $CONFIG = array( * https://mariadb.com/kb/en/mariadb/xtradbinnodb-server-system-variables/#innodb_large_prefix * http://www.tocker.ca/2013/10/31/benchmarking-innodb-page-compression-performance.html * http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/ - * - * WARNING: EXPERIMENTAL */ 'mysql.utf8mb4' => false, diff --git a/core/Command/Db/ConvertMysqlToMB4.php b/core/Command/Db/ConvertMysqlToMB4.php index 286274753ee..38aff8b09d8 100644 --- a/core/Command/Db/ConvertMysqlToMB4.php +++ b/core/Command/Db/ConvertMysqlToMB4.php @@ -22,6 +22,7 @@ namespace OC\Core\Command\Db; use Doctrine\DBAL\Platforms\MySqlPlatform; +use OC\DB\MySqlTools; use OC\Migration\ConsoleOutput; use OC\Repair\Collation; use OCP\IConfig; @@ -71,18 +72,17 @@ class ConvertMysqlToMB4 extends Command { return 1; } - $oldValue = $this->config->getSystemValue('mysql.utf8mb4', false); - // enable charset - $this->config->setSystemValue('mysql.utf8mb4', true); - - if (!$this->connection->supports4ByteText()) { + $tools = new MySqlTools(); + if (!$tools->supports4ByteCharset($this->connection)) { $url = $this->urlGenerator->linkToDocs('admin-mysql-utf8mb4'); $output->writeln("The database is not properly setup to use the charset utf8mb4."); $output->writeln("For more information please read the documentation at $url"); - $this->config->setSystemValue('mysql.utf8mb4', $oldValue); return 1; } + // enable charset + $this->config->setSystemValue('mysql.utf8mb4', true); + // run conversion $coll = new Collation($this->config, $this->logger, $this->connection, false); $coll->run(new ConsoleOutput($output)); diff --git a/core/Controller/ClientFlowLoginController.php b/core/Controller/ClientFlowLoginController.php index ca9c092321a..8c2c121d5b2 100644 --- a/core/Controller/ClientFlowLoginController.php +++ b/core/Controller/ClientFlowLoginController.php @@ -232,7 +232,7 @@ class ClientFlowLoginController extends Controller { IToken::DO_NOT_REMEMBER ); - return new Http\RedirectResponse('nc://' . urlencode($loginName) . ':' . urlencode($token) . '@' . $this->request->getServerHost()); + return new Http\RedirectResponse('nc://login/server:' . $this->request->getServerHost() . '&user:' . urlencode($loginName) . '&password:' . urlencode($token)); } } diff --git a/core/css/guest.css b/core/css/guest.css index e6e194f6417..689eb45d65f 100644 --- a/core/css/guest.css +++ b/core/css/guest.css @@ -70,9 +70,16 @@ h3 { background-size: 175px; background-position: center; width: 252px; - height: 120px; + min-height: 120px; + max-height: 200px; margin: 0 auto; } + +#header .logo img { + opacity: 0; + max-width: 100%; + max-height: 200px; +} .wrapper { min-height: 100%; margin: 0 auto -70px; @@ -637,3 +644,27 @@ footer, height: 1px; overflow: hidden; } + +/* for low-res screens, use Regular font-weight instead of Light */ +@media (-webkit-max-device-pixel-ratio: 1.3), (max-resolution: 124.8dpi) { + @font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: normal; + src: local('Open Sans'), local('OpenSans'), url('../fonts/OpenSans-Regular.woff') format('woff'); + } +} + +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), url('../fonts/OpenSans-Light.woff') format('woff'); +} + +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url('../fonts/OpenSans-Semibold.woff') format('woff'); +} diff --git a/core/css/share.scss b/core/css/share.scss index 2e1c99b6f41..35d90fb4b88 100644 --- a/core/css/share.scss +++ b/core/css/share.scss @@ -43,6 +43,9 @@ font-weight: 400; white-space: nowrap; } + input[type='radio'].radio + label { + margin-left: -1px; + } input[type='checkbox'] { margin: 0 3px 0 8px; vertical-align: middle; diff --git a/core/js/contactsmenu.js b/core/js/contactsmenu.js index 9ce27509e8b..3da6ea127cd 100644 --- a/core/js/contactsmenu.js +++ b/core/js/contactsmenu.js @@ -50,7 +50,8 @@ + '</div>'; var CONTACT_TEMPLATE = '' + '{{#if contact.avatar}}' - + '<img src="{{contact.avatar}}" class="avatar">' + + '<img src="{{contact.avatar}}&size=32" class="avatar"' + + 'srcset="{{contact.avatar}}&size=32 1x, {{contact.avatar}}&size=64 2x, {{contact.avatar}}&size=128 4x">' + '{{else}}' + '<div class="avatar"></div>' + '{{/if}}' diff --git a/core/js/login/authpicker.js b/core/js/login/authpicker.js index 666a63da365..2d4bcc33158 100644 --- a/core/js/login/authpicker.js +++ b/core/js/login/authpicker.js @@ -8,8 +8,9 @@ jQuery(document).ready(function() { $('#submit-app-token-login').click(function(e) { e.preventDefault(); - window.location.href = 'nc://' - + encodeURIComponent($('#user').val()) + ':' + encodeURIComponent($('#password').val()) - + '@' + encodeURIComponent($('#serverHost').val()); + window.location.href = 'nc://login/server:' + + encodeURIComponent($('#serverHost').val()) + + "&user:" + encodeURIComponent($('#user').val()) + + "&password:" + encodeURIComponent($('#password').val()); }); }); diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js index 6b32484ab8e..54019b02c87 100644 --- a/core/js/sharedialoglinkshareview.js +++ b/core/js/sharedialoglinkshareview.js @@ -35,20 +35,23 @@ '{{{popoverMenu}}}' + '{{/if}}' + '</div>' + - ' {{#if publicUpload}}' + - '<div id="allowPublicUploadWrapper">' + - ' <span class="icon-loading-small hidden"></span>' + - ' <input type="checkbox" value="1" name="allowPublicUpload" id="sharingDialogAllowPublicUpload-{{cid}}" class="checkbox publicUploadCheckbox" {{{publicUploadChecked}}} />' + - '<label for="sharingDialogAllowPublicUpload-{{cid}}">{{publicUploadLabel}}</label>' + - '</div>' + - ' {{#if hideFileList}}' + - '<div id="hideFileListWrapper">' + - ' <span class="icon-loading-small hidden"></span>' + - ' <input type="checkbox" value="1" name="hideFileList" id="sharingDialogHideFileList-{{cid}}" class="checkbox hideFileListCheckbox" {{{hideFileListChecked}}} />' + - '<label for="sharingDialogHideFileList-{{cid}}">{{hideFileListLabel}}</label>' + - '</div>' + - ' {{/if}}' + - ' {{/if}}' + + '{{#if publicUpload}}' + + '<div>' + + '<span class="icon-loading-small hidden"></span>' + + '<input type="radio" name="publicUpload" value="{{publicUploadRValue}}" id="sharingDialogAllowPublicUpload-r-{{cid}}" class="radio publicUploadRadio" {{{publicUploadRChecked}}} />' + + '<label for="sharingDialogAllowPublicUpload-r-{{cid}}">{{publicUploadRLabel}}</label>' + + '</div>' + + '<div>' + + '<span class="icon-loading-small hidden"></span>' + + '<input type="radio" name="publicUpload" value="{{publicUploadRWValue}}" id="sharingDialogAllowPublicUpload-rw-{{cid}}" class="radio publicUploadRadio" {{{publicUploadRWChecked}}} />' + + '<label for="sharingDialogAllowPublicUpload-rw-{{cid}}">{{publicUploadRWLabel}}</label>' + + '</div>' + + '<div>' + + '<span class="icon-loading-small hidden"></span>' + + '<input type="radio" name="publicUpload" value="{{publicUploadWValue}}" id="sharingDialogAllowPublicUpload-w-{{cid}}" class="radio publicUploadRadio" {{{publicUploadWChecked}}} />' + + '<label for="sharingDialogAllowPublicUpload-w-{{cid}}">{{publicUploadWLabel}}</label>' + + '</div>' + + '{{/if}}' + ' {{#if publicEditing}}' + '<div id="allowPublicEditingWrapper">' + ' <span class="icon-loading-small hidden"></span>' + @@ -126,12 +129,11 @@ 'keyup input.linkPassText': 'onPasswordKeyUp', 'click .linkCheckbox': 'onLinkCheckBoxChange', 'click .linkText': 'onLinkTextClick', - 'change .publicUploadCheckbox': 'onAllowPublicUploadChange', 'change .publicEditingCheckbox': 'onAllowPublicEditingChange', - 'change .hideFileListCheckbox': 'onHideFileListChange', 'click .showPasswordCheckbox': 'onShowPasswordClick', 'click .icon-more': 'onToggleMenu', - 'click .pop-up': 'onPopUpClick' + 'click .pop-up': 'onPopUpClick', + 'change .publicUploadRadio': 'onPublicUploadChange' }, initialize: function(options) { @@ -170,9 +172,8 @@ 'onPasswordKeyUp', 'onLinkTextClick', 'onShowPasswordClick', - 'onHideFileListChange', - 'onAllowPublicUploadChange', - 'onAllowPublicEditingChange' + 'onAllowPublicEditingChange', + 'onPublicUploadChange' ); var clipboard = new Clipboard('.clipboardButton'); @@ -318,20 +319,6 @@ }); }, - onAllowPublicUploadChange: function() { - var $checkbox = this.$('.publicUploadCheckbox'); - $checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); - - var permissions = OC.PERMISSION_READ; - if($checkbox.is(':checked')) { - permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE; - } - - this.model.saveLinkShare({ - permissions: permissions - }); - }, - onAllowPublicEditingChange: function() { var $checkbox = this.$('.publicEditingCheckbox'); $checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); @@ -346,15 +333,9 @@ }); }, - onHideFileListChange: function () { - var $checkbox = this.$('.hideFileListCheckbox'); - $checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock'); - - var permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE; - if ($checkbox.is(':checked')) { - permissions = OC.PERMISSION_CREATE; - } + onPublicUploadChange: function(e) { + var permissions = e.currentTarget.value; this.model.saveLinkShare({ permissions: permissions }); @@ -382,9 +363,20 @@ && this.model.createPermissionPossible() && this.configModel.isPublicUploadEnabled(); - var publicUploadChecked = ''; - if(this.model.isPublicUploadAllowed()) { - publicUploadChecked = 'checked="checked"'; + var publicUploadRWChecked = ''; + var publicUploadRChecked = ''; + var publicUploadWChecked = ''; + + switch (this.model.linkSharePermissions()) { + case OC.PERMISSION_READ: + publicUploadRChecked = 'checked'; + break; + case OC.PERMISSION_CREATE: + publicUploadWChecked = 'checked'; + break; + case OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE: + publicUploadRWChecked = 'checked'; + break; } var publicEditingChecked = ''; @@ -392,14 +384,6 @@ publicEditingChecked = 'checked="checked"'; } - - var hideFileList = publicUploadChecked; - - var hideFileListChecked = ''; - if(this.model.isHideFileListSet()) { - hideFileListChecked = 'checked="checked"'; - } - var isLinkShare = this.model.get('linkShare').isLinkShare; var isPasswordSet = !!this.model.get('linkShare').password; var showPasswordCheckBox = isLinkShare @@ -437,7 +421,6 @@ this.$el.html(linkShareTemplate({ cid: this.cid, shareAllowed: true, - hideFileList: hideFileList, isLinkShare: isLinkShare, shareLinkURL: this.model.get('linkShare').link, linkShareLabel: t('core', 'Share link'), @@ -449,17 +432,22 @@ isPasswordSet: isPasswordSet, showPasswordCheckBox: showPasswordCheckBox, publicUpload: publicUpload && isLinkShare, - publicUploadChecked: publicUploadChecked, - hideFileListChecked: hideFileListChecked, - publicUploadLabel: t('core', 'Allow upload and editing'), publicEditing: publicEditable, publicEditingChecked: publicEditingChecked, publicEditingLabel: t('core', 'Allow editing'), - hideFileListLabel: 'Secure drop (' + t('core', 'upload only') + ')', mailPrivatePlaceholder: t('core', 'Email link to person'), mailButtonText: t('core', 'Send'), singleAction: OC.Share.Social.Collection.size() == 0, - popoverMenu: popover + popoverMenu: popover, + publicUploadRWLabel: t('core', 'Allow upload and editing'), + publicUploadRLabel: t('core', 'Read only'), + publicUploadWLabel: t('core', 'Secure drop (upload only)'), + publicUploadRWValue: OC.PERMISSION_UPDATE | OC.PERMISSION_CREATE | OC.PERMISSION_READ | OC.PERMISSION_DELETE, + publicUploadRValue: OC.PERMISSION_READ, + publicUploadWValue: OC.PERMISSION_CREATE, + publicUploadRWChecked: publicUploadRWChecked, + publicUploadRChecked: publicUploadRChecked, + publicUploadWChecked: publicUploadWChecked })); if (OC.Share.Social.Collection.size() == 0) { diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js index 4118a8a0188..afe86fa464b 100644 --- a/core/js/shareitemmodel.js +++ b/core/js/shareitemmodel.js @@ -487,6 +487,13 @@ }, /** + * @return {int} + */ + getPermissions: function() { + return this.get('permissions'); + }, + + /** * @returns {boolean} */ sharePermissionPossible: function() { @@ -568,6 +575,17 @@ || this.hasDeletePermission(shareIndex); }, + /** + * @returns {int} + */ + linkSharePermissions: function() { + if (!this.hasLinkShare()) { + return -1; + } else { + return this.get('linkShare').permissions; + } + }, + _getUrl: function(base, params) { params = _.extend({format: 'json'}, params || {}); return OC.linkToOCS('apps/files_sharing/api/v1', 2) + base + '?' + OC.buildQueryString(params); diff --git a/core/l10n/bg.js b/core/l10n/bg.js index b6a251a0cf7..61a4a3581a8 100644 --- a/core/l10n/bg.js +++ b/core/l10n/bg.js @@ -115,10 +115,10 @@ OC.L10N.register( "Share link" : "Връзка за споделяне", "Link" : "Връзка", "Password protect" : "Защитено с парола", - "Allow upload and editing" : "Позволи обновяване и редактиране", "Allow editing" : "Позволяване на редактиране", "Email link to person" : "Имейл връзка към човек", "Send" : "Изпращане", + "Allow upload and editing" : "Позволи обновяване и редактиране", "Shared with you and the group {group} by {owner}" : "Споделено от {owner} с вас и групата {group}", "Shared with you by {owner}" : "Споделено с вас от {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} споделен с връзка", diff --git a/core/l10n/bg.json b/core/l10n/bg.json index a6f7600e519..4483911793c 100644 --- a/core/l10n/bg.json +++ b/core/l10n/bg.json @@ -113,10 +113,10 @@ "Share link" : "Връзка за споделяне", "Link" : "Връзка", "Password protect" : "Защитено с парола", - "Allow upload and editing" : "Позволи обновяване и редактиране", "Allow editing" : "Позволяване на редактиране", "Email link to person" : "Имейл връзка към човек", "Send" : "Изпращане", + "Allow upload and editing" : "Позволи обновяване и редактиране", "Shared with you and the group {group} by {owner}" : "Споделено от {owner} с вас и групата {group}", "Shared with you by {owner}" : "Споделено с вас от {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} споделен с връзка", diff --git a/core/l10n/cs.js b/core/l10n/cs.js index 30b99bf0ef2..b29e1f0dd00 100644 --- a/core/l10n/cs.js +++ b/core/l10n/cs.js @@ -135,11 +135,11 @@ OC.L10N.register( "Share link" : "Sdílet odkaz", "Link" : "Odkaz", "Password protect" : "Chránit heslem", - "Allow upload and editing" : "Povolit nahrávání a úpravy", "Allow editing" : "Povolit úpravy", - "upload only" : "Pouze nahrávat", "Email link to person" : "Odeslat osobě odkaz emailem", "Send" : "Odeslat", + "Allow upload and editing" : "Povolit nahrávání a úpravy", + "Secure drop (upload only)" : "Bezpečné doručení (pouze nahrání)", "Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}", "Shared with you by {owner}" : "S Vámi sdílí {owner}", "Choose a password for the mail share" : "Zvolte si heslo e-mailového sdílení", @@ -154,7 +154,6 @@ OC.L10N.register( "Can create" : "Může vytvářet", "Can change" : "Může měnit", "Can delete" : "Může mazat", - "Secure drop (upload only)" : "Bezpečné doručení (pouze nahrání)", "Access control" : "Řízení přístupu", "Could not unshare" : "Nelze zrušit sdílení", "Error while sharing" : "Chyba při sdílení", diff --git a/core/l10n/cs.json b/core/l10n/cs.json index fa407306369..a23b093e1a5 100644 --- a/core/l10n/cs.json +++ b/core/l10n/cs.json @@ -133,11 +133,11 @@ "Share link" : "Sdílet odkaz", "Link" : "Odkaz", "Password protect" : "Chránit heslem", - "Allow upload and editing" : "Povolit nahrávání a úpravy", "Allow editing" : "Povolit úpravy", - "upload only" : "Pouze nahrávat", "Email link to person" : "Odeslat osobě odkaz emailem", "Send" : "Odeslat", + "Allow upload and editing" : "Povolit nahrávání a úpravy", + "Secure drop (upload only)" : "Bezpečné doručení (pouze nahrání)", "Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}", "Shared with you by {owner}" : "S Vámi sdílí {owner}", "Choose a password for the mail share" : "Zvolte si heslo e-mailového sdílení", @@ -152,7 +152,6 @@ "Can create" : "Může vytvářet", "Can change" : "Může měnit", "Can delete" : "Může mazat", - "Secure drop (upload only)" : "Bezpečné doručení (pouze nahrání)", "Access control" : "Řízení přístupu", "Could not unshare" : "Nelze zrušit sdílení", "Error while sharing" : "Chyba při sdílení", diff --git a/core/l10n/de.js b/core/l10n/de.js index 05900d7a05d..89fae89bb8b 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Link teilen", "Link" : "Link", "Password protect" : "Passwortschutz", - "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", "Allow editing" : "Bearbeitung erlauben", - "upload only" : "Nur Hochladen", "Email link to person" : "Link per E-Mail verschicken", "Send" : "Senden", + "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", + "Read only" : "Schreibgeschützt", + "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt", "Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt", "Choose a password for the mail share" : "Wähle ein Passwort für das Teilen via E-Mail", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "kann erstellen", "Can change" : "kann ändern", "Can delete" : "kann löschen", - "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Access control" : "Zugriffskontrolle", "Could not unshare" : "Freigabe konnte nicht entfernt werden", "Error while sharing" : "Fehler beim Teilen", diff --git a/core/l10n/de.json b/core/l10n/de.json index dab5624e85d..2b2a62ff7bc 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -133,11 +133,12 @@ "Share link" : "Link teilen", "Link" : "Link", "Password protect" : "Passwortschutz", - "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", "Allow editing" : "Bearbeitung erlauben", - "upload only" : "Nur Hochladen", "Email link to person" : "Link per E-Mail verschicken", "Send" : "Senden", + "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", + "Read only" : "Schreibgeschützt", + "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt", "Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt", "Choose a password for the mail share" : "Wähle ein Passwort für das Teilen via E-Mail", @@ -152,7 +153,6 @@ "Can create" : "kann erstellen", "Can change" : "kann ändern", "Can delete" : "kann löschen", - "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Access control" : "Zugriffskontrolle", "Could not unshare" : "Freigabe konnte nicht entfernt werden", "Error while sharing" : "Fehler beim Teilen", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 251ddb35d05..5a79d96372c 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Link teilen", "Link" : "Link", "Password protect" : "Passwortschutz", - "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", "Allow editing" : "Bearbeitung erlauben", - "upload only" : "Nur Hochladen", "Email link to person" : "Link per E-Mail verschicken", "Send" : "Senden", + "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", + "Read only" : "Schreibgeschützt", + "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.", "Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.", "Choose a password for the mail share" : "Wählen Sie ein Passwort für das Teilen via E-Mail", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "kann erstellen", "Can change" : "kann ändern", "Can delete" : "kann löschen", - "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Access control" : "Zugriffskontrolle", "Could not unshare" : "Freigabe konnte nicht aufgehoben werden", "Error while sharing" : "Fehler beim Teilen", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index d9f4f9089ea..c298f9004ea 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -133,11 +133,12 @@ "Share link" : "Link teilen", "Link" : "Link", "Password protect" : "Passwortschutz", - "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", "Allow editing" : "Bearbeitung erlauben", - "upload only" : "Nur Hochladen", "Email link to person" : "Link per E-Mail verschicken", "Send" : "Senden", + "Allow upload and editing" : "Hochladen und Bearbeiten erlauben", + "Read only" : "Schreibgeschützt", + "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.", "Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.", "Choose a password for the mail share" : "Wählen Sie ein Passwort für das Teilen via E-Mail", @@ -152,7 +153,6 @@ "Can create" : "kann erstellen", "Can change" : "kann ändern", "Can delete" : "kann löschen", - "Secure drop (upload only)" : "Sicheres ablegen (nur Hochladen)", "Access control" : "Zugriffskontrolle", "Could not unshare" : "Freigabe konnte nicht aufgehoben werden", "Error while sharing" : "Fehler beim Teilen", diff --git a/core/l10n/el.js b/core/l10n/el.js index 90ac874177a..be436779d44 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -14,6 +14,7 @@ OC.L10N.register( "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", "Crop is not square" : "Η περικοπή δεν εχει τετραγωνικό σχήμα", + "State token does not match" : "Το αναγνωριστικό κατάστασης δεν ταιριάζει", "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς συνθηματικού λόγω μη έγκυρου διακριτικού", "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς συνθηματικού επειδή το διακριτικό έχει λήξει", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Αδυναμία αποστολής ηλεκτρονικού μηνύματος επαναφοράς διότι δεν υπάρχει διεύθυνση ηλεκτρινικής αλληλογραφίας για αυτόν τον χρήστη. Παρακαλώ επικοινωνήστε με το διαχειριστή.", @@ -133,11 +134,11 @@ OC.L10N.register( "Share link" : "Διαμοιρασμός συνδέσμου", "Link" : "Σύνδεσμος", "Password protect" : "Προστασία συνθηματικού", - "Allow upload and editing" : "Επιτρέπονται η μεταφόρτωση και η επεξεργασία", "Allow editing" : "Επιτρέπεται η επεξεργασία", - "upload only" : "μόνο μεταφόρτωση", "Email link to person" : "Αποστολή συνδέσμου με email", "Send" : "Αποστολή", + "Allow upload and editing" : "Επιτρέπονται η μεταφόρτωση και η επεξεργασία", + "Secure drop (upload only)" : "Ασφαλής απόθεση (μόνο μεταφόρτωση)", "Shared with you and the group {group} by {owner}" : "Διαμοιράστηκε με σας και με την ομάδα {group} του {owner}", "Shared with you by {owner}" : "Διαμοιράστηκε με σας από τον {owner}", "Choose a password for the mail share" : "Επιλογή συνθηματικού για διαμοιρασμό με αλληλογραφία", @@ -152,7 +153,6 @@ OC.L10N.register( "Can create" : "Δυνατότητα δημιουργίας", "Can change" : "Δυνατότητα αλλαγής", "Can delete" : "Δυνατότητα διαγραφής", - "Secure drop (upload only)" : "Ασφαλής απόθεση (μόνο μεταφόρτωση)", "Access control" : "Έλεγχος πρόσβασης", "Could not unshare" : "Δεν μπορεί να γίνει αναίρεση διαμοιρασμού", "Error while sharing" : "Σφάλμα κατά τον διαμοιρασμό", diff --git a/core/l10n/el.json b/core/l10n/el.json index 838decb3afd..36f67e5726d 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -12,6 +12,7 @@ "No crop data provided" : "Δεν δόθηκαν δεδομένα περικοπής", "No valid crop data provided" : "Έχουν δοθεί μη έγκυρα δεδομένα περικοπής", "Crop is not square" : "Η περικοπή δεν εχει τετραγωνικό σχήμα", + "State token does not match" : "Το αναγνωριστικό κατάστασης δεν ταιριάζει", "Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς συνθηματικού λόγω μη έγκυρου διακριτικού", "Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς συνθηματικού επειδή το διακριτικό έχει λήξει", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Αδυναμία αποστολής ηλεκτρονικού μηνύματος επαναφοράς διότι δεν υπάρχει διεύθυνση ηλεκτρινικής αλληλογραφίας για αυτόν τον χρήστη. Παρακαλώ επικοινωνήστε με το διαχειριστή.", @@ -131,11 +132,11 @@ "Share link" : "Διαμοιρασμός συνδέσμου", "Link" : "Σύνδεσμος", "Password protect" : "Προστασία συνθηματικού", - "Allow upload and editing" : "Επιτρέπονται η μεταφόρτωση και η επεξεργασία", "Allow editing" : "Επιτρέπεται η επεξεργασία", - "upload only" : "μόνο μεταφόρτωση", "Email link to person" : "Αποστολή συνδέσμου με email", "Send" : "Αποστολή", + "Allow upload and editing" : "Επιτρέπονται η μεταφόρτωση και η επεξεργασία", + "Secure drop (upload only)" : "Ασφαλής απόθεση (μόνο μεταφόρτωση)", "Shared with you and the group {group} by {owner}" : "Διαμοιράστηκε με σας και με την ομάδα {group} του {owner}", "Shared with you by {owner}" : "Διαμοιράστηκε με σας από τον {owner}", "Choose a password for the mail share" : "Επιλογή συνθηματικού για διαμοιρασμό με αλληλογραφία", @@ -150,7 +151,6 @@ "Can create" : "Δυνατότητα δημιουργίας", "Can change" : "Δυνατότητα αλλαγής", "Can delete" : "Δυνατότητα διαγραφής", - "Secure drop (upload only)" : "Ασφαλής απόθεση (μόνο μεταφόρτωση)", "Access control" : "Έλεγχος πρόσβασης", "Could not unshare" : "Δεν μπορεί να γίνει αναίρεση διαμοιρασμού", "Error while sharing" : "Σφάλμα κατά τον διαμοιρασμό", diff --git a/core/l10n/es.js b/core/l10n/es.js index 09da33640d9..5d35a93474f 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Enlace compartido", "Link" : "Enlace", "Password protect" : "Protección con contraseña", - "Allow upload and editing" : "Permitir la subida y la edición", "Allow editing" : "Permitir edición", - "upload only" : "solo subida", "Email link to person" : "Enviar enlace por correo electrónico a una persona", "Send" : "Enviar", + "Allow upload and editing" : "Permitir la subida y la edición", + "Read only" : "Solo lectura", + "Secure drop (upload only)" : "Gota segura (solo subir)", "Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido contigo por {owner}", "Choose a password for the mail share" : "Elija una contraseña para compartir por correo electrónico", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Puede crear", "Can change" : "Puede cambiar", "Can delete" : "Puede eliminar", - "Secure drop (upload only)" : "Gota segura (solo subir)", "Access control" : "Control de acceso", "Could not unshare" : "No se puede quitar el comparto", "Error while sharing" : "Error al compartir", diff --git a/core/l10n/es.json b/core/l10n/es.json index 09c3d64a6da..c4f38f116fd 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -133,11 +133,12 @@ "Share link" : "Enlace compartido", "Link" : "Enlace", "Password protect" : "Protección con contraseña", - "Allow upload and editing" : "Permitir la subida y la edición", "Allow editing" : "Permitir edición", - "upload only" : "solo subida", "Email link to person" : "Enviar enlace por correo electrónico a una persona", "Send" : "Enviar", + "Allow upload and editing" : "Permitir la subida y la edición", + "Read only" : "Solo lectura", + "Secure drop (upload only)" : "Gota segura (solo subir)", "Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido contigo por {owner}", "Choose a password for the mail share" : "Elija una contraseña para compartir por correo electrónico", @@ -152,7 +153,6 @@ "Can create" : "Puede crear", "Can change" : "Puede cambiar", "Can delete" : "Puede eliminar", - "Secure drop (upload only)" : "Gota segura (solo subir)", "Access control" : "Control de acceso", "Could not unshare" : "No se puede quitar el comparto", "Error while sharing" : "Error al compartir", diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js index 67638809691..60946f5a0f8 100644 --- a/core/l10n/es_MX.js +++ b/core/l10n/es_MX.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Compartir liga", "Link" : "Liga", "Password protect" : "Proteger con contraseña", - "Allow upload and editing" : "Permitir cargar y editar", "Allow editing" : "Permitir editar", - "upload only" : "sólo cargar", "Email link to person" : "Enviar la liga por correo electrónico a una persona", "Send" : "Enviar", + "Allow upload and editing" : "Permitir cargar y editar", + "Read only" : "Solo lectura", + "Secure drop (upload only)" : "Depósito seguro (sólo carga de archivos)", "Shared with you and the group {group} by {owner}" : "Compartido con usted y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido con usted por {owner}", "Choose a password for the mail share" : "Establecer una contraseña para el elemento compartido por correo", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Puede crear", "Can change" : "Puede cambiar", "Can delete" : "Puede borrar", - "Secure drop (upload only)" : "Depósito seguro (sólo carga de archivos)", "Access control" : "Control de acceso", "Could not unshare" : "No fue posible dejar de compartir", "Error while sharing" : "Se presentó un error al compartir", diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json index 5b28d0b38d1..c19324cea6c 100644 --- a/core/l10n/es_MX.json +++ b/core/l10n/es_MX.json @@ -133,11 +133,12 @@ "Share link" : "Compartir liga", "Link" : "Liga", "Password protect" : "Proteger con contraseña", - "Allow upload and editing" : "Permitir cargar y editar", "Allow editing" : "Permitir editar", - "upload only" : "sólo cargar", "Email link to person" : "Enviar la liga por correo electrónico a una persona", "Send" : "Enviar", + "Allow upload and editing" : "Permitir cargar y editar", + "Read only" : "Solo lectura", + "Secure drop (upload only)" : "Depósito seguro (sólo carga de archivos)", "Shared with you and the group {group} by {owner}" : "Compartido con usted y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido con usted por {owner}", "Choose a password for the mail share" : "Establecer una contraseña para el elemento compartido por correo", @@ -152,7 +153,6 @@ "Can create" : "Puede crear", "Can change" : "Puede cambiar", "Can delete" : "Puede borrar", - "Secure drop (upload only)" : "Depósito seguro (sólo carga de archivos)", "Access control" : "Control de acceso", "Could not unshare" : "No fue posible dejar de compartir", "Error while sharing" : "Se presentó un error al compartir", diff --git a/core/l10n/eu.js b/core/l10n/eu.js index 17f1ce2cb39..c19aabe6cdf 100644 --- a/core/l10n/eu.js +++ b/core/l10n/eu.js @@ -116,10 +116,10 @@ OC.L10N.register( "Share link" : "Elkarbanatu lotura", "Link" : "Esteka", "Password protect" : "Babestu pasahitzarekin", - "Allow upload and editing" : "Onartu igoera eta edizioa", "Allow editing" : "Baimendu editatzea", "Email link to person" : "Postaz bidali lotura ", "Send" : "Bidali", + "Allow upload and editing" : "Onartu igoera eta edizioa", "Shared with you and the group {group} by {owner}" : "{owner}-k zu eta {group} taldearekin elkarbanatuta", "Shared with you by {owner}" : "{owner}-k zurekin elkarbanatuta", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} link bidez partekatuta", diff --git a/core/l10n/eu.json b/core/l10n/eu.json index 133b4e39635..e89b1f8eb68 100644 --- a/core/l10n/eu.json +++ b/core/l10n/eu.json @@ -114,10 +114,10 @@ "Share link" : "Elkarbanatu lotura", "Link" : "Esteka", "Password protect" : "Babestu pasahitzarekin", - "Allow upload and editing" : "Onartu igoera eta edizioa", "Allow editing" : "Baimendu editatzea", "Email link to person" : "Postaz bidali lotura ", "Send" : "Bidali", + "Allow upload and editing" : "Onartu igoera eta edizioa", "Shared with you and the group {group} by {owner}" : "{owner}-k zu eta {group} taldearekin elkarbanatuta", "Shared with you by {owner}" : "{owner}-k zurekin elkarbanatuta", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} link bidez partekatuta", diff --git a/core/l10n/fi.js b/core/l10n/fi.js index ce26d121f99..5bab688fc59 100644 --- a/core/l10n/fi.js +++ b/core/l10n/fi.js @@ -128,11 +128,11 @@ OC.L10N.register( "Share link" : "Jaa linkki", "Link" : "Linkki", "Password protect" : "Suojaa salasanalla", - "Allow upload and editing" : "Salli lähetys ja muokkaus", "Allow editing" : "Salli muokkaus", - "upload only" : "vain lähetys", "Email link to person" : "Lähetä linkki sähköpostitse", "Send" : "Lähetä", + "Allow upload and editing" : "Salli lähetys ja muokkaus", + "Secure drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", "Shared with you and the group {group} by {owner}" : "Jaettu sinun ja ryhmän {group} kanssa käyttäjältä {owner}", "Shared with you by {owner}" : "Jaettu kanssasi käyttäjältä {owner}", "Choose a password for the mail share" : "Valitse salasana sähköpostijaolle", @@ -147,7 +147,6 @@ OC.L10N.register( "Can create" : "Voi luoda", "Can change" : "Voi vaihtaa", "Can delete" : "Voi poistaa", - "Secure drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", "Access control" : "Pääsynhallinta", "Could not unshare" : "Jakamisen lopettaminen epäonnistui", "Error while sharing" : "Virhe jaettaessa", diff --git a/core/l10n/fi.json b/core/l10n/fi.json index 631f8d7cfdd..80db8e783f7 100644 --- a/core/l10n/fi.json +++ b/core/l10n/fi.json @@ -126,11 +126,11 @@ "Share link" : "Jaa linkki", "Link" : "Linkki", "Password protect" : "Suojaa salasanalla", - "Allow upload and editing" : "Salli lähetys ja muokkaus", "Allow editing" : "Salli muokkaus", - "upload only" : "vain lähetys", "Email link to person" : "Lähetä linkki sähköpostitse", "Send" : "Lähetä", + "Allow upload and editing" : "Salli lähetys ja muokkaus", + "Secure drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", "Shared with you and the group {group} by {owner}" : "Jaettu sinun ja ryhmän {group} kanssa käyttäjältä {owner}", "Shared with you by {owner}" : "Jaettu kanssasi käyttäjältä {owner}", "Choose a password for the mail share" : "Valitse salasana sähköpostijaolle", @@ -145,7 +145,6 @@ "Can create" : "Voi luoda", "Can change" : "Voi vaihtaa", "Can delete" : "Voi poistaa", - "Secure drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", "Access control" : "Pääsynhallinta", "Could not unshare" : "Jakamisen lopettaminen epäonnistui", "Error while sharing" : "Virhe jaettaessa", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 6cda757a64c..155daba2eac 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -132,11 +132,12 @@ OC.L10N.register( "Share link" : "Partager par lien public", "Link" : "Lien", "Password protect" : "Protéger par un mot de passe", - "Allow upload and editing" : "Autoriser l'envoi et l'édition", "Allow editing" : "Permettre la modification", - "upload only" : " Envoyer uniquement", "Email link to person" : "Envoyer le lien par courriel", "Send" : "Envoyer", + "Allow upload and editing" : "Autoriser l'envoi et l'édition", + "Read only" : "Lecture seule", + "Secure drop (upload only)" : "Dépôt sécurisé (téléversement uniquement)", "Shared with you and the group {group} by {owner}" : "Partagé avec vous et le groupe {group} par {owner}", "Shared with you by {owner}" : "Partagé avec vous par {owner}", "Choose a password for the mail share" : "Choisissez un mot de passe pour le partage par email", @@ -151,7 +152,6 @@ OC.L10N.register( "Can create" : "Peut créer", "Can change" : "Peut modifier", "Can delete" : "Peut supprimer", - "Secure drop (upload only)" : "Dépôt sécurisé (téléversement uniquement)", "Access control" : "Contrôle d'accès", "Could not unshare" : "Impossible d'arrêter de partager", "Error while sharing" : "Erreur lors de la mise en partage", @@ -265,6 +265,8 @@ OC.L10N.register( "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "You are about to grant \"%s\" access to your %s account." : "Vous êtes sur le point d'accorder à \"%s\" l'accès à votre compte \"%s\".", + "App token" : "Jeton d'application", + "Alternative login using app token" : "Authentification alternative utilisant un jeton d'application", "Redirecting …" : "Redirection en cours...", "New password" : "Nouveau mot de passe", "New Password" : "Nouveau mot de passe", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index e9cd957490b..22d4e4f705c 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -130,11 +130,12 @@ "Share link" : "Partager par lien public", "Link" : "Lien", "Password protect" : "Protéger par un mot de passe", - "Allow upload and editing" : "Autoriser l'envoi et l'édition", "Allow editing" : "Permettre la modification", - "upload only" : " Envoyer uniquement", "Email link to person" : "Envoyer le lien par courriel", "Send" : "Envoyer", + "Allow upload and editing" : "Autoriser l'envoi et l'édition", + "Read only" : "Lecture seule", + "Secure drop (upload only)" : "Dépôt sécurisé (téléversement uniquement)", "Shared with you and the group {group} by {owner}" : "Partagé avec vous et le groupe {group} par {owner}", "Shared with you by {owner}" : "Partagé avec vous par {owner}", "Choose a password for the mail share" : "Choisissez un mot de passe pour le partage par email", @@ -149,7 +150,6 @@ "Can create" : "Peut créer", "Can change" : "Peut modifier", "Can delete" : "Peut supprimer", - "Secure drop (upload only)" : "Dépôt sécurisé (téléversement uniquement)", "Access control" : "Contrôle d'accès", "Could not unshare" : "Impossible d'arrêter de partager", "Error while sharing" : "Erreur lors de la mise en partage", @@ -263,6 +263,8 @@ "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "You are about to grant \"%s\" access to your %s account." : "Vous êtes sur le point d'accorder à \"%s\" l'accès à votre compte \"%s\".", + "App token" : "Jeton d'application", + "Alternative login using app token" : "Authentification alternative utilisant un jeton d'application", "Redirecting …" : "Redirection en cours...", "New password" : "Nouveau mot de passe", "New Password" : "Nouveau mot de passe", diff --git a/core/l10n/hu.js b/core/l10n/hu.js index 2a7f9ff3c84..097834ea472 100644 --- a/core/l10n/hu.js +++ b/core/l10n/hu.js @@ -115,11 +115,10 @@ OC.L10N.register( "Share link" : "Megosztás hivatkozással", "Link" : "Hivatkozás", "Password protect" : "Jelszóval védett", - "Allow upload and editing" : "Feltöltés és szerkesztés engedélyezése", "Allow editing" : "Szerkesztés engedélyezése", - "upload only" : "csak feltöltés", "Email link to person" : "Hivatkozás elküldése e-mail címre", "Send" : "Küldés", + "Allow upload and editing" : "Feltöltés és szerkesztés engedélyezése", "Shared with you and the group {group} by {owner}" : "{owner} megosztotta veled és ezzel a csoporttal: {group}", "Shared with you by {owner}" : "{owner} megosztotta veled", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} megosztva hivatkozással", diff --git a/core/l10n/hu.json b/core/l10n/hu.json index ba703d83dd0..6462720387e 100644 --- a/core/l10n/hu.json +++ b/core/l10n/hu.json @@ -113,11 +113,10 @@ "Share link" : "Megosztás hivatkozással", "Link" : "Hivatkozás", "Password protect" : "Jelszóval védett", - "Allow upload and editing" : "Feltöltés és szerkesztés engedélyezése", "Allow editing" : "Szerkesztés engedélyezése", - "upload only" : "csak feltöltés", "Email link to person" : "Hivatkozás elküldése e-mail címre", "Send" : "Küldés", + "Allow upload and editing" : "Feltöltés és szerkesztés engedélyezése", "Shared with you and the group {group} by {owner}" : "{owner} megosztotta veled és ezzel a csoporttal: {group}", "Shared with you by {owner}" : "{owner} megosztotta veled", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} megosztva hivatkozással", diff --git a/core/l10n/id.js b/core/l10n/id.js index c09e1399bd3..fb4852db6f9 100644 --- a/core/l10n/id.js +++ b/core/l10n/id.js @@ -117,10 +117,10 @@ OC.L10N.register( "Share link" : "Bagikan tautan", "Link" : "Tautan", "Password protect" : "Lindungi dengan sandi", - "Allow upload and editing" : "Izinkan pengunggahan dan penyuntingan", "Allow editing" : "Izinkan penyuntingan", "Email link to person" : "Emailkan tautan ini ke orang", "Send" : "Kirim", + "Allow upload and editing" : "Izinkan pengunggahan dan penyuntingan", "Shared with you and the group {group} by {owner}" : "Dibagikan dengan anda dan grup {group} oleh {owner}", "Shared with you by {owner}" : "Dibagikan dengan anda oleh {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} dibagikan lewat tautan", diff --git a/core/l10n/id.json b/core/l10n/id.json index 2397a7416fc..8639c6b818d 100644 --- a/core/l10n/id.json +++ b/core/l10n/id.json @@ -115,10 +115,10 @@ "Share link" : "Bagikan tautan", "Link" : "Tautan", "Password protect" : "Lindungi dengan sandi", - "Allow upload and editing" : "Izinkan pengunggahan dan penyuntingan", "Allow editing" : "Izinkan penyuntingan", "Email link to person" : "Emailkan tautan ini ke orang", "Send" : "Kirim", + "Allow upload and editing" : "Izinkan pengunggahan dan penyuntingan", "Shared with you and the group {group} by {owner}" : "Dibagikan dengan anda dan grup {group} oleh {owner}", "Shared with you by {owner}" : "Dibagikan dengan anda oleh {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} dibagikan lewat tautan", diff --git a/core/l10n/is.js b/core/l10n/is.js index 273fdbe25ec..0ed52aa0d0b 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -131,11 +131,11 @@ OC.L10N.register( "Share link" : "Deila tengli", "Link" : "Tengill", "Password protect" : "Verja með lykilorði", - "Allow upload and editing" : "Leyfa innsendingu og breytingar", "Allow editing" : "Leyfa breytingar", - "upload only" : "einungis innsending", "Email link to person" : "Senda veftengil í tölvupósti til notanda", "Send" : "Senda", + "Allow upload and editing" : "Leyfa innsendingu og breytingar", + "Secure drop (upload only)" : "Örugg slepping skráa (einungis innsending)", "Shared with you and the group {group} by {owner}" : "Deilt með þér og hópnum {group} af {owner}", "Shared with you by {owner}" : "Deilt með þér af {owner}", "Choose a password for the mail share" : "Veldu lykilorð fyrir póstsameign", @@ -150,7 +150,6 @@ OC.L10N.register( "Can create" : "Getur búið til", "Can change" : "Getur skipt um", "Can delete" : "Getur eytt", - "Secure drop (upload only)" : "Örugg slepping skráa (einungis innsending)", "Access control" : "Aðgangsstýring", "Could not unshare" : "Gat ekki hætt deilingu", "Error while sharing" : "Villa við deilingu", diff --git a/core/l10n/is.json b/core/l10n/is.json index f3e8869460a..c84bed42b8a 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -129,11 +129,11 @@ "Share link" : "Deila tengli", "Link" : "Tengill", "Password protect" : "Verja með lykilorði", - "Allow upload and editing" : "Leyfa innsendingu og breytingar", "Allow editing" : "Leyfa breytingar", - "upload only" : "einungis innsending", "Email link to person" : "Senda veftengil í tölvupósti til notanda", "Send" : "Senda", + "Allow upload and editing" : "Leyfa innsendingu og breytingar", + "Secure drop (upload only)" : "Örugg slepping skráa (einungis innsending)", "Shared with you and the group {group} by {owner}" : "Deilt með þér og hópnum {group} af {owner}", "Shared with you by {owner}" : "Deilt með þér af {owner}", "Choose a password for the mail share" : "Veldu lykilorð fyrir póstsameign", @@ -148,7 +148,6 @@ "Can create" : "Getur búið til", "Can change" : "Getur skipt um", "Can delete" : "Getur eytt", - "Secure drop (upload only)" : "Örugg slepping skráa (einungis innsending)", "Access control" : "Aðgangsstýring", "Could not unshare" : "Gat ekki hætt deilingu", "Error while sharing" : "Villa við deilingu", diff --git a/core/l10n/it.js b/core/l10n/it.js index ea6bdc658d3..baf6fc6c3bc 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -123,11 +123,10 @@ OC.L10N.register( "Share link" : "Condividi collegamento", "Link" : "Collegamento", "Password protect" : "Proteggi con password", - "Allow upload and editing" : "Consenti il caricamento e la modifica", "Allow editing" : "Consenti la modifica", - "upload only" : "solo caricamento", "Email link to person" : "Invia collegamento via email", "Send" : "Invia", + "Allow upload and editing" : "Consenti il caricamento e la modifica", "Shared with you and the group {group} by {owner}" : "Condiviso con te e con il gruppo {group} da {owner}", "Shared with you by {owner}" : "Condiviso con te da {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} ha condiviso tramite collegamento", diff --git a/core/l10n/it.json b/core/l10n/it.json index 11bfe5bc732..8f44d1c2f1e 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -121,11 +121,10 @@ "Share link" : "Condividi collegamento", "Link" : "Collegamento", "Password protect" : "Proteggi con password", - "Allow upload and editing" : "Consenti il caricamento e la modifica", "Allow editing" : "Consenti la modifica", - "upload only" : "solo caricamento", "Email link to person" : "Invia collegamento via email", "Send" : "Invia", + "Allow upload and editing" : "Consenti il caricamento e la modifica", "Shared with you and the group {group} by {owner}" : "Condiviso con te e con il gruppo {group} da {owner}", "Shared with you by {owner}" : "Condiviso con te da {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} ha condiviso tramite collegamento", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 94a20116505..6bc2f471a4a 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -123,11 +123,11 @@ OC.L10N.register( "Share link" : "URLで共有", "Link" : "リンク", "Password protect" : "パスワード保護を有効化", - "Allow upload and editing" : "アップロードと編集を許可する", "Allow editing" : "編集を許可", - "upload only" : "アップロードのみ", "Email link to person" : "メールリンク", "Send" : "送信", + "Allow upload and editing" : "アップロードと編集を許可する", + "Secure drop (upload only)" : "セキュアドロップ (アップロードのみ)", "Shared with you and the group {group} by {owner}" : "あなたと {owner} のグループ {group} で共有中", "Shared with you by {owner}" : "{owner} より共有中", "Choose a password for the mail share" : "メール共有のパスワードを選択", @@ -142,7 +142,6 @@ OC.L10N.register( "Can create" : "作成可能", "Can change" : "変更可能", "Can delete" : "削除可能", - "Secure drop (upload only)" : "セキュアドロップ (アップロードのみ)", "Access control" : "アクセス制御", "Could not unshare" : "共有の解除ができませんでした", "Error while sharing" : "共有でエラー発生", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 7f75aaa1b69..192ea81c69d 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -121,11 +121,11 @@ "Share link" : "URLで共有", "Link" : "リンク", "Password protect" : "パスワード保護を有効化", - "Allow upload and editing" : "アップロードと編集を許可する", "Allow editing" : "編集を許可", - "upload only" : "アップロードのみ", "Email link to person" : "メールリンク", "Send" : "送信", + "Allow upload and editing" : "アップロードと編集を許可する", + "Secure drop (upload only)" : "セキュアドロップ (アップロードのみ)", "Shared with you and the group {group} by {owner}" : "あなたと {owner} のグループ {group} で共有中", "Shared with you by {owner}" : "{owner} より共有中", "Choose a password for the mail share" : "メール共有のパスワードを選択", @@ -140,7 +140,6 @@ "Can create" : "作成可能", "Can change" : "変更可能", "Can delete" : "削除可能", - "Secure drop (upload only)" : "セキュアドロップ (アップロードのみ)", "Access control" : "アクセス制御", "Could not unshare" : "共有の解除ができませんでした", "Error while sharing" : "共有でエラー発生", diff --git a/core/l10n/ko.js b/core/l10n/ko.js index c803eb547f5..f1af50c0c5a 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -135,11 +135,11 @@ OC.L10N.register( "Share link" : "링크 공유", "Link" : "링크", "Password protect" : "암호 보호", - "Allow upload and editing" : "업로드 및 편집 허용", "Allow editing" : "편집 허용", - "upload only" : "업로드만 허용", "Email link to person" : "이메일 주소", "Send" : "전송", + "Allow upload and editing" : "업로드 및 편집 허용", + "Secure drop (upload only)" : "안전 보관소(업로드만 허용)", "Shared with you and the group {group} by {owner}" : "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중", "Shared with you by {owner}" : "{owner} 님이 공유 중", "Choose a password for the mail share" : "이메일 공유 암호 입력", @@ -154,7 +154,6 @@ OC.L10N.register( "Can create" : "생성 가능", "Can change" : "변경 가능", "Can delete" : "삭제 가능", - "Secure drop (upload only)" : "안전 보관소(업로드만 허용)", "Access control" : "접근 제어", "Could not unshare" : "공유 해제할 수 없음", "Error while sharing" : "공유하는 중 오류 발생", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index 0f7711164b5..78917f8a9cc 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -133,11 +133,11 @@ "Share link" : "링크 공유", "Link" : "링크", "Password protect" : "암호 보호", - "Allow upload and editing" : "업로드 및 편집 허용", "Allow editing" : "편집 허용", - "upload only" : "업로드만 허용", "Email link to person" : "이메일 주소", "Send" : "전송", + "Allow upload and editing" : "업로드 및 편집 허용", + "Secure drop (upload only)" : "안전 보관소(업로드만 허용)", "Shared with you and the group {group} by {owner}" : "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중", "Shared with you by {owner}" : "{owner} 님이 공유 중", "Choose a password for the mail share" : "이메일 공유 암호 입력", @@ -152,7 +152,6 @@ "Can create" : "생성 가능", "Can change" : "변경 가능", "Can delete" : "삭제 가능", - "Secure drop (upload only)" : "안전 보관소(업로드만 허용)", "Access control" : "접근 제어", "Could not unshare" : "공유 해제할 수 없음", "Error while sharing" : "공유하는 중 오류 발생", diff --git a/core/l10n/nb.js b/core/l10n/nb.js index a983947144f..5e1c092854a 100644 --- a/core/l10n/nb.js +++ b/core/l10n/nb.js @@ -135,11 +135,11 @@ OC.L10N.register( "Share link" : "Del lenke", "Link" : "Lenke", "Password protect" : "Passordbeskyttet", - "Allow upload and editing" : "Tillatt opplasting og redigering", "Allow editing" : "Tillat redigering", - "upload only" : "kun opplasting", "Email link to person" : "Send lenke til person via e-post", "Send" : "Send", + "Allow upload and editing" : "Tillatt opplasting og redigering", + "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Shared with you and the group {group} by {owner}" : "Delt med deg og gruppen {group} av {owner}", "Shared with you by {owner}" : "Delt med deg av {owner}", "Choose a password for the mail share" : "Velg et passord for e-postlageret", @@ -154,7 +154,6 @@ OC.L10N.register( "Can create" : "Kan opprette", "Can change" : "Kan endre", "Can delete" : "Kan slette", - "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Access control" : "Tilgangskontroll", "Could not unshare" : "Kunne ikke avslutte deling", "Error while sharing" : "Feil under deling", diff --git a/core/l10n/nb.json b/core/l10n/nb.json index 43bda62fd43..a0bca69f382 100644 --- a/core/l10n/nb.json +++ b/core/l10n/nb.json @@ -133,11 +133,11 @@ "Share link" : "Del lenke", "Link" : "Lenke", "Password protect" : "Passordbeskyttet", - "Allow upload and editing" : "Tillatt opplasting og redigering", "Allow editing" : "Tillat redigering", - "upload only" : "kun opplasting", "Email link to person" : "Send lenke til person via e-post", "Send" : "Send", + "Allow upload and editing" : "Tillatt opplasting og redigering", + "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Shared with you and the group {group} by {owner}" : "Delt med deg og gruppen {group} av {owner}", "Shared with you by {owner}" : "Delt med deg av {owner}", "Choose a password for the mail share" : "Velg et passord for e-postlageret", @@ -152,7 +152,6 @@ "Can create" : "Kan opprette", "Can change" : "Kan endre", "Can delete" : "Kan slette", - "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Access control" : "Tilgangskontroll", "Could not unshare" : "Kunne ikke avslutte deling", "Error while sharing" : "Feil under deling", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index 0e4626deefb..b181bc9f9e2 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Deellink", "Link" : "Link", "Password protect" : "Wachtwoord beveiligd", - "Allow upload and editing" : "Toestaan uploaden en bewerken", "Allow editing" : "Bewerken toestaan", - "upload only" : "alleen uploaden", "Email link to person" : "E-mail link naar persoon", "Send" : "Versturen", + "Allow upload and editing" : "Toestaan uploaden en bewerken", + "Read only" : "Alleen lezen", + "Secure drop (upload only)" : "Veilige drop (alleen uploaden)", "Shared with you and the group {group} by {owner}" : "Gedeeld met jou en de groep {group} door {owner}", "Shared with you by {owner}" : "Gedeeld met jou door {owner}", "Choose a password for the mail share" : "Kies een wachtwoord om gedeelde te mailen", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Kan creëren", "Can change" : "Kan wijzigen", "Can delete" : "Kan verwijderen", - "Secure drop (upload only)" : "Veilige drop (alleen uploaden)", "Access control" : "Toegangscontrole", "Could not unshare" : "Kon delen niet ongedaan maken", "Error while sharing" : "Fout tijdens het delen", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index ade3ae9fd79..e2631655212 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -133,11 +133,12 @@ "Share link" : "Deellink", "Link" : "Link", "Password protect" : "Wachtwoord beveiligd", - "Allow upload and editing" : "Toestaan uploaden en bewerken", "Allow editing" : "Bewerken toestaan", - "upload only" : "alleen uploaden", "Email link to person" : "E-mail link naar persoon", "Send" : "Versturen", + "Allow upload and editing" : "Toestaan uploaden en bewerken", + "Read only" : "Alleen lezen", + "Secure drop (upload only)" : "Veilige drop (alleen uploaden)", "Shared with you and the group {group} by {owner}" : "Gedeeld met jou en de groep {group} door {owner}", "Shared with you by {owner}" : "Gedeeld met jou door {owner}", "Choose a password for the mail share" : "Kies een wachtwoord om gedeelde te mailen", @@ -152,7 +153,6 @@ "Can create" : "Kan creëren", "Can change" : "Kan wijzigen", "Can delete" : "Kan verwijderen", - "Secure drop (upload only)" : "Veilige drop (alleen uploaden)", "Access control" : "Toegangscontrole", "Could not unshare" : "Kon delen niet ongedaan maken", "Error while sharing" : "Fout tijdens het delen", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index 121b1593290..3d8144f23f2 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Udostępnij link", "Link" : "Odnośnik", "Password protect" : "Zabezpiecz hasłem", - "Allow upload and editing" : "Pozwól na przesyłanie i edycję", "Allow editing" : "Pozwól na edycję", - "upload only" : "tylko wysyłanie", "Email link to person" : "Wyślij osobie odnośnik poprzez e-mail", "Send" : "Wyślij", + "Allow upload and editing" : "Pozwól na przesyłanie i edycję", + "Read only" : "Tylko do odczytu", + "Secure drop (upload only)" : "Bezpieczny zrzut (tylko wysyłanie)", "Shared with you and the group {group} by {owner}" : "Udostępnione tobie i grupie {group} przez {owner}", "Shared with you by {owner}" : "Udostępnione tobie przez {owner}", "Choose a password for the mail share" : "Wybierz hasło do współdzielenia e-mailem", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Może tworzyć", "Can change" : "Może zmieniać", "Can delete" : "Może usuwać", - "Secure drop (upload only)" : "Bezpieczny zrzut (tylko wysyłanie)", "Access control" : "Kontrola dostępu", "Could not unshare" : "Nie udało się usunąć udostępnienia", "Error while sharing" : "Błąd podczas udostępniania", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 51102891120..069d335940c 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -133,11 +133,12 @@ "Share link" : "Udostępnij link", "Link" : "Odnośnik", "Password protect" : "Zabezpiecz hasłem", - "Allow upload and editing" : "Pozwól na przesyłanie i edycję", "Allow editing" : "Pozwól na edycję", - "upload only" : "tylko wysyłanie", "Email link to person" : "Wyślij osobie odnośnik poprzez e-mail", "Send" : "Wyślij", + "Allow upload and editing" : "Pozwól na przesyłanie i edycję", + "Read only" : "Tylko do odczytu", + "Secure drop (upload only)" : "Bezpieczny zrzut (tylko wysyłanie)", "Shared with you and the group {group} by {owner}" : "Udostępnione tobie i grupie {group} przez {owner}", "Shared with you by {owner}" : "Udostępnione tobie przez {owner}", "Choose a password for the mail share" : "Wybierz hasło do współdzielenia e-mailem", @@ -152,7 +153,6 @@ "Can create" : "Może tworzyć", "Can change" : "Może zmieniać", "Can delete" : "Może usuwać", - "Secure drop (upload only)" : "Bezpieczny zrzut (tylko wysyłanie)", "Access control" : "Kontrola dostępu", "Could not unshare" : "Nie udało się usunąć udostępnienia", "Error while sharing" : "Błąd podczas udostępniania", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 25e33c98f1e..f099c5a82c7 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -18,14 +18,14 @@ OC.L10N.register( "Auth flow can only be started unauthenticated." : "O fluxo de autenticação só pode ser iniciado como não autenticado.", "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", - "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 email para este nome de usuário. Entre em contato com o administrador.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar e-mail 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.", "Password reset" : "Redefinir a senha", - "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no botão abaixo para redefinir sua senha. Se você não solicitou isso, ignore este email.", - "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no link abaixo para redefinir sua senha. Se você não solicitou isso, ignore este email.", + "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no botão abaixo para redefinir sua senha. Se você não solicitou isso, ignore este e-mail.", + "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no link abaixo para redefinir sua senha. Se você não solicitou isso, ignore este e-mail.", "Reset your password" : "Redefinir sua senha", "%s password reset" : "%s redefinir senha", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o email de redefinição. Por favor, contate o administrador.", - "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar o email de redefinição. Verifique se o seu nome de usuário está correto.", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de redefinição. Por favor, contate o administrador.", + "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar o e-mail de redefinição. Verifique se o seu nome de usuário está correto.", "Preparing update" : "Preparando a atualização", "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Aviso da reparação:", @@ -72,7 +72,7 @@ OC.L10N.register( "Failed to authenticate, try again" : "Falha na autenticação, tente novamente", "seconds ago" : "segundos atrás", "Logging in …" : "Entrando...", - "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 enviado para seu email. 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 local.", + "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 enviado para 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 local.", "Your files are encrypted. 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. Não existe nenhuma maneira de ter seus dados de volta depois que sua senha seja redefinida.<br /> Se você não tem certeza do que fazer, por favor contate seu administrador antes de continuar.<br />Você realmente deseja continuar?", "I know what I'm doing" : "Eu sei o que estou fazendo", "Password can not be changed. Please contact your administrator." : "A senha não pôde ser alterada. Por favor, contate o administrador.", @@ -102,11 +102,11 @@ OC.L10N.register( "Strong password" : "Senha forte", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, pois a interface WebDAV parece ser desconfigurada.", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", - "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet: Várias terminações finais podem não ser encontradas. Isso significa que alguns dos recursos como montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros podem não funcionar. Acesso a arquivos remotos e envio de emails de notificação podem não funcionar também. Sugerimos habilitar a conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", + "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet: Várias terminações finais podem não ser encontradas. Isso significa que alguns dos recursos como montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros podem não funcionar. Acesso a arquivos remotos e envio de e-mails de notificação podem não funcionar também. Sugerimos habilitar a conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", "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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nenhum cache de memória foi configurado. Para melhorar o desempenho, por favor configure um memcached se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" 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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido pelo PHP e é altamente desencorajado por razões de segurança. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Você está atualmente executando PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar as<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">atualizações de segurança e desempenho proporcionados pelo Grupo PHP</a> assim que sua distribuição suportar.", - "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O cabeçalho do proxy reverso está incorreto, ou você está acessando a partir de um proxy confiável. Se voce não está usando um proxy confiável, há uma falha de segurança que pode permitir um ataque. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O cabeçalho do proxy reverso está incorreto, ou você está acessando a partir de um proxy confiável. Se você não está usando um proxy confiável, há uma falha de segurança que pode permitir um ataque. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" 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\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki memcached 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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema pode ser encontrado em nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "O Opcache do PHP não está configurado corretamente. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Para um melhor desempenho recomendamos ↗</a> usar as seguintes configurações no <code>php.ini</code>:", @@ -135,18 +135,19 @@ OC.L10N.register( "Share link" : "Compartilhar link", "Link" : "Link", "Password protect" : "Proteger com senha", - "Allow upload and editing" : "Permitir envio e edição", "Allow editing" : "Permitir edição", - "upload only" : "somente envio", - "Email link to person" : "Enviar link por email", + "Email link to person" : "Enviar link por e-mail", "Send" : "Enviar", + "Allow upload and editing" : "Permitir envio e edição", + "Read only" : "Somente leitura", + "Secure drop (upload only)" : "Drop seguro (apenas envio)", "Shared with you and the group {group} by {owner}" : "Compartilhado com você e com o grupo {group} por {owner}", "Shared with you by {owner}" : "Compartilhado com você por {owner}", - "Choose a password for the mail share" : "Escolha uma senha para o compartilhamento de email", + "Choose a password for the mail share" : "Escolha uma senha para o compartilhamento de e-mail", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatiorDisplayName}} compartilhou via link", "group" : "grupo", "remote" : "remoto", - "email" : "email", + "email" : "e-mail", "shared by {sharer}" : "compartilhado por {sharer}", "Unshare" : "Descompartilhar", "Can reshare" : "Pode compartilhar novamente", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Pode criar", "Can change" : "Pode modificar", "Can delete" : "Pode excluir", - "Secure drop (upload only)" : "Drop seguro (apenas envio)", "Access control" : "Controle de acesso", "Could not unshare" : "Não foi possível descompartilhar", "Error while sharing" : "Erro ao compartilhar", @@ -169,12 +169,12 @@ OC.L10N.register( "{sharee} (email)" : "{sharee} (email)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Compartilhar", - "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo, ID de cloud federada ou um email.", + "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo, ID de cloud federada ou um e-mail.", "Share with other people by entering a user or group or a federated cloud ID." : "Compartilhe com outras pessoas entrando um usuário, grupo ou ID de cloud federada.", - "Share with other people by entering a user or group or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo ou um email.", - "Name or email address..." : "Nome ou email...", + "Share with other people by entering a user or group or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo ou um e-mail.", + "Name or email address..." : "Nome ou e-mail...", "Name or federated cloud ID..." : "Nome ou ID de cloud federada...", - "Name, federated cloud ID or email address..." : "Nome, ID de cloud federada ou email...", + "Name, federated cloud ID or email address..." : "Nome, ID de cloud federada ou e-mail...", "Name..." : "Nome...", "Error" : "Erro", "Error removing share" : "Erro na exclusão do compartilhamento", @@ -246,7 +246,7 @@ OC.L10N.register( "Please specify the port number along with the host name (e.g., localhost:5432)." : "Por favor especifique o nome do host e o número de porta (ex., localhost:5432).", "Performance warning" : "Alerta de performance", "SQLite will be used as database." : "SQLite será usado como banco de dados", - "For larger installations we recommend to choose a different database backend." : "Para instalações maiores é recomendável escolher um backend de banco de dados diferente.", + "For larger installations we recommend to choose a different database backend." : "Para instalações maiores é recomendável escolher uma plataforma de serviço de banco de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente quando se utiliza o cliente de desktop para sincronização de arquivos.", "Finish setup" : "Concluir configuração", "Finishing …" : "Finalizando...", @@ -261,7 +261,7 @@ OC.L10N.register( "Please contact your administrator." : "Por favor, contacte o administrador.", "An internal error occurred." : "Ocorreu um erro interno.", "Please try again or contact your administrator." : "Por favor tente novamente ou contacte o administrador.", - "Username or email" : "Nome de usuário ou email", + "Username or email" : "Nome de usuário ou e-mail", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", "Wrong password." : "Senha errada", "Log in" : "Entrar", @@ -315,13 +315,13 @@ OC.L10N.register( "can delete" : "pode excluir", "access control" : "controle de acesso", "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "Compartilhe com pessoas de outros servidores usando o ID de nuvem federada username@example.com/nextcloud", - "Share with users or by mail..." : "Compartilhe com usuários internos ou email...", + "Share with users or by mail..." : "Compartilhe com usuários internos ou e-mail...", "Share with users or remote users..." : "Compartilhe com usuários internos ou remotos...", - "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, remotos ou email...", + "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, remotos ou e-mail...", "Share with users or groups..." : "Compartilhe com usuários internos ou grupos...", - "Share with users, groups or by mail..." : "Compartilhe com usuários internos, grupos ou email...", + "Share with users, groups or by mail..." : "Compartilhe com usuários internos, grupos ou e-mail...", "Share with users, groups or remote users..." : "Compartilhe com usuários internos, remotos ou grupos...", - "Share with users, groups, remote users or by mail..." : "Compartilhe com usuários internos, remotos, grupos ou email...", + "Share with users, groups, remote users or by mail..." : "Compartilhe com usuários internos, remotos, grupos ou e-mail...", "Share with users..." : "Compartilhe com usuários internos...", "The object type is not specified." : "O tipo de objeto não foi especificado.", "Enter new" : "Entre nova", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 0acfe497d26..d981f5c5ebe 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -16,14 +16,14 @@ "Auth flow can only be started unauthenticated." : "O fluxo de autenticação só pode ser iniciado como não autenticado.", "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", - "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 email para este nome de usuário. Entre em contato com o administrador.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar e-mail 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.", "Password reset" : "Redefinir a senha", - "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no botão abaixo para redefinir sua senha. Se você não solicitou isso, ignore este email.", - "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no link abaixo para redefinir sua senha. Se você não solicitou isso, ignore este email.", + "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no botão abaixo para redefinir sua senha. Se você não solicitou isso, ignore este e-mail.", + "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no link abaixo para redefinir sua senha. Se você não solicitou isso, ignore este e-mail.", "Reset your password" : "Redefinir sua senha", "%s password reset" : "%s redefinir senha", - "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o email de redefinição. Por favor, contate o administrador.", - "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar o email de redefinição. Verifique se o seu nome de usuário está correto.", + "Couldn't send reset email. Please contact your administrator." : "Não foi possível enviar o e-mail de redefinição. Por favor, contate o administrador.", + "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar o e-mail de redefinição. Verifique se o seu nome de usuário está correto.", "Preparing update" : "Preparando a atualização", "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Aviso da reparação:", @@ -70,7 +70,7 @@ "Failed to authenticate, try again" : "Falha na autenticação, tente novamente", "seconds ago" : "segundos atrás", "Logging in …" : "Entrando...", - "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 enviado para seu email. 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 local.", + "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 enviado para 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 local.", "Your files are encrypted. 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. Não existe nenhuma maneira de ter seus dados de volta depois que sua senha seja redefinida.<br /> Se você não tem certeza do que fazer, por favor contate seu administrador antes de continuar.<br />Você realmente deseja continuar?", "I know what I'm doing" : "Eu sei o que estou fazendo", "Password can not be changed. Please contact your administrator." : "A senha não pôde ser alterada. Por favor, contate o administrador.", @@ -100,11 +100,11 @@ "Strong password" : "Senha forte", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Seu servidor web ainda não está configurado corretamente para permitir a sincronização de arquivos, pois a interface WebDAV parece ser desconfigurada.", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Seu servidor web não está configurado corretamente para resolver \"{url}\". Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", - "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet: Várias terminações finais podem não ser encontradas. Isso significa que alguns dos recursos como montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros podem não funcionar. Acesso a arquivos remotos e envio de emails de notificação podem não funcionar também. Sugerimos habilitar a conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", + "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet: Várias terminações finais podem não ser encontradas. Isso significa que alguns dos recursos como montagem de armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros podem não funcionar. Acesso a arquivos remotos e envio de e-mails de notificação podem não funcionar também. Sugerimos habilitar a conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", "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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nenhum cache de memória foi configurado. Para melhorar o desempenho, por favor configure um memcached se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" 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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não pode ser lido pelo PHP e é altamente desencorajado por razões de segurança. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Você está atualmente executando PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar as<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">atualizações de segurança e desempenho proporcionados pelo Grupo PHP</a> assim que sua distribuição suportar.", - "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O cabeçalho do proxy reverso está incorreto, ou você está acessando a partir de um proxy confiável. Se voce não está usando um proxy confiável, há uma falha de segurança que pode permitir um ataque. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "O cabeçalho do proxy reverso está incorreto, ou você está acessando a partir de um proxy confiável. Se você não está usando um proxy confiável, há uma falha de segurança que pode permitir um ataque. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" 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\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurado como cache distribuído, mas o módulo PHP errado \"memcache\" está instalado. \\OC\\Memcache\\Memcached suporta apenas \"memcached\" e não \"memcache\". Veja a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki memcached 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\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns arquivos não passaram na verificação de integridade. Mais informações sobre como resolver este problema pode ser encontrado em nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "O Opcache do PHP não está configurado corretamente. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Para um melhor desempenho recomendamos ↗</a> usar as seguintes configurações no <code>php.ini</code>:", @@ -133,18 +133,19 @@ "Share link" : "Compartilhar link", "Link" : "Link", "Password protect" : "Proteger com senha", - "Allow upload and editing" : "Permitir envio e edição", "Allow editing" : "Permitir edição", - "upload only" : "somente envio", - "Email link to person" : "Enviar link por email", + "Email link to person" : "Enviar link por e-mail", "Send" : "Enviar", + "Allow upload and editing" : "Permitir envio e edição", + "Read only" : "Somente leitura", + "Secure drop (upload only)" : "Drop seguro (apenas envio)", "Shared with you and the group {group} by {owner}" : "Compartilhado com você e com o grupo {group} por {owner}", "Shared with you by {owner}" : "Compartilhado com você por {owner}", - "Choose a password for the mail share" : "Escolha uma senha para o compartilhamento de email", + "Choose a password for the mail share" : "Escolha uma senha para o compartilhamento de e-mail", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatiorDisplayName}} compartilhou via link", "group" : "grupo", "remote" : "remoto", - "email" : "email", + "email" : "e-mail", "shared by {sharer}" : "compartilhado por {sharer}", "Unshare" : "Descompartilhar", "Can reshare" : "Pode compartilhar novamente", @@ -152,7 +153,6 @@ "Can create" : "Pode criar", "Can change" : "Pode modificar", "Can delete" : "Pode excluir", - "Secure drop (upload only)" : "Drop seguro (apenas envio)", "Access control" : "Controle de acesso", "Could not unshare" : "Não foi possível descompartilhar", "Error while sharing" : "Erro ao compartilhar", @@ -167,12 +167,12 @@ "{sharee} (email)" : "{sharee} (email)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Compartilhar", - "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo, ID de cloud federada ou um email.", + "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo, ID de cloud federada ou um e-mail.", "Share with other people by entering a user or group or a federated cloud ID." : "Compartilhe com outras pessoas entrando um usuário, grupo ou ID de cloud federada.", - "Share with other people by entering a user or group or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo ou um email.", - "Name or email address..." : "Nome ou email...", + "Share with other people by entering a user or group or an email address." : "Compartilhe com outras pessoas entrando um usuário, grupo ou um e-mail.", + "Name or email address..." : "Nome ou e-mail...", "Name or federated cloud ID..." : "Nome ou ID de cloud federada...", - "Name, federated cloud ID or email address..." : "Nome, ID de cloud federada ou email...", + "Name, federated cloud ID or email address..." : "Nome, ID de cloud federada ou e-mail...", "Name..." : "Nome...", "Error" : "Erro", "Error removing share" : "Erro na exclusão do compartilhamento", @@ -244,7 +244,7 @@ "Please specify the port number along with the host name (e.g., localhost:5432)." : "Por favor especifique o nome do host e o número de porta (ex., localhost:5432).", "Performance warning" : "Alerta de performance", "SQLite will be used as database." : "SQLite será usado como banco de dados", - "For larger installations we recommend to choose a different database backend." : "Para instalações maiores é recomendável escolher um backend de banco de dados diferente.", + "For larger installations we recommend to choose a different database backend." : "Para instalações maiores é recomendável escolher uma plataforma de serviço de banco de dados diferente.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "O uso de SQLite é desencorajado especialmente quando se utiliza o cliente de desktop para sincronização de arquivos.", "Finish setup" : "Concluir configuração", "Finishing …" : "Finalizando...", @@ -259,7 +259,7 @@ "Please contact your administrator." : "Por favor, contacte o administrador.", "An internal error occurred." : "Ocorreu um erro interno.", "Please try again or contact your administrator." : "Por favor tente novamente ou contacte o administrador.", - "Username or email" : "Nome de usuário ou email", + "Username or email" : "Nome de usuário ou e-mail", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", "Wrong password." : "Senha errada", "Log in" : "Entrar", @@ -313,13 +313,13 @@ "can delete" : "pode excluir", "access control" : "controle de acesso", "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "Compartilhe com pessoas de outros servidores usando o ID de nuvem federada username@example.com/nextcloud", - "Share with users or by mail..." : "Compartilhe com usuários internos ou email...", + "Share with users or by mail..." : "Compartilhe com usuários internos ou e-mail...", "Share with users or remote users..." : "Compartilhe com usuários internos ou remotos...", - "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, remotos ou email...", + "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, remotos ou e-mail...", "Share with users or groups..." : "Compartilhe com usuários internos ou grupos...", - "Share with users, groups or by mail..." : "Compartilhe com usuários internos, grupos ou email...", + "Share with users, groups or by mail..." : "Compartilhe com usuários internos, grupos ou e-mail...", "Share with users, groups or remote users..." : "Compartilhe com usuários internos, remotos ou grupos...", - "Share with users, groups, remote users or by mail..." : "Compartilhe com usuários internos, remotos, grupos ou email...", + "Share with users, groups, remote users or by mail..." : "Compartilhe com usuários internos, remotos, grupos ou e-mail...", "Share with users..." : "Compartilhe com usuários internos...", "The object type is not specified." : "O tipo de objeto não foi especificado.", "Enter new" : "Entre nova", diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js index 7ca0550bc63..ce8531522c5 100644 --- a/core/l10n/pt_PT.js +++ b/core/l10n/pt_PT.js @@ -119,11 +119,11 @@ OC.L10N.register( "Share link" : "Partilhar hiperligação", "Link" : "Hiperligação", "Password protect" : "Proteger com palavra-passe", - "Allow upload and editing" : "Permitir enviar e editar", "Allow editing" : "Permitir edição", - "upload only" : "envio apenas", "Email link to person" : "Enviar hiperligação por mensagem para a pessoa", "Send" : "Enviar", + "Allow upload and editing" : "Permitir enviar e editar", + "Secure drop (upload only)" : "Arrastar seguro (apenas envio)", "Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}", "Shared with you by {owner}" : "Partilhado consigo por {owner}", "Choose a password for the mail share" : "Escolher password para a partilha de email", @@ -137,7 +137,6 @@ OC.L10N.register( "Can create" : "Pode criar", "Can change" : "Pode alterar", "Can delete" : "Pode apagar", - "Secure drop (upload only)" : "Arrastar seguro (apenas envio)", "Access control" : "Controlo de acesso", "Could not unshare" : "Não foi possível cancelar a partilha", "Error while sharing" : "Erro ao partilhar", diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json index a77e404674a..c1e584d1630 100644 --- a/core/l10n/pt_PT.json +++ b/core/l10n/pt_PT.json @@ -117,11 +117,11 @@ "Share link" : "Partilhar hiperligação", "Link" : "Hiperligação", "Password protect" : "Proteger com palavra-passe", - "Allow upload and editing" : "Permitir enviar e editar", "Allow editing" : "Permitir edição", - "upload only" : "envio apenas", "Email link to person" : "Enviar hiperligação por mensagem para a pessoa", "Send" : "Enviar", + "Allow upload and editing" : "Permitir enviar e editar", + "Secure drop (upload only)" : "Arrastar seguro (apenas envio)", "Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}", "Shared with you by {owner}" : "Partilhado consigo por {owner}", "Choose a password for the mail share" : "Escolher password para a partilha de email", @@ -135,7 +135,6 @@ "Can create" : "Pode criar", "Can change" : "Pode alterar", "Can delete" : "Pode apagar", - "Secure drop (upload only)" : "Arrastar seguro (apenas envio)", "Access control" : "Controlo de acesso", "Could not unshare" : "Não foi possível cancelar a partilha", "Error while sharing" : "Erro ao partilhar", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index 1c3d8bc10cc..55092a78b35 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -117,10 +117,10 @@ OC.L10N.register( "Share link" : "Împărtășește link-ul", "Link" : "Legătură", "Password protect" : "Protejare cu parolă", - "Allow upload and editing" : "Permite încărcarea și editarea", "Allow editing" : "Permite editarea", "Email link to person" : "Expediază legătura prin poșta electronică", "Send" : "Trimite", + "Allow upload and editing" : "Permite încărcarea și editarea", "Shared with you and the group {group} by {owner}" : "Distribuie cu tine si grupul {group} de {owner}", "Shared with you by {owner}" : "Distribuie cu tine de {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} partajat prin legătura", diff --git a/core/l10n/ro.json b/core/l10n/ro.json index 68350c6764a..c035873c17e 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -115,10 +115,10 @@ "Share link" : "Împărtășește link-ul", "Link" : "Legătură", "Password protect" : "Protejare cu parolă", - "Allow upload and editing" : "Permite încărcarea și editarea", "Allow editing" : "Permite editarea", "Email link to person" : "Expediază legătura prin poșta electronică", "Send" : "Trimite", + "Allow upload and editing" : "Permite încărcarea și editarea", "Shared with you and the group {group} by {owner}" : "Distribuie cu tine si grupul {group} de {owner}", "Shared with you by {owner}" : "Distribuie cu tine de {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} partajat prin legătura", diff --git a/core/l10n/ru.js b/core/l10n/ru.js index 03b69834cf4..995bc3ffed2 100644 --- a/core/l10n/ru.js +++ b/core/l10n/ru.js @@ -57,6 +57,8 @@ OC.L10N.register( "Loading your contacts …" : "Загрузка контактов…", "Looking for {term} …" : "Поиск {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\"> Были обнаружены проблемы с проверкой целостности кода. Подробнее ...", + "No action available" : "Нет доступных действий", + "Error fetching contact actions" : "Ошибка получения действий контакта", "Settings" : "Настройки", "Connection to server lost" : "Подключение к серверу потеряно", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Возникла проблема при загрузке страницы, повторная попытка через %n секунду","Возникла проблема при загрузке страницы, повторная попытка через %n секунды","Возникла проблема при загрузке страницы, повторная попытка через %n секунд","Возникла проблема при загрузке страницы, повторная попытка через %n секунд"], @@ -133,11 +135,12 @@ OC.L10N.register( "Share link" : "Поделиться ссылкой", "Link" : "Ссылка", "Password protect" : "Защитить паролем", - "Allow upload and editing" : "Разрешить загрузку и редактирование", "Allow editing" : "Разрешить редактирование", - "upload only" : "только загружать", "Email link to person" : "Отправить ссылку по электронной почте", "Send" : "Отправить", + "Allow upload and editing" : "Разрешить загрузку и редактирование", + "Read only" : "Только чтение", + "Secure drop (upload only)" : "Безопасное хранилище (только для приема файлов)", "Shared with you and the group {group} by {owner}" : "{owner} поделился с вами и группой {group} ", "Shared with you by {owner}" : "С вами поделился {owner} ", "Choose a password for the mail share" : "Укажите пароль для ссылки по почте", @@ -152,7 +155,6 @@ OC.L10N.register( "Can create" : "Можно создавать", "Can change" : "Можно изменять", "Can delete" : "Можно удалять", - "Secure drop (upload only)" : "Безопасное хранилище (только для приема файлов)", "Access control" : "Контроль доступа", "Could not unshare" : "Не удалось отменить доступ", "Error while sharing" : "При попытке поделиться произошла ошибка", diff --git a/core/l10n/ru.json b/core/l10n/ru.json index 2ea2fa49de2..f9a58afe9a3 100644 --- a/core/l10n/ru.json +++ b/core/l10n/ru.json @@ -55,6 +55,8 @@ "Loading your contacts …" : "Загрузка контактов…", "Looking for {term} …" : "Поиск {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\"> Были обнаружены проблемы с проверкой целостности кода. Подробнее ...", + "No action available" : "Нет доступных действий", + "Error fetching contact actions" : "Ошибка получения действий контакта", "Settings" : "Настройки", "Connection to server lost" : "Подключение к серверу потеряно", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Возникла проблема при загрузке страницы, повторная попытка через %n секунду","Возникла проблема при загрузке страницы, повторная попытка через %n секунды","Возникла проблема при загрузке страницы, повторная попытка через %n секунд","Возникла проблема при загрузке страницы, повторная попытка через %n секунд"], @@ -131,11 +133,12 @@ "Share link" : "Поделиться ссылкой", "Link" : "Ссылка", "Password protect" : "Защитить паролем", - "Allow upload and editing" : "Разрешить загрузку и редактирование", "Allow editing" : "Разрешить редактирование", - "upload only" : "только загружать", "Email link to person" : "Отправить ссылку по электронной почте", "Send" : "Отправить", + "Allow upload and editing" : "Разрешить загрузку и редактирование", + "Read only" : "Только чтение", + "Secure drop (upload only)" : "Безопасное хранилище (только для приема файлов)", "Shared with you and the group {group} by {owner}" : "{owner} поделился с вами и группой {group} ", "Shared with you by {owner}" : "С вами поделился {owner} ", "Choose a password for the mail share" : "Укажите пароль для ссылки по почте", @@ -150,7 +153,6 @@ "Can create" : "Можно создавать", "Can change" : "Можно изменять", "Can delete" : "Можно удалять", - "Secure drop (upload only)" : "Безопасное хранилище (только для приема файлов)", "Access control" : "Контроль доступа", "Could not unshare" : "Не удалось отменить доступ", "Error while sharing" : "При попытке поделиться произошла ошибка", diff --git a/core/l10n/sk.js b/core/l10n/sk.js index c9f78742b18..5d19503431d 100644 --- a/core/l10n/sk.js +++ b/core/l10n/sk.js @@ -108,11 +108,10 @@ OC.L10N.register( "Share link" : "Sprístupniť odkaz", "Link" : "Odkaz", "Password protect" : "Chrániť heslom", - "Allow upload and editing" : "Povoliť nahratie a úpravy", "Allow editing" : "Povoliť úpravy", - "upload only" : "len odoslať", "Email link to person" : "Odoslať odkaz emailom", "Send" : "Odoslať", + "Allow upload and editing" : "Povoliť nahratie a úpravy", "Shared with you and the group {group} by {owner}" : "Sprístupnené vám a skupine {group} používateľom {owner}", "Shared with you by {owner}" : "Sprístupnené vám používateľom {owner}", "Choose a password for the mail share" : "Zvoľte heslo pre zdieľanie pošty", diff --git a/core/l10n/sk.json b/core/l10n/sk.json index 514e8079699..9b6dd1c04b1 100644 --- a/core/l10n/sk.json +++ b/core/l10n/sk.json @@ -106,11 +106,10 @@ "Share link" : "Sprístupniť odkaz", "Link" : "Odkaz", "Password protect" : "Chrániť heslom", - "Allow upload and editing" : "Povoliť nahratie a úpravy", "Allow editing" : "Povoliť úpravy", - "upload only" : "len odoslať", "Email link to person" : "Odoslať odkaz emailom", "Send" : "Odoslať", + "Allow upload and editing" : "Povoliť nahratie a úpravy", "Shared with you and the group {group} by {owner}" : "Sprístupnené vám a skupine {group} používateľom {owner}", "Shared with you by {owner}" : "Sprístupnené vám používateľom {owner}", "Choose a password for the mail share" : "Zvoľte heslo pre zdieľanie pošty", diff --git a/core/l10n/sl.js b/core/l10n/sl.js index 7378c61bc66..f1a6d26f2d7 100644 --- a/core/l10n/sl.js +++ b/core/l10n/sl.js @@ -102,10 +102,10 @@ OC.L10N.register( "Share link" : "Povezava za prejem", "Link" : "Povezava", "Password protect" : "Zaščiti z geslom", - "Allow upload and editing" : "Dovoli nalaganje in urejanje", "Allow editing" : "Dovoli urejanje", "Email link to person" : "Posreduj povezavo po elektronski pošti", "Send" : "Pošlji", + "Allow upload and editing" : "Dovoli nalaganje in urejanje", "Shared with you and the group {group} by {owner}" : "V souporabi z vami in skupino {group}. Lastnik je {owner}.", "Shared with you by {owner}" : "V souporabi z vami. Lastnik je {owner}.", "group" : "skupina", diff --git a/core/l10n/sl.json b/core/l10n/sl.json index fd0acf4f9f7..c7533d95f1c 100644 --- a/core/l10n/sl.json +++ b/core/l10n/sl.json @@ -100,10 +100,10 @@ "Share link" : "Povezava za prejem", "Link" : "Povezava", "Password protect" : "Zaščiti z geslom", - "Allow upload and editing" : "Dovoli nalaganje in urejanje", "Allow editing" : "Dovoli urejanje", "Email link to person" : "Posreduj povezavo po elektronski pošti", "Send" : "Pošlji", + "Allow upload and editing" : "Dovoli nalaganje in urejanje", "Shared with you and the group {group} by {owner}" : "V souporabi z vami in skupino {group}. Lastnik je {owner}.", "Shared with you by {owner}" : "V souporabi z vami. Lastnik je {owner}.", "group" : "skupina", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index e160e697cc2..2191b413f65 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -115,10 +115,10 @@ OC.L10N.register( "Share link" : "Lidhje ndarjeje", "Link" : "Lidhje", "Password protect" : "Mbroje me fjalëkalim", - "Allow upload and editing" : "Lejo ngarkim dhe editim", "Allow editing" : "Lejo përpunim", "Email link to person" : "Dërgoja personit lidhjen me email", "Send" : "Dërgoje", + "Allow upload and editing" : "Lejo ngarkim dhe editim", "Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}", "Shared with you by {owner}" : "Ndarë me ju nga {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shpërndaEmrinEShfaqurTëNismëtarit}} shpërnda nëpërmjet linkut", diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 32dd24a6aed..d8c9e26087d 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -113,10 +113,10 @@ "Share link" : "Lidhje ndarjeje", "Link" : "Lidhje", "Password protect" : "Mbroje me fjalëkalim", - "Allow upload and editing" : "Lejo ngarkim dhe editim", "Allow editing" : "Lejo përpunim", "Email link to person" : "Dërgoja personit lidhjen me email", "Send" : "Dërgoje", + "Allow upload and editing" : "Lejo ngarkim dhe editim", "Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}", "Shared with you by {owner}" : "Ndarë me ju nga {owner}", "{{shareInitiatorDisplayName}} shared via link" : "{{shpërndaEmrinEShfaqurTëNismëtarit}} shpërnda nëpërmjet linkut", diff --git a/core/l10n/sv.js b/core/l10n/sv.js index c39692cba4d..ae2e6558cf8 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -129,11 +129,11 @@ OC.L10N.register( "Share link" : "Dela länk", "Link" : "Länk", "Password protect" : "Lösenordsskydda", - "Allow upload and editing" : "Tillåt uppladdning och redigering", "Allow editing" : "Tillåt redigering", - "upload only" : "endast uppladdning", "Email link to person" : "Skicka länken som e-postmeddelande", "Send" : "Skicka", + "Allow upload and editing" : "Tillåt uppladdning och redigering", + "Secure drop (upload only)" : "Säkert släpp (endast uppladdning)", "Shared with you and the group {group} by {owner}" : "Delad med dig och gruppen {group} av {owner}", "Shared with you by {owner}" : "Delad med dig av {owner}", "Choose a password for the mail share" : "Välj ett lösenord för delning via e-post", @@ -148,7 +148,6 @@ OC.L10N.register( "Can create" : "Kan skapa", "Can change" : "Kan ändra", "Can delete" : "Kan radera", - "Secure drop (upload only)" : "Säkert släpp (endast uppladdning)", "Access control" : "Åtkomstkontroll", "Could not unshare" : "Kunde inte ta bort delning", "Error while sharing" : "Fel vid delning", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index 5829c93f080..9a02191d2b0 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -127,11 +127,11 @@ "Share link" : "Dela länk", "Link" : "Länk", "Password protect" : "Lösenordsskydda", - "Allow upload and editing" : "Tillåt uppladdning och redigering", "Allow editing" : "Tillåt redigering", - "upload only" : "endast uppladdning", "Email link to person" : "Skicka länken som e-postmeddelande", "Send" : "Skicka", + "Allow upload and editing" : "Tillåt uppladdning och redigering", + "Secure drop (upload only)" : "Säkert släpp (endast uppladdning)", "Shared with you and the group {group} by {owner}" : "Delad med dig och gruppen {group} av {owner}", "Shared with you by {owner}" : "Delad med dig av {owner}", "Choose a password for the mail share" : "Välj ett lösenord för delning via e-post", @@ -146,7 +146,6 @@ "Can create" : "Kan skapa", "Can change" : "Kan ändra", "Can delete" : "Kan radera", - "Secure drop (upload only)" : "Säkert släpp (endast uppladdning)", "Access control" : "Åtkomstkontroll", "Could not unshare" : "Kunde inte ta bort delning", "Error while sharing" : "Fel vid delning", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index d7fdb9c222d..ee4814e98ba 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -135,11 +135,12 @@ OC.L10N.register( "Share link" : "Paylaşma bağlantısı", "Link" : "Bağlantı", "Password protect" : "Parola koruması", - "Allow upload and editing" : "Yükleme ve düzenleme yapılabilsin", "Allow editing" : "Düzenleme yapılabilsin", - "upload only" : "yalnız yükleme", "Email link to person" : "Bağlantıyı e-posta ile gönder", "Send" : "Gönder", + "Allow upload and editing" : "Yükleme ve düzenleme yapılabilsin", + "Read only" : "Salt okunur", + "Secure drop (upload only)" : "Güvenli bırakma (yalnız yükleme)", "Shared with you and the group {group} by {owner}" : "{owner} tarafından sizinle ve {group} ile paylaşılmış", "Shared with you by {owner}" : "{owner} tarafından sizinle paylaşılmış", "Choose a password for the mail share" : "E-posta ile paylaşmak için bir parola seçin", @@ -154,7 +155,6 @@ OC.L10N.register( "Can create" : "Ekleyebilir", "Can change" : "Değiştirebilir", "Can delete" : "Silebilir", - "Secure drop (upload only)" : "Güvenli bırakma (yalnız yükleme)", "Access control" : "Erişim denetimi", "Could not unshare" : "Paylaşım kaldırılamadı", "Error while sharing" : "Paylaşılırken sorun çıktı", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 5a84eb8f414..f61c8da34d5 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -133,11 +133,12 @@ "Share link" : "Paylaşma bağlantısı", "Link" : "Bağlantı", "Password protect" : "Parola koruması", - "Allow upload and editing" : "Yükleme ve düzenleme yapılabilsin", "Allow editing" : "Düzenleme yapılabilsin", - "upload only" : "yalnız yükleme", "Email link to person" : "Bağlantıyı e-posta ile gönder", "Send" : "Gönder", + "Allow upload and editing" : "Yükleme ve düzenleme yapılabilsin", + "Read only" : "Salt okunur", + "Secure drop (upload only)" : "Güvenli bırakma (yalnız yükleme)", "Shared with you and the group {group} by {owner}" : "{owner} tarafından sizinle ve {group} ile paylaşılmış", "Shared with you by {owner}" : "{owner} tarafından sizinle paylaşılmış", "Choose a password for the mail share" : "E-posta ile paylaşmak için bir parola seçin", @@ -152,7 +153,6 @@ "Can create" : "Ekleyebilir", "Can change" : "Değiştirebilir", "Can delete" : "Silebilir", - "Secure drop (upload only)" : "Güvenli bırakma (yalnız yükleme)", "Access control" : "Erişim denetimi", "Could not unshare" : "Paylaşım kaldırılamadı", "Error while sharing" : "Paylaşılırken sorun çıktı", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index bb514911495..8ffcc997c8e 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -133,11 +133,10 @@ OC.L10N.register( "Share link" : "分享链接", "Link" : "链接", "Password protect" : "密码保护", - "Allow upload and editing" : "允许上传和编辑", "Allow editing" : "允许编辑", - "upload only" : "仅上传", "Email link to person" : "发送链接到个人", "Send" : "发送", + "Allow upload and editing" : "允许上传和编辑", "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组", "Shared with you by {owner}" : "{owner} 分享给您", "Choose a password for the mail share" : "为电子邮件分享选择一个密码", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index 31079506730..ceb105d8a7c 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -131,11 +131,10 @@ "Share link" : "分享链接", "Link" : "链接", "Password protect" : "密码保护", - "Allow upload and editing" : "允许上传和编辑", "Allow editing" : "允许编辑", - "upload only" : "仅上传", "Email link to person" : "发送链接到个人", "Send" : "发送", + "Allow upload and editing" : "允许上传和编辑", "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组", "Shared with you by {owner}" : "{owner} 分享给您", "Choose a password for the mail share" : "为电子邮件分享选择一个密码", diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index 197e522b4bd..f99f9f8e7ee 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -104,10 +104,10 @@ OC.L10N.register( "Share link" : "分享連結", "Link" : "連結", "Password protect" : "密碼保護", - "Allow upload and editing" : "允許上傳及編輯", "Allow editing" : "允許編輯", "Email link to person" : "將連結 email 給別人", "Send" : "寄出", + "Allow upload and editing" : "允許上傳及編輯", "Shared with you and the group {group} by {owner}" : "由 {owner} 分享給您和 {group}", "Shared with you by {owner}" : "{owner} 已經和您分享", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 分享了連結", diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index 359000ad487..ac4a81b52cd 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -102,10 +102,10 @@ "Share link" : "分享連結", "Link" : "連結", "Password protect" : "密碼保護", - "Allow upload and editing" : "允許上傳及編輯", "Allow editing" : "允許編輯", "Email link to person" : "將連結 email 給別人", "Send" : "寄出", + "Allow upload and editing" : "允許上傳及編輯", "Shared with you and the group {group} by {owner}" : "由 {owner} 分享給您和 {group}", "Shared with you by {owner}" : "{owner} 已經和您分享", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 分享了連結", diff --git a/core/shipped.json b/core/shipped.json index e114ec769e7..d064cbb5c37 100644 --- a/core/shipped.json +++ b/core/shipped.json @@ -5,7 +5,6 @@ "comments", "dav", "encryption", - "external", "federatedfilesharing", "federation", "files", diff --git a/core/templates/layout.guest.php b/core/templates/layout.guest.php index 1e2559d6960..2c2373d53aa 100644 --- a/core/templates/layout.guest.php +++ b/core/templates/layout.guest.php @@ -40,6 +40,10 @@ <h1 class="hidden-visually"> <?php p($theme->getName()); ?> </h1> + <?php if(\OC::$server->getConfig()->getSystemValue('installed', false) + && \OC::$server->getConfig()->getAppValue('theming', 'logoMime', false)): ?> + <img src="<?php p($theme->getLogo()); ?>"/> + <?php endif; ?> </div> <div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div> </div> diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 2151aeff33b..703d624397c 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -488,6 +488,7 @@ return array( 'OC\\DB\\MigrationException' => $baseDir . '/lib/private/DB/MigrationException.php', 'OC\\DB\\Migrator' => $baseDir . '/lib/private/DB/Migrator.php', 'OC\\DB\\MySQLMigrator' => $baseDir . '/lib/private/DB/MySQLMigrator.php', + 'OC\\DB\\MySqlTools' => $baseDir . '/lib/private/DB/MySqlTools.php', 'OC\\DB\\NoCheckMigrator' => $baseDir . '/lib/private/DB/NoCheckMigrator.php', 'OC\\DB\\OCSqlitePlatform' => $baseDir . '/lib/private/DB/OCSqlitePlatform.php', 'OC\\DB\\OracleConnection' => $baseDir . '/lib/private/DB/OracleConnection.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index ec5190bc71d..ff7118e5bb1 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -518,6 +518,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\DB\\MigrationException' => __DIR__ . '/../../..' . '/lib/private/DB/MigrationException.php', 'OC\\DB\\Migrator' => __DIR__ . '/../../..' . '/lib/private/DB/Migrator.php', 'OC\\DB\\MySQLMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/MySQLMigrator.php', + 'OC\\DB\\MySqlTools' => __DIR__ . '/../../..' . '/lib/private/DB/MySqlTools.php', 'OC\\DB\\NoCheckMigrator' => __DIR__ . '/../../..' . '/lib/private/DB/NoCheckMigrator.php', 'OC\\DB\\OCSqlitePlatform' => __DIR__ . '/../../..' . '/lib/private/DB/OCSqlitePlatform.php', 'OC\\DB\\OracleConnection' => __DIR__ . '/../../..' . '/lib/private/DB/OracleConnection.php', diff --git a/lib/l10n/el.js b/lib/l10n/el.js index 0207afa9603..9f4faf09873 100644 --- a/lib/l10n/el.js +++ b/lib/l10n/el.js @@ -11,6 +11,8 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s και %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s και %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s και %5$s", + "Enterprise bundle" : "Πακέτο επιχειρήσεων", + "Groupware bundle" : "Ομάδα δέσμης", "PHP %s or higher is required." : "PHP %s ή νεώτερη απαιτείται.", "PHP with a version lower than %s is required." : "Απαιτείται PHP παλαιότερη από την έκδοση %s.", "%sbit or higher PHP required." : "%sbit απαιτείται νεώτερη έκδοση PHP.", diff --git a/lib/l10n/el.json b/lib/l10n/el.json index 8319f8fd030..569845c8249 100644 --- a/lib/l10n/el.json +++ b/lib/l10n/el.json @@ -9,6 +9,8 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s και %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s και %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s και %5$s", + "Enterprise bundle" : "Πακέτο επιχειρήσεων", + "Groupware bundle" : "Ομάδα δέσμης", "PHP %s or higher is required." : "PHP %s ή νεώτερη απαιτείται.", "PHP with a version lower than %s is required." : "Απαιτείται PHP παλαιότερη από την έκδοση %s.", "%sbit or higher PHP required." : "%sbit απαιτείται νεώτερη έκδοση PHP.", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index e36d75c634f..f6d75043c44 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s, y %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s y %5$s", + "Enterprise bundle" : "Conjunto para empresas", + "Groupware bundle" : "Conjunto de groupware", + "Social sharing bundle" : "Conjunto para compartir en redes", "PHP %s or higher is required." : "Se requiere PHP %s o superior.", "PHP with a version lower than %s is required." : "PHP con una versión inferior que %s la requerida.", "%sbit or higher PHP required." : "Se requiere PHP %sbit o superior.", @@ -36,6 +39,7 @@ OC.L10N.register( "_%n hour ago_::_%n hours ago_" : ["Hace %n hora","Hace %n horas"], "_%n minute ago_::_%n minutes ago_" : ["Hace %n minuto","Hace %n minutos"], "seconds ago" : "hace segundos", + "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "El módulo con ID %s no existe. Por favor, actívalo en la configuración de apps o contacta con tu administrador.", "File name is a reserved word" : "El nombre de archivo es una palabra reservada", "File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido", "File name is too long" : "El nombre del archivo es demasiado largo", @@ -157,6 +161,7 @@ OC.L10N.register( "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "Username contains whitespace at the beginning or at the end" : "El nombre de usuario contiene espacios en blanco al principio o al final", + "Username must not consist of dots only" : "El nombre de usuario no debe consistir solo de puntos", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "User disabled" : "Usuario deshabilitado", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index f94778a239c..6de910eef58 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s, y %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s y %5$s", + "Enterprise bundle" : "Conjunto para empresas", + "Groupware bundle" : "Conjunto de groupware", + "Social sharing bundle" : "Conjunto para compartir en redes", "PHP %s or higher is required." : "Se requiere PHP %s o superior.", "PHP with a version lower than %s is required." : "PHP con una versión inferior que %s la requerida.", "%sbit or higher PHP required." : "Se requiere PHP %sbit o superior.", @@ -34,6 +37,7 @@ "_%n hour ago_::_%n hours ago_" : ["Hace %n hora","Hace %n horas"], "_%n minute ago_::_%n minutes ago_" : ["Hace %n minuto","Hace %n minutos"], "seconds ago" : "hace segundos", + "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "El módulo con ID %s no existe. Por favor, actívalo en la configuración de apps o contacta con tu administrador.", "File name is a reserved word" : "El nombre de archivo es una palabra reservada", "File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido", "File name is too long" : "El nombre del archivo es demasiado largo", @@ -155,6 +159,7 @@ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo los siguientes caracteres están permitidos en un nombre de usuario: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"", "A valid username must be provided" : "Se debe proporcionar un nombre de usuario válido", "Username contains whitespace at the beginning or at the end" : "El nombre de usuario contiene espacios en blanco al principio o al final", + "Username must not consist of dots only" : "El nombre de usuario no debe consistir solo de puntos", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "User disabled" : "Usuario deshabilitado", diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 72b734afcff..16419544ee2 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -1,7 +1,7 @@ OC.L10N.register( "lib", { - "Cannot write into \"config\" directory!" : "Não é possível gravar no diretório \"config\"!", + "Cannot write into \"config\" directory!" : "Não foi possível gravar no diretório \"config\"!", "This can usually be fixed by giving the webserver write access to the config directory" : "Isso geralmente pode ser corrigido dando o acesso de gravação ao webserver para o diretório de configuração", "See %s" : "Ver %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isso geralmente pode ser corrigido por %s dar a permissão de gravação ao servidor web para o diretório de configuração %s.", @@ -45,7 +45,7 @@ OC.L10N.register( "File name is too long" : "O nome do arquivo é muito longo", "Dot files are not allowed" : "Arquivos Dot não são permitidos", "Empty filename is not allowed" : "Nome vazio para arquivo não é permitido.", - "This is an automatically sent email, please do not reply." : "Este é um email enviado automaticamente. Por favor, não responda.", + "This is an automatically sent email, please do not reply." : "Este é um e-mail enviado automaticamente. Por favor, não responda.", "Help" : "Ajuda", "Apps" : "Aplicativos", "Personal" : "Pessoal", @@ -77,9 +77,9 @@ OC.L10N.register( "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, remova a configuração de open_basedir de seu php.ini ou altere o PHP para 64bit.", "Set an admin username." : "Defina um nome do usuário administrador.", "Set an admin password." : "Defina uma senha para o administrador.", - "Can't create or write into the data directory %s" : "Não é possível criar ou gravar no diretório de dados %s", + "Can't create or write into the data directory %s" : "Não foi possível criar ou gravar no diretório de dados %s", "Invalid Federated Cloud ID" : "ID inválida de Nuvem Federada", - "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou pois o processo interno não permite ações de tipo %i", + "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou pois a plataforma de serviço não permite ações de tipo %i", "Sharing %s failed, because the file does not exist" : "Compartilhamento %s falhou pois o arquivo não existe", "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s", "Sharing %s failed, because you can not share with yourself" : "O compartilhamento %s falhou pois você não pode compartilhar com você mesmo", @@ -96,22 +96,22 @@ OC.L10N.register( "Share type %s is not valid for %s" : "O tipo de compartilhamento %s não é válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "A definição de permissões para %s falhou pois as permissões excedem as permissões concedidas a %s", "Setting permissions for %s failed, because the item was not found" : "A definição de permissões para %s falhou pois o item não foi encontrado", - "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir a data de expiração. Os compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados", - "Cannot set expiration date. Expiration date is in the past" : "Não é possível definir a data de expiração pois ela está no passado", - "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível eliminar a data de expiração. Compartilhamentos devem ter uma data de expiração.", - "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhamento backend %s deve implementar a interface OCP\\Share_Backend", - "Sharing backend %s not found" : "Compartilhamento backend %s não encontrado", - "Sharing backend for %s not found" : "Compartilhamento backend para %s não foi encontrado", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não foi possível definir a data de expiração. Os compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados", + "Cannot set expiration date. Expiration date is in the past" : "Não foi possível definir a data de expiração pois ela está no passado", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Não foi possível eliminar a data de expiração. Compartilhamentos devem ter uma data de expiração.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "A plataforma de serviço de compartilhamento %s deve implementar a interface OCP\\Share_Backend", + "Sharing backend %s not found" : "Plataforma de serviço de compartilhamento %s não encontrada", + "Sharing backend for %s not found" : "Plataforma de serviço de compartilhamento para %s não foi encontrada", "Sharing failed, because the user %s is the original sharer" : "O compartilhamento falhou pois o usuário %s é o compartilhador original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartilhamento %s falhou pois as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "O compartilhamento %s falhou pois recompartilhamentos não são permitidos", - "Sharing %s failed, because the sharing backend for %s could not find its source" : "O compartilhamento %s falhou, pois a infraestrutura de compartilhamento para %s não conseguiu encontrar a sua fonte", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "O compartilhamento %s falhou pois a plataforma de serviço de compartilhamento para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "O compartilhamento %s falhou pois o arquivo não pôde ser encontrado no cache de arquivos", - "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s", + "Cannot increase permissions of %s" : "Não foi possível aumentar as permissões de %s", "Files can't be shared with delete permissions" : "Os arquivos não podem ser compartilhadas com permissões de exclusão", "Files can't be shared with create permissions" : "Os arquivos não podem ser compartilhados com permissões de criação", "Expiration date is in the past" : "Data de expiração está no passado", - "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de expiração para mais que %s dias no futuro", + "Cannot set expiration date more than %s days in the future" : "Não foi possível definir a data de expiração para mais que %s dias no futuro", "Could not find category \"%s\"" : "Impossível localizar a categoria \"%s\"", "Sunday" : "Domingo", "Monday" : "Segunda-feira", @@ -173,14 +173,14 @@ OC.L10N.register( "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "O aplicativo \"%s\" não pode ser instalado pois as seguintes dependências não foram cumpridas: %s", "a safe home for all your data" : "um local seguro para todos os seus dados", "File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde", - "Can't read file" : "Não é possível ler arquivo", + "Can't read file" : "Não foi possível ler arquivo", "Application is not enabled" : "O aplicativo não está habilitado", "Authentication error" : "Erro de autenticação", "Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.", "Unknown user" : "Usuário desconhecido", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhum driver de banco de dados (sqlite, mysql ou postgresql) instalado.", - "Cannot write into \"config\" directory" : "Não é possível gravar no diretório \"config\"", - "Cannot write into \"apps\" directory" : "Não é possível gravar no diretório \"apps\"", + "Cannot write into \"config\" directory" : "Não foi possível gravar no diretório \"config\"", + "Cannot write into \"apps\" directory" : "Não foi possível gravar no diretório \"apps\"", "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 corrigido por %sdando ao servidor web permissão de escrita para o diretório app%s ou desabilitando o appstore no arquivo de configuração.", "Cannot create \"data\" directory" : "Não foi possível criar o diretório de dados", "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Isto geralmente pode ser corrigido ao <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dar permissão de gravação no diretório raiz</a>.", diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index 939681966ee..133b7ae3ec2 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -1,5 +1,5 @@ { "translations": { - "Cannot write into \"config\" directory!" : "Não é possível gravar no diretório \"config\"!", + "Cannot write into \"config\" directory!" : "Não foi possível gravar no diretório \"config\"!", "This can usually be fixed by giving the webserver write access to the config directory" : "Isso geralmente pode ser corrigido dando o acesso de gravação ao webserver para o diretório de configuração", "See %s" : "Ver %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isso geralmente pode ser corrigido por %s dar a permissão de gravação ao servidor web para o diretório de configuração %s.", @@ -43,7 +43,7 @@ "File name is too long" : "O nome do arquivo é muito longo", "Dot files are not allowed" : "Arquivos Dot não são permitidos", "Empty filename is not allowed" : "Nome vazio para arquivo não é permitido.", - "This is an automatically sent email, please do not reply." : "Este é um email enviado automaticamente. Por favor, não responda.", + "This is an automatically sent email, please do not reply." : "Este é um e-mail enviado automaticamente. Por favor, não responda.", "Help" : "Ajuda", "Apps" : "Aplicativos", "Personal" : "Pessoal", @@ -75,9 +75,9 @@ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, remova a configuração de open_basedir de seu php.ini ou altere o PHP para 64bit.", "Set an admin username." : "Defina um nome do usuário administrador.", "Set an admin password." : "Defina uma senha para o administrador.", - "Can't create or write into the data directory %s" : "Não é possível criar ou gravar no diretório de dados %s", + "Can't create or write into the data directory %s" : "Não foi possível criar ou gravar no diretório de dados %s", "Invalid Federated Cloud ID" : "ID inválida de Nuvem Federada", - "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou pois o processo interno não permite ações de tipo %i", + "Sharing %s failed, because the backend does not allow shares from type %i" : "O compartilhamento %s falhou pois a plataforma de serviço não permite ações de tipo %i", "Sharing %s failed, because the file does not exist" : "Compartilhamento %s falhou pois o arquivo não existe", "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s", "Sharing %s failed, because you can not share with yourself" : "O compartilhamento %s falhou pois você não pode compartilhar com você mesmo", @@ -94,22 +94,22 @@ "Share type %s is not valid for %s" : "O tipo de compartilhamento %s não é válido para %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "A definição de permissões para %s falhou pois as permissões excedem as permissões concedidas a %s", "Setting permissions for %s failed, because the item was not found" : "A definição de permissões para %s falhou pois o item não foi encontrado", - "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não é possível definir a data de expiração. Os compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados", - "Cannot set expiration date. Expiration date is in the past" : "Não é possível definir a data de expiração pois ela está no passado", - "Cannot clear expiration date. Shares are required to have an expiration date." : "Não é possível eliminar a data de expiração. Compartilhamentos devem ter uma data de expiração.", - "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Compartilhamento backend %s deve implementar a interface OCP\\Share_Backend", - "Sharing backend %s not found" : "Compartilhamento backend %s não encontrado", - "Sharing backend for %s not found" : "Compartilhamento backend para %s não foi encontrado", + "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Não foi possível definir a data de expiração. Os compartilhamentos não podem expirar mais tarde que %s depois de terem sido compartilhados", + "Cannot set expiration date. Expiration date is in the past" : "Não foi possível definir a data de expiração pois ela está no passado", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Não foi possível eliminar a data de expiração. Compartilhamentos devem ter uma data de expiração.", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "A plataforma de serviço de compartilhamento %s deve implementar a interface OCP\\Share_Backend", + "Sharing backend %s not found" : "Plataforma de serviço de compartilhamento %s não encontrada", + "Sharing backend for %s not found" : "Plataforma de serviço de compartilhamento para %s não foi encontrada", "Sharing failed, because the user %s is the original sharer" : "O compartilhamento falhou pois o usuário %s é o compartilhador original", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartilhamento %s falhou pois as permissões excedem as permissões concedidas a %s", "Sharing %s failed, because resharing is not allowed" : "O compartilhamento %s falhou pois recompartilhamentos não são permitidos", - "Sharing %s failed, because the sharing backend for %s could not find its source" : "O compartilhamento %s falhou, pois a infraestrutura de compartilhamento para %s não conseguiu encontrar a sua fonte", + "Sharing %s failed, because the sharing backend for %s could not find its source" : "O compartilhamento %s falhou pois a plataforma de serviço de compartilhamento para %s não conseguiu encontrar a sua fonte", "Sharing %s failed, because the file could not be found in the file cache" : "O compartilhamento %s falhou pois o arquivo não pôde ser encontrado no cache de arquivos", - "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s", + "Cannot increase permissions of %s" : "Não foi possível aumentar as permissões de %s", "Files can't be shared with delete permissions" : "Os arquivos não podem ser compartilhadas com permissões de exclusão", "Files can't be shared with create permissions" : "Os arquivos não podem ser compartilhados com permissões de criação", "Expiration date is in the past" : "Data de expiração está no passado", - "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de expiração para mais que %s dias no futuro", + "Cannot set expiration date more than %s days in the future" : "Não foi possível definir a data de expiração para mais que %s dias no futuro", "Could not find category \"%s\"" : "Impossível localizar a categoria \"%s\"", "Sunday" : "Domingo", "Monday" : "Segunda-feira", @@ -171,14 +171,14 @@ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "O aplicativo \"%s\" não pode ser instalado pois as seguintes dependências não foram cumpridas: %s", "a safe home for all your data" : "um local seguro para todos os seus dados", "File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde", - "Can't read file" : "Não é possível ler arquivo", + "Can't read file" : "Não foi possível ler arquivo", "Application is not enabled" : "O aplicativo não está habilitado", "Authentication error" : "Erro de autenticação", "Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.", "Unknown user" : "Usuário desconhecido", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nenhum driver de banco de dados (sqlite, mysql ou postgresql) instalado.", - "Cannot write into \"config\" directory" : "Não é possível gravar no diretório \"config\"", - "Cannot write into \"apps\" directory" : "Não é possível gravar no diretório \"apps\"", + "Cannot write into \"config\" directory" : "Não foi possível gravar no diretório \"config\"", + "Cannot write into \"apps\" directory" : "Não foi possível gravar no diretório \"apps\"", "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 corrigido por %sdando ao servidor web permissão de escrita para o diretório app%s ou desabilitando o appstore no arquivo de configuração.", "Cannot create \"data\" directory" : "Não foi possível criar o diretório de dados", "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Isto geralmente pode ser corrigido ao <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dar permissão de gravação no diretório raiz</a>.", diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index 9a590769892..bb9f9b9ae84 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", + "Enterprise bundle" : "Корпоративный пакет", + "Groupware bundle" : "Пакет для групп", + "Social sharing bundle" : "Пакет для соц. сетей", "PHP %s or higher is required." : "Требуется PHP %s или выше", "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", @@ -51,6 +54,7 @@ OC.L10N.register( "Admin" : "Администрирование", "APCu" : "APCu", "Redis" : "Redis", + "Basic settings" : "Основные настройки", "Sharing" : "Общий доступ", "Security" : "Безопасность", "Encryption" : "Шифрование", diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index 8aefa0e5250..10e1b49fdb1 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s", + "Enterprise bundle" : "Корпоративный пакет", + "Groupware bundle" : "Пакет для групп", + "Social sharing bundle" : "Пакет для соц. сетей", "PHP %s or higher is required." : "Требуется PHP %s или выше", "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", @@ -49,6 +52,7 @@ "Admin" : "Администрирование", "APCu" : "APCu", "Redis" : "Redis", + "Basic settings" : "Основные настройки", "Sharing" : "Общий доступ", "Security" : "Безопасность", "Encryption" : "Шифрование", diff --git a/lib/private/DB/MySqlTools.php b/lib/private/DB/MySqlTools.php new file mode 100644 index 00000000000..32f1de887c3 --- /dev/null +++ b/lib/private/DB/MySqlTools.php @@ -0,0 +1,49 @@ +<?php +/** + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @copyright Copyright (c) 2017, ownCloud GmbH + * @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\DB; + +use OCP\IDBConnection; + +/** +* Various MySQL specific helper functions. +*/ +class MySqlTools { + + /** + * @param Connection $connection + * @return bool + */ + public function supports4ByteCharset(IDBConnection $connection) { + foreach (['innodb_file_format' => 'Barracuda', 'innodb_large_prefix' => 'ON', 'innodb_file_per_table' => 'ON'] as $var => $val) { + $result = $connection->executeQuery("SHOW VARIABLES LIKE '$var'"); + $rows = $result->fetch(); + $result->closeCursor(); + if ($rows === false) { + return false; + } + if (strcasecmp($rows['Value'], $val) !== 0) { + return false; + } + } + return true; + } +} diff --git a/lib/private/Mail/EMailTemplate.php b/lib/private/Mail/EMailTemplate.php index 3442e8e9430..0ae79345e4c 100644 --- a/lib/private/Mail/EMailTemplate.php +++ b/lib/private/Mail/EMailTemplate.php @@ -357,7 +357,7 @@ EOF; } $this->headerAdded = true; - $logoUrl = $this->urlGenerator->getAbsoluteURL($this->themingDefaults->getLogo()); + $logoUrl = $this->urlGenerator->getAbsoluteURL($this->themingDefaults->getLogo(false)); $this->htmlBody .= vsprintf($this->header, [$this->themingDefaults->getColorPrimary(), $logoUrl, $this->themingDefaults->getName()]); } diff --git a/lib/private/Memcache/Redis.php b/lib/private/Memcache/Redis.php index d423b134f95..a154d08deca 100644 --- a/lib/private/Memcache/Redis.php +++ b/lib/private/Memcache/Redis.php @@ -70,7 +70,7 @@ class Redis extends Cache implements IMemcacheTTL { } public function remove($key) { - if (self::$cache->delete($this->getNameSpace() . $key)) { + if (self::$cache->del($this->getNameSpace() . $key)) { return true; } else { return false; @@ -82,7 +82,7 @@ class Redis extends Cache implements IMemcacheTTL { $it = null; self::$cache->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY); while ($keys = self::$cache->scan($it, $prefix)) { - self::$cache->delete($keys); + self::$cache->del($keys); } return true; } diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php index 9998ca401d9..8290d675500 100644 --- a/lib/private/Setup/MySQL.php +++ b/lib/private/Setup/MySQL.php @@ -27,6 +27,7 @@ */ namespace OC\Setup; +use OC\DB\MySqlTools; use OCP\IDBConnection; class MySQL extends AbstractDatabase { @@ -36,6 +37,13 @@ class MySQL extends AbstractDatabase { //check if the database user has admin right $connection = $this->connect(['dbname' => null]); + // detect mb4 + $tools = new MySqlTools(); + if ($tools->supports4ByteCharset($connection)) { + $this->config->setValue('mysql.utf8mb4', true); + $connection = $this->connect(); + } + $this->createSpecificUser($username, $connection); //create the database diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index efa11348efe..ac0150ff611 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -46,6 +46,7 @@ use OC_User; use OC_Util; use OCA\DAV\Connector\Sabre\Auth; use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\NotPermittedException; use OCP\IConfig; use OCP\IRequest; use OCP\ISession; @@ -480,8 +481,12 @@ class Session implements IUserSession, Emitter { //trigger creation of user home and /files folder $userFolder = \OC::$server->getUserFolder($user); - // copy skeleton - \OC_Util::copySkeleton($user, $userFolder); + try { + // copy skeleton + \OC_Util::copySkeleton($user, $userFolder); + } catch (NotPermittedException $ex) { + // read only uses + } // trigger any other initialization \OC::$server->getEventDispatcher()->dispatch(IUser::class . '::firstLogin', new GenericEvent($this->getUser())); diff --git a/lib/private/legacy/defaults.php b/lib/private/legacy/defaults.php index cc4991efd3e..f6d72d9776d 100644 --- a/lib/private/legacy/defaults.php +++ b/lib/private/legacy/defaults.php @@ -47,9 +47,8 @@ class OC_Defaults { private $defaultSlogan; private $defaultLogoClaim; private $defaultColorPrimary; - private $defaultLogoUrl; - function __construct() { + public function __construct() { $this->l = \OC::$server->getL10N('lib'); $this->defaultEntity = 'Nextcloud'; /* e.g. company name, used for footers and copyright notices */ @@ -65,8 +64,6 @@ class OC_Defaults { $this->defaultSlogan = $this->l->t('a safe home for all your data'); $this->defaultLogoClaim = ''; $this->defaultColorPrimary = '#0082c9'; - $this->defaultLogoUrl = \OC::$server->getURLGenerator()->imagePath('core','logo.svg'); - $this->defaultLogoUrl .= '?v=' . hash('sha1', implode('.', \OCP\Util::getVersion())); $themePath = OC::$SERVERROOT . '/themes/' . OC_Util::getTheme() . '/defaults.php'; if (file_exists($themePath)) { @@ -307,13 +304,19 @@ class OC_Defaults { /** * Themed logo url * + * @param bool $useSvg Whether to point to the SVG image or a fallback * @return string */ - public function getLogo() { + public function getLogo($useSvg = true) { if ($this->themeExist('getLogo')) { - return $this->theme->getLogo(); + return $this->theme->getLogo($useSvg); } - return $this->defaultLogoUrl; + if($useSvg) { + $logo = \OC::$server->getURLGenerator()->imagePath('core', 'logo.svg'); + } else { + $logo = \OC::$server->getURLGenerator()->imagePath('core', 'logo.png'); + } + return $logo . '?v=' . hash('sha1', implode('.', \OCP\Util::getVersion())); } } diff --git a/lib/private/legacy/template.php b/lib/private/legacy/template.php index 9a919ff12f2..b4c69327438 100644 --- a/lib/private/legacy/template.php +++ b/lib/private/legacy/template.php @@ -292,6 +292,11 @@ class OC_Template extends \OC\Template\Base { * @param string $hint An optional hint message - needs to be properly escaped */ public static function printErrorPage( $error_msg, $hint = '' ) { + if (\OC_App::isEnabled('theming') && !\OC_App::isAppLoaded('theming')) { + \OC_App::loadApp('theming'); + } + + if ($error_msg === $hint) { // If the hint is the same as the message there is no need to display it twice. $hint = ''; diff --git a/lib/public/Defaults.php b/lib/public/Defaults.php index dbde78bce68..543657694c5 100644 --- a/lib/public/Defaults.php +++ b/lib/public/Defaults.php @@ -178,11 +178,12 @@ class Defaults { /** * Themed logo url * + * @param bool $useSvg Whether to point to the SVG image or a fallback * @return string * @since 12.0.0 */ - public function getLogo() { - return $this->defaults->getLogo(); + public function getLogo($useSvg = true) { + return $this->defaults->getLogo($useSvg); } /** diff --git a/lib/public/IGroup.php b/lib/public/IGroup.php index 0cc62e9a8ed..aa51e51046c 100644 --- a/lib/public/IGroup.php +++ b/lib/public/IGroup.php @@ -41,7 +41,7 @@ interface IGroup { * Returns the group display name * * @return string - * @since 9.2 + * @since 12.0.0 */ public function getDisplayName(); diff --git a/lib/public/Security/ISecureRandom.php b/lib/public/Security/ISecureRandom.php index c60529ef803..14190639f44 100644 --- a/lib/public/Security/ISecureRandom.php +++ b/lib/public/Security/ISecureRandom.php @@ -45,6 +45,13 @@ interface ISecureRandom { const CHAR_SYMBOLS = '!\"#$%&\\\'()* +,-./:;<=>?@[\]^_`{|}~'; /** + * Characters that can be used for <code>generate($length, $characters)</code>, to + * generate human readable random strings. Lower- and upper-case characters and digits + * are included. Characters which are ambiguous are excluded, such as I, l, and 1 and so on. + */ + const CHAR_HUMAN_READABLE = "abcdefgijkmnopqrstwxyzABCDEFGHJKLMNPQRSTWXYZ23456789"; + + /** * Convenience method to get a low strength random number generator. * * Low Strength should be used anywhere that random strings are needed diff --git a/settings/BackgroundJobs/VerifyUserData.php b/settings/BackgroundJobs/VerifyUserData.php index 4a32398f6c4..8c02ae1727c 100644 --- a/settings/BackgroundJobs/VerifyUserData.php +++ b/settings/BackgroundJobs/VerifyUserData.php @@ -96,6 +96,8 @@ class VerifyUserData extends Job { $jobList->remove($this, $this->argument); if ($this->retainJob) { $this->reAddJob($jobList, $this->argument); + } else { + $this->resetVerificationState(); } } @@ -270,4 +272,17 @@ class VerifyUserData extends Job { return ((time() - $lastRun) > $this->interval); } + + /** + * reset verification state after max tries are reached + */ + protected function resetVerificationState() { + $user = $this->userManager->get($this->argument['uid']); + if ($user !== null) { + $accountData = $this->accountManager->getUser($user); + $accountData[$this->argument['type']]['verified'] = AccountManager::NOT_VERIFIED; + $this->accountManager->updateUser($user, $accountData); + } + } + } diff --git a/settings/Controller/AuthSettingsController.php b/settings/Controller/AuthSettingsController.php index 57192e119a9..7bb8a6654e6 100644 --- a/settings/Controller/AuthSettingsController.php +++ b/settings/Controller/AuthSettingsController.php @@ -154,16 +154,16 @@ class AuthSettingsController extends Controller { } /** - * Return a 20 digit device password + * Return a 25 digit device password * - * Example: ABCDE-FGHIJ-KLMNO-PQRST + * Example: AbCdE-fGhIj-KlMnO-pQrSt-12345 * * @return string */ private function generateRandomDeviceToken() { $groups = []; - for ($i = 0; $i < 4; $i++) { - $groups[] = $this->random->generate(5, implode('', range('A', 'Z'))); + for ($i = 0; $i < 5; $i++) { + $groups[] = $this->random->generate(5, ISecureRandom::CHAR_HUMAN_READABLE); } return implode('-', $groups); } diff --git a/settings/css/settings.css b/settings/css/settings.css index 0777f7e4cf4..fb71e5ece23 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -2,8 +2,13 @@ This file is licensed under the Affero General Public License version 3 or later. See the COPYING-README file. */ -select#languageinput, select#timezone { width:15em; } -input#openid, input#webdav { width:20em; } +select#languageinput, select#timezone { + width: 15em; +} + +input#openid, input#webdav { + width: 20em; +} /* PERSONAL */ @@ -11,21 +16,27 @@ input#openid, input#webdav { width:20em; } .nav-icon-personal-settings { background-image: url('../img/personal.svg?v=1'); } + .nav-icon-sessions { background-image: url('../img/toggle-filelist.svg?v=1'); } + .nav-icon-apppasswords { background-image: url('../img/password.svg?v=1'); } + .nav-icon-clientsbox { background-image: url('../img/change.svg?v=1'); } + .nav-icon-federated-cloud { background-image: url('../img/share.svg?v=1'); } + .nav-icon-second-factor-backup-codes { background-image: url('../img/password.svg?v=1'); } + .nav-icon-ssl-root-certificate { background-image: url('../img/password.svg?v=1'); } @@ -34,15 +45,19 @@ input#openid, input#webdav { width:20em; } min-width: 145px; padding-right: 0; } + #avatarform .avatardiv { margin-bottom: 10px; } + #avatarform .warning { width: 100%; } + #displayavatar { text-align: center; } + #displayavatar p { text-align: left; } @@ -53,9 +68,11 @@ input#openid, input#webdav { width:20em; } width: 33px; height: 33px; } + .jcrop-holder { z-index: 500; } + #cropper { float: left; z-index: 500; @@ -68,6 +85,7 @@ input#openid, input#webdav { width:20em; } width: 100%; height: calc(100% - 45px); } + #cropper .inner-container { z-index: 2001; /* above the top bar if needed */ position: absolute; @@ -84,9 +102,11 @@ input#openid, input#webdav { width:20em; } #cropper .inner-container .jcrop-holder { box-shadow: 0 0 7px #888; } + #cropper .inner-container .button { margin-top: 15px; } + #cropper .inner-container .primary { float: right; } @@ -94,6 +114,7 @@ input#openid, input#webdav { width:20em; } #personal-settings-avatar-container { float: left; } + #personal-settings-container { position: relative; float: left; @@ -101,22 +122,27 @@ input#openid, input#webdav { width:20em; } max-width: 700px; width: calc(100% - 200px); } + #personal-settings-container:after { clear: both; } + #personal-settings-container > div { float: left; height: 100px; min-width: 300px; } + #personal-settings-container.no-edit > div { height: 20px; min-width: 200px; } + #avatarform > h2, #personal-settings-container > div h2 { position: relative; } + #personal-settings-container > div h2 span[class^="icon-"], #personal-settings-avatar-container h2 span[class^="icon-"] { display: inline-block; @@ -127,11 +153,13 @@ input#openid, input#webdav { width:20em; } opacity: .3; cursor: pointer; } + .personal-settings-setting-box input[type="text"], .personal-settings-setting-box input[type="email"], .personal-settings-setting-box input[type="tel"] { width: 17em; } + #personal-settings-container > div > form span[class^="icon-checkmark"] { position: absolute; left: 228px; @@ -145,22 +173,27 @@ input#openid, input#webdav { width:20em; } right: 14px; top: 70px; } + #personal-settings-container .verify img { padding: 12px 7px 6px; } + /* only show pointer cursor when popup will be there */ #personal-settings-container .verify-action { cursor: pointer; } + .verification-dialog { display: none; right: -9px; top: 40px; width: 275px; } + .verification-dialog p { padding: 10px; } + .verification-dialog .verificationCode { font-family: monospace; display: block; @@ -171,16 +204,19 @@ input#openid, input#webdav { width:20em; } top: 44px; margin: -5px 0px 0; } + .federationScopeMenu.bubble::after { right: 50%; transform: translate(50%, 0); } + .federationScopeMenu.popovermenu a.menuitem, .federationScopeMenu.popovermenu label.menuitem, .federationScopeMenu.popovermenu .menuitem { font-size: 12.8px; line-height: 1.6em; } + .federationScopeMenu.popovermenu .menuitem .menuitem-text-detail { opacity: .75; } @@ -194,11 +230,13 @@ input#openid, input#webdav { width:20em; } padding-right: 0; min-width: 60%; } + #avatarform, #passwordform { margin-bottom: 0; padding-bottom: 0; } + #groups { overflow-wrap: break-word; max-width: 75%; @@ -213,17 +251,19 @@ input#openid, input#webdav { width:20em; } #sslCertificate tr.expired { background-color: rgba(255, 0, 0, 0.5); } + #sslCertificate td { padding: 5px; } - #displaynameerror { display: none; } + #displaynamechanged { display: none; } + input#identity { width: 20em; } @@ -237,6 +277,7 @@ input#identity { background-color: #47a447; padding: 3px; } + .msg.error { color: #fff; background-color: #d2322d; @@ -247,8 +288,13 @@ input#identity { display: inline-block; } -table.nostyle label { margin-right: 2em; } -table.nostyle td { padding: 0.2em 0; } +table.nostyle label { + margin-right: 2em; +} + +table.nostyle td { + padding: 0.2em 0; +} #sessions table, #apppasswords table { @@ -257,10 +303,12 @@ table.nostyle td { padding: 0.2em 0; } padding-top: 5px; max-width: 580px; } + #sessions table th, #apppasswords table th { opacity: .5; } + #sessions table th, #sessions table td, #apppasswords table th, @@ -286,10 +334,11 @@ table.nostyle td { padding: 0.2em 0; } position: relative; } -#sessions tr>*:nth-child(2), -#apppasswords tr>*:nth-child(2) { +#sessions tr > *:nth-child(2), +#apppasswords tr > *:nth-child(2) { text-align: right; } + #sessions .token-list td > a.icon, #apppasswords .token-list td > a.icon { opacity: 0; @@ -305,7 +354,7 @@ table.nostyle td { padding: 0.2em 0; } #sessions .token-list tr:hover td > a.icon, #apppasswords .token-list tr:hover td > a.icon, #sessions .token-list tr.active td > a.icon, -#apppasswords .token-list tr.active td > a.icon{ +#apppasswords .token-list tr.active td > a.icon { opacity: 0.6; } @@ -329,7 +378,7 @@ table.nostyle td { padding: 0.2em 0; } } #sessions .token-list tr.active div.configure > *, -#apppasswords .token-list tr.active div.configure > *{ +#apppasswords .token-list tr.active div.configure > * { margin-top: 5px; margin-bottom: 5px; display: inline-block; @@ -343,10 +392,11 @@ table.nostyle td { padding: 0.2em 0; } #new-app-login-name, #new-app-password { - width: 186px; + width: 245px; font-family: monospace; background-color: lightyellow; } + .app-password-row { display: table-row; } @@ -369,21 +419,29 @@ table.nostyle td { padding: 0.2em 0; } padding-left: 0 !important; margin-left: -10px } + .social-button img { padding: 10px; } - /* USERS */ -#newgroup-init a span { margin-left: 20px; } +#newgroup-init a span { + margin-left: 20px; +} + #newgroup-init a span:before { - position: absolute; left: 12px; top:-2px; - content: '+'; font-weight: bold; font-size: 150%; + position: absolute; + left: 12px; + top: -2px; + content: '+'; + font-weight: bold; + font-size: 150%; } #newgroup-form { height: 44px; } + #newgroupname { margin: 0; width: 100%; @@ -394,6 +452,7 @@ table.nostyle td { padding: 0.2em 0; } border-bottom: 1px solid #eee; border-radius: 0; } + #newgroup-form .button { position: absolute; right: 0; @@ -410,36 +469,70 @@ table.nostyle td { padding: 0.2em 0; } overflow: hidden; text-overflow: ellipsis; } + .isgroup.active .groupname { width: 65%; } -.usercount { float: left; margin: 5px; } +.usercount { + float: left; + margin: 5px; +} + li.active span.utils .delete { - float: left; position: relative; opacity: 0.5; - top: -7px; left: 7px; width: 44px; height: 44px; + float: left; + position: relative; + opacity: 0.5; + top: -7px; + left: 7px; + width: 44px; + height: 44px; } + li.active .rename { padding: 8px 14px 20px 14px; - top: 0px; position: absolute; width: 16px; height: 16px; + top: 0px; + position: absolute; + width: 16px; + height: 16px; opacity: 0.5; display: inline-block !important; } -li.active span.utils .delete img { margin: 14px; } -li.active .rename { opacity: 0.5; } -li.active span.utils .delete:hover, li.active .rename:hover { opacity: 1; } -span.utils .delete, .rename { display: none; } + +li.active span.utils .delete img { + margin: 14px; +} + +li.active .rename { + opacity: 0.5; +} + +li.active span.utils .delete:hover, li.active .rename:hover { + opacity: 1; +} + +span.utils .delete, .rename { + display: none; +} + #app-navigation ul li.active > span.utils .delete, -#app-navigation ul li.active > span.utils .rename { display: block; } +#app-navigation ul li.active > span.utils .rename { + display: block; +} + #usersearchform { position: absolute; top: 2px; right: 0; } + #usersearchform input { width: 150px; } -#usersearchform label { font-weight: 700; } + +#usersearchform label { + font-weight: 700; +} /* display table at full width */ table.grid { @@ -450,6 +543,7 @@ table.grid th { height: 2em; color: #999; } + table.grid th, table.grid td { border-bottom: 1px solid #eee; padding: 0 .5em; @@ -457,11 +551,28 @@ table.grid th, table.grid td { text-align: left; font-weight: normal; } -td.name, td.password { padding-left:.8em; } -td.password>img,td.displayName>img, td.quota>img { visibility:hidden; } -td.password, td.quota, td.displayName { width:12em; cursor:pointer; } -td.password>span, td.quota>span { margin-right: 1.2em; color: #C7C7C7; } -span.usersLastLoginTooltip { white-space: nowrap; } + +td.name, td.password { + padding-left: .8em; +} + +td.password > img, td.displayName > img, td.quota > img { + visibility: hidden; +} + +td.password, td.quota, td.displayName { + width: 12em; + cursor: pointer; +} + +td.password > span, td.quota > span { + margin-right: 1.2em; + color: #C7C7C7; +} + +span.usersLastLoginTooltip { + white-space: nowrap; +} /* dropdowns will be relative to this element */ #userlist { @@ -472,7 +583,7 @@ span.usersLastLoginTooltip { white-space: nowrap; } #userlist .storageLocation, #userlist .userBackend, #userlist .lastLogin { - display : none; + display: none; } /* because of accessibility the name cell is <th> - therefore we enforce the black color */ @@ -503,10 +614,11 @@ span.usersLastLoginTooltip { white-space: nowrap; } } .bubble { - z-index:1; + z-index: 1; right: -6px; top: auto; } + .bubble:after { right: 5px; } @@ -521,63 +633,111 @@ span.usersLastLoginTooltip { white-space: nowrap; } #userlist .popovermenu { margin-top: 4px; border-top-right-radius: 3px; + right: 3px; + opacity: 0; + display: block; + visibility: hidden; + transition: opacity 0.1s, visibility 0.1s; +} + +#userlist tr.active .popovermenu { + opacity: 1; + visibility: visible; +} + +#userlist .popovermenu > ul.userActionsMenu { + right: 15px; } -#userlist .popovermenu>ul.userActionsMenu { - right: 10px; +#userlist .popovermenu > ul.userActionsMenu a { + margin: 5px 0; } -#userlist .popovermenu>ul.userActionsMenu a span { +#userlist .popovermenu > ul.userActionsMenu a span:last-child { margin-left: 5px; } -#userlist .popovermenu { - display:none; +tr:hover > td.password > span, tr:hover > td.displayName > span { + margin: 0; + cursor: pointer; +} + +tr:hover > td.password > img, tr:hover > td.displayName > img, tr:hover > td.quota > img { + visibility: visible; + cursor: pointer; } -tr:hover>td.password>span, tr:hover>td.displayName>span { margin:0; cursor:pointer; } -tr:hover>td.password>img,tr:hover>td.displayName>img, tr:hover>td.quota>img { visibility:visible; cursor:pointer; } td.userActions { width: 25px; text-align: center; } + td.userActions .action { position: relative; top: 3px; } + +tr.active td.userActions .action { + opacity: 1; +} + td.userActions .action:hover { cursor: pointer; } -div.recoveryPassword { left:50em; display:block; position:absolute; top:-1px; } -input#recoveryPassword {width:15em;} +div.recoveryPassword { + left: 50em; + display: block; + position: absolute; + top: -1px; +} + +input#recoveryPassword { + width: 15em; +} + #controls select.quota { margin: 3px; margin-right: 10px; height: 37px; } -select.quota-user { position:relative; left:0; top:0; width:10em; } -select.quota.active { background: #fff; } -input.userFilter {width: 200px;} +select.quota-user { + position: relative; + left: 0; + top: 0; + width: 10em; +} + +select.quota.active { + background: #fff; +} + +input.userFilter { + width: 200px; +} /* positioning fixes */ #newuser { padding-left: 3px; } + #newuser .multiselect { min-width: 150px !important; } + #newuser .multiselect, #newusergroups + input[type='submit'] { position: relative; top: -1px; } + #headerGroups, #headerSubAdmins, #headerQuota { padding-left: 18px; } + #headerAvatar { width: 32px; } @@ -587,7 +747,6 @@ input.userFilter {width: 200px;} background-color: #FDD; } - /* APPS */ /* Bundle header */ @@ -595,21 +754,25 @@ input.userFilter {width: 200px;} display: table-row; position: relative; } + #apps-list .apps-header div { display: table-cell; height: 70px; } + #apps-list .apps-header h2 { display: table-cell; position: absolute; padding-left: 6px; padding-top: 15px; } + #apps-list .apps-header h2 .enable { position: relative; top: -1px; margin-left: 12px; } + #apps-list .apps-header h2 + .section { margin-top: 50px; } @@ -624,10 +787,14 @@ input.userFilter {width: 200px;} margin-bottom: 20px; } -.appinfo { margin: 1em 40px; } +.appinfo { + margin: 1em 40px; +} + #app-navigation .appwarning { background: #fcc; } + #app-navigation.appwarning:hover { background: #fbb; } @@ -640,12 +807,13 @@ span.version { #app-navigation .app-external, .app-version { - color: rgba(85,85,85,.5); + color: rgba(85, 85, 85, .5); } .app-level { margin-top: 8px; } + .app-level span { color: #555; background-color: transparent; @@ -653,10 +821,12 @@ span.version { border-radius: 3px; padding: 3px 6px; } + .app-level a { padding: 10px; white-space: nowrap; } + .app-level .official { border-color: #37ce02; background-position: left center; @@ -677,6 +847,7 @@ span.version { flex-wrap: wrap; align-content: flex-start; } + #apps-list.hidden { display: none; } @@ -686,6 +857,7 @@ span.version { flex: 0 0 auto; margin-left: 20px; } + #apps-list .section.apps-experimental { flex-basis: 90%; } @@ -693,16 +865,20 @@ span.version { #apps-list .app-description p { margin: 10px 0; } + #apps-list .app-description ul { list-style: disc; } + #apps-list .app-description ol { list-style: decimal; } + #apps-list .app-description > ul, #apps-list .app-description > ol { margin-left: 19px; } + #apps-list .app-description ol ol, #apps-list .app-description ol ul, #apps-list .app-description ul ol, @@ -715,6 +891,7 @@ span.version { width: 22%; box-sizing: border-box; } + #apps-list .section:nth-child(4n) { margin-right: 20px; } @@ -725,6 +902,7 @@ span.version { width: 30%; box-sizing: border-box; } + #apps-list .section:nth-child(3n) { margin-right: 20px; } @@ -735,6 +913,7 @@ span.version { width: 40%; box-sizing: border-box; } + #apps-list .section:nth-child(2n) { margin-right: 20px; } @@ -747,6 +926,7 @@ span.version { display: none !important; } } + @media only screen and (max-width: 700px) { #apps-list.installed .app-groups { display: none !important; @@ -757,9 +937,11 @@ span.version { display: block; margin: 8px 0; } + form.section { position: relative; } + .followupsection { display: block; padding: 0 30px 30px 30px; @@ -768,12 +950,14 @@ form.section { margin-top: -30px; position: relative; } + .app-image { position: relative; height: 150px; opacity: 1; overflow: hidden; } + .app-name, .app-version, .app-score, @@ -789,6 +973,7 @@ form.section { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; opacity: .5; } + .app-description-container { clear: both; position: relative; @@ -806,6 +991,7 @@ form.section { #app-category-1 { margin-bottom: 18px; } + /* capitalize "Other" category */ #app-category-925 { text-transform: capitalize; @@ -822,10 +1008,19 @@ form.section { } /* Transition to complete width! */ -.app:hover, .app:active { max-width: inherit; } +.app:hover, .app:active { + max-width: inherit; +} -.appslink { text-decoration: underline; } -.score { color:#666; font-weight:bold; font-size:0.8em; } +.appslink { + text-decoration: underline; +} + +.score { + color: #666; + font-weight: bold; + font-size: 0.8em; +} .appinfo .documentation { margin-top: 1em; @@ -845,7 +1040,7 @@ form.section { margin: 0; } -#apps-list.installed .section > *{ +#apps-list.installed .section > * { display: table-cell; height: initial; vertical-align: middle; @@ -884,20 +1079,25 @@ form.section { } #apps-list.installed .groups-enable label { - margin-right: 3px; + margin-right: 3px; } /* LOG */ #log { - white-space:normal; + white-space: normal; margin-bottom: 14px; } -#lessLog { display:none; } -table.grid td.date{ + +#lessLog { + display: none; +} + +table.grid td.date { white-space: nowrap; } + #log-section p { - margin-top:20px; + margin-top: 20px; } /* ADMIN */ @@ -908,6 +1108,7 @@ table.grid td.date{ margin-right: 6px; width: 16px; } + #app-navigation li span.no-icon { padding-left: 32px; } @@ -916,20 +1117,29 @@ table.grid td.date{ list-style: initial; margin: 10px 0; } + #security-warning-state span { padding-left: 25px; background-position: 5px center; margin-left: -5px; } -#shareAPI p { padding-bottom: 0.8em; } -#shareAPI input#shareapiExpireAfterNDays {width: 25px;} +#shareAPI p { + padding-bottom: 0.8em; +} + +#shareAPI input#shareapiExpireAfterNDays { + width: 25px; +} + #shareAPI .indent { padding-left: 28px; } + #shareAPI .double-indent { padding-left: 56px; } + #fileSharingSettings h3 { display: inline-block; } @@ -947,6 +1157,7 @@ table.grid td.date{ padding: 11px 20px; vertical-align: text-bottom; } + #shareAPI h2, #encryptionAPI h2, #mail_general_settings h2 { @@ -964,9 +1175,11 @@ table.grid td.date{ width: 300px; text-align: right; } + .mail_settings p select:nth-child(2) { width: 143px; } + #mail_smtpport { width: 40px; } @@ -974,12 +1187,14 @@ table.grid td.date{ .cronlog { margin-left: 10px; } + .status { display: inline-block; height: 16px; width: 16px; vertical-align: text-bottom; } + .status.success { border-radius: 50%; } @@ -1002,9 +1217,11 @@ span.success { background: #37ce02; border-radius: 3px; } + span.error { background: #ce3702; } + span.indeterminate { background: #e6db00; border-radius: 40% 0; @@ -1032,7 +1249,6 @@ doesnotexist:-o-prefocus, .strengthify-wrapper { font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; } - /* HELP */ .help-includes { @@ -1062,6 +1278,7 @@ doesnotexist:-o-prefocus, .strengthify-wrapper { #admin-tips li { list-style: initial; } + #admin-tips li a { display: inline-block; padding: 3px 0; diff --git a/settings/js/users/users.js b/settings/js/users/users.js index 387709cd64c..dccbcc0ce1e 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -908,21 +908,24 @@ $(document).ready(function () { event.stopPropagation(); var $td = $(this).closest('td'); var $tr = $($td).closest('tr'); - var menudiv = $td.find('.popovermenu'); + var menudiv = $tr.find('.popovermenu'); - if(menudiv.is(':visible')) { - menudiv.fadeOut(100); + if($tr.is('.active')) { + $tr.removeClass('active'); return; } + $('#userlist tr.active').removeClass('active'); menudiv.find('.action-togglestate').empty(); if($tr.data('userEnabled')) { $('.action-togglestate', $td).html('<span class="icon icon-close"></span><span>'+t('settings', 'Disable')+'</span>'); } else { $('.action-togglestate', $td).html('<span class="icon icon-add"></span><span>'+t('settings', 'Enable')+'</span>'); } - menudiv.click(function() { menudiv.fadeOut(100); }); - menudiv.hover('', function() { menudiv.fadeOut(100); }); - menudiv.fadeIn(100); + $tr.addClass('active'); + }); + + $(document.body).click(function() { + $('#userlist tr.active').removeClass('active'); }); $userListBody.on('click', '.action-togglestate', function (event) { diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index aabd227bb64..4ff1676ec91 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -1,11 +1,23 @@ OC.L10N.register( "settings", { + "{actor} changed your password" : "{actor} va canviar la contrasenya", + "You changed your password" : "Has canviat la teva contrasenya", + "Your password was reset by an administrator" : "La seva contrasenya s'ha restablert per un administrador", + "{actor} changed your email address" : "{actor} va canviar la seva adreça d\\'email", + "You changed your email address" : "Has canviat el teu email", + "Your email address was changed by an administrator" : "La seva adreça d'email s\\'ha canviat per un administrador", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "La teva <strong>contrasenya</strong> o <strong>email</strong> s'ha modificat", + "Your apps" : "Les teves apps", + "Enabled apps" : "Apps activades", + "Disabled apps" : "Apps desactivades", + "App bundles" : "Paquets d'apps", "Wrong password" : "Contrasenya incorrecta", "Saved" : "Desat", "No user supplied" : "No heu proporcionat cap usuari", "Unable to change password" : "No es pot canviar la contrasenya", "Authentication error" : "Error d'autenticació", + "Please provide an admin recovery password; otherwise, all user data will be lost." : "Si us plau, proporcioni una contrasenya d'administrador de recuperació; en cas contrari, es perdran totes les dades d'usuari.", "Wrong admin recovery password. Please check the password and try again." : "La contrasenya de recuperació d'administrador és incorrecta. Comproveu-la i torneu-ho a intentar.", "Federated Cloud Sharing" : "Compartició federada de núvol", "A problem occurred, please check your log files (Error: %s)" : "S'ha produït un problema, si us plau revisi els arxius de registre (Error: %s)", @@ -13,6 +25,8 @@ OC.L10N.register( "Group already exists." : "El grup ja existeix.", "Unable to add group." : "No es pot agregar el grup.", "Unable to delete group." : "No es pot esborrar el grup.", + "Invalid SMTP password." : "Contrasenya SMTP no vàlida.", + "Well done, %s!" : "Ben fet, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Hi ha hagut un problema en enviar el correu. Revisi la seva configuració. (Error: %s)", "You need to set your user email before being able to send test emails." : "Heu d'establir un nom d'usuari abans de poder enviar correus de prova.", "Invalid request" : "Sol·licitud no vàlida", @@ -21,6 +35,8 @@ OC.L10N.register( "A user with that name already exists." : "Ja existeix un usuari amb est nom.", "Unable to create user." : "No es pot crear el usuari.", "Unable to delete user." : "No es pot eliminar l'usuari", + "Error while enabling user." : "Error activant usuari.", + "Error while disabling user." : "Error desactivant usuari.", "Settings saved" : "Paràmetres desats", "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Unable to change email address" : "No es pot canviar l'adreça de correu", @@ -29,18 +45,41 @@ OC.L10N.register( "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "%1$s changed your password on %2$s." : "%1$s va canviar la teva contrasenya a %2$s.", + "Your password on %s was changed." : "La teva contrasenya a %s es va canviar.", + "Your password on %s was reset by an administrator." : "La teva contrasenya a %s va ser restablerta per un administrador.", + "Password changed for %s" : "Contrasenya canviada per %s", + "If you did not request this, please contact an administrator." : "Si vostè no l'ha sol·licitat, si us plau, poseu-vos en contacte amb un administrador.", + "Password for %1$s changed on %2$s" : "Contrasenya per %1$s canviada a %2$s", + "%1$s changed your email address on %2$s." : "%1$s va canviar el teu email a %2$s.", + "Your email address on %s was changed." : "El teu email a %s es va canviar.", + "Your email address on %s was changed by an administrator." : "El teu email a %s es va canviar per un administrador.", + "Email address changed for %s" : "Adreça d'email canviada per %s", + "The new email address is %s" : "La teva adreça d'email és %s", + "Email address for %1$s changed on %2$s" : "Adreça d'email per %1$s canviada a %2$s", + "Welcome aboard" : "Benvingut a bord", + "Welcome aboard %s" : "Benvingut a bord %s", + "You have now an %s account, you can add, protect, and share your data." : "Ara tens un compte %s, pot afegir, protegir i compartir les teves dades.", + "Your username is: %s" : "El teu usuari és: %s", + "Set your password" : "Establir la contrasenya", + "Go to %s" : "Anar a %s", + "Install Client" : "Instal·lar Client", "Your %s account was created" : "S'ha creat el seu compte %s", + "Password confirmation is required" : "Cal una confirmació de la contrasenya", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Couldn't update app." : "No s'ha pogut actualitzar l'aplicació.", + "Are you really sure you want add {domain} as trusted domain?" : "Estàs segur que vols afegir {domini} com a domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", "Migration started …" : "Migració iniciada ...", "Not saved" : "No desat", + "Sending…" : "Enviant…", "Email sent" : "El correu electrónic s'ha enviat", "Official" : "Oficial", "All" : "Tots", "Update to %s" : "Actualitzar a %s", "No apps found for your version" : "No s'han trobat aplicacions per la seva versió", + "The app will be downloaded from the app store" : "L'app es descarregarà des de la botiga d'apps", "Error while disabling app" : "Error en desactivar l'aplicació", "Disable" : "Desactiva", "Enable" : "Habilita", @@ -49,10 +88,15 @@ OC.L10N.register( "Updating...." : "Actualitzant...", "Error while updating app" : "Error en actualitzar l'aplicació", "Updated" : "Actualitzada", + "Removing …" : "Treient ...", + "Error while removing app" : "Error treient app", + "Remove" : "Treure", "App update" : "Actualització de la App", "Approved" : "Aprovat", "Experimental" : "Experimental", + "Enable all" : "Permetre tots", "Disconnect" : "Desconnecta", + "Revoke" : "Revocar", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -63,12 +107,14 @@ OC.L10N.register( "iPad iOS" : "iPad iOS", "iOS Client" : "iOS Client", "Android Client" : "Client Android", + "Sync client - {os}" : "Client de sincronització - {os}", "This session" : "Aquesta sessió", "Copy" : "Copia", "Copied!" : "Copiat!", "Not supported!" : "No soportat!", "Press ⌘-C to copy." : "Prem ⌘-C per copiar.", "Press Ctrl-C to copy." : "Prem Ctrl-C per copiar.", + "Error while loading browser sessions and device tokens" : "Error durant la càrrega de les sessions del navegador i testimonis de dispositius", "Valid until {date}" : "Vàlid fins {date}", "Delete" : "Esborra", "Local" : "Local", @@ -77,6 +123,8 @@ OC.L10N.register( "Only visible to you" : "Només visible per tu", "Contacts" : "Contactes", "Public" : "Públic", + "Verify" : "Verificar", + "Verifying …" : "Verificant ...", "Select a profile picture" : "Seleccioneu una imatge de perfil", "Very weak password" : "Contrasenya massa feble", "Weak password" : "Contrasenya feble", @@ -85,27 +133,35 @@ OC.L10N.register( "Strong password" : "Contrasenya forta", "Groups" : "Grups", "Unable to delete {objName}" : "No es pot eliminar {objName}", + "Error creating group: {message}" : "Error creant grup: {message}", "A valid group name must be provided" : "Heu de facilitar un nom de grup vàlid", "deleted {groupName}" : "eliminat {groupName}", "undo" : "desfés", "never" : "mai", "deleted {userName}" : "eliminat {userName}", + "Unable to add user to group {group}" : "No es pot afegir l'usuari al grup {group}", + "Unable to remove user from group {group}" : "No es pot eliminar l'usuari del grup {group}", "Add group" : "Afegeix grup", "no group" : "sense grup", + "Password successfully changed" : "Contrasenya canviada correctament", "Changing the password will result in data loss, because data recovery is not available for this user" : "Canviar la contrasenya provocarà pèrdua de dades, perquè la recuperació de dades no està disponible per a aquest usuari", + "Could not change the users email" : "No s'ha pogut canviar el correu electrònic dels usuaris", "A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid", "A valid password must be provided" : "Heu de facilitar una contrasenya vàlida", "A valid email must be provided" : "S'ha de subministrar una adreça de correu electrònic vàlida", "__language_name__" : "Català", "Unlimited" : "Il·limitat", + "Verifying" : "Verificant", "Personal info" : "Informació personal", "Sessions" : "Sessions", - "App passwords" : "Contrasenyes de l'Apliació", + "App passwords" : "Contrasenyes de l'Aplicació", "Sync clients" : "Sincronitzar clients", "None" : "Cap", "Login" : "Inici de sessió", "Plain" : "Pla", "NT LAN Manager" : "Gestor NT LAN", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correu electrònic", "Open documentation" : "Obre la documentació", "Send mode" : "Mode d'enviament", @@ -148,16 +204,19 @@ OC.L10N.register( "Allow apps to use the Share API" : "Permet que les aplicacions utilitzin l'API de compartir", "Allow users to share via link" : "Permet als usuaris compartir a través d'enllaços", "Allow public uploads" : "Permet pujada pública", + "Always ask for a password" : "Sempre demanar una contrasenya", "Enforce password protection" : "Reforça la protecció amb contrasenya", "Set default expiration date" : "Estableix la data de venciment", "Expire after " : "Venciment després de", "days" : "dies", "Enforce expiration date" : "Força la data de venciment", "Allow resharing" : "Permet compartir de nou", + "Allow sharing with groups" : "Permetre compartir amb grups", "Restrict users to only share with users in their groups" : "Permet als usuaris compartir només amb usuaris del seu grup", "Exclude groups from sharing" : "Exclou grups de compartició", "These groups will still be able to receive shares, but not to initiate them." : "Aquests fitxers encara podran rebre compartits, però no podran iniciar-los.", "Tips & tricks" : "Consells i trucs", + "This is particularly recommended when using the desktop client for file synchronisation." : "Això es recomana especialment quan s'utilitza el client d'escriptori per a sincronització d'arxius.", "How to do backups" : "Com fer còpies de seguretat", "Advanced monitoring" : "Supervisió avançada", "Performance tuning" : "Ajust del rendiment", @@ -165,6 +224,8 @@ OC.L10N.register( "Theming" : "Tematització", "Hardening and security guidance" : "Guia de protecció i seguretat", "Developer documentation" : "Documentació para desenvolupadors", + "Limit to groups" : "Limitar per grups", + "This app has an update available." : "Aquesta aplicació té una actualització disponible.", "by %s" : "per %s", "Documentation:" : "Documentació:", "User documentation" : "Documentació d'usuari", @@ -174,6 +235,7 @@ OC.L10N.register( "Hide description …" : "Amagar descripció...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aquesta aplicació no es pot instal·lar perquè les següents dependències no es compleixen:", "Enable only for specific groups" : "Activa només per grups específics", + "SSL Root Certificates" : "Certificats arrel SSL", "Common Name" : "Nom comú", "Valid until" : "Valid fins", "Issued By" : "Emès Per", @@ -186,8 +248,10 @@ OC.L10N.register( "Commercial support" : "Suport comercial", "Profile picture" : "Foto de perfil", "Upload new" : "Puja'n una de nova", + "Select from Files" : "Seleccioneu d'Arxius", "Remove image" : "Elimina imatge", "png or jpg, max. 20 MB" : "png or jpg, max. 20 MB", + "Picture provided by original account" : "Imatge proveïda per compte original", "Cancel" : "Cancel·la", "Choose as profile picture" : "Elegeix una imatge de perfil", "Full name" : "Nom complet", @@ -195,11 +259,13 @@ OC.L10N.register( "Email" : "Correu electrònic", "Your email address" : "Correu electrònic", "No email address set" : "No s'ha establert cap adreça de correu", + "For password reset and notifications" : "Per restablir la contrasenya i notificacions", "Phone number" : "Número de telèfon", "Your phone number" : "El teu número de telèfon", "Address" : "Adreça", "Your postal address" : "La teva adreça postal", "Website" : "Lloc web", + "It can take up to 24 hours before the account is displayed as verified." : "Pot prendre fins a 24 hores abans que aparegui el compte com a verificat.", "Twitter" : "Twitter", "You are member of the following groups:" : "Vostè és membre dels següents grups:", "Password" : "Contrasenya", @@ -213,15 +279,19 @@ OC.L10N.register( "Android app" : "aplicació para Android", "iOS app" : "aplicació para iOS", "Show First Run Wizard again" : "Torna a mostrar l'assistent de primera execució", + "Web, desktop and mobile clients currently logged in to your account." : "Clients Web, d'escriptori i mòbils connectats actualment al seu compte", "Device" : "Dispositiu", "Last activity" : "Última activitat", "Name" : "Nom", "App name" : "Nom de l'aplicació", "Create new app password" : "Crea una nova contrasenya de l'aplicació", + "For security reasons this password will only be shown once." : "Per raons de seguretat aquesta contrasenya només es mostrarà una vegada.", "Username" : "Nom d'usuari", "Done" : "Fet", + "Settings" : "Preferències", "Show storage location" : "Mostra la ubicació del magatzem", "Show user backend" : "Mostrar backend d'usuari", + "Show last login" : "Mostra darrera entrada", "Show email address" : "Mostrar l'adreça de correu electrònic", "Send email to new user" : "Enviar correu electrònic al nou usuari", "E-Mail" : "E-mail", @@ -231,8 +301,11 @@ OC.L10N.register( "Group name" : "Nom del grup", "Everyone" : "Tothom", "Admins" : "Administradors", + "Disabled" : "Desactivat", + "Default quota" : "Quota per defecte", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Escriviu la quota d'emmagatzemament (per ex.: \"512 MB\" o \"12 GB\")", "Other" : "Un altre", + "Group admin for" : "Administrador de grup per", "Quota" : "Quota", "Storage location" : "Ubicació de l'emmagatzemament", "Last login" : "Últim accés", @@ -256,6 +329,8 @@ OC.L10N.register( "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "El mòdul de PHP 'fileinfo' no s'ha trobat. Us recomanem que habiliteu aquest mòdul per obtenir millors resultats amb la detecció mime-type.", "Uninstall app" : "Desinstala la app", "Cheers!" : "Salut!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola,\n\nsimplement que sàpigas que ja tens un compte %s.\n\nEl teu nom d'usuari: %s\nAccedir-hi: %s\n", + "For password recovery and notifications" : "Per a la recuperació de la contrasenya i notificacions", "Your website" : "El teu lloc web", "Show last log in" : "Mostrar l'últim accés" }, diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index ef1d3c37822..2be02259108 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -1,9 +1,21 @@ { "translations": { + "{actor} changed your password" : "{actor} va canviar la contrasenya", + "You changed your password" : "Has canviat la teva contrasenya", + "Your password was reset by an administrator" : "La seva contrasenya s'ha restablert per un administrador", + "{actor} changed your email address" : "{actor} va canviar la seva adreça d\\'email", + "You changed your email address" : "Has canviat el teu email", + "Your email address was changed by an administrator" : "La seva adreça d'email s\\'ha canviat per un administrador", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "La teva <strong>contrasenya</strong> o <strong>email</strong> s'ha modificat", + "Your apps" : "Les teves apps", + "Enabled apps" : "Apps activades", + "Disabled apps" : "Apps desactivades", + "App bundles" : "Paquets d'apps", "Wrong password" : "Contrasenya incorrecta", "Saved" : "Desat", "No user supplied" : "No heu proporcionat cap usuari", "Unable to change password" : "No es pot canviar la contrasenya", "Authentication error" : "Error d'autenticació", + "Please provide an admin recovery password; otherwise, all user data will be lost." : "Si us plau, proporcioni una contrasenya d'administrador de recuperació; en cas contrari, es perdran totes les dades d'usuari.", "Wrong admin recovery password. Please check the password and try again." : "La contrasenya de recuperació d'administrador és incorrecta. Comproveu-la i torneu-ho a intentar.", "Federated Cloud Sharing" : "Compartició federada de núvol", "A problem occurred, please check your log files (Error: %s)" : "S'ha produït un problema, si us plau revisi els arxius de registre (Error: %s)", @@ -11,6 +23,8 @@ "Group already exists." : "El grup ja existeix.", "Unable to add group." : "No es pot agregar el grup.", "Unable to delete group." : "No es pot esborrar el grup.", + "Invalid SMTP password." : "Contrasenya SMTP no vàlida.", + "Well done, %s!" : "Ben fet, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Hi ha hagut un problema en enviar el correu. Revisi la seva configuració. (Error: %s)", "You need to set your user email before being able to send test emails." : "Heu d'establir un nom d'usuari abans de poder enviar correus de prova.", "Invalid request" : "Sol·licitud no vàlida", @@ -19,6 +33,8 @@ "A user with that name already exists." : "Ja existeix un usuari amb est nom.", "Unable to create user." : "No es pot crear el usuari.", "Unable to delete user." : "No es pot eliminar l'usuari", + "Error while enabling user." : "Error activant usuari.", + "Error while disabling user." : "Error desactivant usuari.", "Settings saved" : "Paràmetres desats", "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Unable to change email address" : "No es pot canviar l'adreça de correu", @@ -27,18 +43,41 @@ "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "%1$s changed your password on %2$s." : "%1$s va canviar la teva contrasenya a %2$s.", + "Your password on %s was changed." : "La teva contrasenya a %s es va canviar.", + "Your password on %s was reset by an administrator." : "La teva contrasenya a %s va ser restablerta per un administrador.", + "Password changed for %s" : "Contrasenya canviada per %s", + "If you did not request this, please contact an administrator." : "Si vostè no l'ha sol·licitat, si us plau, poseu-vos en contacte amb un administrador.", + "Password for %1$s changed on %2$s" : "Contrasenya per %1$s canviada a %2$s", + "%1$s changed your email address on %2$s." : "%1$s va canviar el teu email a %2$s.", + "Your email address on %s was changed." : "El teu email a %s es va canviar.", + "Your email address on %s was changed by an administrator." : "El teu email a %s es va canviar per un administrador.", + "Email address changed for %s" : "Adreça d'email canviada per %s", + "The new email address is %s" : "La teva adreça d'email és %s", + "Email address for %1$s changed on %2$s" : "Adreça d'email per %1$s canviada a %2$s", + "Welcome aboard" : "Benvingut a bord", + "Welcome aboard %s" : "Benvingut a bord %s", + "You have now an %s account, you can add, protect, and share your data." : "Ara tens un compte %s, pot afegir, protegir i compartir les teves dades.", + "Your username is: %s" : "El teu usuari és: %s", + "Set your password" : "Establir la contrasenya", + "Go to %s" : "Anar a %s", + "Install Client" : "Instal·lar Client", "Your %s account was created" : "S'ha creat el seu compte %s", + "Password confirmation is required" : "Cal una confirmació de la contrasenya", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Couldn't update app." : "No s'ha pogut actualitzar l'aplicació.", + "Are you really sure you want add {domain} as trusted domain?" : "Estàs segur que vols afegir {domini} com a domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", "Migration started …" : "Migració iniciada ...", "Not saved" : "No desat", + "Sending…" : "Enviant…", "Email sent" : "El correu electrónic s'ha enviat", "Official" : "Oficial", "All" : "Tots", "Update to %s" : "Actualitzar a %s", "No apps found for your version" : "No s'han trobat aplicacions per la seva versió", + "The app will be downloaded from the app store" : "L'app es descarregarà des de la botiga d'apps", "Error while disabling app" : "Error en desactivar l'aplicació", "Disable" : "Desactiva", "Enable" : "Habilita", @@ -47,10 +86,15 @@ "Updating...." : "Actualitzant...", "Error while updating app" : "Error en actualitzar l'aplicació", "Updated" : "Actualitzada", + "Removing …" : "Treient ...", + "Error while removing app" : "Error treient app", + "Remove" : "Treure", "App update" : "Actualització de la App", "Approved" : "Aprovat", "Experimental" : "Experimental", + "Enable all" : "Permetre tots", "Disconnect" : "Desconnecta", + "Revoke" : "Revocar", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -61,12 +105,14 @@ "iPad iOS" : "iPad iOS", "iOS Client" : "iOS Client", "Android Client" : "Client Android", + "Sync client - {os}" : "Client de sincronització - {os}", "This session" : "Aquesta sessió", "Copy" : "Copia", "Copied!" : "Copiat!", "Not supported!" : "No soportat!", "Press ⌘-C to copy." : "Prem ⌘-C per copiar.", "Press Ctrl-C to copy." : "Prem Ctrl-C per copiar.", + "Error while loading browser sessions and device tokens" : "Error durant la càrrega de les sessions del navegador i testimonis de dispositius", "Valid until {date}" : "Vàlid fins {date}", "Delete" : "Esborra", "Local" : "Local", @@ -75,6 +121,8 @@ "Only visible to you" : "Només visible per tu", "Contacts" : "Contactes", "Public" : "Públic", + "Verify" : "Verificar", + "Verifying …" : "Verificant ...", "Select a profile picture" : "Seleccioneu una imatge de perfil", "Very weak password" : "Contrasenya massa feble", "Weak password" : "Contrasenya feble", @@ -83,27 +131,35 @@ "Strong password" : "Contrasenya forta", "Groups" : "Grups", "Unable to delete {objName}" : "No es pot eliminar {objName}", + "Error creating group: {message}" : "Error creant grup: {message}", "A valid group name must be provided" : "Heu de facilitar un nom de grup vàlid", "deleted {groupName}" : "eliminat {groupName}", "undo" : "desfés", "never" : "mai", "deleted {userName}" : "eliminat {userName}", + "Unable to add user to group {group}" : "No es pot afegir l'usuari al grup {group}", + "Unable to remove user from group {group}" : "No es pot eliminar l'usuari del grup {group}", "Add group" : "Afegeix grup", "no group" : "sense grup", + "Password successfully changed" : "Contrasenya canviada correctament", "Changing the password will result in data loss, because data recovery is not available for this user" : "Canviar la contrasenya provocarà pèrdua de dades, perquè la recuperació de dades no està disponible per a aquest usuari", + "Could not change the users email" : "No s'ha pogut canviar el correu electrònic dels usuaris", "A valid username must be provided" : "Heu de facilitar un nom d'usuari vàlid", "A valid password must be provided" : "Heu de facilitar una contrasenya vàlida", "A valid email must be provided" : "S'ha de subministrar una adreça de correu electrònic vàlida", "__language_name__" : "Català", "Unlimited" : "Il·limitat", + "Verifying" : "Verificant", "Personal info" : "Informació personal", "Sessions" : "Sessions", - "App passwords" : "Contrasenyes de l'Apliació", + "App passwords" : "Contrasenyes de l'Aplicació", "Sync clients" : "Sincronitzar clients", "None" : "Cap", "Login" : "Inici de sessió", "Plain" : "Pla", "NT LAN Manager" : "Gestor NT LAN", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correu electrònic", "Open documentation" : "Obre la documentació", "Send mode" : "Mode d'enviament", @@ -146,16 +202,19 @@ "Allow apps to use the Share API" : "Permet que les aplicacions utilitzin l'API de compartir", "Allow users to share via link" : "Permet als usuaris compartir a través d'enllaços", "Allow public uploads" : "Permet pujada pública", + "Always ask for a password" : "Sempre demanar una contrasenya", "Enforce password protection" : "Reforça la protecció amb contrasenya", "Set default expiration date" : "Estableix la data de venciment", "Expire after " : "Venciment després de", "days" : "dies", "Enforce expiration date" : "Força la data de venciment", "Allow resharing" : "Permet compartir de nou", + "Allow sharing with groups" : "Permetre compartir amb grups", "Restrict users to only share with users in their groups" : "Permet als usuaris compartir només amb usuaris del seu grup", "Exclude groups from sharing" : "Exclou grups de compartició", "These groups will still be able to receive shares, but not to initiate them." : "Aquests fitxers encara podran rebre compartits, però no podran iniciar-los.", "Tips & tricks" : "Consells i trucs", + "This is particularly recommended when using the desktop client for file synchronisation." : "Això es recomana especialment quan s'utilitza el client d'escriptori per a sincronització d'arxius.", "How to do backups" : "Com fer còpies de seguretat", "Advanced monitoring" : "Supervisió avançada", "Performance tuning" : "Ajust del rendiment", @@ -163,6 +222,8 @@ "Theming" : "Tematització", "Hardening and security guidance" : "Guia de protecció i seguretat", "Developer documentation" : "Documentació para desenvolupadors", + "Limit to groups" : "Limitar per grups", + "This app has an update available." : "Aquesta aplicació té una actualització disponible.", "by %s" : "per %s", "Documentation:" : "Documentació:", "User documentation" : "Documentació d'usuari", @@ -172,6 +233,7 @@ "Hide description …" : "Amagar descripció...", "This app cannot be installed because the following dependencies are not fulfilled:" : "Aquesta aplicació no es pot instal·lar perquè les següents dependències no es compleixen:", "Enable only for specific groups" : "Activa només per grups específics", + "SSL Root Certificates" : "Certificats arrel SSL", "Common Name" : "Nom comú", "Valid until" : "Valid fins", "Issued By" : "Emès Per", @@ -184,8 +246,10 @@ "Commercial support" : "Suport comercial", "Profile picture" : "Foto de perfil", "Upload new" : "Puja'n una de nova", + "Select from Files" : "Seleccioneu d'Arxius", "Remove image" : "Elimina imatge", "png or jpg, max. 20 MB" : "png or jpg, max. 20 MB", + "Picture provided by original account" : "Imatge proveïda per compte original", "Cancel" : "Cancel·la", "Choose as profile picture" : "Elegeix una imatge de perfil", "Full name" : "Nom complet", @@ -193,11 +257,13 @@ "Email" : "Correu electrònic", "Your email address" : "Correu electrònic", "No email address set" : "No s'ha establert cap adreça de correu", + "For password reset and notifications" : "Per restablir la contrasenya i notificacions", "Phone number" : "Número de telèfon", "Your phone number" : "El teu número de telèfon", "Address" : "Adreça", "Your postal address" : "La teva adreça postal", "Website" : "Lloc web", + "It can take up to 24 hours before the account is displayed as verified." : "Pot prendre fins a 24 hores abans que aparegui el compte com a verificat.", "Twitter" : "Twitter", "You are member of the following groups:" : "Vostè és membre dels següents grups:", "Password" : "Contrasenya", @@ -211,15 +277,19 @@ "Android app" : "aplicació para Android", "iOS app" : "aplicació para iOS", "Show First Run Wizard again" : "Torna a mostrar l'assistent de primera execució", + "Web, desktop and mobile clients currently logged in to your account." : "Clients Web, d'escriptori i mòbils connectats actualment al seu compte", "Device" : "Dispositiu", "Last activity" : "Última activitat", "Name" : "Nom", "App name" : "Nom de l'aplicació", "Create new app password" : "Crea una nova contrasenya de l'aplicació", + "For security reasons this password will only be shown once." : "Per raons de seguretat aquesta contrasenya només es mostrarà una vegada.", "Username" : "Nom d'usuari", "Done" : "Fet", + "Settings" : "Preferències", "Show storage location" : "Mostra la ubicació del magatzem", "Show user backend" : "Mostrar backend d'usuari", + "Show last login" : "Mostra darrera entrada", "Show email address" : "Mostrar l'adreça de correu electrònic", "Send email to new user" : "Enviar correu electrònic al nou usuari", "E-Mail" : "E-mail", @@ -229,8 +299,11 @@ "Group name" : "Nom del grup", "Everyone" : "Tothom", "Admins" : "Administradors", + "Disabled" : "Desactivat", + "Default quota" : "Quota per defecte", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Escriviu la quota d'emmagatzemament (per ex.: \"512 MB\" o \"12 GB\")", "Other" : "Un altre", + "Group admin for" : "Administrador de grup per", "Quota" : "Quota", "Storage location" : "Ubicació de l'emmagatzemament", "Last login" : "Últim accés", @@ -254,6 +327,8 @@ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "El mòdul de PHP 'fileinfo' no s'ha trobat. Us recomanem que habiliteu aquest mòdul per obtenir millors resultats amb la detecció mime-type.", "Uninstall app" : "Desinstala la app", "Cheers!" : "Salut!", + "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola,\n\nsimplement que sàpigas que ja tens un compte %s.\n\nEl teu nom d'usuari: %s\nAccedir-hi: %s\n", + "For password recovery and notifications" : "Per a la recuperació de la contrasenya i notificacions", "Your website" : "El teu lloc web", "Show last log in" : "Mostrar l'últim accés" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/settings/l10n/el.js b/settings/l10n/el.js index adf99c156f8..a61a07909f1 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -1,10 +1,14 @@ OC.L10N.register( "settings", { + "{actor} changed your password" : "{actor} το συθηματικό σας άλλαξε", "You changed your password" : "Αλλάξατε το συνθηματικό σας", "Your password was reset by an administrator" : "Έχει γίνει επαναφορά του συνθηματικού σας από τον διαχειριστή", + "You changed your email address" : "Έχετε αλλάξει τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας", "Your apps" : "Οι εφαρμογές σας", "Enabled apps" : "Ενεργοποιημένες εφαρμογές", + "Disabled apps" : "Απενεργοποιημένες εφαρμογές", + "App bundles" : "Πακέτα εφαρμογών", "Wrong password" : "Εσφαλμένο συνθηματικό", "Saved" : "Αποθηκεύτηκαν", "No user supplied" : "Δεν εισήχθη χρήστης", @@ -206,6 +210,7 @@ OC.L10N.register( "Theming" : "Θέματα", "Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης", "Developer documentation" : "Τεκμηρίωση προγραμματιστή", + "Limit to groups" : "Όριο στις ομάδες", "This app has an update available." : "Αυτή η εφαρμογή έχει διαθέσιμη ενημέρωση.", "by %s" : "από %s", "Documentation:" : "Τεκμηρίωση:", @@ -286,6 +291,7 @@ OC.L10N.register( "Group name" : "Όνομα ομάδας", "Everyone" : "Όλοι", "Admins" : "Διαχειριστές", + "Disabled" : "Απενεργοποιημένο", "Default quota" : "Προεπιλέγμενη χωρητικότητα", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Παρακαλώ εισάγετε επιτρεπόμενα μερίδια αποθηκευτικού χώρου (π.χ. \"512 MB\" ή \"12 GB\")", "Other" : "Άλλο", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index be170ca67d9..5617064e25c 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -1,8 +1,12 @@ { "translations": { + "{actor} changed your password" : "{actor} το συθηματικό σας άλλαξε", "You changed your password" : "Αλλάξατε το συνθηματικό σας", "Your password was reset by an administrator" : "Έχει γίνει επαναφορά του συνθηματικού σας από τον διαχειριστή", + "You changed your email address" : "Έχετε αλλάξει τη διεύθυνση ηλεκτρονικού ταχυδρομείου σας", "Your apps" : "Οι εφαρμογές σας", "Enabled apps" : "Ενεργοποιημένες εφαρμογές", + "Disabled apps" : "Απενεργοποιημένες εφαρμογές", + "App bundles" : "Πακέτα εφαρμογών", "Wrong password" : "Εσφαλμένο συνθηματικό", "Saved" : "Αποθηκεύτηκαν", "No user supplied" : "Δεν εισήχθη χρήστης", @@ -204,6 +208,7 @@ "Theming" : "Θέματα", "Hardening and security guidance" : "Οδηγίες ασφάλειας και θωράκισης", "Developer documentation" : "Τεκμηρίωση προγραμματιστή", + "Limit to groups" : "Όριο στις ομάδες", "This app has an update available." : "Αυτή η εφαρμογή έχει διαθέσιμη ενημέρωση.", "by %s" : "από %s", "Documentation:" : "Τεκμηρίωση:", @@ -284,6 +289,7 @@ "Group name" : "Όνομα ομάδας", "Everyone" : "Όλοι", "Admins" : "Διαχειριστές", + "Disabled" : "Απενεργοποιημένο", "Default quota" : "Προεπιλέγμενη χωρητικότητα", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Παρακαλώ εισάγετε επιτρεπόμενα μερίδια αποθηκευτικού χώρου (π.χ. \"512 MB\" ή \"12 GB\")", "Other" : "Άλλο", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 89c53a2eed7..a3b757750f6 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -397,7 +397,7 @@ OC.L10N.register( "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", - "Sending..." : "Envoi en cours...", + "Sending..." : "Envoi en cours…", "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 9abb89d2bf3..2cc96b346d6 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -395,7 +395,7 @@ "Admins can't remove themself from the admin group" : "Les administrateurs ne peuvent pas se retirer eux-mêmes du groupe admin", "Unable to add user to group %s" : "Impossible d'ajouter l'utilisateur au groupe %s", "Unable to remove user from group %s" : "Impossible de supprimer l'utilisateur du groupe %s", - "Sending..." : "Envoi en cours...", + "Sending..." : "Envoi en cours…", "Uninstalling ...." : "Désinstallation...", "Error while uninstalling app" : "Erreur lors de la désinstallation de l'application", "Uninstall" : "Désinstaller", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index 4ec6c7eb7d8..31cf04f21dc 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -1,6 +1,13 @@ OC.L10N.register( "settings", { + "{actor} changed your password" : "{actor} ganti kata sandi anda", + "You changed your password" : "Anda mengganti kata sandi", + "Your password was reset by an administrator" : "Kata sandi anda telah diatur ulang oleh administrator", + "{actor} changed your email address" : "{actor} merubah alamat email anda", + "Your apps" : "Aplikasi anda", + "Enabled apps" : "Aktifkan Aplikasi", + "Disabled apps" : "Matikan Aplikasi", "Wrong password" : "Sandi salah", "Saved" : "Disimpan", "No user supplied" : "Tidak ada pengguna yang diberikan", @@ -15,6 +22,7 @@ OC.L10N.register( "Group already exists." : "Grup sudah ada.", "Unable to add group." : "Tidak dapat menambah grup.", "Unable to delete group." : "Tidak dapat menghapus grup.", + "Invalid SMTP password." : "Kata sandi SMTP tidak cocok", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Terjadi masalah saat mengirim email. Mohon periksa kembali pengaturan Anda. (Kesalahan: %s)", "You need to set your user email before being able to send test emails." : "Anda perlu menetapkan email pengguna Anda sebelum dapat mengirim email percobaan.", "Invalid request" : "Permintaan tidak valid", @@ -34,6 +42,7 @@ OC.L10N.register( "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", "Migration started …" : "Migrasi dimulai ...", + "Sending…" : "Mengirim...", "Email sent" : "Email terkirim", "Official" : "Resmi", "All" : "Semua", @@ -54,6 +63,7 @@ OC.L10N.register( "Updating...." : "Memperbarui....", "Error while updating app" : "Terjadi kesalahan saat memperbarui aplikasi", "Updated" : "Diperbarui", + "Remove" : "Hapus", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikasi sudah diaktifkan tetapi perlu diperbarui. Anda akan dialihkan ke halaman pembaruan dalam 5 detik.", "App update" : "Pembaruan Aplikasi", "Approved" : "Disetujui", @@ -70,6 +80,7 @@ OC.L10N.register( "Android Client" : "Klien Android", "Sync client - {os}" : "Klien sync - {os}", "This session" : "Sesi ini", + "Copy" : "Salin", "Copied!" : "Tersalin!", "Not supported!" : "Tidak didukung!", "Press ⌘-C to copy." : "Tekan ⌘-C untuk menyalin.", @@ -80,6 +91,12 @@ OC.L10N.register( "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Valid until {date}" : "Berlaku sampai {date}", "Delete" : "Hapus", + "Local" : "Lokal", + "Private" : "Pribadi", + "Contacts" : "Kontak", + "Public" : "Publik", + "Verify" : "Verifikasi", + "Verifying …" : "Sedang memferivikasi...", "Select a profile picture" : "Pilih foto profil", "Very weak password" : "Sandi sangat lemah", "Weak password" : "Sandi lemah", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index 7ae7c8cc66d..fe93e61d42a 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -1,4 +1,11 @@ { "translations": { + "{actor} changed your password" : "{actor} ganti kata sandi anda", + "You changed your password" : "Anda mengganti kata sandi", + "Your password was reset by an administrator" : "Kata sandi anda telah diatur ulang oleh administrator", + "{actor} changed your email address" : "{actor} merubah alamat email anda", + "Your apps" : "Aplikasi anda", + "Enabled apps" : "Aktifkan Aplikasi", + "Disabled apps" : "Matikan Aplikasi", "Wrong password" : "Sandi salah", "Saved" : "Disimpan", "No user supplied" : "Tidak ada pengguna yang diberikan", @@ -13,6 +20,7 @@ "Group already exists." : "Grup sudah ada.", "Unable to add group." : "Tidak dapat menambah grup.", "Unable to delete group." : "Tidak dapat menghapus grup.", + "Invalid SMTP password." : "Kata sandi SMTP tidak cocok", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Terjadi masalah saat mengirim email. Mohon periksa kembali pengaturan Anda. (Kesalahan: %s)", "You need to set your user email before being able to send test emails." : "Anda perlu menetapkan email pengguna Anda sebelum dapat mengirim email percobaan.", "Invalid request" : "Permintaan tidak valid", @@ -32,6 +40,7 @@ "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", "Migration started …" : "Migrasi dimulai ...", + "Sending…" : "Mengirim...", "Email sent" : "Email terkirim", "Official" : "Resmi", "All" : "Semua", @@ -52,6 +61,7 @@ "Updating...." : "Memperbarui....", "Error while updating app" : "Terjadi kesalahan saat memperbarui aplikasi", "Updated" : "Diperbarui", + "Remove" : "Hapus", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikasi sudah diaktifkan tetapi perlu diperbarui. Anda akan dialihkan ke halaman pembaruan dalam 5 detik.", "App update" : "Pembaruan Aplikasi", "Approved" : "Disetujui", @@ -68,6 +78,7 @@ "Android Client" : "Klien Android", "Sync client - {os}" : "Klien sync - {os}", "This session" : "Sesi ini", + "Copy" : "Salin", "Copied!" : "Tersalin!", "Not supported!" : "Tidak didukung!", "Press ⌘-C to copy." : "Tekan ⌘-C untuk menyalin.", @@ -78,6 +89,12 @@ "An error occurred. Please upload an ASCII-encoded PEM certificate." : "Terjadi kesalahan. Mohon unggah sertifikat PEM terenkode-ASCII.", "Valid until {date}" : "Berlaku sampai {date}", "Delete" : "Hapus", + "Local" : "Lokal", + "Private" : "Pribadi", + "Contacts" : "Kontak", + "Public" : "Publik", + "Verify" : "Verifikasi", + "Verifying …" : "Sedang memferivikasi...", "Select a profile picture" : "Pilih foto profil", "Very weak password" : "Sandi sangat lemah", "Weak password" : "Sandi lemah", diff --git a/settings/l10n/nb.js b/settings/l10n/nb.js index 9952f42b043..43dce267992 100644 --- a/settings/l10n/nb.js +++ b/settings/l10n/nb.js @@ -42,6 +42,10 @@ OC.L10N.register( "To send a password link to the user an email address is required." : "Krever epost for å sende link til bruker.", "Unable to create user." : "Kan ikke opprette bruker.", "Unable to delete user." : "Kan ikke slette bruker.", + "Error while enabling user." : "Feil ved påslag av brukerkonto.", + "Error while disabling user." : "Feil ved avslag av brukerkonto.", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "For å bekrefte din Twitter-konto, post følgende tweet på Twitter (husk å ikke få med noen linjeskift):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "For å bekrefte din nettside, lagre følgende innhold på roten av din nettjener på '.well-known/CloudIdVerificationCode.txt' (forsikre deg om at hele teksten er på ei linje):", "Settings saved" : "Innstillinger lagret", "Unable to change full name" : "Klarte ikke å endre fullt navn", "Unable to change email address" : "Klarer ikke å endre epostadresse", @@ -144,6 +148,8 @@ OC.L10N.register( "Visible to local users and to trusted servers" : "Synlig for lokale brukere og klarerte tjenere", "Public" : "Offentlig", "Will be synced to a global and public address book" : "Vil blir synkronisert til global og offentlig addressbok", + "Verify" : "Bekreft", + "Verifying …" : "Bekrefter…", "Select a profile picture" : "Velg et profilbilde", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -167,12 +173,14 @@ OC.L10N.register( "Password successfully changed" : "Passordet ble endret.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Forandring av passordet vil føre til tap av data, fordi datagjennoppretting er utilgjengelig for denne brukeren", "Could not change the users email" : "Kunne ikke endre brukerens epostadresse", + "Error while changing status of {user}" : "Feil ved endring av status for {user}", "A valid username must be provided" : "Oppgi et gyldig brukernavn", "Error creating user: {message}" : "Feil ved oppretting av bruker: {message}", "A valid password must be provided" : "Oppgi et gyldig passord", "A valid email must be provided" : "En gyldig e-postadresse må oppgis", "__language_name__" : "Norsk bokmål", "Unlimited" : "Ubegrenset", + "Verifying" : "Bekrefter", "Personal info" : "Personlig informasjon", "Sessions" : "Økt", "App passwords" : "App passord", @@ -324,7 +332,10 @@ OC.L10N.register( "Address" : "Adresse", "Your postal address" : "Din postadresse", "Website" : "Nettside", + "It can take up to 24 hours before the account is displayed as verified." : "Det kan ta opptil et døgn før kontoen vises som bekreftet.", + "Link https://…" : "Lenk http://..", "Twitter" : "Twitter", + "Twitter handle @…" : "Twitter-konto @…", "You are member of the following groups:" : "Du er medlem av følgende grupper:", "Password" : "Passord", "Current password" : "Nåværende passord", @@ -369,6 +380,7 @@ OC.L10N.register( "Group name" : "Gruppenavn", "Everyone" : "Alle", "Admins" : "Administratorer", + "Disabled" : "Avskrudd", "Default quota" : "Standard kvote", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Legg inn lagringskvote (f.eks. \"512 MB\" eller \"12 GB\")", "Other" : "Annet", @@ -401,10 +413,10 @@ OC.L10N.register( "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvil bare opplyse deg omat du har en %s konto.\n\nDitt brukernavn: %s\nGå dit: %s\n\n", "For password recovery and notifications" : "For passord-gjenoppretting og varsler", "Your website" : "Din nettside", - "Your Twitter handle" : "Din Twitter nøkkel", + "Your Twitter handle" : "Din Twitter-konto", "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", "Follow us on Google Plus!" : "Følg oss på Google Plus!", - "Subscribe to our twitter channel!" : "Abonner på vår twitter kanal!", + "Subscribe to our twitter channel!" : "Abonner på vår Twitter kanal!", "Subscribe to our news feed!" : "Abonner på vår nyhetsstrøm!", "Show last log in" : "Vis siste innlogging" }, diff --git a/settings/l10n/nb.json b/settings/l10n/nb.json index 4e27eba8ff3..af55342821d 100644 --- a/settings/l10n/nb.json +++ b/settings/l10n/nb.json @@ -40,6 +40,10 @@ "To send a password link to the user an email address is required." : "Krever epost for å sende link til bruker.", "Unable to create user." : "Kan ikke opprette bruker.", "Unable to delete user." : "Kan ikke slette bruker.", + "Error while enabling user." : "Feil ved påslag av brukerkonto.", + "Error while disabling user." : "Feil ved avslag av brukerkonto.", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "For å bekrefte din Twitter-konto, post følgende tweet på Twitter (husk å ikke få med noen linjeskift):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "For å bekrefte din nettside, lagre følgende innhold på roten av din nettjener på '.well-known/CloudIdVerificationCode.txt' (forsikre deg om at hele teksten er på ei linje):", "Settings saved" : "Innstillinger lagret", "Unable to change full name" : "Klarte ikke å endre fullt navn", "Unable to change email address" : "Klarer ikke å endre epostadresse", @@ -142,6 +146,8 @@ "Visible to local users and to trusted servers" : "Synlig for lokale brukere og klarerte tjenere", "Public" : "Offentlig", "Will be synced to a global and public address book" : "Vil blir synkronisert til global og offentlig addressbok", + "Verify" : "Bekreft", + "Verifying …" : "Bekrefter…", "Select a profile picture" : "Velg et profilbilde", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -165,12 +171,14 @@ "Password successfully changed" : "Passordet ble endret.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Forandring av passordet vil føre til tap av data, fordi datagjennoppretting er utilgjengelig for denne brukeren", "Could not change the users email" : "Kunne ikke endre brukerens epostadresse", + "Error while changing status of {user}" : "Feil ved endring av status for {user}", "A valid username must be provided" : "Oppgi et gyldig brukernavn", "Error creating user: {message}" : "Feil ved oppretting av bruker: {message}", "A valid password must be provided" : "Oppgi et gyldig passord", "A valid email must be provided" : "En gyldig e-postadresse må oppgis", "__language_name__" : "Norsk bokmål", "Unlimited" : "Ubegrenset", + "Verifying" : "Bekrefter", "Personal info" : "Personlig informasjon", "Sessions" : "Økt", "App passwords" : "App passord", @@ -322,7 +330,10 @@ "Address" : "Adresse", "Your postal address" : "Din postadresse", "Website" : "Nettside", + "It can take up to 24 hours before the account is displayed as verified." : "Det kan ta opptil et døgn før kontoen vises som bekreftet.", + "Link https://…" : "Lenk http://..", "Twitter" : "Twitter", + "Twitter handle @…" : "Twitter-konto @…", "You are member of the following groups:" : "Du er medlem av følgende grupper:", "Password" : "Passord", "Current password" : "Nåværende passord", @@ -367,6 +378,7 @@ "Group name" : "Gruppenavn", "Everyone" : "Alle", "Admins" : "Administratorer", + "Disabled" : "Avskrudd", "Default quota" : "Standard kvote", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Legg inn lagringskvote (f.eks. \"512 MB\" eller \"12 GB\")", "Other" : "Annet", @@ -399,10 +411,10 @@ "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvil bare opplyse deg omat du har en %s konto.\n\nDitt brukernavn: %s\nGå dit: %s\n\n", "For password recovery and notifications" : "For passord-gjenoppretting og varsler", "Your website" : "Din nettside", - "Your Twitter handle" : "Din Twitter nøkkel", + "Your Twitter handle" : "Din Twitter-konto", "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", "Follow us on Google Plus!" : "Følg oss på Google Plus!", - "Subscribe to our twitter channel!" : "Abonner på vår twitter kanal!", + "Subscribe to our twitter channel!" : "Abonner på vår Twitter kanal!", "Subscribe to our news feed!" : "Abonner på vår nyhetsstrøm!", "Show last log in" : "Vis siste innlogging" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index e122f632b8f..297bedefbce 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -44,6 +44,8 @@ OC.L10N.register( "Unable to delete user." : "Kan de gebruiker niet verwijderen.", "Error while enabling user." : "Fout bij inschakelen gebruiker.", "Error while disabling user." : "Fout bij uitschakelen gebruiker.", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "Om je Twitter-account te verifiëren moet je de volgende tweet op Twitter plaatsen (let erop dat het plaatst zonder regelafbreking):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Om je website te verifiëren moet je de volgende inhoud binnen de web-root van je server in '.well-known/CloudIdVerificationCode.txt' plaatsen (let erop dat de complete tekst op één regel staat):", "Settings saved" : "Instellingen opgeslagen", "Unable to change full name" : "Kan de volledige naam niet wijzigen", "Unable to change email address" : "Kan e-mailadres niet wijzigen", @@ -171,6 +173,7 @@ OC.L10N.register( "Password successfully changed" : "Wachtwoord succesvol gewijzigd.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Wijzigen van het wachtwoord leidt tot gegevensverlies, omdat gegevensherstel voor deze gebruiker niet beschikbaar is", "Could not change the users email" : "Kon het gebruikers e-mailadres niet wijzigen", + "Error while changing status of {user}" : "Fout bij wijzigen status van {user}", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "Error creating user: {message}" : "Fout bij aanmaken gebruiker: {message}", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", @@ -206,6 +209,7 @@ OC.L10N.register( "Test email settings" : "Test e-mailinstellingen", "Send email" : "Versturen e-mail", "Server-side encryption" : "Server-side versleuteling", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Server-side versleuteling maakt het mogelijk om bestanden te versleutelen die worden geüploaded. Dit betekent wel enig prestatieverlies, dus schakel het alleen in als het nodig is.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", "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." : "Als versleuteling is ingeschakeld, worden alle geüploade bestanden vanaf dat moment versleuteld opgeslagen op de server. Het is alleen mogelijk om de versleuteling later uit te schakelen als de actieve versleutelingsmodule dit ondersteunt en aan alle pré-condities (mn de ingestelde herstelsleutel) wordt voldaan.", @@ -220,6 +224,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Je moet je cryptosleutels van de oude versleuteling (ownCloud <= 8.0) migreren naar de nieuwe.", "Start migration" : "Start migratie", "Security & setup warnings" : "Beveiligings- en instellingswaarschuwingen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Voor beveiliging en prestaties van je server is het belangrijk dat alles goed is geconfigureerd. Om je hierbij te helpen doen we paar automatische controles. Bekijk de Tips & Trucs sectie en de ocumentatie voor meer informatie.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php lijkt niet goed te zijn ingesteld om systeemomgevingsvariabelen te bevragen. De test met getenv(\"PATH\") gaf een leeg resultaat.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installatiedocumentatie ↗</a> voor php configuratienotities en de php configuratie van je server, zeker bij gebruik van 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." : "De Alleen-lezen config is ingeschakeld. Dit voorkomt het via de webinterface wijzigen van verschillende instellingen. Bovendien moet het bestand voor elke aanpassing handmatig op beschrijfbaar worden ingesteld.", @@ -240,6 +245,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.", "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Voor optimale prestaties is het belangrijk om de achtergrondtaken goed te configureren. Voor grotere installaties is \"Cron' de aanbevolen instelling. Bekijk de documentatie voor meer informatie.", "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.", "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", @@ -247,6 +253,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Om dit te draaien, is de PHP posix extensie vereist. Bekijk {linkstart}PHP documentatie{linkend} voor meer informatie.", "Version" : "Versie", "Sharing" : "Delen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als beheerder kun je het deel-gedrag optimaliseren. Bekijk de documentatie voor meer informatie.", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Allow users to share via link" : "Sta gebruikers toe om te delen via een link", "Allow public uploads" : "Sta publieke uploads toe", @@ -265,6 +272,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Tonen disclaimer op de openbare link uploadpagina (alleen tonen als het bestandsoverzicht verborgen is).", "This text will be shown on the public link upload page when the file list is hidden." : "Deze tekst wordt getoond op de openbare link uploadpagina als het bestandsoverzicht is verborgen.", "Tips & tricks" : "Tips & trucs", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Er zijn veel mogelijkheden en instellingsschakelaars beschikbaar om je installatie te optimaliseren. Hier zijn wat aanwijzigen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wordt momenteel gebruikt als backend database. Voor grotere installaties adviseren we dat je omschakelt naar een andere database backend.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dit wordt vooral aanbevolen als de desktop client wordt gebruikt voor bestandssynchronisatie.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie ↗</a>.", @@ -324,7 +332,10 @@ OC.L10N.register( "Address" : "Adres", "Your postal address" : "Je postadres", "Website" : "Website", + "It can take up to 24 hours before the account is displayed as verified." : "Het kan tot 24 uur duren voordat het account als geverifieerd wordt weergegeven.", + "Link https://…" : "Link https://…", "Twitter" : "Twitter", + "Twitter handle @…" : "Twitter naam @…", "You are member of the following groups:" : "U bent lid van de volgende groepen:", "Password" : "Wachtwoord", "Current password" : "Huidig wachtwoord", @@ -341,6 +352,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", "Last activity" : "Laatste activiteit", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier kun je individuele wachtwoorden voor apps genereren, zodat je geen wachtwoorden hoeft uit te geven. Je kunt ze ook weer individueel intrekken.", "Name" : "Naam", "App name" : "Appnaam", "Create new app password" : "Creëer een nieuw app wachtwoord", @@ -368,6 +380,7 @@ OC.L10N.register( "Group name" : "Groepsnaam", "Everyone" : "Iedereen", "Admins" : "Beheerders", + "Disabled" : "Uitgeschakeld", "Default quota" : "Standaard quota", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Geef de opslagquotering op (bijv. \"512 MB\" of \"12 GB\")", "Other" : "Anders", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 0aa02237ecb..fb8a77b2d1c 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -42,6 +42,8 @@ "Unable to delete user." : "Kan de gebruiker niet verwijderen.", "Error while enabling user." : "Fout bij inschakelen gebruiker.", "Error while disabling user." : "Fout bij uitschakelen gebruiker.", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "Om je Twitter-account te verifiëren moet je de volgende tweet op Twitter plaatsen (let erop dat het plaatst zonder regelafbreking):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Om je website te verifiëren moet je de volgende inhoud binnen de web-root van je server in '.well-known/CloudIdVerificationCode.txt' plaatsen (let erop dat de complete tekst op één regel staat):", "Settings saved" : "Instellingen opgeslagen", "Unable to change full name" : "Kan de volledige naam niet wijzigen", "Unable to change email address" : "Kan e-mailadres niet wijzigen", @@ -169,6 +171,7 @@ "Password successfully changed" : "Wachtwoord succesvol gewijzigd.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Wijzigen van het wachtwoord leidt tot gegevensverlies, omdat gegevensherstel voor deze gebruiker niet beschikbaar is", "Could not change the users email" : "Kon het gebruikers e-mailadres niet wijzigen", + "Error while changing status of {user}" : "Fout bij wijzigen status van {user}", "A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven", "Error creating user: {message}" : "Fout bij aanmaken gebruiker: {message}", "A valid password must be provided" : "Er moet een geldig wachtwoord worden opgegeven", @@ -204,6 +207,7 @@ "Test email settings" : "Test e-mailinstellingen", "Send email" : "Versturen e-mail", "Server-side encryption" : "Server-side versleuteling", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Server-side versleuteling maakt het mogelijk om bestanden te versleutelen die worden geüploaded. Dit betekent wel enig prestatieverlies, dus schakel het alleen in als het nodig is.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", "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." : "Als versleuteling is ingeschakeld, worden alle geüploade bestanden vanaf dat moment versleuteld opgeslagen op de server. Het is alleen mogelijk om de versleuteling later uit te schakelen als de actieve versleutelingsmodule dit ondersteunt en aan alle pré-condities (mn de ingestelde herstelsleutel) wordt voldaan.", @@ -218,6 +222,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Je moet je cryptosleutels van de oude versleuteling (ownCloud <= 8.0) migreren naar de nieuwe.", "Start migration" : "Start migratie", "Security & setup warnings" : "Beveiligings- en instellingswaarschuwingen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Voor beveiliging en prestaties van je server is het belangrijk dat alles goed is geconfigureerd. Om je hierbij te helpen doen we paar automatische controles. Bekijk de Tips & Trucs sectie en de ocumentatie voor meer informatie.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php lijkt niet goed te zijn ingesteld om systeemomgevingsvariabelen te bevragen. De test met getenv(\"PATH\") gaf een leeg resultaat.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installatiedocumentatie ↗</a> voor php configuratienotities en de php configuratie van je server, zeker bij gebruik van 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." : "De Alleen-lezen config is ingeschakeld. Dit voorkomt het via de webinterface wijzigen van verschillende instellingen. Bovendien moet het bestand voor elke aanpassing handmatig op beschrijfbaar worden ingesteld.", @@ -238,6 +243,7 @@ "Last cron job execution: %s." : "Laatst uitgevoerde cronjob: %s.", "Last cron job execution: %s. Something seems wrong." : "Laatst uitgevoerde cronjob: %s. Er lijkt iets fout gegaan.", "Cron was not executed yet!" : "Cron is nog niet uitgevoerd!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Voor optimale prestaties is het belangrijk om de achtergrondtaken goed te configureren. Voor grotere installaties is \"Cron' de aanbevolen instelling. Bekijk de documentatie voor meer informatie.", "Execute one task with each page loaded" : "Bij laden van elke pagina één taak uitvoeren", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.", "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", @@ -245,6 +251,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Om dit te draaien, is de PHP posix extensie vereist. Bekijk {linkstart}PHP documentatie{linkend} voor meer informatie.", "Version" : "Versie", "Sharing" : "Delen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als beheerder kun je het deel-gedrag optimaliseren. Bekijk de documentatie voor meer informatie.", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Allow users to share via link" : "Sta gebruikers toe om te delen via een link", "Allow public uploads" : "Sta publieke uploads toe", @@ -263,6 +270,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Tonen disclaimer op de openbare link uploadpagina (alleen tonen als het bestandsoverzicht verborgen is).", "This text will be shown on the public link upload page when the file list is hidden." : "Deze tekst wordt getoond op de openbare link uploadpagina als het bestandsoverzicht is verborgen.", "Tips & tricks" : "Tips & trucs", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Er zijn veel mogelijkheden en instellingsschakelaars beschikbaar om je installatie te optimaliseren. Hier zijn wat aanwijzigen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wordt momenteel gebruikt als backend database. Voor grotere installaties adviseren we dat je omschakelt naar een andere database backend.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dit wordt vooral aanbevolen als de desktop client wordt gebruikt voor bestandssynchronisatie.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Om te migreren naar een andere database moet u de commandoregel tool gebruiken: 'occ db:convert-type', lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie ↗</a>.", @@ -322,7 +330,10 @@ "Address" : "Adres", "Your postal address" : "Je postadres", "Website" : "Website", + "It can take up to 24 hours before the account is displayed as verified." : "Het kan tot 24 uur duren voordat het account als geverifieerd wordt weergegeven.", + "Link https://…" : "Link https://…", "Twitter" : "Twitter", + "Twitter handle @…" : "Twitter naam @…", "You are member of the following groups:" : "U bent lid van de volgende groepen:", "Password" : "Wachtwoord", "Current password" : "Huidig wachtwoord", @@ -339,6 +350,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", "Last activity" : "Laatste activiteit", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier kun je individuele wachtwoorden voor apps genereren, zodat je geen wachtwoorden hoeft uit te geven. Je kunt ze ook weer individueel intrekken.", "Name" : "Naam", "App name" : "Appnaam", "Create new app password" : "Creëer een nieuw app wachtwoord", @@ -366,6 +378,7 @@ "Group name" : "Groepsnaam", "Everyone" : "Iedereen", "Admins" : "Beheerders", + "Disabled" : "Uitgeschakeld", "Default quota" : "Standaard quota", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Geef de opslagquotering op (bijv. \"512 MB\" of \"12 GB\")", "Other" : "Anders", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index c8ee932b071..898adf19178 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -4,10 +4,10 @@ OC.L10N.register( "{actor} changed your password" : "{actor} alterou sua senha", "You changed your password" : "Você alterou sua senha", "Your password was reset by an administrator" : "Sua senha foi redefinida pelo administrador", - "{actor} changed your email address" : "{actor} alterou seu email", - "You changed your email address" : "Você alterou seu email", - "Your email address was changed by an administrator" : "Seu email foi alterado pelo administrador", - "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sua <strong>senha</strong> ou <strong>email</strong> foram alterados", + "{actor} changed your email address" : "{actor} alterou seu e-mail", + "You changed your email address" : "Você alterou seu e-mail", + "Your email address was changed by an administrator" : "Seu e-mail foi alterado pelo administrador", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sua <strong>senha</strong> ou <strong>e-mail</strong> foram alterados", "Your apps" : "Seus aplicativos", "Enabled apps" : "Aplicativos habilitados", "Disabled apps" : "Aplicativos desabilitados", @@ -15,57 +15,57 @@ OC.L10N.register( "Wrong password" : "Senha incorreta", "Saved" : "Salvo", "No user supplied" : "Nenhum usuário fornecido", - "Unable to change password" : "Não é possível alterar a senha", + "Unable to change password" : "Não foi possível alterar a senha", "Authentication error" : "Erro de autenticação", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Por favor, forneça uma senha de recuperação do administrador, caso contrário todos os dados serão perdidos.", "Wrong admin recovery password. Please check the password and try again." : "Senha de recuperação do administrador incorreta. Por favor, verifique a senha e tente novamente.", - "Backend doesn't support password change, but the user's encryption key was updated." : "O backend não suporte alteração de senha mas a chave de criptografia do usuário foi alterada.", + "Backend doesn't support password change, but the user's encryption key was updated." : "A plataforma de serviço não suporta alteração de senha mas a chave de criptografia do usuário foi alterada.", "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicativos via loja de aplicativos ou Nuvem Compartilhada Federada", "Federated Cloud Sharing" : "Compartilhamento de Nuvem 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á usando uma versão %s desatualizada (%s). Por favor, atualize seu sistema operacional ou recursos como %s não funcionarão de forma confiável.", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)", "Migration Completed" : "Migração concluída", "Group already exists." : "O grupo já existe.", - "Unable to add group." : "Não é possível adicionar o grupo.", - "Unable to delete group." : "Não é possível excluir o grupo.", + "Unable to add group." : "Não foi possível adicionar o grupo.", + "Unable to delete group." : "Não foi possível excluir o grupo.", "Invalid SMTP password." : "Senha SMTP incorreta.", "Well done, %s!" : "Bom trabalho, %s!", - "If you received this email, the email configuration seems to be correct." : "Se você recebeu este email, é sinal que a configuração do email está correta.", - "Email setting test" : "Teste da configuração de email", - "Email could not be sent. Check your mail server log" : "O email não pôde ser enviado. Verifique o log do servidor de email", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o email. Por favor, revise suas configurações. (Erro: %s)", - "You need to set your user email before being able to send test emails." : "Você precisa configurar seu email de usuário antes de ser capaz de enviar emails de teste.", + "If you received this email, the email configuration seems to be correct." : "Se você recebeu este e-mail, é sinal que a configuração do e-mail está correta.", + "Email setting test" : "Teste da configuração de e-mail", + "Email could not be sent. Check your mail server log" : "O e-mail não pôde ser enviado. Verifique o log do servidor de e-mail", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações. (Erro: %s)", + "You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.", "Invalid request" : "Solicitação inválida", - "Invalid mail address" : "Endereço de email inválido", + "Invalid mail address" : "Endereço de e-mail inválido", "No valid group selected" : "Nenhum grupo válido foi selecionado", "A user with that name already exists." : "Um usuário com esse nome já existe.", - "To send a password link to the user an email address is required." : "Para envio da senha ao usuário é necessário um endereço de email.", - "Unable to create user." : "Não é possível criar usuário.", - "Unable to delete user." : "Não é possível excluir o usuário.", + "To send a password link to the user an email address is required." : "Para envio da senha ao usuário é necessário um endereço de e-mail.", + "Unable to create user." : "Não foi possível criar usuário.", + "Unable to delete user." : "Não foi possível excluir o usuário.", "Error while enabling user." : "Erro ao habilitar usuário.", "Error while disabling user." : "Erro ao desabilitar usuário.", "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "A fim de verificar sua conta no Twitter, poste isso no Twitter (por favor, certifique-se de postar sem quebras de linha):", "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "A fim de verificar seu site, coloque o seguinte conteúdo no raiz do site: '.well-known/CloudIdVerificationCode.txt' (por favor certifique-se que o texto completo esteja em uma linha):", "Settings saved" : "Configurações salvas", - "Unable to change full name" : "Não é possível alterar o nome completo", - "Unable to change email address" : "Não foi possível alterar o endereço de email", + "Unable to change full name" : "Não foi possível alterar o nome completo", + "Unable to change email address" : "Não foi possível alterar o endereço de e-mail", "Your full name has been changed." : "Seu nome completo foi alterado.", "Forbidden" : "Proibido", "Invalid user" : "Usuário inválido", - "Unable to change mail address" : "Não é possível alterar o endereço de email", - "Email saved" : "Email salvo", + "Unable to change mail address" : "Não foi possível alterar o endereço de e-mail", + "Email saved" : "E-mail salvo", "%1$s changed your password on %2$s." : "%1$s mudou sua senha em %2$s.", "Your password on %s was changed." : "Sua senha em %s foi alterada.", "Your password on %s was reset by an administrator." : "Sua senha em %s foi redefinida por um administrador.", "Password changed for %s" : "Senha alterada para %s", "If you did not request this, please contact an administrator." : "Se você não solicitou isso, por favor contacte o administrador.", "Password for %1$s changed on %2$s" : "Senha para %1$s alterada em %2$s", - "%1$s changed your email address on %2$s." : "%1$s alterou seu email em %2$s.", - "Your email address on %s was changed." : "Seu email em %s foi alterado.", - "Your email address on %s was changed by an administrator." : "Seu email em %s foi alterado pelo administrador.", - "Email address changed for %s" : "Email alterado para %s", - "The new email address is %s" : "O novo email é %s", - "Email address for %1$s changed on %2$s" : "Email para %1$s foi alterado em %2$s", + "%1$s changed your email address on %2$s." : "%1$s alterou seu e-mail em %2$s.", + "Your email address on %s was changed." : "Seu e-mail em %s foi alterado.", + "Your email address on %s was changed by an administrator." : "Seu e-mail em %s foi alterado pelo administrador.", + "Email address changed for %s" : "E-mail alterado para %s", + "The new email address is %s" : "O novo e-mail é %s", + "Email address for %1$s changed on %2$s" : "E-mail para %1$s foi alterado em %2$s", "Welcome aboard" : "Bem-vindo a bordo", "Welcome aboard %s" : "%s, bem-vindo a bordo", "You have now an %s account, you can add, protect, and share your data." : "Agora que você tem uma conta %s, pode adicionar, proteger e compartilhar seus dados.", @@ -83,7 +83,7 @@ OC.L10N.register( "Migration started …" : "Migração iniciada...", "Not saved" : "Não salvo", "Sending…" : "Enviando...", - "Email sent" : "Email enviado", + "Email sent" : "E-mail enviado", "Official" : "Oficial", "All" : "Todos", "Update to %s" : "Atualizado para %s", @@ -157,7 +157,7 @@ OC.L10N.register( "Good password" : "Boa senha", "Strong password" : "Senha forte", "Groups" : "Grupos", - "Unable to delete {objName}" : "Não é possível excluir {objName}", + "Unable to delete {objName}" : "Não foi possível excluir {objName}", "Error creating group: {message}" : "Erro criando o grupo: {message}", "A valid group name must be provided" : "Um nome de grupo válido deve ser fornecido", "deleted {groupName}" : "{groupName} excluído", @@ -165,19 +165,19 @@ OC.L10N.register( "never" : "nunca", "deleted {userName}" : "{userName} excluído", "No user found for <strong>{pattern}</strong>" : "Nenhum usuário encontrado para <strong>{pattern}</strong>", - "Unable to add user to group {group}" : "Não é possível adicionar usuário ao grupo {group}", - "Unable to remove user from group {group}" : "Não é possível excluir usuário do grupo {group}", + "Unable to add user to group {group}" : "Não foi possível adicionar usuário ao grupo {group}", + "Unable to remove user from group {group}" : "Não foi possível excluir usuário do grupo {group}", "Add group" : "Adicionar grupo", "Invalid quota value \"{val}\"" : "Valor inválido para a cota \"{val}\"", "no group" : "nenhum grupo", "Password successfully changed" : "Senha alterada com sucesso", "Changing the password will result in data loss, because data recovery is not available for this user" : "Alterar a senha irá resultar em perda de dados pois a recuperação de dados não está disponível para este usuário", - "Could not change the users email" : "Não foi possível alterar o email dos usuários", + "Could not change the users email" : "Não foi possível alterar o e-mail dos usuários", "Error while changing status of {user}" : "Erro ao mudar o status de {user}", "A valid username must be provided" : "Forneça um nome de usuário válido", "Error creating user: {message}" : "Erro criando o usuário: {message}", "A valid password must be provided" : "Forneça uma senha válida", - "A valid email must be provided" : "Um email válido deve ser fornecido", + "A valid email must be provided" : "Um e-mail válido deve ser fornecido", "__language_name__" : "Português Brasileiro", "Unlimited" : "Ilimitado", "Verifying" : "Verificando", @@ -191,13 +191,13 @@ OC.L10N.register( "NT LAN Manager" : "Gerenciador NT LAN", "SSL/TLS" : "SSL/TLS", "STARTTLS" : "STARTTLS", - "Email server" : "Servidor de email", + "Email server" : "Servidor de e-mail", "Open documentation" : "Abrir documentação", - "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar emails, assim como para redefinir a senha e notificações.", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar e-mails, assim como para redefinir a senha e notificações.", "Send mode" : "Modo de envio", "Encryption" : "Criptografia", "From address" : "Endereço \"From\"", - "mail" : "email", + "mail" : "e-mail", "Authentication method" : "Método de autenticação", "Authentication required" : "Autenticação é requerida", "Server address" : "Endereço do servidor", @@ -206,8 +206,8 @@ OC.L10N.register( "SMTP Username" : "Nome do Usuário SMTP", "SMTP Password" : "Senha SMTP", "Store credentials" : "Armazenar credenciais", - "Test email settings" : "Configurações do email de teste", - "Send email" : "Enviar email", + "Test email settings" : "Configurações do e-mail de teste", + "Send email" : "Enviar e-mail", "Server-side encryption" : "Criptografia do lado do servidor", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "A criptografia do lado do servidor torna possível criptografar arquivos que são carregados para este servidor. Isso vem com limitações como uma diminuição de desempenho, portanto, habilite isso apenas se necessário.", "Enable server-side encryption" : "Habilitar a criptografia do lado do servidor", @@ -273,7 +273,7 @@ OC.L10N.register( "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será mostrado na página de envio do link público quando a lista de arquivos está oculta.", "Tips & tricks" : "Dicas & Truques", "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Há muitos recursos e opções de configuração disponíveis para otimizar e usar essa instância. Aqui estão algumas indicações para obter mais informações.", - "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como backend de banco de dados. Para instalações maiores recomendamos que voce use um outro banco de dados", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como Plataforma de serviço de banco de dados. Para instalações maiores recomendamos que você use uma outra plataforma de serviço de banco de dados", "This is particularly recommended when using the desktop client for file synchronisation." : "Isso é particulamente recomendado quando se utiliza um cliente para sincronização.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados use a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.", "How to do backups" : "Como fazer backups", @@ -323,9 +323,9 @@ OC.L10N.register( "Choose as profile picture" : "Escolha como imagem de perfil", "Full name" : "Nome completo", "No display name set" : "Nenhum nome de exibição definido", - "Email" : "Email", - "Your email address" : "Seu endereço de email", - "No email address set" : "Nenhum endereço de email foi configurado", + "Email" : "E-mail", + "Your email address" : "Seu endereço de e-mail", + "No email address set" : "Nenhum endereço de e-mail foi configurado", "For password reset and notifications" : "Para redefinição de senha e notificações", "Phone number" : "Número de telefone", "Your phone number" : "Seu número de telefone", @@ -347,9 +347,9 @@ OC.L10N.register( "Desktop client" : "Cliente desktop", "Android app" : "Aplicativo Android", "iOS app" : "Aplicativo iOS", - "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se voce quiser ajudar o projeto, {contributeopen}junte-se ao desenvolvimento{linkclose} ou {contributeopen}divulgue nossos conceitos{linkclose}!", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se você quiser ajudar o projeto, {contributeopen}junte-se ao desenvolvimento{linkclose} ou {contributeopen}divulgue nossos conceitos{linkclose}!", "Show First Run Wizard again" : "Mostrar Assistente de Primeira Execução novamente", - "Web, desktop and mobile clients currently logged in to your account." : "Clientes Web, desktop e móvel que estão conectados à sua conta.", + "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, desktop e móvel que estão conectados à sua conta.", "Device" : "Dispositivo", "Last activity" : "Última atividade", "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui você pode gerar senhas individuais para aplicativos. Assim você não tem que dar sua senha. Você pode revogá-los individualmente também.", @@ -368,12 +368,12 @@ OC.L10N.register( "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Settings" : "Configurações", "Show storage location" : "Mostrar localização do armazenamento", - "Show user backend" : "Mostrar backend do usuário", + "Show user backend" : "Mostrar plataforma de serviço de usuário", "Show last login" : "Mostrar último login", - "Show email address" : "Mostrar o endereço de email", - "Send email to new user" : "Enviar um email para o novo usuário", - "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a senha de um novo usuário é deixada em branco, um email de ativação com um link para definir a senha é enviado.", - "E-Mail" : "Email", + "Show email address" : "Mostrar o endereço de e-mail", + "Send email to new user" : "Enviar um e-mail para o novo usuário", + "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a senha de um novo usuário é deixada em branco, um e-mail de ativação com um link para definir a senha é enviado.", + "E-Mail" : "E-mail", "Create" : "Criar", "Admin Recovery Password" : "Recuperação da Senha do Administrador", "Enter the recovery password in order to recover the users files during password change" : "Digite a senha de recuperação para recuperar os arquivos dos usuários durante a mudança de senha.", @@ -387,17 +387,17 @@ OC.L10N.register( "Group admin for" : "Grupo administrativo para", "Quota" : "Cota", "Storage location" : "Local do armazenamento", - "User backend" : "Backend do usuário", + "User backend" : "Plataforma de serviço de usuário", "Last login" : "Último acesso", "change full name" : "alterar nome completo", "set new password" : "definir uma senha nova", - "change email address" : "Alterar o endereço de email", + "change email address" : "Alterar o endereço de e-mail", "Default" : "Padrão", "Enabled" : "Habilitado", "Not enabled" : "Desabilitado", "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma senha de recuperação de administrador, caso contrário todos os dados do usuário serão perdidos", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend não suporta alteração de senha, mas a chave de criptografia do usuário foi atualizada.", - "test email settings" : "testar configurações de email", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "A plataforma de serviço não suporta alteração de senha, mas a chave de criptografia do usuário foi atualizada.", + "test email settings" : "testar configurações de e-mail", "Admins can't remove themself from the admin group" : "Administradores não podem remover a si do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar o usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível excluir o usuário do grupo %s", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 56f90ece24c..69c654cb48e 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -2,10 +2,10 @@ "{actor} changed your password" : "{actor} alterou sua senha", "You changed your password" : "Você alterou sua senha", "Your password was reset by an administrator" : "Sua senha foi redefinida pelo administrador", - "{actor} changed your email address" : "{actor} alterou seu email", - "You changed your email address" : "Você alterou seu email", - "Your email address was changed by an administrator" : "Seu email foi alterado pelo administrador", - "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sua <strong>senha</strong> ou <strong>email</strong> foram alterados", + "{actor} changed your email address" : "{actor} alterou seu e-mail", + "You changed your email address" : "Você alterou seu e-mail", + "Your email address was changed by an administrator" : "Seu e-mail foi alterado pelo administrador", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sua <strong>senha</strong> ou <strong>e-mail</strong> foram alterados", "Your apps" : "Seus aplicativos", "Enabled apps" : "Aplicativos habilitados", "Disabled apps" : "Aplicativos desabilitados", @@ -13,57 +13,57 @@ "Wrong password" : "Senha incorreta", "Saved" : "Salvo", "No user supplied" : "Nenhum usuário fornecido", - "Unable to change password" : "Não é possível alterar a senha", + "Unable to change password" : "Não foi possível alterar a senha", "Authentication error" : "Erro de autenticação", "Please provide an admin recovery password; otherwise, all user data will be lost." : "Por favor, forneça uma senha de recuperação do administrador, caso contrário todos os dados serão perdidos.", "Wrong admin recovery password. Please check the password and try again." : "Senha de recuperação do administrador incorreta. Por favor, verifique a senha e tente novamente.", - "Backend doesn't support password change, but the user's encryption key was updated." : "O backend não suporte alteração de senha mas a chave de criptografia do usuário foi alterada.", + "Backend doesn't support password change, but the user's encryption key was updated." : "A plataforma de serviço não suporta alteração de senha mas a chave de criptografia do usuário foi alterada.", "installing and updating apps via the app store or Federated Cloud Sharing" : "instalando e atualizando aplicativos via loja de aplicativos ou Nuvem Compartilhada Federada", "Federated Cloud Sharing" : "Compartilhamento de Nuvem 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á usando uma versão %s desatualizada (%s). Por favor, atualize seu sistema operacional ou recursos como %s não funcionarão de forma confiável.", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)", "Migration Completed" : "Migração concluída", "Group already exists." : "O grupo já existe.", - "Unable to add group." : "Não é possível adicionar o grupo.", - "Unable to delete group." : "Não é possível excluir o grupo.", + "Unable to add group." : "Não foi possível adicionar o grupo.", + "Unable to delete group." : "Não foi possível excluir o grupo.", "Invalid SMTP password." : "Senha SMTP incorreta.", "Well done, %s!" : "Bom trabalho, %s!", - "If you received this email, the email configuration seems to be correct." : "Se você recebeu este email, é sinal que a configuração do email está correta.", - "Email setting test" : "Teste da configuração de email", - "Email could not be sent. Check your mail server log" : "O email não pôde ser enviado. Verifique o log do servidor de email", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o email. Por favor, revise suas configurações. (Erro: %s)", - "You need to set your user email before being able to send test emails." : "Você precisa configurar seu email de usuário antes de ser capaz de enviar emails de teste.", + "If you received this email, the email configuration seems to be correct." : "Se você recebeu este e-mail, é sinal que a configuração do e-mail está correta.", + "Email setting test" : "Teste da configuração de e-mail", + "Email could not be sent. Check your mail server log" : "O e-mail não pôde ser enviado. Verifique o log do servidor de e-mail", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o e-mail. Por favor, revise suas configurações. (Erro: %s)", + "You need to set your user email before being able to send test emails." : "Você precisa configurar seu e-mail de usuário antes de ser capaz de enviar e-mails de teste.", "Invalid request" : "Solicitação inválida", - "Invalid mail address" : "Endereço de email inválido", + "Invalid mail address" : "Endereço de e-mail inválido", "No valid group selected" : "Nenhum grupo válido foi selecionado", "A user with that name already exists." : "Um usuário com esse nome já existe.", - "To send a password link to the user an email address is required." : "Para envio da senha ao usuário é necessário um endereço de email.", - "Unable to create user." : "Não é possível criar usuário.", - "Unable to delete user." : "Não é possível excluir o usuário.", + "To send a password link to the user an email address is required." : "Para envio da senha ao usuário é necessário um endereço de e-mail.", + "Unable to create user." : "Não foi possível criar usuário.", + "Unable to delete user." : "Não foi possível excluir o usuário.", "Error while enabling user." : "Erro ao habilitar usuário.", "Error while disabling user." : "Erro ao desabilitar usuário.", "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "A fim de verificar sua conta no Twitter, poste isso no Twitter (por favor, certifique-se de postar sem quebras de linha):", "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "A fim de verificar seu site, coloque o seguinte conteúdo no raiz do site: '.well-known/CloudIdVerificationCode.txt' (por favor certifique-se que o texto completo esteja em uma linha):", "Settings saved" : "Configurações salvas", - "Unable to change full name" : "Não é possível alterar o nome completo", - "Unable to change email address" : "Não foi possível alterar o endereço de email", + "Unable to change full name" : "Não foi possível alterar o nome completo", + "Unable to change email address" : "Não foi possível alterar o endereço de e-mail", "Your full name has been changed." : "Seu nome completo foi alterado.", "Forbidden" : "Proibido", "Invalid user" : "Usuário inválido", - "Unable to change mail address" : "Não é possível alterar o endereço de email", - "Email saved" : "Email salvo", + "Unable to change mail address" : "Não foi possível alterar o endereço de e-mail", + "Email saved" : "E-mail salvo", "%1$s changed your password on %2$s." : "%1$s mudou sua senha em %2$s.", "Your password on %s was changed." : "Sua senha em %s foi alterada.", "Your password on %s was reset by an administrator." : "Sua senha em %s foi redefinida por um administrador.", "Password changed for %s" : "Senha alterada para %s", "If you did not request this, please contact an administrator." : "Se você não solicitou isso, por favor contacte o administrador.", "Password for %1$s changed on %2$s" : "Senha para %1$s alterada em %2$s", - "%1$s changed your email address on %2$s." : "%1$s alterou seu email em %2$s.", - "Your email address on %s was changed." : "Seu email em %s foi alterado.", - "Your email address on %s was changed by an administrator." : "Seu email em %s foi alterado pelo administrador.", - "Email address changed for %s" : "Email alterado para %s", - "The new email address is %s" : "O novo email é %s", - "Email address for %1$s changed on %2$s" : "Email para %1$s foi alterado em %2$s", + "%1$s changed your email address on %2$s." : "%1$s alterou seu e-mail em %2$s.", + "Your email address on %s was changed." : "Seu e-mail em %s foi alterado.", + "Your email address on %s was changed by an administrator." : "Seu e-mail em %s foi alterado pelo administrador.", + "Email address changed for %s" : "E-mail alterado para %s", + "The new email address is %s" : "O novo e-mail é %s", + "Email address for %1$s changed on %2$s" : "E-mail para %1$s foi alterado em %2$s", "Welcome aboard" : "Bem-vindo a bordo", "Welcome aboard %s" : "%s, bem-vindo a bordo", "You have now an %s account, you can add, protect, and share your data." : "Agora que você tem uma conta %s, pode adicionar, proteger e compartilhar seus dados.", @@ -81,7 +81,7 @@ "Migration started …" : "Migração iniciada...", "Not saved" : "Não salvo", "Sending…" : "Enviando...", - "Email sent" : "Email enviado", + "Email sent" : "E-mail enviado", "Official" : "Oficial", "All" : "Todos", "Update to %s" : "Atualizado para %s", @@ -155,7 +155,7 @@ "Good password" : "Boa senha", "Strong password" : "Senha forte", "Groups" : "Grupos", - "Unable to delete {objName}" : "Não é possível excluir {objName}", + "Unable to delete {objName}" : "Não foi possível excluir {objName}", "Error creating group: {message}" : "Erro criando o grupo: {message}", "A valid group name must be provided" : "Um nome de grupo válido deve ser fornecido", "deleted {groupName}" : "{groupName} excluído", @@ -163,19 +163,19 @@ "never" : "nunca", "deleted {userName}" : "{userName} excluído", "No user found for <strong>{pattern}</strong>" : "Nenhum usuário encontrado para <strong>{pattern}</strong>", - "Unable to add user to group {group}" : "Não é possível adicionar usuário ao grupo {group}", - "Unable to remove user from group {group}" : "Não é possível excluir usuário do grupo {group}", + "Unable to add user to group {group}" : "Não foi possível adicionar usuário ao grupo {group}", + "Unable to remove user from group {group}" : "Não foi possível excluir usuário do grupo {group}", "Add group" : "Adicionar grupo", "Invalid quota value \"{val}\"" : "Valor inválido para a cota \"{val}\"", "no group" : "nenhum grupo", "Password successfully changed" : "Senha alterada com sucesso", "Changing the password will result in data loss, because data recovery is not available for this user" : "Alterar a senha irá resultar em perda de dados pois a recuperação de dados não está disponível para este usuário", - "Could not change the users email" : "Não foi possível alterar o email dos usuários", + "Could not change the users email" : "Não foi possível alterar o e-mail dos usuários", "Error while changing status of {user}" : "Erro ao mudar o status de {user}", "A valid username must be provided" : "Forneça um nome de usuário válido", "Error creating user: {message}" : "Erro criando o usuário: {message}", "A valid password must be provided" : "Forneça uma senha válida", - "A valid email must be provided" : "Um email válido deve ser fornecido", + "A valid email must be provided" : "Um e-mail válido deve ser fornecido", "__language_name__" : "Português Brasileiro", "Unlimited" : "Ilimitado", "Verifying" : "Verificando", @@ -189,13 +189,13 @@ "NT LAN Manager" : "Gerenciador NT LAN", "SSL/TLS" : "SSL/TLS", "STARTTLS" : "STARTTLS", - "Email server" : "Servidor de email", + "Email server" : "Servidor de e-mail", "Open documentation" : "Abrir documentação", - "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar emails, assim como para redefinir a senha e notificações.", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar e-mails, assim como para redefinir a senha e notificações.", "Send mode" : "Modo de envio", "Encryption" : "Criptografia", "From address" : "Endereço \"From\"", - "mail" : "email", + "mail" : "e-mail", "Authentication method" : "Método de autenticação", "Authentication required" : "Autenticação é requerida", "Server address" : "Endereço do servidor", @@ -204,8 +204,8 @@ "SMTP Username" : "Nome do Usuário SMTP", "SMTP Password" : "Senha SMTP", "Store credentials" : "Armazenar credenciais", - "Test email settings" : "Configurações do email de teste", - "Send email" : "Enviar email", + "Test email settings" : "Configurações do e-mail de teste", + "Send email" : "Enviar e-mail", "Server-side encryption" : "Criptografia do lado do servidor", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "A criptografia do lado do servidor torna possível criptografar arquivos que são carregados para este servidor. Isso vem com limitações como uma diminuição de desempenho, portanto, habilite isso apenas se necessário.", "Enable server-side encryption" : "Habilitar a criptografia do lado do servidor", @@ -271,7 +271,7 @@ "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será mostrado na página de envio do link público quando a lista de arquivos está oculta.", "Tips & tricks" : "Dicas & Truques", "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Há muitos recursos e opções de configuração disponíveis para otimizar e usar essa instância. Aqui estão algumas indicações para obter mais informações.", - "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como backend de banco de dados. Para instalações maiores recomendamos que voce use um outro banco de dados", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como Plataforma de serviço de banco de dados. Para instalações maiores recomendamos que você use uma outra plataforma de serviço de banco de dados", "This is particularly recommended when using the desktop client for file synchronisation." : "Isso é particulamente recomendado quando se utiliza um cliente para sincronização.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados use a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.", "How to do backups" : "Como fazer backups", @@ -321,9 +321,9 @@ "Choose as profile picture" : "Escolha como imagem de perfil", "Full name" : "Nome completo", "No display name set" : "Nenhum nome de exibição definido", - "Email" : "Email", - "Your email address" : "Seu endereço de email", - "No email address set" : "Nenhum endereço de email foi configurado", + "Email" : "E-mail", + "Your email address" : "Seu endereço de e-mail", + "No email address set" : "Nenhum endereço de e-mail foi configurado", "For password reset and notifications" : "Para redefinição de senha e notificações", "Phone number" : "Número de telefone", "Your phone number" : "Seu número de telefone", @@ -345,9 +345,9 @@ "Desktop client" : "Cliente desktop", "Android app" : "Aplicativo Android", "iOS app" : "Aplicativo iOS", - "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se voce quiser ajudar o projeto, {contributeopen}junte-se ao desenvolvimento{linkclose} ou {contributeopen}divulgue nossos conceitos{linkclose}!", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Se você quiser ajudar o projeto, {contributeopen}junte-se ao desenvolvimento{linkclose} ou {contributeopen}divulgue nossos conceitos{linkclose}!", "Show First Run Wizard again" : "Mostrar Assistente de Primeira Execução novamente", - "Web, desktop and mobile clients currently logged in to your account." : "Clientes Web, desktop e móvel que estão conectados à sua conta.", + "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, desktop e móvel que estão conectados à sua conta.", "Device" : "Dispositivo", "Last activity" : "Última atividade", "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui você pode gerar senhas individuais para aplicativos. Assim você não tem que dar sua senha. Você pode revogá-los individualmente também.", @@ -366,12 +366,12 @@ "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Settings" : "Configurações", "Show storage location" : "Mostrar localização do armazenamento", - "Show user backend" : "Mostrar backend do usuário", + "Show user backend" : "Mostrar plataforma de serviço de usuário", "Show last login" : "Mostrar último login", - "Show email address" : "Mostrar o endereço de email", - "Send email to new user" : "Enviar um email para o novo usuário", - "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a senha de um novo usuário é deixada em branco, um email de ativação com um link para definir a senha é enviado.", - "E-Mail" : "Email", + "Show email address" : "Mostrar o endereço de e-mail", + "Send email to new user" : "Enviar um e-mail para o novo usuário", + "When the password of a new user is left empty, an activation email with a link to set the password is sent." : "Quando a senha de um novo usuário é deixada em branco, um e-mail de ativação com um link para definir a senha é enviado.", + "E-Mail" : "E-mail", "Create" : "Criar", "Admin Recovery Password" : "Recuperação da Senha do Administrador", "Enter the recovery password in order to recover the users files during password change" : "Digite a senha de recuperação para recuperar os arquivos dos usuários durante a mudança de senha.", @@ -385,17 +385,17 @@ "Group admin for" : "Grupo administrativo para", "Quota" : "Cota", "Storage location" : "Local do armazenamento", - "User backend" : "Backend do usuário", + "User backend" : "Plataforma de serviço de usuário", "Last login" : "Último acesso", "change full name" : "alterar nome completo", "set new password" : "definir uma senha nova", - "change email address" : "Alterar o endereço de email", + "change email address" : "Alterar o endereço de e-mail", "Default" : "Padrão", "Enabled" : "Habilitado", "Not enabled" : "Desabilitado", "Please provide an admin recovery password, otherwise all user data will be lost" : "Por favor, forneça uma senha de recuperação de administrador, caso contrário todos os dados do usuário serão perdidos", - "Backend doesn't support password change, but the user's encryption key was successfully updated." : "Backend não suporta alteração de senha, mas a chave de criptografia do usuário foi atualizada.", - "test email settings" : "testar configurações de email", + "Backend doesn't support password change, but the user's encryption key was successfully updated." : "A plataforma de serviço não suporta alteração de senha, mas a chave de criptografia do usuário foi atualizada.", + "test email settings" : "testar configurações de e-mail", "Admins can't remove themself from the admin group" : "Administradores não podem remover a si do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar o usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível excluir o usuário do grupo %s", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index d9f630de32e..4ab1c924b84 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Ваши приложения", "Enabled apps" : "Активные приложения", "Disabled apps" : "Отключённые приложения", + "App bundles" : "Пакеты приложений", "Wrong password" : "Неправильный пароль", "Saved" : "Сохранено", "No user supplied" : "Пользователь не задан", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Отлично, %s!", "If you received this email, the email configuration seems to be correct." : "Если вы получили это сообщение, значит электронная почта настроена правильно.", "Email setting test" : "Проверка настроек электронной почты", + "Email could not be sent. Check your mail server log" : "Не удалось отправить email. Проверьте журнал почтового сервера", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки письма произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)", "You need to set your user email before being able to send test emails." : "Вы должны настроить ваш собственный адрес электронной почты прежде чем отправлять тестовые сообщения.", "Invalid request" : "Неправильный запрос", @@ -40,6 +42,10 @@ OC.L10N.register( "To send a password link to the user an email address is required." : "Для отправки пользователю запароленный ссылки требуется указать адрес эл.почты.", "Unable to create user." : "Невозможно создать пользователя.", "Unable to delete user." : "Невозможно удалить пользователя.", + "Error while enabling user." : "Ошибка разблокировки пользователя ", + "Error while disabling user." : "Ошибка блокировки пользователя", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "Для подтверждения владения аккаунтом Twitter, опубликуйте следующий твит (убедитесь, что разместили его без разрыва стироки):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Для подтверждения владения сайтом поместите в корневом каталоге по пути «.well-known/CloudIdVerificationCode.txt» следующее содержимое (весь текст в одну строку): ", "Settings saved" : "Настройки сохранены", "Unable to change full name" : "Невозможно изменить полное имя", "Unable to change email address" : "Невозможно изменить адрес электронной почты", @@ -107,6 +113,7 @@ OC.L10N.register( "Approved" : "Подтвержденное", "Experimental" : "Экспериментальное", "No apps found for {query}" : "Приложения не найдены по {query}", + "Enable all" : "Включить все", "Allow filesystem access" : "Разрешить доступ к файловой системе", "Disconnect" : "Отключить", "Revoke" : "Отменить", @@ -141,6 +148,8 @@ OC.L10N.register( "Visible to local users and to trusted servers" : "Виден локальным пользователям и доверенным серверам", "Public" : "Открытый", "Will be synced to a global and public address book" : "Будет синхронизирован с глобальной и открытой адресной книгой", + "Verify" : "Проверить", + "Verifying …" : "Производится проверка…", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", "Weak password" : "Слабый пароль", @@ -164,12 +173,14 @@ OC.L10N.register( "Password successfully changed" : "Пароль успешно изменен.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", "Could not change the users email" : "Невозможно изменить электронный адрес пользователя", + "Error while changing status of {user}" : "Ошибка изменения статуса пользователя {user}", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", "A valid email must be provided" : "Должен быть указан корректный адрес электронной почты", "__language_name__" : "Русский", "Unlimited" : "Неограничено", + "Verifying" : "Производится проверка", "Personal info" : "Личная информация", "Sessions" : "Сессии", "App passwords" : "Пароль приложения", @@ -182,6 +193,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "Почтовый сервер", "Open documentation" : "Открыть документацию", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Важно предоставить этому серверу возможность отправлять электронные письма, например, для сброса пароля и уведомлений.", "Send mode" : "Способ отправки", "Encryption" : "Шифрование", "From address" : "Адрес отправителя", @@ -197,6 +209,7 @@ OC.L10N.register( "Test email settings" : "Проверка настроек email", "Send email" : "Отправить email", "Server-side encryption" : "Шифрование на стороне сервера", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Шифрование на стороне сервера позволяет шифровать файлы, которые загружаются на этот сервер. Это связано с ограничениями, такими как снижение производительности, поэтому включите его только в случае необходимости.", "Enable server-side encryption" : "Включить шифрование на стороне сервера", "Please read carefully before activating server-side encryption: " : "Пожалуйста прочтите внимательно прежде чем включать шифрование на стороне сервера:", "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." : "Когда вы включите шифрование, все файлы, загруженные с этого момента на сервер, будут храниться в зашифрованном виде. Отключить шифрование в более позднее время возможно только в случае, если выбранный модуль шифрования поддерживает эту функцию, и все дополнительные условия соблюдены (например настроен ключ восстановления).", @@ -211,6 +224,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (ownCloud <= 8.0) в новый.", "Start migration" : "Запустить миграцию", "Security & setup warnings" : "Предупреждения безопасности и установки", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Для обеспечения безопасности и производительности важно, чтобы всё было настроено правильно. Чтобы помочь вам в этом, мы проводим некоторые автоматические проверки. Дополнительную информацию см. В разделе «Советы и рекомендации» и в документации.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP был установлен неверно. Запрос getenv(\"PATH\") возвращает пустые результаты.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации по установке ↗</a> для получения информации по настройке php на вашем сервере, особенно это касается 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." : "Конфигурационный файл в режиме только для чтения. В связи с этим некоторые настройки веб-интерфейса невозможно изменить. Учтите, что для установки обновлений, вам потребуется самостоятельно разрешить запись в конфигурационный файл.", @@ -231,6 +245,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Последнее выполненное задание планировщика: %s.", "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное задание планировщика: %s. Похоже, что-то не в порядке.", "Cron was not executed yet!" : "Задачи cron ещё не запускались!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Для оптимальной производительности важно правильно настроить выполнение задач в фоновом режиме. Для больших экземпляров рекомендуется использовать параметр «Cron». Дополнительную информацию см. в документации.", "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", @@ -238,6 +253,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска вам необходимо расширение PHP posix. Для более подробной информации смотрите {linkstart}PHP документацию{linkend}", "Version" : "Версия", "Sharing" : "Общий доступ", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Вы, как администратор, можете тонко настроить поведение механизма предоставления общего доступа. Дополнительную информацию см. в документации.", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", "Allow users to share via link" : "Разрешить пользователям публикации через ссылки", "Allow public uploads" : "Разрешить открытые/публичные загрузки", @@ -256,6 +272,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Показать текст об отказе на странице загрузки публичной ссылки (Показывать только когда список файлов скрыт)", "This text will be shown on the public link upload page when the file list is hidden." : "Этот текст будет показан при переходе по публичной ссылке на загрузку при скрытом списке файлов", "Tips & tricks" : "Советы и трюки", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Для оптимальной настройки и использования доступно множество возможностей и параметров конфигурации. Вот несколько указателей для получения дополнительной информации.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.", "This is particularly recommended when using the desktop client for file synchronisation." : "Рекомендуется при синхронизации файлов с использованием клиента для ПК.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Для миграции на другую базу данных используйте команду: 'occ db:convert-type' или обратитесь к a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗</a>.", @@ -315,7 +332,10 @@ OC.L10N.register( "Address" : "Адрес", "Your postal address" : "Ваш почтовый адрес", "Website" : "Сайт", + "It can take up to 24 hours before the account is displayed as verified." : "До момента подтверждения аккаунта может пройти до 24 часов.", + "Link https://…" : "Ссылка https://…", "Twitter" : "Twitter", + "Twitter handle @…" : "Имя в Twitter @…", "You are member of the following groups:" : "Вы являетесь членом следующих групп:", "Password" : "Пароль", "Current password" : "Текущий пароль", @@ -332,6 +352,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", "Last activity" : "Последние действия", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Тут можно для каждого из приложений создать индивидуальные пароли, поэтому не требуется передавать ваш пароль. Такие пароли могут также отзываться по отдельности.", "Name" : "Название", "App name" : "Название приложения", "Create new app password" : "Создать новый пароль для приложения", @@ -340,7 +361,10 @@ OC.L10N.register( "Username" : "Имя пользователя", "Done" : "Выполнено", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Следите за нашими новостями в Google+!", "Like our facebook page!" : "Посмотрите нашу страницу на facebook!", + "Follow us on Twitter!" : "Следите за нашими новостями в Twitter!", + "Check out our blog!" : "Просмотрите наш блог!", "Subscribe to our newsletter!" : "Подписывайтесь на нашу новостную рассылку!", "Settings" : "Настройки", "Show storage location" : "Показать местонахождение хранилища", @@ -356,6 +380,7 @@ OC.L10N.register( "Group name" : "Название группы", "Everyone" : "Все", "Admins" : "Администраторы", + "Disabled" : "Отключено", "Default quota" : "Квота по умолчанию", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Пожалуйста, введите квоту на хранилище (например: \"512 MB\" или \"12 GB\")", "Other" : "Другая", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index ab2a70678ca..7d70b23d785 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -9,6 +9,7 @@ "Your apps" : "Ваши приложения", "Enabled apps" : "Активные приложения", "Disabled apps" : "Отключённые приложения", + "App bundles" : "Пакеты приложений", "Wrong password" : "Неправильный пароль", "Saved" : "Сохранено", "No user supplied" : "Пользователь не задан", @@ -29,6 +30,7 @@ "Well done, %s!" : "Отлично, %s!", "If you received this email, the email configuration seems to be correct." : "Если вы получили это сообщение, значит электронная почта настроена правильно.", "Email setting test" : "Проверка настроек электронной почты", + "Email could not be sent. Check your mail server log" : "Не удалось отправить email. Проверьте журнал почтового сервера", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Во время отправки письма произошла ошибка. Пожалуйста проверьте настройки. (Ошибка: %s)", "You need to set your user email before being able to send test emails." : "Вы должны настроить ваш собственный адрес электронной почты прежде чем отправлять тестовые сообщения.", "Invalid request" : "Неправильный запрос", @@ -38,6 +40,10 @@ "To send a password link to the user an email address is required." : "Для отправки пользователю запароленный ссылки требуется указать адрес эл.почты.", "Unable to create user." : "Невозможно создать пользователя.", "Unable to delete user." : "Невозможно удалить пользователя.", + "Error while enabling user." : "Ошибка разблокировки пользователя ", + "Error while disabling user." : "Ошибка блокировки пользователя", + "In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):" : "Для подтверждения владения аккаунтом Twitter, опубликуйте следующий твит (убедитесь, что разместили его без разрыва стироки):", + "In order to verify your Website store following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Для подтверждения владения сайтом поместите в корневом каталоге по пути «.well-known/CloudIdVerificationCode.txt» следующее содержимое (весь текст в одну строку): ", "Settings saved" : "Настройки сохранены", "Unable to change full name" : "Невозможно изменить полное имя", "Unable to change email address" : "Невозможно изменить адрес электронной почты", @@ -105,6 +111,7 @@ "Approved" : "Подтвержденное", "Experimental" : "Экспериментальное", "No apps found for {query}" : "Приложения не найдены по {query}", + "Enable all" : "Включить все", "Allow filesystem access" : "Разрешить доступ к файловой системе", "Disconnect" : "Отключить", "Revoke" : "Отменить", @@ -139,6 +146,8 @@ "Visible to local users and to trusted servers" : "Виден локальным пользователям и доверенным серверам", "Public" : "Открытый", "Will be synced to a global and public address book" : "Будет синхронизирован с глобальной и открытой адресной книгой", + "Verify" : "Проверить", + "Verifying …" : "Производится проверка…", "Select a profile picture" : "Выберите аватар", "Very weak password" : "Очень слабый пароль", "Weak password" : "Слабый пароль", @@ -162,12 +171,14 @@ "Password successfully changed" : "Пароль успешно изменен.", "Changing the password will result in data loss, because data recovery is not available for this user" : "Изменение пароля приведёт к потере данных, так как восстановление данных не доступно для этого пользователя", "Could not change the users email" : "Невозможно изменить электронный адрес пользователя", + "Error while changing status of {user}" : "Ошибка изменения статуса пользователя {user}", "A valid username must be provided" : "Укажите правильное имя пользователя", "Error creating user: {message}" : "Ошибка создания пользователя: {message}", "A valid password must be provided" : "Должен быть указан правильный пароль", "A valid email must be provided" : "Должен быть указан корректный адрес электронной почты", "__language_name__" : "Русский", "Unlimited" : "Неограничено", + "Verifying" : "Производится проверка", "Personal info" : "Личная информация", "Sessions" : "Сессии", "App passwords" : "Пароль приложения", @@ -180,6 +191,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "Почтовый сервер", "Open documentation" : "Открыть документацию", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Важно предоставить этому серверу возможность отправлять электронные письма, например, для сброса пароля и уведомлений.", "Send mode" : "Способ отправки", "Encryption" : "Шифрование", "From address" : "Адрес отправителя", @@ -195,6 +207,7 @@ "Test email settings" : "Проверка настроек email", "Send email" : "Отправить email", "Server-side encryption" : "Шифрование на стороне сервера", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Шифрование на стороне сервера позволяет шифровать файлы, которые загружаются на этот сервер. Это связано с ограничениями, такими как снижение производительности, поэтому включите его только в случае необходимости.", "Enable server-side encryption" : "Включить шифрование на стороне сервера", "Please read carefully before activating server-side encryption: " : "Пожалуйста прочтите внимательно прежде чем включать шифрование на стороне сервера:", "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." : "Когда вы включите шифрование, все файлы, загруженные с этого момента на сервер, будут храниться в зашифрованном виде. Отключить шифрование в более позднее время возможно только в случае, если выбранный модуль шифрования поддерживает эту функцию, и все дополнительные условия соблюдены (например настроен ключ восстановления).", @@ -209,6 +222,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Вам необходимо произвести конвертацию ключей шифрования из старого формата (ownCloud <= 8.0) в новый.", "Start migration" : "Запустить миграцию", "Security & setup warnings" : "Предупреждения безопасности и установки", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Для обеспечения безопасности и производительности важно, чтобы всё было настроено правильно. Чтобы помочь вам в этом, мы проводим некоторые автоматические проверки. Дополнительную информацию см. В разделе «Советы и рекомендации» и в документации.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP был установлен неверно. Запрос getenv(\"PATH\") возвращает пустые результаты.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Пожалуйста обратитесь к <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации по установке ↗</a> для получения информации по настройке php на вашем сервере, особенно это касается 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." : "Конфигурационный файл в режиме только для чтения. В связи с этим некоторые настройки веб-интерфейса невозможно изменить. Учтите, что для установки обновлений, вам потребуется самостоятельно разрешить запись в конфигурационный файл.", @@ -229,6 +243,7 @@ "Last cron job execution: %s." : "Последнее выполненное задание планировщика: %s.", "Last cron job execution: %s. Something seems wrong." : "Последнее выполненное задание планировщика: %s. Похоже, что-то не в порядке.", "Cron was not executed yet!" : "Задачи cron ещё не запускались!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Для оптимальной производительности важно правильно настроить выполнение задач в фоновом режиме. Для больших экземпляров рекомендуется использовать параметр «Cron». Дополнительную информацию см. в документации.", "Execute one task with each page loaded" : "Выполнять одно задание с каждой загруженной страницей", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php зарегистрирован в webcron и будет вызываться каждые 15 минут по http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Использовать системный cron для вызова cron.php каждые 15 минут.", @@ -236,6 +251,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Для запуска вам необходимо расширение PHP posix. Для более подробной информации смотрите {linkstart}PHP документацию{linkend}", "Version" : "Версия", "Sharing" : "Общий доступ", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Вы, как администратор, можете тонко настроить поведение механизма предоставления общего доступа. Дополнительную информацию см. в документации.", "Allow apps to use the Share API" : "Позволить приложениям использовать API общего доступа", "Allow users to share via link" : "Разрешить пользователям публикации через ссылки", "Allow public uploads" : "Разрешить открытые/публичные загрузки", @@ -254,6 +270,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Показать текст об отказе на странице загрузки публичной ссылки (Показывать только когда список файлов скрыт)", "This text will be shown on the public link upload page when the file list is hidden." : "Этот текст будет показан при переходе по публичной ссылке на загрузку при скрытом списке файлов", "Tips & tricks" : "Советы и трюки", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Для оптимальной настройки и использования доступно множество возможностей и параметров конфигурации. Вот несколько указателей для получения дополнительной информации.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "В качестве базы данных используется SQLite. Для больших установок мы рекомендуем переключиться на другую серверную базу данных.", "This is particularly recommended when using the desktop client for file synchronisation." : "Рекомендуется при синхронизации файлов с использованием клиента для ПК.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Для миграции на другую базу данных используйте команду: 'occ db:convert-type' или обратитесь к a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">документации ↗</a>.", @@ -313,7 +330,10 @@ "Address" : "Адрес", "Your postal address" : "Ваш почтовый адрес", "Website" : "Сайт", + "It can take up to 24 hours before the account is displayed as verified." : "До момента подтверждения аккаунта может пройти до 24 часов.", + "Link https://…" : "Ссылка https://…", "Twitter" : "Twitter", + "Twitter handle @…" : "Имя в Twitter @…", "You are member of the following groups:" : "Вы являетесь членом следующих групп:", "Password" : "Пароль", "Current password" : "Текущий пароль", @@ -330,6 +350,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", "Last activity" : "Последние действия", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Тут можно для каждого из приложений создать индивидуальные пароли, поэтому не требуется передавать ваш пароль. Такие пароли могут также отзываться по отдельности.", "Name" : "Название", "App name" : "Название приложения", "Create new app password" : "Создать новый пароль для приложения", @@ -338,7 +359,10 @@ "Username" : "Имя пользователя", "Done" : "Выполнено", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Разработано {communityopen}сообществом Nextcloud{linkclose}, {githubopen}исходный код{linkclose} лицензируется в соответствии с {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Следите за нашими новостями в Google+!", "Like our facebook page!" : "Посмотрите нашу страницу на facebook!", + "Follow us on Twitter!" : "Следите за нашими новостями в Twitter!", + "Check out our blog!" : "Просмотрите наш блог!", "Subscribe to our newsletter!" : "Подписывайтесь на нашу новостную рассылку!", "Settings" : "Настройки", "Show storage location" : "Показать местонахождение хранилища", @@ -354,6 +378,7 @@ "Group name" : "Название группы", "Everyone" : "Все", "Admins" : "Администраторы", + "Disabled" : "Отключено", "Default quota" : "Квота по умолчанию", "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")" : "Пожалуйста, введите квоту на хранилище (например: \"512 MB\" или \"12 GB\")", "Other" : "Другая", diff --git a/tests/Core/Controller/ClientFlowLoginControllerTest.php b/tests/Core/Controller/ClientFlowLoginControllerTest.php index 7c525b53210..7a98e5c26c6 100644 --- a/tests/Core/Controller/ClientFlowLoginControllerTest.php +++ b/tests/Core/Controller/ClientFlowLoginControllerTest.php @@ -338,7 +338,7 @@ class ClientFlowLoginControllerTest extends TestCase { ->method('getServerHost') ->willReturn('example.com'); - $expected = new Http\RedirectResponse('nc://MyLoginName:MyGeneratedToken@example.com'); + $expected = new Http\RedirectResponse('nc://login/server:example.com&user:MyLoginName&password:MyGeneratedToken'); $this->assertEquals($expected, $this->clientFlowLoginController->generateAppPassword('MyStateToken')); } @@ -402,7 +402,7 @@ class ClientFlowLoginControllerTest extends TestCase { ->method('getServerHost') ->willReturn('example.com'); - $expected = new Http\RedirectResponse('nc://MyLoginName:MyGeneratedToken@example.com'); + $expected = new Http\RedirectResponse('nc://login/server:example.com&user:MyLoginName&password:MyGeneratedToken'); $this->assertEquals($expected, $this->clientFlowLoginController->generateAppPassword('MyStateToken')); } } diff --git a/tests/Settings/Controller/AuthSettingsControllerTest.php b/tests/Settings/Controller/AuthSettingsControllerTest.php index 7f4277acd73..5c1280ff4b0 100644 --- a/tests/Settings/Controller/AuthSettingsControllerTest.php +++ b/tests/Settings/Controller/AuthSettingsControllerTest.php @@ -133,11 +133,11 @@ class AuthSettingsControllerTest extends TestCase { ->method('getLoginName') ->will($this->returnValue('User13')); - $this->secureRandom->expects($this->exactly(4)) + $this->secureRandom->expects($this->exactly(5)) ->method('generate') - ->with(5, implode('', range('A', 'Z'))) + ->with(5, ISecureRandom::CHAR_HUMAN_READABLE) ->will($this->returnValue('XXXXX')); - $newToken = 'XXXXX-XXXXX-XXXXX-XXXXX'; + $newToken = 'XXXXX-XXXXX-XXXXX-XXXXX-XXXXX'; $this->tokenProvider->expects($this->once()) ->method('generateToken') diff --git a/tests/acceptance/features/core/Actor.php b/tests/acceptance/features/core/Actor.php index 3a57b7e6054..a87ccfb7737 100644 --- a/tests/acceptance/features/core/Actor.php +++ b/tests/acceptance/features/core/Actor.php @@ -42,6 +42,11 @@ * exception is thrown if the element is not found, and, optionally, it is * possible to try again to find the element several times before giving up. * + * The returned object is also a wrapper over the element itself that + * automatically handles common causes of failed commands, like clicking on a + * hidden element; in this case, the wrapper would wait for the element to be + * visible up to the timeout set to find the element. + * * The amount of time to wait before giving up is specified in each call to * find(). However, a general multiplier to be applied to every timeout can be * set using setFindTimeoutMultiplier(); this makes possible to retry longer @@ -150,6 +155,10 @@ class Actor { * before retrying is half a second. If the timeout is not 0 it will be * affected by the multiplier set using setFindTimeoutMultiplier(), if any. * + * When found, the element is returned wrapped in an ElementWrapper; the + * ElementWrapper handles common causes of failures when executing commands + * in an element, like clicking on a hidden element. + * * In any case, if the element, or its ancestors, can not be found a * NoSuchElementException is thrown. * @@ -158,90 +167,16 @@ class Actor { * most for the element to appear. * @param float $timeoutStep the number of seconds (decimals allowed) to * wait before trying to find the element again. - * @return \Behat\Mink\Element\Element the element found. + * @return ElementWrapper an ElementWrapper object for the element. * @throws NoSuchElementException if the element, or its ancestor, can not * be found. */ - public function find($elementLocator, $timeout = 0, $timeoutStep = 0.5) { + public function find(Locator $elementLocator, $timeout = 0, $timeoutStep = 0.5) { $timeout = $timeout * $this->findTimeoutMultiplier; - return $this->findInternal($elementLocator, $timeout, $timeoutStep); - } - - /** - * Finds an element in the Mink Session of this Actor. - * - * The timeout is not affected by the multiplier set using - * setFindTimeoutMultiplier(). - * - * @see find($elementLocator, $timeout, $timeoutStep) - */ - private function findInternal($elementLocator, $timeout, $timeoutStep) { - $element = null; - $selector = $elementLocator->getSelector(); - $locator = $elementLocator->getLocator(); - $ancestorElement = $this->findAncestorElement($elementLocator, $timeout, $timeoutStep); - - $findCallback = function() use (&$element, $selector, $locator, $ancestorElement) { - $element = $ancestorElement->find($selector, $locator); - - return $element !== null; - }; - if (!Utils::waitFor($findCallback, $timeout, $timeoutStep)) { - $message = $elementLocator->getDescription() . " could not be found"; - if ($timeout > 0) { - $message = $message . " after $timeout seconds"; - } - throw new NoSuchElementException($message); - } - - return $element; - } - - /** - * Returns the ancestor element from which the given locator will be looked - * for. - * - * If the ancestor of the given locator is another locator the element for - * the ancestor locator is found and returned. If the ancestor of the given - * locator is already an element that element is the one returned. If the - * given locator has no ancestor then the base document element is returned. - * - * The timeout is used only when finding the element for the ancestor - * locator; if the timeout expires a NoSuchElementException is thrown. - * - * @param Locator $elementLocator the locator for the element to get its - * ancestor. - * @param float $timeout the number of seconds (decimals allowed) to wait at - * most for the ancestor element to appear. - * @param float $timeoutStep the number of seconds (decimals allowed) to - * wait before trying to find the ancestor element again. - * @return \Behat\Mink\Element\Element the ancestor element found. - * @throws NoSuchElementException if the ancestor element can not be found. - */ - private function findAncestorElement($elementLocator, $timeout, $timeoutStep) { - $ancestorElement = $elementLocator->getAncestor(); - if ($ancestorElement instanceof Locator) { - try { - $ancestorElement = $this->findInternal($ancestorElement, $timeout, $timeoutStep); - } catch (NoSuchElementException $exception) { - // Little hack to show the stack of ancestor elements that could - // not be found, as Behat only shows the message of the last - // exception in the chain. - $message = $exception->getMessage() . "\n" . - $elementLocator->getDescription() . " could not be found"; - if ($timeout > 0) { - $message = $message . " after $timeout seconds"; - } - throw new NoSuchElementException($message, $exception); - } - } - - if ($ancestorElement === null) { - $ancestorElement = $this->getSession()->getPage(); - } + $elementFinder = new ElementFinder($this->session, $elementLocator, $timeout, $timeoutStep); - return $ancestorElement; + return new ElementWrapper($elementFinder); } /** diff --git a/tests/acceptance/features/core/ElementFinder.php b/tests/acceptance/features/core/ElementFinder.php new file mode 100644 index 00000000000..d075e9fe660 --- /dev/null +++ b/tests/acceptance/features/core/ElementFinder.php @@ -0,0 +1,205 @@ +<?php + +/** + * + * @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.com) + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * Command object to find Mink elements. + * + * The element locator is relative to its ancestor (either another locator or an + * actual element); if it has no ancestor then the base document element is + * used. + * + * Sometimes an element may not be found simply because it has not appeared yet; + * for those cases ElementFinder supports trying again to find the element + * several times before giving up. The timeout parameter controls how much time + * to wait, at most, to find the element; the timeoutStep parameter controls how + * much time to wait before trying again to find the element. If ancestor + * locators need to be found the timeout is applied individually to each one, + * that is, if the timeout is 10 seconds the method will wait up to 10 seconds + * to find the ancestor of the ancestor and, then, up to 10 seconds to find the + * ancestor and, then, up to 10 seconds to find the element. By default the + * timeout is 0, so the element and its ancestor will be looked for just once; + * the default time to wait before retrying is half a second. + * + * In any case, if the element, or its ancestors, can not be found a + * NoSuchElementException is thrown. + */ +class ElementFinder { + + /** + * Finds an element in the given Mink Session. + * + * @see ElementFinder + */ + private static function findInternal(\Behat\Mink\Session $session, Locator $elementLocator, $timeout, $timeoutStep) { + $element = null; + $selector = $elementLocator->getSelector(); + $locator = $elementLocator->getLocator(); + $ancestorElement = self::findAncestorElement($session, $elementLocator, $timeout, $timeoutStep); + + $findCallback = function() use (&$element, $selector, $locator, $ancestorElement) { + $element = $ancestorElement->find($selector, $locator); + + return $element !== null; + }; + if (!Utils::waitFor($findCallback, $timeout, $timeoutStep)) { + $message = $elementLocator->getDescription() . " could not be found"; + if ($timeout > 0) { + $message = $message . " after $timeout seconds"; + } + throw new NoSuchElementException($message); + } + + return $element; + } + + /** + * Returns the ancestor element from which the given locator will be looked + * for. + * + * If the ancestor of the given locator is another locator the element for + * the ancestor locator is found and returned. If the ancestor of the given + * locator is already an element that element is the one returned. If the + * given locator has no ancestor then the base document element is returned. + * + * The timeout is used only when finding the element for the ancestor + * locator; if the timeout expires a NoSuchElementException is thrown. + * + * @param \Behat\Mink\Session $session the Mink Session to get the ancestor + * element from. + * @param Locator $elementLocator the locator for the element to get its + * ancestor. + * @param float $timeout the number of seconds (decimals allowed) to wait at + * most for the ancestor element to appear. + * @param float $timeoutStep the number of seconds (decimals allowed) to + * wait before trying to find the ancestor element again. + * @return \Behat\Mink\Element\Element the ancestor element found. + * @throws NoSuchElementException if the ancestor element can not be found. + */ + private static function findAncestorElement(\Behat\Mink\Session $session, Locator $elementLocator, $timeout, $timeoutStep) { + $ancestorElement = $elementLocator->getAncestor(); + if ($ancestorElement instanceof Locator) { + try { + $ancestorElement = self::findInternal($session, $ancestorElement, $timeout, $timeoutStep); + } catch (NoSuchElementException $exception) { + // Little hack to show the stack of ancestor elements that could + // not be found, as Behat only shows the message of the last + // exception in the chain. + $message = $exception->getMessage() . "\n" . + $elementLocator->getDescription() . " could not be found"; + if ($timeout > 0) { + $message = $message . " after $timeout seconds"; + } + throw new NoSuchElementException($message, $exception); + } + } + + if ($ancestorElement === null) { + $ancestorElement = $session->getPage(); + } + + return $ancestorElement; + } + + /** + * @var \Behat\Mink\Session + */ + private $session; + + /** + * @param Locator + */ + private $elementLocator; + + /** + * @var float + */ + private $timeout; + + /** + * @var float + */ + private $timeoutStep; + + /** + * Creates a new ElementFinder. + * + * @param \Behat\Mink\Session $session the Mink Session to get the element + * from. + * @param Locator $elementLocator the locator for the element. + * @param float $timeout the number of seconds (decimals allowed) to wait at + * most for the element to appear. + * @param float $timeoutStep the number of seconds (decimals allowed) to + * wait before trying to find the element again. + */ + public function __construct(\Behat\Mink\Session $session, Locator $elementLocator, $timeout, $timeoutStep) { + $this->session = $session; + $this->elementLocator = $elementLocator; + $this->timeout = $timeout; + $this->timeoutStep = $timeoutStep; + } + + /** + * Returns the description of the element to find. + * + * @return string the description of the element to find. + */ + public function getDescription() { + return $this->elementLocator->getDescription(); + } + + /** + * Returns the timeout. + * + * @return float the number of seconds (decimals allowed) to wait at most + * for the element to appear. + */ + public function getTimeout() { + return $this->timeout; + } + + /** + * Returns the timeout step. + * + * @return float the number of seconds (decimals allowed) to wait before + * trying to find the element again. + */ + public function getTimeoutStep() { + return $this->timeoutStep; + } + + /** + * Finds an element using the parameters set in the constructor of this + * ElementFinder. + * + * If the element, or its ancestors, can not be found a + * NoSuchElementException is thrown. + * + * @return \Behat\Mink\Element\Element the element found. + * @throws NoSuchElementException if the element, or its ancestor, can not + * be found. + */ + public function find() { + return self::findInternal($this->session, $this->elementLocator, $this->timeout, $this->timeoutStep); + } + +} diff --git a/tests/acceptance/features/core/ElementWrapper.php b/tests/acceptance/features/core/ElementWrapper.php new file mode 100644 index 00000000000..6b730903f6c --- /dev/null +++ b/tests/acceptance/features/core/ElementWrapper.php @@ -0,0 +1,275 @@ +<?php + +/** + * + * @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.com) + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * Wrapper to automatically handle failed commands on Mink elements. + * + * Commands executed on Mink elements may fail for several reasons. The + * ElementWrapper frees the caller of the commands from handling the most common + * reasons of failure. + * + * StaleElementReference exceptions are thrown when the command is executed on + * an element that is no longer attached to the DOM. This can happen even in + * a chained call like "$actor->find($locator)->click()"; in the milliseconds + * between finding the element and clicking it the element could have been + * removed from the page (for example, if a previous interaction with the page + * started an asynchronous update of the DOM). Every command executed through + * the ElementWrapper is guarded against StaleElementReference exceptions; if + * the element is stale it is found again using the same parameters to find it + * in the first place. + * + * ElementNotVisible exceptions are thrown when the command requires the element + * to be visible but the element is not. Finding an element only guarantees that + * (at that time) the element is attached to the DOM, but it does not provide + * any guarantee regarding its visibility. Due to that, a call like + * "$actor->find($locator)->click()" can fail if the element was hidden and + * meant to be made visible by a previous interaction with the page, but that + * interaction triggered an asynchronous update that was not finished when the + * click command is executed. All commands executed through the ElementWrapper + * that require the element to be visible are guarded against ElementNotVisible + * exceptions; if the element is not visible it is waited for it to be visible + * up to the timeout set to find it. + * + * Despite the automatic handling it is possible for the commands to throw those + * exceptions when they are executed again; this class does not handle cases + * like an element becoming stale several times in a row (uncommon) or an + * element not becoming visible before the timeout expires (which would mean + * that the timeout is too short or that the test has to, indeed, fail). + * + * If needed, automatically handling failed commands can be disabled calling + * "doNotHandleFailedCommands()"; as it returns the ElementWrapper it can be + * chained with the command to execute (but note that automatically handling + * failed commands will still be disabled if further commands are executed on + * the ElementWrapper). + */ +class ElementWrapper { + + /** + * @var ElementFinder + */ + private $elementFinder; + + /** + * @var \Behat\Mink\Element\Element + */ + private $element; + + /** + * @param boolean + */ + private $handleFailedCommands; + + /** + * Creates a new ElementWrapper. + * + * The wrapped element is found in the constructor itself using the + * ElementFinder. + * + * @param ElementFinder $elementFinder the command object to find the + * wrapped element. + * @throws NoSuchElementException if the element, or its ancestor, can not + * be found. + */ + public function __construct(ElementFinder $elementFinder) { + $this->elementFinder = $elementFinder; + $this->element = $elementFinder->find(); + $this->handleFailedCommands = true; + } + + /** + * Returns the raw Mink element. + * + * @return \Behat\Mink\Element\Element the wrapped element. + */ + public function getWrappedElement() { + return $element; + } + + /** + * Prevents the automatic handling of failed commands. + * + * @return ElementWrapper this ElementWrapper. + */ + public function doNotHandleFailedCommands() { + $this->handleFailedCommands = false; + + return $this; + } + + /** + * Returns whether the wrapped element is visible or not. + * + * @return boolbean true if the wrapped element is visible, false otherwise. + */ + public function isVisible() { + $commandCallback = function() { + return $this->element->isVisible(); + }; + return $this->executeCommand($commandCallback, "visibility could not be got"); + } + + /** + * Returns the text of the wrapped element. + * + * If the wrapped element is not visible the returned text is an empty + * string. + * + * @return string the text of the wrapped element, or an empty string if it + * is not visible. + */ + public function getText() { + $commandCallback = function() { + return $this->element->getText(); + }; + return $this->executeCommand($commandCallback, "text could not be got"); + } + + /** + * Returns the value of the wrapped element. + * + * The value can be got even if the wrapped element is not visible. + * + * @return string the value of the wrapped element. + */ + public function getValue() { + $commandCallback = function() { + return $this->element->getValue(); + }; + return $this->executeCommand($commandCallback, "value could not be got"); + } + + /** + * Sets the given value on the wrapped element. + * + * If automatically waits for the wrapped element to be visible (up to the + * timeout set when finding it). + * + * @param string $value the value to set. + */ + public function setValue($value) { + $commandCallback = function() use ($value) { + $this->element->setValue($value); + }; + $this->executeCommandOnVisibleElement($commandCallback, "value could not be set"); + } + + /** + * Clicks on the wrapped element. + * + * If automatically waits for the wrapped element to be visible (up to the + * timeout set when finding it). + */ + public function click() { + $commandCallback = function() { + $this->element->click(); + }; + $this->executeCommandOnVisibleElement($commandCallback, "could not be clicked"); + } + + /** + * Executes the given command. + * + * If a StaleElementReference exception is thrown the wrapped element is + * found again and, then, the command is executed again. + * + * @param \Closure $commandCallback the command to execute. + * @param string $errorMessage an error message that describes the failed + * command (appended to the description of the element). + */ + private function executeCommand(\Closure $commandCallback, $errorMessage) { + if (!$this->handleFailedCommands) { + return $commandCallback(); + } + + try { + return $commandCallback(); + } catch (\WebDriver\Exception\StaleElementReference $exception) { + $this->printFailedCommandMessage($exception, $errorMessage); + } + + $this->element = $this->elementFinder->find(); + + return $commandCallback(); + } + + /** + * Executes the given command on a visible element. + * + * If a StaleElementReference exception is thrown the wrapped element is + * found again and, then, the command is executed again. If an + * ElementNotVisible exception is thrown it is waited for the wrapped + * element to be visible and, then, the command is executed again. + * + * @param \Closure $commandCallback the command to execute. + * @param string $errorMessage an error message that describes the failed + * command (appended to the description of the element). + */ + private function executeCommandOnVisibleElement(\Closure $commandCallback, $errorMessage) { + if (!$this->handleFailedCommands) { + return $commandCallback(); + } + + try { + return $this->executeCommand($commandCallback, $errorMessage); + } catch (\WebDriver\Exception\ElementNotVisible $exception) { + $this->printFailedCommandMessage($exception, $errorMessage); + } + + $this->waitForElementToBeVisible(); + + return $commandCallback(); + } + + /** + * Prints information about the failed command. + * + * @param \Exception exception the exception thrown by the command. + * @param string $errorMessage an error message that describes the failed + * command (appended to the description of the locator of the element). + */ + private function printFailedCommandMessage(\Exception $exception, $errorMessage) { + echo $this->elementFinder->getDescription() . " " . $errorMessage . "\n"; + echo "Exception message: " . $exception->getMessage() . "\n"; + echo "Trying again\n"; + } + + /** + * Waits for the wrapped element to be visible. + * + * This method waits up to the timeout used when finding the wrapped + * element; therefore, it may return when the element is still not visible. + * + * @return boolean true if the element is visible after the wait, false + * otherwise. + */ + private function waitForElementToBeVisible() { + $isVisibleCallback = function() { + return $this->isVisible(); + }; + $timeout = $this->elementFinder->getTimeout(); + $timeoutStep = $this->elementFinder->getTimeoutStep(); + + return Utils::waitFor($isVisibleCallback, $timeout, $timeoutStep); + } + +} diff --git a/tests/lib/Cache/TestCache.php b/tests/lib/Cache/TestCache.php index 75ff65207ee..2642c014a78 100644 --- a/tests/lib/Cache/TestCache.php +++ b/tests/lib/Cache/TestCache.php @@ -53,21 +53,48 @@ abstract class TestCache extends \Test\TestCase { function testClear() { $value='ipsum lorum'; - $this->instance->set('1_value1', $value); - $this->instance->set('1_value2', $value); - $this->instance->set('2_value1', $value); - $this->instance->set('3_value1', $value); + $this->instance->set('1_value1', $value . '1'); + $this->instance->set('1_value2', $value . '2'); + $this->instance->set('2_value1', $value . '3'); + $this->instance->set('3_value1', $value . '4'); + $this->assertEquals([ + '1_value1' => 'ipsum lorum1', + '1_value2' => 'ipsum lorum2', + '2_value1' => 'ipsum lorum3', + '3_value1' => 'ipsum lorum4', + ], [ + '1_value1' => $this->instance->get('1_value1'), + '1_value2' => $this->instance->get('1_value2'), + '2_value1' => $this->instance->get('2_value1'), + '3_value1' => $this->instance->get('3_value1'), + ]); $this->assertTrue($this->instance->clear('1_')); - $this->assertFalse($this->instance->hasKey('1_value1')); - $this->assertFalse($this->instance->hasKey('1_value2')); - $this->assertTrue($this->instance->hasKey('2_value1')); - $this->assertTrue($this->instance->hasKey('3_value1')); + + $this->assertEquals([ + '1_value1' => null, + '1_value2' => null, + '2_value1' => 'ipsum lorum3', + '3_value1' => 'ipsum lorum4', + ], [ + '1_value1' => $this->instance->get('1_value1'), + '1_value2' => $this->instance->get('1_value2'), + '2_value1' => $this->instance->get('2_value1'), + '3_value1' => $this->instance->get('3_value1'), + ]); $this->assertTrue($this->instance->clear()); - $this->assertFalse($this->instance->hasKey('1_value1')); - $this->assertFalse($this->instance->hasKey('1_value2')); - $this->assertFalse($this->instance->hasKey('2_value1')); - $this->assertFalse($this->instance->hasKey('3_value1')); + + $this->assertEquals([ + '1_value1' => null, + '1_value2' => null, + '2_value1' => null, + '3_value1' => null, + ], [ + '1_value1' => $this->instance->get('1_value1'), + '1_value2' => $this->instance->get('1_value2'), + '2_value1' => $this->instance->get('2_value1'), + '3_value1' => $this->instance->get('3_value1'), + ]); } } diff --git a/tests/lib/Memcache/RedisTest.php b/tests/lib/Memcache/RedisTest.php index e707f30fb5b..6a0a82f6aa7 100644 --- a/tests/lib/Memcache/RedisTest.php +++ b/tests/lib/Memcache/RedisTest.php @@ -24,6 +24,7 @@ class RedisTest extends Cache { }, E_WARNING ); + $instance = null; try { $instance = new \OC\Memcache\Redis(self::getUniqueID()); } catch (\RuntimeException $e) { @@ -34,6 +35,10 @@ class RedisTest extends Cache { self::markTestSkipped($errorOccurred); } + if ($instance === null) { + throw new \Exception('redis server is not reachable'); + } + if ($instance->set(self::getUniqueID(), self::getUniqueID()) === false) { self::markTestSkipped('redis server seems to be down.'); } diff --git a/version.php b/version.php index c1b989c8790..4f428c128aa 100644 --- a/version.php +++ b/version.php @@ -26,10 +26,10 @@ // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(12, 0, 0, 17); +$OC_Version = array(12, 0, 0, 18); // The human readable string -$OC_VersionString = '12.0 beta 1'; +$OC_VersionString = '12.0 beta 2'; $OC_VersionCanBeUpgradedFrom = [ 'nextcloud' => [ |