diff options
520 files changed, 10135 insertions, 3046 deletions
diff --git a/.htaccess b/.htaccess index 206d2be33bc..c5dbf194b04 100644 --- a/.htaccess +++ b/.htaccess @@ -21,8 +21,13 @@ </IfModule> # Add cache control for static resources - <FilesMatch "\.(css|js|woff|svg|gif)$"> - Header set Cache-Control "max-age=7200, public" + <FilesMatch "\.(css|js|svg|gif)$"> + Header set Cache-Control "max-age=15778463" + </FilesMatch> + + # Let browsers cache WOFF files for a week + <FilesMatch "\.woff$"> + Header set Cache-Control "max-age=604800" </FilesMatch> </IfModule> <IfModule mod_php5.c> diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml index 0da8b115dc8..14bce64aabc 100644 --- a/apps/admin_audit/appinfo/info.xml +++ b/apps/admin_audit/appinfo/info.xml @@ -9,7 +9,7 @@ <author>Nextcloud</author> <version>1.1.0</version> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <types> <logging/> diff --git a/apps/comments/appinfo/info.xml b/apps/comments/appinfo/info.xml index 39584694e23..1c0a38e5668 100644 --- a/apps/comments/appinfo/info.xml +++ b/apps/comments/appinfo/info.xml @@ -8,7 +8,7 @@ <default_enable/> <version>1.1.0</version> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <types> <logging/> diff --git a/apps/comments/l10n/es.js b/apps/comments/l10n/es.js index ea03c76ec27..c609df31e7e 100644 --- a/apps/comments/l10n/es.js +++ b/apps/comments/l10n/es.js @@ -2,6 +2,7 @@ OC.L10N.register( "comments", { "Comments" : "Comentarios", + "Unknown user" : "Usuario desconocido", "New comment …" : "Comentario nuevo", "Delete comment" : "Borrar comentario", "Post" : "Publicar", diff --git a/apps/comments/l10n/es.json b/apps/comments/l10n/es.json index 5f91f224c4e..f838dea3767 100644 --- a/apps/comments/l10n/es.json +++ b/apps/comments/l10n/es.json @@ -1,5 +1,6 @@ { "translations": { "Comments" : "Comentarios", + "Unknown user" : "Usuario desconocido", "New comment …" : "Comentario nuevo", "Delete comment" : "Borrar comentario", "Post" : "Publicar", diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 4d3b1757284..314391a1448 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -15,7 +15,7 @@ <webdav>appinfo/v1/publicwebdav.php</webdav> </public> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <background-jobs> <job>OCA\DAV\CardDAV\SyncJob</job> diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index 670eadd5ea9..95fb71032d5 100644 --- a/apps/dav/appinfo/v1/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -73,14 +73,12 @@ $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, func $isReadable = $share->getPermissions() & \OCP\Constants::PERMISSION_READ; $fileId = $share->getNodeId(); - /* - if (!$isReadable) { - return false; - }*/ - + // FIXME: should not add storage wrappers outside of preSetup, need to find a better way + $previousLog = \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper(false); \OC\Files\Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) { return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => $share->getPermissions() | \OCP\Constants::PERMISSION_SHARE)); }); + \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper($previousLog); OC_Util::setupFS($owner); $ownerView = \OC\Files\Filesystem::getView(); diff --git a/apps/dav/l10n/it.js b/apps/dav/l10n/it.js index 2265d7eb74b..483404492f0 100644 --- a/apps/dav/l10n/it.js +++ b/apps/dav/l10n/it.js @@ -2,8 +2,8 @@ OC.L10N.register( "dav", { "A <strong>calendar</strong> was modified" : "Un <strong>calendario</strong> è stato modificato", - "A calendar <strong>event</strong> was modified" : "Un <strong>evento</strong> di calendario è stato modificato", - "A calendar <strong>todo</strong> was modified" : "Una <strong>cosa da fare</strong> del calendario è stato modificata", + "A calendar <strong>event</strong> was modified" : "Un <strong>evento</strong> del calendario è stato modificato", + "A calendar <strong>todo</strong> was modified" : "Una <strong>cosa da fare</strong> del calendario è stata modificata", "%1$s created calendar %2$s" : "%1$s ha creato il calendario %2$s", "You created calendar %2$s" : "Hai creato il calendario %2$s", "%1$s deleted calendar %2$s" : "%1$s ha eliminato il calendario %2$s", @@ -13,14 +13,14 @@ OC.L10N.register( "%1$s shared calendar %2$s with you" : "%1$s ha condiviso il calendario %2$s con te", "You shared calendar %2$s with %1$s" : "Hai condiviso il calendario %2$s con %1$s", "%3$s shared calendar %2$s with %1$s" : "%3$s ha condiviso il calendario %2$s con %1$s", - "%1$s unshared calendar %2$s from you" : "%1$s ha rimosso la condivisione %2$s con te", + "%1$s unshared calendar %2$s from you" : "%1$s ha rimosso la condivisione del calendario %2$s con te", "You unshared calendar %2$s from %1$s" : "Hai rimosso la condivisione del calendario %2$s da %1$s", - "%3$s unshared calendar %2$s from %1$s" : "%3$s ha rimosso la condivisione %2$s con %1$s", - "%1$s unshared calendar %2$s from themselves" : "%1$s ha rimosso la condivisione %2$s con se stesso", + "%3$s unshared calendar %2$s from %1$s" : "%3$s ha rimosso la condivisione del calendario %2$s con %1$s", + "%1$s unshared calendar %2$s from themselves" : "%1$s ha rimosso la condivisione del calendario %2$s con se stesso", "You shared calendar %2$s with group %1$s" : "Hai condiviso il calendario %2$s con il gruppo %1$s", "%3$s shared calendar %2$s with group %1$s" : "%3$s ha condiviso il calendario %2$s con il gruppo %1$s", "You unshared calendar %2$s from group %1$s" : "Hai rimosso la condivisione del calendario %2$s con il gruppo %1$s", - "%3$s unshared calendar %2$s from group %1$s" : "%3$s ha rimosso la condivisione %2$s con il gruppo %1$s", + "%3$s unshared calendar %2$s from group %1$s" : "%3$s ha rimosso la condivisione del calendario %2$s con il gruppo %1$s", "%1$s created event %3$s in calendar %2$s" : "%1$s ha creato l'evento %3$s nel calendario %2$s", "You created event %3$s in calendar %2$s" : "Hai creato l'evento %3$s nel calendario %2$s", "%1$s deleted event %3$s from calendar %2$s" : "%1$s ha eliminato l'evento %3$s dal calendario %2$s", diff --git a/apps/dav/l10n/it.json b/apps/dav/l10n/it.json index d1aa791dabe..2ea2380107b 100644 --- a/apps/dav/l10n/it.json +++ b/apps/dav/l10n/it.json @@ -1,7 +1,7 @@ { "translations": { "A <strong>calendar</strong> was modified" : "Un <strong>calendario</strong> è stato modificato", - "A calendar <strong>event</strong> was modified" : "Un <strong>evento</strong> di calendario è stato modificato", - "A calendar <strong>todo</strong> was modified" : "Una <strong>cosa da fare</strong> del calendario è stato modificata", + "A calendar <strong>event</strong> was modified" : "Un <strong>evento</strong> del calendario è stato modificato", + "A calendar <strong>todo</strong> was modified" : "Una <strong>cosa da fare</strong> del calendario è stata modificata", "%1$s created calendar %2$s" : "%1$s ha creato il calendario %2$s", "You created calendar %2$s" : "Hai creato il calendario %2$s", "%1$s deleted calendar %2$s" : "%1$s ha eliminato il calendario %2$s", @@ -11,14 +11,14 @@ "%1$s shared calendar %2$s with you" : "%1$s ha condiviso il calendario %2$s con te", "You shared calendar %2$s with %1$s" : "Hai condiviso il calendario %2$s con %1$s", "%3$s shared calendar %2$s with %1$s" : "%3$s ha condiviso il calendario %2$s con %1$s", - "%1$s unshared calendar %2$s from you" : "%1$s ha rimosso la condivisione %2$s con te", + "%1$s unshared calendar %2$s from you" : "%1$s ha rimosso la condivisione del calendario %2$s con te", "You unshared calendar %2$s from %1$s" : "Hai rimosso la condivisione del calendario %2$s da %1$s", - "%3$s unshared calendar %2$s from %1$s" : "%3$s ha rimosso la condivisione %2$s con %1$s", - "%1$s unshared calendar %2$s from themselves" : "%1$s ha rimosso la condivisione %2$s con se stesso", + "%3$s unshared calendar %2$s from %1$s" : "%3$s ha rimosso la condivisione del calendario %2$s con %1$s", + "%1$s unshared calendar %2$s from themselves" : "%1$s ha rimosso la condivisione del calendario %2$s con se stesso", "You shared calendar %2$s with group %1$s" : "Hai condiviso il calendario %2$s con il gruppo %1$s", "%3$s shared calendar %2$s with group %1$s" : "%3$s ha condiviso il calendario %2$s con il gruppo %1$s", "You unshared calendar %2$s from group %1$s" : "Hai rimosso la condivisione del calendario %2$s con il gruppo %1$s", - "%3$s unshared calendar %2$s from group %1$s" : "%3$s ha rimosso la condivisione %2$s con il gruppo %1$s", + "%3$s unshared calendar %2$s from group %1$s" : "%3$s ha rimosso la condivisione del calendario %2$s con il gruppo %1$s", "%1$s created event %3$s in calendar %2$s" : "%1$s ha creato l'evento %3$s nel calendario %2$s", "You created event %3$s in calendar %2$s" : "Hai creato l'evento %3$s nel calendario %2$s", "%1$s deleted event %3$s from calendar %2$s" : "%1$s ha eliminato l'evento %3$s dal calendario %2$s", diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index c777f5e5a35..844e0780ffb 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -33,6 +33,7 @@ use OCA\DAV\CardDAV\SyncService; use OCA\DAV\HookManager; use \OCP\AppFramework\App; use OCP\Contacts\IManager; +use OCP\IUser; use Symfony\Component\EventDispatcher\GenericEvent; class Application extends App { @@ -65,6 +66,16 @@ class Application extends App { $hm = $this->getContainer()->query(HookManager::class); $hm->setup(); + $dispatcher = $this->getContainer()->getServer()->getEventDispatcher(); + + // first time login event setup + $dispatcher->addListener(IUser::class . '::firstLogin', function ($event) use ($hm) { + if ($event instanceof GenericEvent) { + $hm->firstLogin($event->getSubject()); + } + }); + + // carddav/caldav sync event setup $listener = function($event) { if ($event instanceof GenericEvent) { /** @var BirthdayService $b */ @@ -77,7 +88,6 @@ class Application extends App { } }; - $dispatcher = $this->getContainer()->getServer()->getEventDispatcher(); $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::createCard', $listener); $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $listener); $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function($event) { diff --git a/apps/dav/lib/CalDAV/Activity/Backend.php b/apps/dav/lib/CalDAV/Activity/Backend.php index 6cf09f6de46..6a557fef7bd 100644 --- a/apps/dav/lib/CalDAV/Activity/Backend.php +++ b/apps/dav/lib/CalDAV/Activity/Backend.php @@ -112,7 +112,7 @@ class Backend { $event = $this->activityManager->generateEvent(); $event->setApp('dav') - ->setObject(Extension::CALENDAR, $calendarData['id']) + ->setObject(Extension::CALENDAR, (int) $calendarData['id']) ->setType(Extension::CALENDAR) ->setAuthor($currentUser); @@ -162,7 +162,7 @@ class Backend { $event = $this->activityManager->generateEvent(); $event->setApp('dav') - ->setObject(Extension::CALENDAR, $calendarData['id']) + ->setObject(Extension::CALENDAR, (int) $calendarData['id']) ->setType(Extension::CALENDAR) ->setAuthor($currentUser); @@ -387,7 +387,7 @@ class Backend { $event = $this->activityManager->generateEvent(); $event->setApp('dav') - ->setObject(Extension::CALENDAR, $calendarData['id']) + ->setObject(Extension::CALENDAR, (int) $calendarData['id']) ->setType($object['type'] === 'event' ? Extension::CALENDAR_EVENT : Extension::CALENDAR_TODO) ->setAuthor($currentUser); diff --git a/apps/dav/lib/CalDAV/BirthdayService.php b/apps/dav/lib/CalDAV/BirthdayService.php index bf26aec5377..104eec6b496 100644 --- a/apps/dav/lib/CalDAV/BirthdayService.php +++ b/apps/dav/lib/CalDAV/BirthdayService.php @@ -1,10 +1,12 @@ <?php /** * @copyright Copyright (c) 2016, ownCloud, Inc. + * @copyright Copyright (c) 2016, Georg Ehrke * * @author Achim Königs <garfonso@tratschtante.de> * @author Robin Appelman <robin@icewind.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Georg Ehrke <georg@nextcloud.com> * * @license AGPL-3.0 * @@ -147,6 +149,8 @@ class BirthdayService { } catch (Exception $e) { return null; } + + $summary = $title . ' (' . $summarySymbol . $date->format('Y') . ')'; $vCal = new VCalendar(); $vCal->VERSION = '2.0'; $vEvent = $vCal->createComponent('VEVENT'); @@ -163,7 +167,7 @@ class BirthdayService { $vEvent->DTEND['VALUE'] = 'DATE'; $vEvent->{'UID'} = $doc->UID; $vEvent->{'RRULE'} = 'FREQ=YEARLY'; - $vEvent->{'SUMMARY'} = $title . ' (' . $summarySymbol . $date->format('Y') . ')'; + $vEvent->{'SUMMARY'} = $summary; $vEvent->{'TRANSP'} = 'TRANSPARENT'; $alarm = $vCal->createComponent('VALARM'); $alarm->add($vCal->createProperty('TRIGGER', '-PT0M', ['VALUE' => 'DURATION'])); diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php index a35eed88073..95222dafec9 100644 --- a/apps/dav/lib/Connector/Sabre/Auth.php +++ b/apps/dav/lib/Connector/Sabre/Auth.php @@ -159,6 +159,7 @@ class Auth extends AbstractBasic { } catch (Exception $e) { $class = get_class($e); $msg = $e->getMessage(); + \OC::$server->getLogger()->logException($e); throw new ServiceUnavailable("$class: $msg"); } } diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 539e22296f2..59b326243ee 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -115,7 +115,6 @@ class FilesPlugin extends ServerPlugin { /** * @param Tree $tree - * @param View $view * @param IConfig $config * @param IRequest $request * @param IPreview $previewManager @@ -123,14 +122,12 @@ class FilesPlugin extends ServerPlugin { * @param bool $downloadAttachment */ public function __construct(Tree $tree, - View $view, IConfig $config, IRequest $request, IPreview $previewManager, $isPublic = false, $downloadAttachment = true) { $this->tree = $tree; - $this->fileView = $view; $this->config = $config; $this->request = $request; $this->isPublic = $isPublic; diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php index 6d9f9b1bc8b..24c93ee571d 100644 --- a/apps/dav/lib/Connector/Sabre/ServerFactory.php +++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php @@ -153,7 +153,6 @@ class ServerFactory { $server->addPlugin( new \OCA\DAV\Connector\Sabre\FilesPlugin( $objectTree, - $view, $this->config, $this->request, $this->previewManager, diff --git a/apps/dav/lib/Connector/Sabre/SharesPlugin.php b/apps/dav/lib/Connector/Sabre/SharesPlugin.php index 56d76e66184..33e79364758 100644 --- a/apps/dav/lib/Connector/Sabre/SharesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/SharesPlugin.php @@ -67,6 +67,8 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { */ private $cachedShareTypes; + private $cachedFolders = []; + /** * @param \Sabre\DAV\Tree $tree tree * @param IUserSession $userSession user session @@ -143,24 +145,18 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { false ); - $children = $node->getDirectoryListing(); + $shareTypesByFileId = []; - $values = array_map(function (\OCP\Files\Node $node) use ($shares) { - /** @var IShare[] $shares */ - $shares = (isset($shares[$node->getId()])) ? $shares[$node->getId()] : []; + foreach($shares as $fileId => $sharesForFile) { $types = array_map(function(IShare $share) { return $share->getShareType(); - }, $shares); + }, $sharesForFile); $types = array_unique($types); sort($types); - return $types; - }, $children); - - $keys = array_map(function (\OCP\Files\Node $node) { - return $node->getId(); - }, $children); + $shareTypesByFileId[$fileId] = $types; + } - return array_combine($keys, $values); + return $shareTypesByFileId; } /** @@ -185,6 +181,7 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { $folderNode = $this->userFolder->get($sabreNode->getPath()); $childShares = $this->getSharesTypesInFolder($folderNode); + $this->cachedFolders[] = $sabreNode->getPath(); $this->cachedShareTypes[$folderNode->getId()] = $this->getShareTypes($folderNode); foreach ($childShares as $id => $shares) { $this->cachedShareTypes[$id] = $shares; @@ -195,8 +192,17 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin { if (isset($this->cachedShareTypes[$sabreNode->getId()])) { $shareTypes = $this->cachedShareTypes[$sabreNode->getId()]; } else { - $node = $this->userFolder->get($sabreNode->getPath()); - $shareTypes = $this->getShareTypes($node); + list($parentPath,) = \Sabre\Uri\split($sabreNode->getPath()); + if ($parentPath === '') { + $parentPath = '/'; + } + // if we already cached the folder this file is in we know there are no shares for this file + if (array_search($parentPath, $this->cachedFolders) === false) { + $node = $this->userFolder->get($sabreNode->getPath()); + $shareTypes = $this->getShareTypes($node); + } else { + return []; + } } return new ShareTypeList($shareTypes); diff --git a/apps/dav/lib/Files/Sharing/FilesDropPlugin.php b/apps/dav/lib/Files/Sharing/FilesDropPlugin.php index ccfa452cb68..299427b1634 100644 --- a/apps/dav/lib/Files/Sharing/FilesDropPlugin.php +++ b/apps/dav/lib/Files/Sharing/FilesDropPlugin.php @@ -58,13 +58,13 @@ class FilesDropPlugin extends ServerPlugin { * @return void */ public function initialize(\Sabre\DAV\Server $server) { - $server->on('beforeMethod:PUT', [$this, 'beforeMethod']); + $server->on('beforeMethod', [$this, 'beforeMethod'], 999); $this->enabled = false; } public function beforeMethod(RequestInterface $request, ResponseInterface $response){ - if (!$this->enabled) { + if (!$this->enabled || $request->getMethod() !== 'PUT') { return; } diff --git a/apps/dav/lib/HookManager.php b/apps/dav/lib/HookManager.php index 92aa4fce7fa..247d4b291af 100644 --- a/apps/dav/lib/HookManager.php +++ b/apps/dav/lib/HookManager.php @@ -78,10 +78,6 @@ class HookManager { 'changeUser', $this, 'changeUser'); - Util::connectHook('OC_User', - 'post_login', - $this, - 'postLogin'); } public function postCreateUser($params) { @@ -117,8 +113,7 @@ class HookManager { $this->syncService->updateUser($user); } - public function postLogin($params) { - $user = $this->userManager->get($params['uid']); + public function firstLogin(IUser $user = null) { if (!is_null($user)) { $principal = 'principals/users/' . $user->getUID(); if ($this->calDav->getCalendarsForUserCount($principal) === 0) { diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index fca4d0ce209..1205d018241 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -171,7 +171,6 @@ class Server { $this->server->addPlugin( new FilesPlugin( $this->server->tree, - $view, \OC::$server->getConfig(), $this->request, \OC::$server->getPreviewManager(), diff --git a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php index 8f8d02f9890..5eeb6772a60 100644 --- a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php +++ b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php @@ -240,6 +240,7 @@ class BirthdayServiceTest extends TestCase { [true, "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\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"], [true, "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\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"], [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\nBDAY:1900-01-01\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + [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\nBDAY:1900-12-31\r\nEND:VCARD\r\n", "Dr. Foo Bar"], ]; } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php index d4e9ce9dd3e..c6e833033d5 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php @@ -68,11 +68,6 @@ class FilesPluginTest extends TestCase { private $plugin; /** - * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject - */ - private $view; - - /** * @var \OCP\IConfig | \PHPUnit_Framework_MockObject_MockObject */ private $config; @@ -95,12 +90,7 @@ class FilesPluginTest extends TestCase { $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree') ->disableOriginalConstructor() ->getMock(); - $this->view = $this->getMockBuilder('\OC\Files\View') - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder('\OCP\IConfig') - ->disableOriginalConstructor() - ->getMock(); + $this->config = $this->createMock('\OCP\IConfig'); $this->config->expects($this->any())->method('getSystemValue') ->with($this->equalTo('data-fingerprint'), $this->equalTo('')) ->willReturn('my_fingerprint'); @@ -113,7 +103,6 @@ class FilesPluginTest extends TestCase { $this->plugin = new FilesPlugin( $this->tree, - $this->view, $this->config, $this->request, $this->previewManager @@ -246,7 +235,6 @@ class FilesPluginTest extends TestCase { public function testGetPublicPermissions() { $this->plugin = new FilesPlugin( $this->tree, - $this->view, $this->config, $this->getMockBuilder('\OCP\IRequest') ->disableOriginalConstructor() diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php index 2b5c9f46301..54e5283c7c1 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php @@ -380,7 +380,6 @@ class FilesReportPluginTest extends \Test\TestCase { $this->server->addPlugin( new \OCA\DAV\Connector\Sabre\FilesPlugin( $this->tree, - $this->view, $config, $this->getMockBuilder('\OCP\IRequest') ->disableOriginalConstructor() diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php index f22da14a0d8..1db85b1bcaf 100644 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php @@ -88,6 +88,7 @@ class UploadTest extends RequestTest { public function testUploadOverWriteWriteLocked() { $user = $this->getUniqueID(); $view = $this->setupUser($user, 'pass'); + $this->loginAsUser($user); $view->file_put_contents('foo.txt', 'bar'); diff --git a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php index 2e17c7d0b38..9d8a66f24b6 100644 --- a/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/SharesPluginTest.php @@ -97,7 +97,7 @@ class SharesPluginTest extends \Test\TestCase { $sabreNode->expects($this->any()) ->method('getId') ->will($this->returnValue(123)); - $sabreNode->expects($this->once()) + $sabreNode->expects($this->any()) ->method('getPath') ->will($this->returnValue('/subdir')); @@ -155,7 +155,7 @@ class SharesPluginTest extends \Test\TestCase { $sabreNode1->expects($this->any()) ->method('getId') ->will($this->returnValue(111)); - $sabreNode1->expects($this->never()) + $sabreNode1->expects($this->any()) ->method('getPath'); $sabreNode2 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') ->disableOriginalConstructor() @@ -163,8 +163,9 @@ class SharesPluginTest extends \Test\TestCase { $sabreNode2->expects($this->any()) ->method('getId') ->will($this->returnValue(222)); - $sabreNode2->expects($this->never()) - ->method('getPath'); + $sabreNode2->expects($this->any()) + ->method('getPath') + ->will($this->returnValue('/subdir/foo')); $sabreNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() @@ -198,9 +199,6 @@ class SharesPluginTest extends \Test\TestCase { $node2->expects($this->any()) ->method('getId') ->will($this->returnValue(222)); - $node->expects($this->once()) - ->method('getDirectoryListing') - ->will($this->returnValue([$node1, $node2])); $this->userFolder->expects($this->once()) ->method('get') @@ -208,7 +206,7 @@ class SharesPluginTest extends \Test\TestCase { ->will($this->returnValue($node)); $dummyShares = array_map(function($type) { - $share = $this->getMock('\OCP\Share\IShare'); + $share = $this->getMockBuilder('\OCP\Share\IShare')->getMock(); $share->expects($this->any()) ->method('getShareType') ->will($this->returnValue($type)); diff --git a/apps/dav/tests/unit/DAV/HookManagerTest.php b/apps/dav/tests/unit/DAV/HookManagerTest.php index 5b7d4700a5f..f980e595bf9 100644 --- a/apps/dav/tests/unit/DAV/HookManagerTest.php +++ b/apps/dav/tests/unit/DAV/HookManagerTest.php @@ -58,7 +58,6 @@ class HookManagerTest extends TestCase { $userManager = $this->getMockBuilder(IUserManager::class) ->disableOriginalConstructor() ->getMock(); - $userManager->expects($this->once())->method('get')->willReturn($user); /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */ $syncService = $this->getMockBuilder(SyncService::class) @@ -84,7 +83,7 @@ class HookManagerTest extends TestCase { 'contacts', ['{DAV:}displayname' => 'Contacts']); $hm = new HookManager($userManager, $syncService, $cal, $card); - $hm->postLogin(['uid' => 'newUser']); + $hm->firstLogin($user); } public function testWithExisting() { @@ -97,7 +96,6 @@ class HookManagerTest extends TestCase { $userManager = $this->getMockBuilder(IUserManager::class) ->disableOriginalConstructor() ->getMock(); - $userManager->expects($this->once())->method('get')->willReturn($user); /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */ $syncService = $this->getMockBuilder(SyncService::class) @@ -119,7 +117,7 @@ class HookManagerTest extends TestCase { $card->expects($this->never())->method('createAddressBook'); $hm = new HookManager($userManager, $syncService, $cal, $card); - $hm->postLogin(['uid' => 'newUser']); + $hm->firstLogin($user); } public function testWithBirthdayCalendar() { @@ -132,7 +130,6 @@ class HookManagerTest extends TestCase { $userManager = $this->getMockBuilder(IUserManager::class) ->disableOriginalConstructor() ->getMock(); - $userManager->expects($this->once())->method('get')->willReturn($user); /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */ $syncService = $this->getMockBuilder(SyncService::class) @@ -158,7 +155,7 @@ class HookManagerTest extends TestCase { 'contacts', ['{DAV:}displayname' => 'Contacts']); $hm = new HookManager($userManager, $syncService, $cal, $card); - $hm->postLogin(['uid' => 'newUser']); + $hm->firstLogin($user); } public function testDeleteCalendar() { diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml index f6632b2ae92..0bb3efebf5f 100644 --- a/apps/encryption/appinfo/info.xml +++ b/apps/encryption/appinfo/info.xml @@ -25,7 +25,7 @@ </types> <dependencies> <lib>openssl</lib> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <settings> <admin>OCA\Encryption\Settings\Admin</admin> diff --git a/apps/encryption/l10n/de_DE.js b/apps/encryption/l10n/de_DE.js index e4e86df505b..5580dc11a64 100644 --- a/apps/encryption/l10n/de_DE.js +++ b/apps/encryption/l10n/de_DE.js @@ -59,7 +59,7 @@ OC.L10N.register( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben.", "Enabled" : "Aktiviert", "Disabled" : "Deaktiviert", - "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur neuen migrieren. Bitte führen Sie 'occ encryption:migrate' aus oder kontaktieren Sie Ihren Administrator. ", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (Nextcloud <= 8.0) zur neuen migrieren. Bitte führen Sie 'occ encryption:migrate' aus oder kontaktieren Sie Ihren Administrator. ", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisieren Sie Ihr privates Schlüsselpasswort, um den Zugriff auf Ihre verschlüsselten Dateien wiederherzustellen.", "Encryption App is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit", "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 'Nextcloud 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" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort '%s' verschlüsselt.\n\nBitte über die Web-Oberfläche anmelden und die persönlichen Einstellungen aufrufen. Dort findet sich die Option 'Nextcloud-Basisverschlüsselungsmodul' und das Verschlüsselungspasswort kann aktualisiert werden, indem das Passwort in das Feld 'altes Login Passwort' und in das 'aktuelles Login - Passwort'-Feld eingegeben wird.\n", diff --git a/apps/encryption/l10n/de_DE.json b/apps/encryption/l10n/de_DE.json index 930ee8fc202..49f7a677fcc 100644 --- a/apps/encryption/l10n/de_DE.json +++ b/apps/encryption/l10n/de_DE.json @@ -57,7 +57,7 @@ "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben.", "Enabled" : "Aktiviert", "Disabled" : "Deaktiviert", - "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur neuen migrieren. Bitte führen Sie 'occ encryption:migrate' aus oder kontaktieren Sie Ihren Administrator. ", + "You need to migrate your encryption keys from the old encryption (Nextcloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (Nextcloud <= 8.0) zur neuen migrieren. Bitte führen Sie 'occ encryption:migrate' aus oder kontaktieren Sie Ihren Administrator. ", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisieren Sie Ihr privates Schlüsselpasswort, um den Zugriff auf Ihre verschlüsselten Dateien wiederherzustellen.", "Encryption App is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit", "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 'Nextcloud 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" : "Hey,\n\nder Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort '%s' verschlüsselt.\n\nBitte über die Web-Oberfläche anmelden und die persönlichen Einstellungen aufrufen. Dort findet sich die Option 'Nextcloud-Basisverschlüsselungsmodul' und das Verschlüsselungspasswort kann aktualisiert werden, indem das Passwort in das Feld 'altes Login Passwort' und in das 'aktuelles Login - Passwort'-Feld eingegeben wird.\n", diff --git a/apps/federatedfilesharing/appinfo/info.xml b/apps/federatedfilesharing/appinfo/info.xml index 984235f0851..6a414496f37 100644 --- a/apps/federatedfilesharing/appinfo/info.xml +++ b/apps/federatedfilesharing/appinfo/info.xml @@ -9,7 +9,7 @@ <namespace>FederatedFileSharing</namespace> <category>other</category> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <settings> <admin>OCA\FederatedFileSharing\Settings\Admin</admin> diff --git a/apps/federatedfilesharing/js/settings-personal.js b/apps/federatedfilesharing/js/settings-personal.js index f89022dc8a0..04096cb0416 100644 --- a/apps/federatedfilesharing/js/settings-personal.js +++ b/apps/federatedfilesharing/js/settings-personal.js @@ -20,14 +20,21 @@ $(document).ready(function() { } }); + $('#fileSharingSettings .clipboardButton').tooltip({placement: 'bottom', title: t('core', 'Copy'), trigger: 'hover'}); + // Clipboard! var clipboard = new Clipboard('.clipboardButton'); clipboard.on('success', function(e) { $input = $(e.trigger); - $input.tooltip({placement: 'bottom', trigger: 'manual', title: t('core', 'Copied!')}); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copied!')) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function() { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); clipboard.on('error', function (e) { @@ -41,14 +48,18 @@ $(document).ready(function() { actionMsg = t('core', 'Press Ctrl-C to copy.'); } - $input.tooltip({ - placement: 'bottom', - trigger: 'manual', - title: actionMsg - }); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', actionMsg) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function () { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); + + + $('#fileSharingSettings .hasTooltip').tooltip({placement: 'right'}); }); diff --git a/apps/federatedfilesharing/l10n/cs_CZ.js b/apps/federatedfilesharing/l10n/cs_CZ.js index c4f6a0be6de..b8189cb5b87 100644 --- a/apps/federatedfilesharing/l10n/cs_CZ.js +++ b/apps/federatedfilesharing/l10n/cs_CZ.js @@ -7,6 +7,7 @@ OC.L10N.register( "Remote share password" : "Heslo vzdáleného sdílení", "Cancel" : "Zrušit", "Add remote share" : "Přidat propojené sdílení", + "Copy" : "Kopie", "Copied!" : "Zkopírováno!", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", diff --git a/apps/federatedfilesharing/l10n/cs_CZ.json b/apps/federatedfilesharing/l10n/cs_CZ.json index 49caae1da8b..44f052e8a84 100644 --- a/apps/federatedfilesharing/l10n/cs_CZ.json +++ b/apps/federatedfilesharing/l10n/cs_CZ.json @@ -5,6 +5,7 @@ "Remote share password" : "Heslo vzdáleného sdílení", "Cancel" : "Zrušit", "Add remote share" : "Přidat propojené sdílení", + "Copy" : "Kopie", "Copied!" : "Zkopírováno!", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", diff --git a/apps/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js index ddf6c2b3ac5..677371b423c 100644 --- a/apps/federatedfilesharing/l10n/de_DE.js +++ b/apps/federatedfilesharing/l10n/de_DE.js @@ -7,6 +7,7 @@ OC.L10N.register( "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", + "Copy" : "Kopieren", "Copied!" : "Kopiert!", "Not supported!" : "Nicht unterstützt!", "Press ⌘-C to copy." : "⌘-C zum Kopieren drücken.", diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json index 9d895123b8b..4451011acaa 100644 --- a/apps/federatedfilesharing/l10n/de_DE.json +++ b/apps/federatedfilesharing/l10n/de_DE.json @@ -5,6 +5,7 @@ "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", + "Copy" : "Kopieren", "Copied!" : "Kopiert!", "Not supported!" : "Nicht unterstützt!", "Press ⌘-C to copy." : "⌘-C zum Kopieren drücken.", diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js index d9944c775dd..bcd0d329dd8 100644 --- a/apps/federatedfilesharing/l10n/fr.js +++ b/apps/federatedfilesharing/l10n/fr.js @@ -1,7 +1,7 @@ OC.L10N.register( "federatedfilesharing", { - "Federated sharing" : "Federated sharing", + "Federated sharing" : "Partage fédéré", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} depuis {owner}@{remote} ?", "Remote share" : "Partage distant", "Remote share password" : "Mot de passe du partage distant", @@ -26,7 +26,11 @@ OC.L10N.register( "Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet élément est déjà partagé avec %s", "Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur", "File is already shared with %s" : "Le fichier est déjà partagé avec %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.", "Could not find share" : "Impossible de trouver le partage", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s", "You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}", "Accept" : "Accepter", "Decline" : "Refuser", diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json index 3af2ca0e44d..55588ac6044 100644 --- a/apps/federatedfilesharing/l10n/fr.json +++ b/apps/federatedfilesharing/l10n/fr.json @@ -1,5 +1,5 @@ { "translations": { - "Federated sharing" : "Federated sharing", + "Federated sharing" : "Partage fédéré", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} depuis {owner}@{remote} ?", "Remote share" : "Partage distant", "Remote share password" : "Mot de passe du partage distant", @@ -24,7 +24,11 @@ "Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet élément est déjà partagé avec %s", "Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur", "File is already shared with %s" : "Le fichier est déjà partagé avec %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Le partage de %s a échoué, impossible de trouver %s, le serveur est peut-être momentanément injoignable ou utilise un certificat auto-signé.", "Could not find share" : "Impossible de trouver le partage", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous avez reçu \"%3$s\" en tant que partage distant de %1$s (de la part de %2$s)", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Vous avez reçu {share} comme partage distant de la part de {user} (de la part de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Vous avez reçu \"%3$s\" comme partage distant de %1$s", "You received {share} as a remote share from {user}" : "Vous avez reçu {share} comme partage distant de la part de {user}", "Accept" : "Accepter", "Decline" : "Refuser", diff --git a/apps/federatedfilesharing/l10n/it.js b/apps/federatedfilesharing/l10n/it.js index 02195f552e1..1f067d5524c 100644 --- a/apps/federatedfilesharing/l10n/it.js +++ b/apps/federatedfilesharing/l10n/it.js @@ -17,7 +17,7 @@ OC.L10N.register( "Couldn't establish a federated share, maybe the password was wrong." : "Impossibile stabilire una condivisione federata, forse la password non è corretta.", "Federated Share request was successful, you will receive a invitation. Check your notifications." : "La richiesta della condivisione federata è stata eseguita con successo, riceverai un invito. Controlla le tue notifiche.", "The mountpoint name contains invalid characters." : "Il nome del punto di mount contiene caratteri non validi.", - "Not allowed to create a federated share with the owner." : "Non è consentito di creare una condivisione federata con il proprietario.", + "Not allowed to create a federated share with the owner." : "Non è consentito creare una condivisione federata con il proprietario.", "Invalid or untrusted SSL certificate" : "Certificato SSL non valido o non attendibile", "Could not authenticate to remote share, password might be wrong" : "Impossibile autenticarsi sulla condivisione remota, la password potrebbe essere errata", "Storage not valid" : "Archiviazione non valida", diff --git a/apps/federatedfilesharing/l10n/it.json b/apps/federatedfilesharing/l10n/it.json index 97b821c1cbd..30df8ca9356 100644 --- a/apps/federatedfilesharing/l10n/it.json +++ b/apps/federatedfilesharing/l10n/it.json @@ -15,7 +15,7 @@ "Couldn't establish a federated share, maybe the password was wrong." : "Impossibile stabilire una condivisione federata, forse la password non è corretta.", "Federated Share request was successful, you will receive a invitation. Check your notifications." : "La richiesta della condivisione federata è stata eseguita con successo, riceverai un invito. Controlla le tue notifiche.", "The mountpoint name contains invalid characters." : "Il nome del punto di mount contiene caratteri non validi.", - "Not allowed to create a federated share with the owner." : "Non è consentito di creare una condivisione federata con il proprietario.", + "Not allowed to create a federated share with the owner." : "Non è consentito creare una condivisione federata con il proprietario.", "Invalid or untrusted SSL certificate" : "Certificato SSL non valido o non attendibile", "Could not authenticate to remote share, password might be wrong" : "Impossibile autenticarsi sulla condivisione remota, la password potrebbe essere errata", "Storage not valid" : "Archiviazione non valida", diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js index 746968163e1..cc14f8dead6 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -7,6 +7,7 @@ OC.L10N.register( "Remote share password" : "Wachtwoord externe share", "Cancel" : "Annuleren", "Add remote share" : "Toevoegen externe share", + "Copy" : "Kopiëren", "Copied!" : "Gekopieerd!", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index af1f688c6ec..62e4cb7faf6 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -5,6 +5,7 @@ "Remote share password" : "Wachtwoord externe share", "Cancel" : "Annuleren", "Add remote share" : "Toevoegen externe share", + "Copy" : "Kopiëren", "Copied!" : "Gekopieerd!", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", diff --git a/apps/federation/appinfo/info.xml b/apps/federation/appinfo/info.xml index cec3f8341a9..a5eeb133d9e 100644 --- a/apps/federation/appinfo/info.xml +++ b/apps/federation/appinfo/info.xml @@ -9,7 +9,7 @@ <namespace>Federation</namespace> <category>other</category> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <default_enable/> <types> diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js index 10fabbeb9b9..9e3ed763168 100644 --- a/apps/federation/js/settings-admin.js +++ b/apps/federation/js/settings-admin.js @@ -18,66 +18,125 @@ * */ -$(document).ready(function () { +(function( $ ) { + + // ocFederationAddServer + $.fn.ocFederationAddServer = function() { + + /* Go easy on jquery and define some vars + ========================================================================== */ + + var $wrapper = $(this), + + // Buttons + $btnAddServer = $wrapper.find("#ocFederationAddServerButton"), + $btnSubmit = $wrapper.find("#ocFederationSubmit"), + + // Inputs + $inpServerUrl = $wrapper.find("#serverUrl"), + $inpAutoAddServers = $wrapper.find("#autoAddServers"), + + // misc + $msgBox = $wrapper.find("#ocFederationAddServer .msg"), + $srvList = $wrapper.find("#listOfTrustedServers"); + + + /* Interaction + ========================================================================== */ + + $btnAddServer.on('click', function() { + $btnAddServer.addClass('hidden'); + $inpServerUrl + .removeClass('hidden') + .focus(); + }); + + // trigger server removal + $srvList.on('click', 'li > .icon-delete', function() { + var $this = $(this).parent(); + var id = $this.attr('id'); + + removeServer( id ); + }); + + $inpAutoAddServers.on("change", function() { + $.post( + OC.generateUrl('/apps/federation/auto-add-servers'), + { + autoAddServers: $(this).is(":checked") + } + ); + }); + + $btnSubmit.on("click", function() + { + addServer($inpServerUrl.val()); + }); - // show input field to add a new trusted server - $("#ocFederationAddServer").on('click', function() { - $('#ocFederationAddServerButton').addClass('hidden'); - $("#serverUrl").removeClass('hidden'); - $("#serverUrl").focus(); - }); - - // add new trusted server - $("#serverUrl").keyup(function (e) { - if (e.keyCode === 13) { // add server on "enter" - var url = $('#serverUrl').val(); - OC.msg.startSaving('#ocFederationAddServer .msg'); - $.post( - OC.generateUrl('/apps/federation/trusted-servers'), - { - url: url - } - ).done(function (data) { - $('#serverUrl').attr('value', ''); - $('ul#listOfTrustedServers').prepend( - $('<li>') - .attr('id', data.id) - .html('<span class="status indeterminate"></span>' + - data.url + - '<span class="icon icon-delete"></span>') - ); - OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message); - }) - .fail(function (jqXHR) { - OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).message); - }); - } else if (e.keyCode === 27) { // hide input filed again in ESC - $('#ocFederationAddServerButton').toggleClass('hidden'); - $("#serverUrl").toggleClass('hidden'); - } - }); - -// remove trusted server from list - $( "#listOfTrustedServers" ).on('click', 'li > .icon-delete', function() { - var $this = $(this).parent(); - var id = $this.attr('id'); - $.ajax({ - url: OC.generateUrl('/apps/federation/trusted-servers/' + id), - type: 'DELETE', - success: function(response) { - $this.remove(); - } - }); - - }); - - $("#ocFederationSettings #autoAddServers").change(function() { - $.post( - OC.generateUrl('/apps/federation/auto-add-servers'), - { - autoAddServers: $(this).is(":checked") - } - ); - }); + $inpServerUrl.on("change keyup", function (e) { + + console.log("typing away"); + + url = $(this).val(); + + // toggle add-button visiblity based on input length + if ( url.length > 0 ) + $btnSubmit.removeClass("hidden") + else + $btnSubmit.addClass("hidden") + + if (e.keyCode === 13) { // add server on "enter" + addServer(url); + } else if (e.keyCode === 27) { // hide input filed again in ESC + $btnAddServer.removeClass('hidden'); + $inpServerUrl.val("").addClass('hidden'); + $btnSubmit.addClass('hidden'); + } + }); + }; + + /* private Functions + ========================================================================== */ + + function addServer( url ) { + OC.msg.startSaving('#ocFederationAddServer .msg'); + + $.post( + OC.generateUrl('/apps/federation/trusted-servers'), + { + url: url + } + ).done(function (data) { + $("#serverUrl").attr('value', ''); + $("#listOfTrustedServers").prepend( + $('<li>') + .attr('id', data.id) + .html('<span class="status indeterminate"></span>' + + data.url + + '<span class="icon icon-delete"></span>') + ); + OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message); + }) + .fail(function (jqXHR) { + OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).message); + }); + }; + + function removeServer( id ) { + $.ajax({ + url: OC.generateUrl('/apps/federation/trusted-servers/' + id), + type: 'DELETE', + success: function(response) { + $("#ocFederationSettings").find("#" + id).remove(); + } + }); + } + + +})( jQuery ); + +$(document).ready(function () { + $('#ocFederationSettings').ocFederationAddServer(); + }); diff --git a/apps/federation/l10n/de_DE.js b/apps/federation/l10n/de_DE.js index 5421e2fa50c..118432b2b53 100644 --- a/apps/federation/l10n/de_DE.js +++ b/apps/federation/l10n/de_DE.js @@ -6,8 +6,8 @@ OC.L10N.register( "No server to federate with found" : "Kein Server gefunden, der sich verbinden ließe", "Could not add server" : "Konnte Server nicht hinzufügen", "Federation" : "Federation", - "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation erlaubt es Ihnen sich mit anderen vertrauenswürdigen Servern zu verbinden um das Benutzerverzeichnis auszutauschen. Diese Funktion wird beispielsweise für die Autovervollständigung externer Benutzer genutzt und ermöglicht das Teilen von Inhalten mit ihnen (\"federated sharing\").", - "Add server automatically once a federated share was created successfully" : "Server automatisch hinzufügen sobale eine federated Freigabe erstellt wurde", + "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation erlaubt es Ihnen sich mit anderen vertrauenswürdigen Servern zu verbinden um das Benutzerverzeichnis auszutauschen. Diese Funktion wird beispielsweise für die Autovervollständigung externer Benutzer genutzt und ermöglicht das Teilen von Inhalten mit Ihnen (\"federated sharing\").", + "Add server automatically once a federated share was created successfully" : "Server automatisch hinzufügen sobald eine federated Freigabe erstellt wurde", "Trusted Servers" : "Vertrauenswürdige Server", "+ Add Nextcloud server" : "+ Nextcloud Server hinzufügen", "Nextcloud Server" : "Nextcloud Server", diff --git a/apps/federation/l10n/de_DE.json b/apps/federation/l10n/de_DE.json index 039ec743911..ecc6db7ec63 100644 --- a/apps/federation/l10n/de_DE.json +++ b/apps/federation/l10n/de_DE.json @@ -4,8 +4,8 @@ "No server to federate with found" : "Kein Server gefunden, der sich verbinden ließe", "Could not add server" : "Konnte Server nicht hinzufügen", "Federation" : "Federation", - "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation erlaubt es Ihnen sich mit anderen vertrauenswürdigen Servern zu verbinden um das Benutzerverzeichnis auszutauschen. Diese Funktion wird beispielsweise für die Autovervollständigung externer Benutzer genutzt und ermöglicht das Teilen von Inhalten mit ihnen (\"federated sharing\").", - "Add server automatically once a federated share was created successfully" : "Server automatisch hinzufügen sobale eine federated Freigabe erstellt wurde", + "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation erlaubt es Ihnen sich mit anderen vertrauenswürdigen Servern zu verbinden um das Benutzerverzeichnis auszutauschen. Diese Funktion wird beispielsweise für die Autovervollständigung externer Benutzer genutzt und ermöglicht das Teilen von Inhalten mit Ihnen (\"federated sharing\").", + "Add server automatically once a federated share was created successfully" : "Server automatisch hinzufügen sobald eine federated Freigabe erstellt wurde", "Trusted Servers" : "Vertrauenswürdige Server", "+ Add Nextcloud server" : "+ Nextcloud Server hinzufügen", "Nextcloud Server" : "Nextcloud Server", diff --git a/apps/federation/lib/TrustedServers.php b/apps/federation/lib/TrustedServers.php index f802af594dc..1376dd683d3 100644 --- a/apps/federation/lib/TrustedServers.php +++ b/apps/federation/lib/TrustedServers.php @@ -137,7 +137,7 @@ class TrustedServers { * @return bool */ public function getAutoAddServers() { - $value = $this->config->getAppValue('federation', 'autoAddServers', '1'); + $value = $this->config->getAppValue('federation', 'autoAddServers', '0'); return $value === '1'; } diff --git a/apps/federation/templates/settings-admin.php b/apps/federation/templates/settings-admin.php index 8773851c768..0514bad8ee2 100644 --- a/apps/federation/templates/settings-admin.php +++ b/apps/federation/templates/settings-admin.php @@ -19,6 +19,7 @@ style('federation', 'settings-admin') <p id="ocFederationAddServer"> <button id="ocFederationAddServerButton" class=""><?php p($l->t('+ Add Nextcloud server')); ?></button> <input id="serverUrl" class="hidden" type="text" value="" placeholder="<?php p($l->t('Nextcloud Server')); ?>" name="server_url"/> + <button id="ocFederationSubmit" class="hidden"><?php p($l->t('Add')); ?></button> <span class="msg"></span> </p> <ul id="listOfTrustedServers"> diff --git a/apps/federation/tests/TrustedServersTest.php b/apps/federation/tests/TrustedServersTest.php index d16c0908dd4..598c2f01c90 100644 --- a/apps/federation/tests/TrustedServersTest.php +++ b/apps/federation/tests/TrustedServersTest.php @@ -172,7 +172,7 @@ class TrustedServersTest extends TestCase { */ public function testGetAutoAddServers($status, $expected) { $this->config->expects($this->once())->method('getAppValue') - ->with('federation', 'autoAddServers', '1')->willReturn($status); + ->with('federation', 'autoAddServers', '0')->willReturn($status); $this->assertSame($expected, $this->trustedServers->getAutoAddServers() diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php index afb327e24ba..a194bb5e795 100644 --- a/apps/files/appinfo/app.php +++ b/apps/files/appinfo/app.php @@ -67,16 +67,3 @@ $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadshe 'name' => $l->t('Recent'), ]; }); - -\OC::$server->getActivityManager()->registerExtension(function() { - return new \OCA\Files\Activity( - \OC::$server->query('L10NFactory'), - \OC::$server->getURLGenerator(), - \OC::$server->getActivityManager(), - new \OCA\Files\ActivityHelper( - \OC::$server->getTagManager() - ), - \OC::$server->getDatabaseConnection(), - \OC::$server->getConfig() - ); -}); diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index 37a85f33afc..1992b94a03c 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -11,12 +11,31 @@ <filesystem/> </types> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <documentation> <user>user-files</user> </documentation> + <activity> + <settings> + <setting>OCA\Files\Activity\Settings\FileChanged</setting> + <setting>OCA\Files\Activity\Settings\FileCreated</setting> + <setting>OCA\Files\Activity\Settings\FileDeleted</setting> + <setting>OCA\Files\Activity\Settings\FileFavorite</setting> + <setting>OCA\Files\Activity\Settings\FileRestored</setting> + </settings> + + <filters> + <filter>OCA\Files\Activity\Filter\FileChanges</filter> + <filter>OCA\Files\Activity\Filter\Favorites</filter> + </filters> + + <providers> + <provider>OCA\Files\Activity\Provider</provider> + </providers> + </activity> + <background-jobs> <job>OCA\Files\BackgroundJob\ScanFiles</job> <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job> diff --git a/apps/files/css/detailsView.css b/apps/files/css/detailsView.css index 2ec16993ef5..094f44fdf05 100644 --- a/apps/files/css/detailsView.css +++ b/apps/files/css/detailsView.css @@ -19,8 +19,8 @@ } #app-sidebar .mainFileInfoView .permalink { - margin-left: 10px; - opacity: .5; + padding: 6px 10px; + vertical-align: text-top; } #app-sidebar .mainFileInfoView .permalink-field>input { clear: both; @@ -106,10 +106,18 @@ #app-sidebar .file-details { color: #999; } + #app-sidebar .file-details img { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; opacity: .5; } + +#app-sidebar .file-details img:hover, +#app-sidebar .file-details img:focus{ + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} + #app-sidebar .action-favorite { vertical-align: text-bottom; padding: 10px; diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css index 8e2ef23221d..c465f890dda 100644 --- a/apps/files/css/mobile.css +++ b/apps/files/css/mobile.css @@ -61,9 +61,9 @@ table td.filename .nametext .innernametext { max-width: 50%; } -/* ellipsis on user names in share sidebar */ +/* ellipsis on user names in share sidebar, less on mobile */ #shareWithList .username { - max-width: 80px !important; + max-width: 80px !important; } /* proper notification area for multi line messages */ diff --git a/apps/files/img/add-color.svg b/apps/files/img/add-color.svg new file mode 100644 index 00000000000..acf5543c43f --- /dev/null +++ b/apps/files/img/add-color.svg @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <g transform="matrix(-.70711 -.70711 .70711 -.70711 -724.85 753.16)" fill="#00d400"> + <path d="m3.7547 1041.6 1.4142-1.4142 3.5355 3.5355 3.5355-3.5355 1.4142 1.4142-3.5355 3.5355 3.5355 3.5356-1.4142 1.4142-3.5355-3.5356-3.5164 3.5547-1.4333-1.4333 3.5355-3.5356z" fill="#00d400"/> + </g> +</svg> diff --git a/apps/files/img/change.svg b/apps/files/img/change.svg new file mode 100644 index 00000000000..cbc5d982b30 --- /dev/null +++ b/apps/files/img/change.svg @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <path d="m7.9375 0c-3.1175 0.023214-6.0756 1.876-7.3438 4.9375l2.7812 1.1563c1.0568-2.5513 3.98-3.7756 6.5312-2.7188 0.8628 0.3573 1.5738 0.9274 2.0938 1.625l-2 2h6v-6l-1.875 1.875c-0.802-0.9616-1.825-1.7688-3.063-2.2812-1.02-0.4227-2.0853-0.60149-3.1245-0.59375z"/> + <path d="m0 9.5v6l2.0938-2.094c0.7676 0.843 1.7205 1.535 2.8437 2 4.082 1.691 8.7775-0.262 10.468-4.344l-2.781-1.1558c-1.057 2.5508-3.98 3.7758-6.5312 2.7188-0.7435-0.308-1.3509-0.805-1.8438-1.375l1.75-1.75h-6z"/> +</svg> diff --git a/apps/files/img/delete-color.svg b/apps/files/img/delete-color.svg new file mode 100644 index 00000000000..810c63e811b --- /dev/null +++ b/apps/files/img/delete-color.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <path d="m12.95 11.536-1.414 1.414-3.536-3.5358-3.5355 3.5358-1.4142-1.414 3.5355-3.536-3.5355-3.5356 1.4142-1.4142 3.5355 3.5356 3.516-3.5547 1.434 1.4333-3.5357 3.5356z" fill="#d40000"/> +</svg> diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index c53fa4f3d66..fb0439114ed 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -923,7 +923,8 @@ tr, fileData, newTrs = [], - isAllSelected = this.isAllSelected(); + isAllSelected = this.isAllSelected(), + showHidden = this._filesConfig.get('showhidden'); if (index >= this.files.length) { return false; @@ -947,7 +948,10 @@ } newTrs.push(tr); index++; - count--; + // only count visible rows + if (showHidden || !tr.hasClass('hidden-file')) { + count--; + } } // trigger event for newly added rows @@ -2158,7 +2162,7 @@ self.filesClient.putFileContents( targetPath, - '', + ' ', // dont create empty files which fails on some storage backends { contentType: 'text/plain', overwrite: true diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 1681e2c7e48..99f888ce0f7 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -379,14 +379,19 @@ var dragOptions={ $selectedFiles = $(this); } $selectedFiles.closest('tr').addClass('animate-opacity dragging'); + $selectedFiles.closest('tr').filter('.ui-droppable').droppable( 'disable' ); + }, stop: function(event, ui) { var $selectedFiles = $('td.filename input:checkbox:checked'); if (!$selectedFiles.length) { $selectedFiles = $(this); } + var $tr = $selectedFiles.closest('tr'); $tr.removeClass('dragging'); + $tr.filter('.ui-droppable').droppable( 'enable' ); + setTimeout(function() { $tr.removeClass('animate-opacity'); }, 300); @@ -454,4 +459,3 @@ function fileDownloadPath(dir, file) { // for backward compatibility window.Files = OCA.Files.Files; - diff --git a/apps/files/js/mainfileinfodetailview.js b/apps/files/js/mainfileinfodetailview.js index 20cedcf4e82..e9259f75ba1 100644 --- a/apps/files/js/mainfileinfodetailview.js +++ b/apps/files/js/mainfileinfodetailview.js @@ -15,7 +15,7 @@ '<div class="fileName">' + '<h3 title="{{name}}" class="ellipsis">{{name}}</h3>' + '<a class="permalink" href="{{permalink}}" title="{{permalinkTitle}}">' + - '<span class="icon icon-public"></span>' + + '<span class="icon icon-clippy"></span>' + '<span class="hidden-visually">{{permalinkTitle}}</span>' + '</a>' + '</div>' + @@ -157,7 +157,7 @@ starAltText: isFavorite ? t('files', 'Favorited') : t('files', 'Favorite'), starIcon: OC.imagePath('core', isFavorite ? 'actions/starred' : 'actions/star'), permalink: this._makePermalink(this.model.get('id')), - permalinkTitle: t('files', 'Local link') + permalinkTitle: t('files', 'Copy local link') })); // TODO: we really need OC.Previews diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index cf5fde9e2fd..967c95a7db3 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -3,15 +3,16 @@ OC.L10N.register( { "Storage is temporarily not available" : "Временно хранилището не е налично.", "Storage invalid" : "Невалидно хранилище.", - "Unknown error" : "Непозната грешка.", + "Unknown error" : "Неизвестна грешка", "Files" : "Файлове", "All files" : "Всички файлове", "Home" : "Домашен", "Close" : "Затвори", "Favorites" : "Любими", + "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена", "Upload cancelled." : "Качването е прекъснато.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}", "Not enough free space" : "Няма достатъчно свободно място", "Uploading..." : "Качване...", "..." : "...", @@ -21,17 +22,25 @@ OC.L10N.register( "Actions" : "Действия", "Download" : "Изтегли", "Rename" : "Преименуване", - "Delete" : "Изтрий", + "Move" : "Преместване", + "Delete" : "Изтриване", "Disconnect storage" : "Извади хранилището", - "Unshare" : "Премахване на споделяне", + "Unshare" : "Прекратяване на споделяне", "Details" : "Детайли", "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", "This operation is forbidden" : "Операцията е забранена", + "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора", "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен защото съществува в дестинацията", "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен", "{newName} already exists" : "{newName} вече съществува", + "Could not rename \"{fileName}\", it does not exist any more" : "Файлът \"{fileName}\" не може да бъде преименуван защото не съществува", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" вече се ползва от директория \"{dir}\". Моля, изберете друго име.", + "Could not rename \"{fileName}\"" : "\"{fileName}\" не може да бъде преименуван", + "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден", + "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува", + "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува", "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".", "Name" : "Име", "Size" : "Размер", @@ -50,34 +59,52 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).", "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "], + "Path" : "Път", + "_%n byte_::_%n bytes_" : ["%n байт","%n байта"], "Favorited" : "Отбелязано в любими", "Favorite" : "Любими", "Folder" : "Папка", "New folder" : "Нова папка", "Upload" : "Качване", - "An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките", - "A new file or folder has been <strong>created</strong>" : "<strong>Създаване</strong> на нов файл / папка", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Изпращай известия за създаване / промяна само за <strong>любимите файлове</strong> <em>(Само за потока)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Изтриване</strong> на файл / папка", - "A file or folder has been <strong>restored</strong>" : "<strong>Възстановяване</strong> на файл / папка", - "You created %1$s" : "Вие създадохте %1$s.", - "%2$s created %1$s" : "%2$s създаде %1$s.", + "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети", + "Created by %s" : "Създаден от %s", + "Created by {user1}" : "Създаден от {user1}", + "Changed by %2$s" : "Променен от %2$s", + "Changed by {user1}" : "Променен от {user1}", + "Deleted by %2$s" : "Изтрит от %2$s", + "Deleted by {user1}" : "Изтрит от {user1}", + "Restored by %2$s" : "Възстанвен от %2$s", + "Restored by {user1}" : "Възстановен от {user1}", + "Renamed by %2$s" : "Преимеуван от %2$s", + "Renamed by {user1}" : "Преименуван от {user1}", + "Moved by %2$s" : "Преместен от %2$s", + "Moved by {user1}" : "Преместен от {user1}", + "You created %1$s" : "Вие създадохте %1$s", + "You created {file1}" : "Вие създадохте {file1}", + "%2$s created %1$s" : "%2$s създаде %1$s", + "{user1} created {file1}" : "{user1} създаде {file1}", "%1$s was created in a public folder" : "%1$s е създаден в публична папка", - "You changed %1$s" : "Вие променихте %1$s.", - "%2$s changed %1$s" : "%2$s промени %1$s.", - "You deleted %1$s" : "Вие изтрихте %1$s.", + "You changed %1$s" : "Вие променихте %1$s", + "You changed {file1}" : "Вие променихте {file1}", + "%2$s changed %1$s" : "%2$s промени %1$s", + "{user1} changed {file1}" : "{user1} промени {file1}", + "You deleted %1$s" : "Вие изтрихте %1$s", + "You deleted {file1}" : "Вие променихте {file1}", "%2$s deleted %1$s" : "%2$s изтри %1$s.", + "{user1} deleted {file1}" : "{user1} изтри {file1}", "You restored %1$s" : "Вие възстановихте %1$s", + "You restored {file1}" : "Вие възстановихте {file1}", "%2$s restored %1$s" : "%2$s възстанови %1$s", - "You renamed %2$s to %1$s" : "Преименувахте %2$s на %1$s", + "{user1} restored {file1}" : "{user1} възстанови {file1}", + "You renamed %2$s to %1$s" : "Вие преименувахте %2$s на %1$s", "%2$s renamed %3$s to %1$s" : "%2$s преименува %3$s на %1$s", - "You moved %2$s to %1$s" : "Преместихте %2$s в %1$s", + "You moved %2$s to %1$s" : "Вие преместихте %2$s в %1$s", + "You moved {file2} to {file1}" : "Вие преместихте {file2} в {file1}", "%2$s moved %3$s to %1$s" : "%2$s премести %3$s в %1$s", - "Changed by %2$s" : "Променен от %2$s", - "Deleted by %2$s" : "Изтрит от %2$s", - "Restored by %2$s" : "Възстанвен от %2$s", - "Renamed by %2$s" : "Преимеуван от %2$s", - "Moved by %2$s" : "Преместен от %2$s", + "{user1} moved {file2} to {file1}" : "{user1} премести {file2} в {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "<strong>Промяна</strong> или <strong>преименуване</strong> на файл / папка", + "A new file or folder has been <strong>created</strong>" : "<strong>Създаване</strong> на нов файл / папка", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Изпращай известия само при създаване / промяна на <strong>любими файлове</strong> <em>(Само за потока)</em>", "Upload (max. %s)" : "Качи (макс. %s)", "File handling" : "Операция с файла", "Maximum upload size" : "Максимален размер", @@ -96,22 +123,27 @@ OC.L10N.register( "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитвате да качите са по-големи от позволеното на сървъра.", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", + "Shared with you" : "Споделено с вас", + "Shared with others" : "Споделено с други", + "Shared by link" : "Споделено с връзка", + "Tags" : "Етикети", + "Deleted files" : "Изтрити файлове", "Text file" : "Текстов файл", "New text file.txt" : "Нов текст file.txt", - "Storage not available" : "Хранилището не е налично.", + "Storage not available" : "Хранилището не е налично", "Unable to set upload directory." : "Неуспешно задаване на директория за качване.", - "Invalid Token" : "Невалиеден токен.", - "No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.", + "Invalid Token" : "Невалиеден токен", + "No file was uploaded. Unknown error" : "Нито един файл не е качен. Неизвестна грешка", "There is no error, the file uploaded with success" : "Файлът е качен успешно.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Файлът, който се опитваше да качиш надвишава зададения upload_max_filesize размер в php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Файлът, който се опитваш да качиш надвишава стойностите в MAX_FILE_SIZE в HTML формата.", - "The uploaded file was only partially uploaded" : "Файлът е качен частично.", - "No file was uploaded" : "Неуспешно качване.", - "Missing a temporary folder" : "Липсва временна папка.", - "Failed to write to disk" : "Възникна проблем при запис на диска.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Размерът на файла надвишава максималния размер определен от upload_max_filesize в php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.", + "The uploaded file was only partially uploaded" : "Файлът е качен частично", + "No file was uploaded" : "Файлът не е качен", + "Missing a temporary folder" : "Липсва временна папка", + "Failed to write to disk" : "Възникна проблем при запис на диска", "Not enough storage available" : "Недостатъчно място в хранилището", "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", - "Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.", + "Upload failed. Could not find uploaded file" : "Неуспешно качване. Качения файл не е намерен", "Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.", "Invalid directory." : "Невалидна директория.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", @@ -120,6 +152,9 @@ OC.L10N.register( "No entries in this folder match '{filter}'" : "Нищо в тази папка не пасва на '{filter}'", "{newname} already exists" : "{newname} вече съществува", "A file or folder has been <strong>changed</strong>" : "<strong>Промяна</strong> на файл / папка", - "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ползвайте следния адрес <a href=\"%s\" target=\"_blank\">за да достъпите файловете чрез WebDAV</a>" + "A file or folder has been <strong>deleted</strong>" : "<strong>Изтриване</strong> на файл / папка", + "A file or folder has been <strong>restored</strong>" : "<strong>Възстановяване</strong> на на файл / папка", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ползвайте следния адрес <a href=\"%s\" target=\"_blank\">за да достъпите файловете чрез WebDAV</a>", + "Cancel upload" : "Прекрати качването" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index b079d72d22c..47121992918 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -1,15 +1,16 @@ { "translations": { "Storage is temporarily not available" : "Временно хранилището не е налично.", "Storage invalid" : "Невалидно хранилище.", - "Unknown error" : "Непозната грешка.", + "Unknown error" : "Неизвестна грешка", "Files" : "Файлове", "All files" : "Всички файлове", "Home" : "Домашен", "Close" : "Затвори", "Favorites" : "Любими", + "Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена", "Upload cancelled." : "Качването е прекъснато.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}", "Not enough free space" : "Няма достатъчно свободно място", "Uploading..." : "Качване...", "..." : "...", @@ -19,17 +20,25 @@ "Actions" : "Действия", "Download" : "Изтегли", "Rename" : "Преименуване", - "Delete" : "Изтрий", + "Move" : "Преместване", + "Delete" : "Изтриване", "Disconnect storage" : "Извади хранилището", - "Unshare" : "Премахване на споделяне", + "Unshare" : "Прекратяване на споделяне", "Details" : "Детайли", "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", "This operation is forbidden" : "Операцията е забранена", + "This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора", "Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен защото съществува в дестинацията", "Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен", "{newName} already exists" : "{newName} вече съществува", + "Could not rename \"{fileName}\", it does not exist any more" : "Файлът \"{fileName}\" не може да бъде преименуван защото не съществува", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" вече се ползва от директория \"{dir}\". Моля, изберете друго име.", + "Could not rename \"{fileName}\"" : "\"{fileName}\" не може да бъде преименуван", + "Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден", + "Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува", + "Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува", "Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".", "Name" : "Име", "Size" : "Размер", @@ -48,34 +57,52 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).", "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "], + "Path" : "Път", + "_%n byte_::_%n bytes_" : ["%n байт","%n байта"], "Favorited" : "Отбелязано в любими", "Favorite" : "Любими", "Folder" : "Папка", "New folder" : "Нова папка", "Upload" : "Качване", - "An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките", - "A new file or folder has been <strong>created</strong>" : "<strong>Създаване</strong> на нов файл / папка", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Изпращай известия за създаване / промяна само за <strong>любимите файлове</strong> <em>(Само за потока)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Изтриване</strong> на файл / папка", - "A file or folder has been <strong>restored</strong>" : "<strong>Възстановяване</strong> на файл / папка", - "You created %1$s" : "Вие създадохте %1$s.", - "%2$s created %1$s" : "%2$s създаде %1$s.", + "An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети", + "Created by %s" : "Създаден от %s", + "Created by {user1}" : "Създаден от {user1}", + "Changed by %2$s" : "Променен от %2$s", + "Changed by {user1}" : "Променен от {user1}", + "Deleted by %2$s" : "Изтрит от %2$s", + "Deleted by {user1}" : "Изтрит от {user1}", + "Restored by %2$s" : "Възстанвен от %2$s", + "Restored by {user1}" : "Възстановен от {user1}", + "Renamed by %2$s" : "Преимеуван от %2$s", + "Renamed by {user1}" : "Преименуван от {user1}", + "Moved by %2$s" : "Преместен от %2$s", + "Moved by {user1}" : "Преместен от {user1}", + "You created %1$s" : "Вие създадохте %1$s", + "You created {file1}" : "Вие създадохте {file1}", + "%2$s created %1$s" : "%2$s създаде %1$s", + "{user1} created {file1}" : "{user1} създаде {file1}", "%1$s was created in a public folder" : "%1$s е създаден в публична папка", - "You changed %1$s" : "Вие променихте %1$s.", - "%2$s changed %1$s" : "%2$s промени %1$s.", - "You deleted %1$s" : "Вие изтрихте %1$s.", + "You changed %1$s" : "Вие променихте %1$s", + "You changed {file1}" : "Вие променихте {file1}", + "%2$s changed %1$s" : "%2$s промени %1$s", + "{user1} changed {file1}" : "{user1} промени {file1}", + "You deleted %1$s" : "Вие изтрихте %1$s", + "You deleted {file1}" : "Вие променихте {file1}", "%2$s deleted %1$s" : "%2$s изтри %1$s.", + "{user1} deleted {file1}" : "{user1} изтри {file1}", "You restored %1$s" : "Вие възстановихте %1$s", + "You restored {file1}" : "Вие възстановихте {file1}", "%2$s restored %1$s" : "%2$s възстанови %1$s", - "You renamed %2$s to %1$s" : "Преименувахте %2$s на %1$s", + "{user1} restored {file1}" : "{user1} възстанови {file1}", + "You renamed %2$s to %1$s" : "Вие преименувахте %2$s на %1$s", "%2$s renamed %3$s to %1$s" : "%2$s преименува %3$s на %1$s", - "You moved %2$s to %1$s" : "Преместихте %2$s в %1$s", + "You moved %2$s to %1$s" : "Вие преместихте %2$s в %1$s", + "You moved {file2} to {file1}" : "Вие преместихте {file2} в {file1}", "%2$s moved %3$s to %1$s" : "%2$s премести %3$s в %1$s", - "Changed by %2$s" : "Променен от %2$s", - "Deleted by %2$s" : "Изтрит от %2$s", - "Restored by %2$s" : "Възстанвен от %2$s", - "Renamed by %2$s" : "Преимеуван от %2$s", - "Moved by %2$s" : "Преместен от %2$s", + "{user1} moved {file2} to {file1}" : "{user1} премести {file2} в {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "<strong>Промяна</strong> или <strong>преименуване</strong> на файл / папка", + "A new file or folder has been <strong>created</strong>" : "<strong>Създаване</strong> на нов файл / папка", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Изпращай известия само при създаване / промяна на <strong>любими файлове</strong> <em>(Само за потока)</em>", "Upload (max. %s)" : "Качи (макс. %s)", "File handling" : "Операция с файла", "Maximum upload size" : "Максимален размер", @@ -94,22 +121,27 @@ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитвате да качите са по-големи от позволеното на сървъра.", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", + "Shared with you" : "Споделено с вас", + "Shared with others" : "Споделено с други", + "Shared by link" : "Споделено с връзка", + "Tags" : "Етикети", + "Deleted files" : "Изтрити файлове", "Text file" : "Текстов файл", "New text file.txt" : "Нов текст file.txt", - "Storage not available" : "Хранилището не е налично.", + "Storage not available" : "Хранилището не е налично", "Unable to set upload directory." : "Неуспешно задаване на директория за качване.", - "Invalid Token" : "Невалиеден токен.", - "No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.", + "Invalid Token" : "Невалиеден токен", + "No file was uploaded. Unknown error" : "Нито един файл не е качен. Неизвестна грешка", "There is no error, the file uploaded with success" : "Файлът е качен успешно.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Файлът, който се опитваше да качиш надвишава зададения upload_max_filesize размер в php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Файлът, който се опитваш да качиш надвишава стойностите в MAX_FILE_SIZE в HTML формата.", - "The uploaded file was only partially uploaded" : "Файлът е качен частично.", - "No file was uploaded" : "Неуспешно качване.", - "Missing a temporary folder" : "Липсва временна папка.", - "Failed to write to disk" : "Възникна проблем при запис на диска.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Размерът на файла надвишава максималния размер определен от upload_max_filesize в php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Размерът на файла надвишава максималния размер определен от MAX_FILE_SIZE в HTML формата.", + "The uploaded file was only partially uploaded" : "Файлът е качен частично", + "No file was uploaded" : "Файлът не е качен", + "Missing a temporary folder" : "Липсва временна папка", + "Failed to write to disk" : "Възникна проблем при запис на диска", "Not enough storage available" : "Недостатъчно място в хранилището", "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", - "Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.", + "Upload failed. Could not find uploaded file" : "Неуспешно качване. Качения файл не е намерен", "Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.", "Invalid directory." : "Невалидна директория.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", @@ -118,6 +150,9 @@ "No entries in this folder match '{filter}'" : "Нищо в тази папка не пасва на '{filter}'", "{newname} already exists" : "{newname} вече съществува", "A file or folder has been <strong>changed</strong>" : "<strong>Промяна</strong> на файл / папка", - "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ползвайте следния адрес <a href=\"%s\" target=\"_blank\">за да достъпите файловете чрез WebDAV</a>" + "A file or folder has been <strong>deleted</strong>" : "<strong>Изтриване</strong> на файл / папка", + "A file or folder has been <strong>restored</strong>" : "<strong>Възстановяване</strong> на на файл / папка", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ползвайте следния адрес <a href=\"%s\" target=\"_blank\">за да достъпите файловете чрез WebDAV</a>", + "Cancel upload" : "Прекрати качването" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index 3773498f6ca..7f03049ef40 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -1,40 +1,34 @@ OC.L10N.register( "files", { - "Storage not available" : "Emmagatzemament no disponible", "Storage invalid" : "Emmagatzemament no vàlid", "Unknown error" : "Error desconegut", - "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", - "Invalid Token" : "Testimoni no vàlid", - "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", - "There is no error, the file uploaded with success" : "No hi ha errors, el fitxer s'ha carregat correctament", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", - "The uploaded file was only partially uploaded" : "El fitxer només s'ha carregat parcialment", - "No file was uploaded" : "No s'ha carregat cap fitxer", - "Missing a temporary folder" : "Falta un fitxer temporal", - "Failed to write to disk" : "Ha fallat en escriure al disc", - "Not enough storage available" : "No hi ha prou espai disponible", - "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", - "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", - "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", - "Invalid directory." : "Directori no vàlid.", "Files" : "Fitxers", "All files" : "Tots els fitxers", + "Recent" : "Recent", + "File could not be found" : "No s'ha pogut trobar el fitxer", "Home" : "Casa", "Close" : "Tanca", "Favorites" : "Preferits", + "Could not create folder \"{dir}\"" : "No s'ha pogut crear la carpeta \"{dir}\"", "Upload cancelled." : "La pujada s'ha cancel·lat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", - "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", - "Could not get result from server." : "No hi ha resposta del servidor.", + "Not enough free space" : "Espai lliure insuficient", "Uploading..." : "Pujant...", "..." : "...", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "falten {minutes}:{seconds} minut{plural_s}", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "queden {seconds} segon{plural_s}", + "{seconds}s" : "{seconds}s", + "Soon..." : "Aviat...", "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", "Download" : "Baixa", "Rename" : "Reanomena", + "Move" : "Mou", + "Target folder" : "Carpeta de destí", "Delete" : "Esborra", "Disconnect storage" : "Desonnecta l'emmagatzematge", "Unshare" : "Deixa de compartir", @@ -42,7 +36,12 @@ OC.L10N.register( "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", - "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", + "This operation is forbidden" : "Aquesta operació està prohibida", + "Could not move \"{file}\", target exists" : "No s'ha pugut moure \"{file}\", el destí ja existeix", + "Could not move \"{file}\"" : "No s'ha pogut moure \"{file}\"", + "{newName} already exists" : "{newName} ja existeix", + "Could not rename \"{fileName}\"" : "No s'ha pogut renombrar \"{fileName}\"", + "Could not create file \"{file}\"" : "No s'ha pogut crear el fitxer \"{file}\"", "Name" : "Nom", "Size" : "Mida", "Modified" : "Modificat", @@ -59,14 +58,16 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Emmagatzematge de {owner} està gairebé ple ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"], + "View in folder" : "Veure a la carpeta", + "Path" : "Ruta", "Favorited" : "Agregat a favorits", "Favorite" : "Preferits", + "Local link" : "Enllaç local", "Folder" : "Carpeta", "New folder" : "Carpeta nova", "Upload" : "Puja", "An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes", "A new file or folder has been <strong>created</strong>" : "S'ha <strong>creat</strong> un nou fitxer o una nova carpeta", - "A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar les notificacions sobre la creació i canvis dels seus <strong>arxius favorits</strong><em>(solament Stream)</em>", "A file or folder has been <strong>deleted</strong>" : "S'ha <strong>elminiat</strong> un fitxer o una carpeta", "A file or folder has been <strong>restored</strong>" : "S'ha <strong>restaurat</strong> un fitxer o una carpeta", @@ -79,12 +80,20 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s ha esborrat %1$s", "You restored %1$s" : "Has restaurat %1$s", "%2$s restored %1$s" : "%2$s ha restaurat %1$s", + "You moved %2$s to %1$s" : "Has mogut %2$s a %1$s", + "%2$s moved %3$s to %1$s" : "%2$s ha mogut %3$s a %1$s", + "Changed by %2$s" : "Modificat per %2$s", + "Deleted by %2$s" : "Esborrat per %2$s", + "Renamed by %2$s" : "Renombrat per %2$s", + "Moved by %2$s" : "Mogut per %2$s", + "File changes" : "Canvis al fitxer", "Upload (max. %s)" : "Pujada (màx. %s)", "File handling" : "Gestió de fitxers", "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", "Settings" : "Arranjament", + "Show hidden files" : "Mostra els fitxers ocults", "WebDAV" : "WebDAV", "No files in here" : "No hi ha arxius", "Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.", @@ -94,6 +103,34 @@ OC.L10N.register( "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", "No favorites" : "No hi ha favorits", "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", - "Text file" : "Fitxer de text" + "Shared with you" : "Compartit amb tu", + "Shared with others" : "Compartit amb altres", + "Tags" : "Etiquetes", + "Deleted files" : "Fitxers esborrats", + "Text file" : "Fitxer de text", + "New text file.txt" : "Nou fitxer de text.txt", + "Storage not available" : "Emmagatzemament no disponible", + "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", + "Invalid Token" : "Testimoni no vàlid", + "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", + "There is no error, the file uploaded with success" : "No hi ha errors, el fitxer s'ha carregat correctament", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", + "The uploaded file was only partially uploaded" : "El fitxer només s'ha carregat parcialment", + "No file was uploaded" : "No s'ha carregat cap fitxer", + "Missing a temporary folder" : "Falta un fitxer temporal", + "Failed to write to disk" : "Ha fallat en escriure al disc", + "Not enough storage available" : "No hi ha prou espai disponible", + "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", + "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", + "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", + "Invalid directory." : "Directori no vàlid.", + "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", + "Error uploading file \"{fileName}\": {message}" : "Error pujant el fitxer \"{fileName}\": {message}", + "Could not get result from server." : "No hi ha resposta del servidor.", + "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", + "{newname} already exists" : "{newname} ja existeix", + "A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta", + "Cancel upload" : "Cancel·la la pujada" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 2444742b1bd..9cedb8be4b6 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -1,38 +1,32 @@ { "translations": { - "Storage not available" : "Emmagatzemament no disponible", "Storage invalid" : "Emmagatzemament no vàlid", "Unknown error" : "Error desconegut", - "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", - "Invalid Token" : "Testimoni no vàlid", - "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", - "There is no error, the file uploaded with success" : "No hi ha errors, el fitxer s'ha carregat correctament", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", - "The uploaded file was only partially uploaded" : "El fitxer només s'ha carregat parcialment", - "No file was uploaded" : "No s'ha carregat cap fitxer", - "Missing a temporary folder" : "Falta un fitxer temporal", - "Failed to write to disk" : "Ha fallat en escriure al disc", - "Not enough storage available" : "No hi ha prou espai disponible", - "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", - "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", - "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", - "Invalid directory." : "Directori no vàlid.", "Files" : "Fitxers", "All files" : "Tots els fitxers", + "Recent" : "Recent", + "File could not be found" : "No s'ha pogut trobar el fitxer", "Home" : "Casa", "Close" : "Tanca", "Favorites" : "Preferits", + "Could not create folder \"{dir}\"" : "No s'ha pogut crear la carpeta \"{dir}\"", "Upload cancelled." : "La pujada s'ha cancel·lat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", - "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", - "Could not get result from server." : "No hi ha resposta del servidor.", + "Not enough free space" : "Espai lliure insuficient", "Uploading..." : "Pujant...", "..." : "...", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "falten {minutes}:{seconds} minut{plural_s}", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "queden {seconds} segon{plural_s}", + "{seconds}s" : "{seconds}s", + "Soon..." : "Aviat...", "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", "Download" : "Baixa", "Rename" : "Reanomena", + "Move" : "Mou", + "Target folder" : "Carpeta de destí", "Delete" : "Esborra", "Disconnect storage" : "Desonnecta l'emmagatzematge", "Unshare" : "Deixa de compartir", @@ -40,7 +34,12 @@ "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", - "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", + "This operation is forbidden" : "Aquesta operació està prohibida", + "Could not move \"{file}\", target exists" : "No s'ha pugut moure \"{file}\", el destí ja existeix", + "Could not move \"{file}\"" : "No s'ha pogut moure \"{file}\"", + "{newName} already exists" : "{newName} ja existeix", + "Could not rename \"{fileName}\"" : "No s'ha pogut renombrar \"{fileName}\"", + "Could not create file \"{file}\"" : "No s'ha pogut crear el fitxer \"{file}\"", "Name" : "Nom", "Size" : "Mida", "Modified" : "Modificat", @@ -57,14 +56,16 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Emmagatzematge de {owner} està gairebé ple ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"], + "View in folder" : "Veure a la carpeta", + "Path" : "Ruta", "Favorited" : "Agregat a favorits", "Favorite" : "Preferits", + "Local link" : "Enllaç local", "Folder" : "Carpeta", "New folder" : "Carpeta nova", "Upload" : "Puja", "An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes", "A new file or folder has been <strong>created</strong>" : "S'ha <strong>creat</strong> un nou fitxer o una nova carpeta", - "A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta", "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar les notificacions sobre la creació i canvis dels seus <strong>arxius favorits</strong><em>(solament Stream)</em>", "A file or folder has been <strong>deleted</strong>" : "S'ha <strong>elminiat</strong> un fitxer o una carpeta", "A file or folder has been <strong>restored</strong>" : "S'ha <strong>restaurat</strong> un fitxer o una carpeta", @@ -77,12 +78,20 @@ "%2$s deleted %1$s" : "%2$s ha esborrat %1$s", "You restored %1$s" : "Has restaurat %1$s", "%2$s restored %1$s" : "%2$s ha restaurat %1$s", + "You moved %2$s to %1$s" : "Has mogut %2$s a %1$s", + "%2$s moved %3$s to %1$s" : "%2$s ha mogut %3$s a %1$s", + "Changed by %2$s" : "Modificat per %2$s", + "Deleted by %2$s" : "Esborrat per %2$s", + "Renamed by %2$s" : "Renombrat per %2$s", + "Moved by %2$s" : "Mogut per %2$s", + "File changes" : "Canvis al fitxer", "Upload (max. %s)" : "Pujada (màx. %s)", "File handling" : "Gestió de fitxers", "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", "Settings" : "Arranjament", + "Show hidden files" : "Mostra els fitxers ocults", "WebDAV" : "WebDAV", "No files in here" : "No hi ha arxius", "Upload some content or sync with your devices!" : "Pugi continguts o sincronitzi els seus dispositius.", @@ -92,6 +101,34 @@ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", "No favorites" : "No hi ha favorits", "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", - "Text file" : "Fitxer de text" + "Shared with you" : "Compartit amb tu", + "Shared with others" : "Compartit amb altres", + "Tags" : "Etiquetes", + "Deleted files" : "Fitxers esborrats", + "Text file" : "Fitxer de text", + "New text file.txt" : "Nou fitxer de text.txt", + "Storage not available" : "Emmagatzemament no disponible", + "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", + "Invalid Token" : "Testimoni no vàlid", + "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", + "There is no error, the file uploaded with success" : "No hi ha errors, el fitxer s'ha carregat correctament", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "L’arxiu que voleu carregar supera el màxim definit en la directiva upload_max_filesize del php.ini:", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", + "The uploaded file was only partially uploaded" : "El fitxer només s'ha carregat parcialment", + "No file was uploaded" : "No s'ha carregat cap fitxer", + "Missing a temporary folder" : "Falta un fitxer temporal", + "Failed to write to disk" : "Ha fallat en escriure al disc", + "Not enough storage available" : "No hi ha prou espai disponible", + "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", + "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", + "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", + "Invalid directory." : "Directori no vàlid.", + "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", + "Error uploading file \"{fileName}\": {message}" : "Error pujant el fitxer \"{fileName}\": {message}", + "Could not get result from server." : "No hi ha resposta del servidor.", + "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", + "{newname} already exists" : "{newname} ja existeix", + "A file or folder has been <strong>changed</strong>" : "S'ha <strong>canviat</strong> un fitxer o una carpeta", + "Cancel upload" : "Cancel·la la pujada" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js index d9455874cb0..d915522a75d 100644 --- a/apps/files/l10n/cs_CZ.js +++ b/apps/files/l10n/cs_CZ.js @@ -76,35 +76,54 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"], "Favorited" : "Přidáno k oblíbeným", "Favorite" : "Oblíbené", - "Local link" : "Místní odkaz", "Folder" : "Adresář", "New folder" : "Nový adresář", "Upload" : "Odeslat", "An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba", - "A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omezovat oznámení o tvorbě a změnách <strong>oblíbených souborů</strong> <em>(Pouze v proudu)</em>", - "A file or folder has been <strong>deleted</strong>" : "Soubor nebo adresář byl <strong>smazán</strong>", - "A file or folder has been <strong>restored</strong>" : "Soubor nebo adresář byla <strong>obnoven</strong>", + "File changes" : "Změny souboru", + "Created by %s" : "Vytvořil(a) %s", + "Created by {user1}" : "Vytvořil(a) {user1}", + "Changed by %2$s" : "Změněno uživatelem %2$s", + "Changed by {user1}" : "Změnil(a) {user1}", + "Deleted by %2$s" : "Smazáno uživatelem %2$s", + "Deleted by {user1}" : "Smazal(a) {user1}", + "Restored by %2$s" : "Obnoveno uživatelem %2$s", + "Restored by {user1}" : "Obnovil(a) {user1}", + "Renamed by %2$s" : "Přejmenováno uživatelem %2$s", + "Renamed by {user1}" : "Přejmenoval(a) {user1}", + "Moved by %2$s" : "Přesunuto uživatelem %2$s", + "Moved by {user1}" : "Přesunul(a) {user1}", "You created %1$s" : "Vytvořili jste %1$s", + "You created {file1}" : "Vytvořil(a) jsi {file1}", "%2$s created %1$s" : "%2$s vytvořil(a) %1$s", + "{user1} created {file1}" : "{user1} vytvořil(a) {file1}", "%1$s was created in a public folder" : "%1$s byl vytvořen ve veřejném adresáři", + "{file1} was created in a public folder" : "{file1} byl vytvořen ve veřejném adresáři", "You changed %1$s" : "Změnili jste %1$s", + "You changed {file1}" : "Změnil(a) jsi {file1}", "%2$s changed %1$s" : "%2$s změnil(a) %1$s", + "{user1} changed {file1}" : "{user1} změnil(a) {file1}", "You deleted %1$s" : "Smazali jste %1$s", + "You deleted {file1}" : "Smazal(a) jsi {file1}", "%2$s deleted %1$s" : "%2$s smazal(a) %1$s", + "{user1} deleted {file1}" : "{user1} smazal(a) {file1}", "You restored %1$s" : "Obnovili jste %1$s", + "You restored {file1}" : "Obnovil(a) jsi {file1}", "%2$s restored %1$s" : "%2$s obnovil(a) %1$s", + "{user1} restored {file1}" : "{user1} obnovil(a) {file1}", "You renamed %2$s to %1$s" : "Přejmenoval jste %2$s na %1$s", + "You renamed {file2} to {file1}" : "Přejmenoval(a) jsi {file2} na {file1}", "%2$s renamed %3$s to %1$s" : "%2$s přejmenoval %3$s na %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} přejmenoval(a) {file2} na {file1}", "You moved %2$s to %1$s" : "Přesunul(a) jste %2$s na %1$s", + "You moved {file2} to {file1}" : "Přesunul(a) jsi {file2} do {file1}", "%2$s moved %3$s to %1$s" : "%2$s přesunul(a) %3$s na %1$s", - "Changed by %2$s" : "Změněno uživatelem %2$s", - "Deleted by %2$s" : "Smazáno uživatelem %2$s", - "Restored by %2$s" : "Obnoveno uživatelem %2$s", - "Renamed by %2$s" : "Přejmenováno uživatelem %2$s", - "Moved by %2$s" : "Přesunuto uživatelem %2$s", - "File changes" : "Změny souboru", + "{user1} moved {file2} to {file1}" : "{user1} přesunul(a) {file2} do {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>", + "A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář", + "A new file or folder has been <strong>deleted</strong>" : "Nový soubor nebo adresář byl <strong>smazán</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omezovat oznámení o tvorbě a změnách <strong>oblíbených souborů</strong> <em>(Pouze v proudu)</em>", + "A new file or folder has been <strong>restored</strong>" : "Nový soubor nebo adresář byl <strong>obnoven</strong>", "Upload (max. %s)" : "Nahrát (max. %s)", "File handling" : "Zacházení se soubory", "Maximum upload size" : "Maximální velikost pro odesílání", @@ -151,8 +170,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Chyba nahrávání souboru \"{fileName}\": {message}", "Could not get result from server." : "Nepodařilo se získat výsledek ze serveru.", "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", + "Local link" : "Místní odkaz", "{newname} already exists" : "{newname} již existuje", "A file or folder has been <strong>changed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong>", + "A file or folder has been <strong>deleted</strong>" : "Soubor nebo adresář byl <strong>smazán</strong>", + "A file or folder has been <strong>restored</strong>" : "Soubor nebo adresář byla <strong>obnoven</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup ke svým Souborům přes WebDAV</a>", "Cancel upload" : "Ukončit nahrávání" }, diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json index 3763a13dd01..f89157f4b5c 100644 --- a/apps/files/l10n/cs_CZ.json +++ b/apps/files/l10n/cs_CZ.json @@ -74,35 +74,54 @@ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"], "Favorited" : "Přidáno k oblíbeným", "Favorite" : "Oblíbené", - "Local link" : "Místní odkaz", "Folder" : "Adresář", "New folder" : "Nový adresář", "Upload" : "Odeslat", "An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba", - "A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omezovat oznámení o tvorbě a změnách <strong>oblíbených souborů</strong> <em>(Pouze v proudu)</em>", - "A file or folder has been <strong>deleted</strong>" : "Soubor nebo adresář byl <strong>smazán</strong>", - "A file or folder has been <strong>restored</strong>" : "Soubor nebo adresář byla <strong>obnoven</strong>", + "File changes" : "Změny souboru", + "Created by %s" : "Vytvořil(a) %s", + "Created by {user1}" : "Vytvořil(a) {user1}", + "Changed by %2$s" : "Změněno uživatelem %2$s", + "Changed by {user1}" : "Změnil(a) {user1}", + "Deleted by %2$s" : "Smazáno uživatelem %2$s", + "Deleted by {user1}" : "Smazal(a) {user1}", + "Restored by %2$s" : "Obnoveno uživatelem %2$s", + "Restored by {user1}" : "Obnovil(a) {user1}", + "Renamed by %2$s" : "Přejmenováno uživatelem %2$s", + "Renamed by {user1}" : "Přejmenoval(a) {user1}", + "Moved by %2$s" : "Přesunuto uživatelem %2$s", + "Moved by {user1}" : "Přesunul(a) {user1}", "You created %1$s" : "Vytvořili jste %1$s", + "You created {file1}" : "Vytvořil(a) jsi {file1}", "%2$s created %1$s" : "%2$s vytvořil(a) %1$s", + "{user1} created {file1}" : "{user1} vytvořil(a) {file1}", "%1$s was created in a public folder" : "%1$s byl vytvořen ve veřejném adresáři", + "{file1} was created in a public folder" : "{file1} byl vytvořen ve veřejném adresáři", "You changed %1$s" : "Změnili jste %1$s", + "You changed {file1}" : "Změnil(a) jsi {file1}", "%2$s changed %1$s" : "%2$s změnil(a) %1$s", + "{user1} changed {file1}" : "{user1} změnil(a) {file1}", "You deleted %1$s" : "Smazali jste %1$s", + "You deleted {file1}" : "Smazal(a) jsi {file1}", "%2$s deleted %1$s" : "%2$s smazal(a) %1$s", + "{user1} deleted {file1}" : "{user1} smazal(a) {file1}", "You restored %1$s" : "Obnovili jste %1$s", + "You restored {file1}" : "Obnovil(a) jsi {file1}", "%2$s restored %1$s" : "%2$s obnovil(a) %1$s", + "{user1} restored {file1}" : "{user1} obnovil(a) {file1}", "You renamed %2$s to %1$s" : "Přejmenoval jste %2$s na %1$s", + "You renamed {file2} to {file1}" : "Přejmenoval(a) jsi {file2} na {file1}", "%2$s renamed %3$s to %1$s" : "%2$s přejmenoval %3$s na %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} přejmenoval(a) {file2} na {file1}", "You moved %2$s to %1$s" : "Přesunul(a) jste %2$s na %1$s", + "You moved {file2} to {file1}" : "Přesunul(a) jsi {file2} do {file1}", "%2$s moved %3$s to %1$s" : "%2$s přesunul(a) %3$s na %1$s", - "Changed by %2$s" : "Změněno uživatelem %2$s", - "Deleted by %2$s" : "Smazáno uživatelem %2$s", - "Restored by %2$s" : "Obnoveno uživatelem %2$s", - "Renamed by %2$s" : "Přejmenováno uživatelem %2$s", - "Moved by %2$s" : "Přesunuto uživatelem %2$s", - "File changes" : "Změny souboru", + "{user1} moved {file2} to {file1}" : "{user1} přesunul(a) {file2} do {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong> nebo <strong>přejmenován</strong>", + "A new file or folder has been <strong>created</strong>" : "Byl <strong>vytvořen</strong> nový soubor nebo adresář", + "A new file or folder has been <strong>deleted</strong>" : "Nový soubor nebo adresář byl <strong>smazán</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omezovat oznámení o tvorbě a změnách <strong>oblíbených souborů</strong> <em>(Pouze v proudu)</em>", + "A new file or folder has been <strong>restored</strong>" : "Nový soubor nebo adresář byl <strong>obnoven</strong>", "Upload (max. %s)" : "Nahrát (max. %s)", "File handling" : "Zacházení se soubory", "Maximum upload size" : "Maximální velikost pro odesílání", @@ -149,8 +168,11 @@ "Error uploading file \"{fileName}\": {message}" : "Chyba nahrávání souboru \"{fileName}\": {message}", "Could not get result from server." : "Nepodařilo se získat výsledek ze serveru.", "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", + "Local link" : "Místní odkaz", "{newname} already exists" : "{newname} již existuje", "A file or folder has been <strong>changed</strong>" : "Soubor nebo adresář byl <strong>změněn</strong>", + "A file or folder has been <strong>deleted</strong>" : "Soubor nebo adresář byl <strong>smazán</strong>", + "A file or folder has been <strong>restored</strong>" : "Soubor nebo adresář byla <strong>obnoven</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup ke svým Souborům přes WebDAV</a>", "Cancel upload" : "Ukončit nahrávání" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index 641a0f98c03..6783e2ea435 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Local link" : "Lokaler Link", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", - "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", - "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", + "File changes" : "Dateiänderungen", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", + "Renamed by %2$s" : "Umbenannt von %2$s ", + "Moved by %2$s" : "Verschoben von %2$s", "You created %1$s" : "Du hast %1$s erstellt", "%2$s created %1$s" : "%2$s hat %1$s erstellt", "%1$s was created in a public folder" : "%1$s wurde in einem öffentlichen Ordner erstellt", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umebenannt", "You moved %2$s to %1$s" : "Du hast %2$s nach %1$s verschoben", "%2$s moved %3$s to %1$s" : "%2$s hat %3$s nach %1$s verschoben", - "Changed by %2$s" : "Geändert von %2$s", - "Deleted by %2$s" : "Gelöscht von %2$s", - "Restored by %2$s" : "Wiederhergestellt von %2$s", - "Renamed by %2$s" : "Umbenannt von %2$s ", - "Moved by %2$s" : "Verschoben von %2$s", - "File changes" : "Dateiänderungen", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Fehler beim Hochladen der Datei \"{fileName}\": {message}", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", + "Local link" : "Lokaler Link", "{newname} already exists" : "{newname} existiert bereits", "A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>", + "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", + "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf deine Dateien zuzugreifen</a>", "Cancel upload" : "Hochladen abbrechen" }, diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 8c28265370d..aad4aedc156 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Local link" : "Lokaler Link", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", - "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", - "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", + "File changes" : "Dateiänderungen", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", + "Renamed by %2$s" : "Umbenannt von %2$s ", + "Moved by %2$s" : "Verschoben von %2$s", "You created %1$s" : "Du hast %1$s erstellt", "%2$s created %1$s" : "%2$s hat %1$s erstellt", "%1$s was created in a public folder" : "%1$s wurde in einem öffentlichen Ordner erstellt", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umebenannt", "You moved %2$s to %1$s" : "Du hast %2$s nach %1$s verschoben", "%2$s moved %3$s to %1$s" : "%2$s hat %3$s nach %1$s verschoben", - "Changed by %2$s" : "Geändert von %2$s", - "Deleted by %2$s" : "Gelöscht von %2$s", - "Restored by %2$s" : "Wiederhergestellt von %2$s", - "Renamed by %2$s" : "Umbenannt von %2$s ", - "Moved by %2$s" : "Verschoben von %2$s", - "File changes" : "Dateiänderungen", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen auf deine <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Fehler beim Hochladen der Datei \"{fileName}\": {message}", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", + "Local link" : "Lokaler Link", "{newname} already exists" : "{newname} existiert bereits", "A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>", + "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", + "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf deine Dateien zuzugreifen</a>", "Cancel upload" : "Hochladen abbrechen" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 52022cc5013..c15f74a9a4a 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Local link" : "Lokaler Link", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", - "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen zu Ihren <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", - "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", + "File changes" : "Datei geändert", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", + "Renamed by %2$s" : "Umbenannt von %2$s", + "Moved by %2$s" : "Verschoben von %2$s", "You created %1$s" : "Sie haben %1$s erstellt", "%2$s created %1$s" : "%2$s hat %1$s erstellt", "%1$s was created in a public folder" : "%1$s wurde in einem öffentlichen Ordner erstellt", @@ -94,17 +94,22 @@ OC.L10N.register( "You deleted %1$s" : "Sie haben %1$s gelöscht", "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Sie haben %1$s wiederhergestellt", - "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", + "You restored {file1}" : "Sie haben {file1} wiederhergestellt", + "%2$s restored %1$s" : "%2$s hat %1$s wiederhergestellt ", + "{user1} restored {file1}" : "{user1} hat {file1} wiederhergestellt", "You renamed %2$s to %1$s" : "Sie haben %2$s in %1$s umbenannt", - "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umebenannt", + "You renamed {file2} to {file1}" : "Sie haben {file2} in {file1} umbenannt", + "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umbenannt", + "{user1} renamed {file2} to {file1}" : "{user1} hat {file2} in {file1} umbenannt", "You moved %2$s to %1$s" : "Sie haben %2$s nach %1$s verschoben", + "You moved {file2} to {file1}" : "Sie haben {file2} nach {file1} verschoben", "%2$s moved %3$s to %1$s" : "%2$s hat %3$s nach %1$s verschoben", - "Changed by %2$s" : "Geändert von %2$s", - "Deleted by %2$s" : "Gelöscht von %2$s", - "Restored by %2$s" : "Wiederhergestellt von %2$s", - "Renamed by %2$s" : "Umbenannt von %2$s", - "Moved by %2$s" : "Verschoben von %2$s", - "File changes" : "Datei geändert", + "{user1} moved {file2} to {file1}" : "{user1} hat {file2} nach {file1} verschoben", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", + "A new file or folder has been <strong>deleted</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>gelöscht</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen zu Ihren <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", + "A new file or folder has been <strong>restored</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>wiederhergestellt</strong>", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", @@ -151,8 +156,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Fehler beim Hochladen der Datei \"{fileName}\": {message}", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", + "Local link" : "Lokaler Link", "{newname} already exists" : "{newname} existiert bereits", "A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>", + "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", + "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">via WebDAV auf deine Dateien zuzugreifen</a>", "Cancel upload" : "Hochladen abbrechen" }, diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index a17cb51f71d..9cc6d5b253a 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Local link" : "Lokaler Link", "Folder" : "Ordner", "New folder" : "Neuer Ordner", "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", - "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen zu Ihren <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", - "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", + "File changes" : "Datei geändert", + "Changed by %2$s" : "Geändert von %2$s", + "Deleted by %2$s" : "Gelöscht von %2$s", + "Restored by %2$s" : "Wiederhergestellt von %2$s", + "Renamed by %2$s" : "Umbenannt von %2$s", + "Moved by %2$s" : "Verschoben von %2$s", "You created %1$s" : "Sie haben %1$s erstellt", "%2$s created %1$s" : "%2$s hat %1$s erstellt", "%1$s was created in a public folder" : "%1$s wurde in einem öffentlichen Ordner erstellt", @@ -92,17 +92,22 @@ "You deleted %1$s" : "Sie haben %1$s gelöscht", "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Sie haben %1$s wiederhergestellt", - "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", + "You restored {file1}" : "Sie haben {file1} wiederhergestellt", + "%2$s restored %1$s" : "%2$s hat %1$s wiederhergestellt ", + "{user1} restored {file1}" : "{user1} hat {file1} wiederhergestellt", "You renamed %2$s to %1$s" : "Sie haben %2$s in %1$s umbenannt", - "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umebenannt", + "You renamed {file2} to {file1}" : "Sie haben {file2} in {file1} umbenannt", + "%2$s renamed %3$s to %1$s" : "%2$s hat %3$s in %1$s umbenannt", + "{user1} renamed {file2} to {file1}" : "{user1} hat {file2} in {file1} umbenannt", "You moved %2$s to %1$s" : "Sie haben %2$s nach %1$s verschoben", + "You moved {file2} to {file1}" : "Sie haben {file2} nach {file1} verschoben", "%2$s moved %3$s to %1$s" : "%2$s hat %3$s nach %1$s verschoben", - "Changed by %2$s" : "Geändert von %2$s", - "Deleted by %2$s" : "Gelöscht von %2$s", - "Restored by %2$s" : "Wiederhergestellt von %2$s", - "Renamed by %2$s" : "Umbenannt von %2$s", - "Moved by %2$s" : "Verschoben von %2$s", - "File changes" : "Datei geändert", + "{user1} moved {file2} to {file1}" : "{user1} hat {file2} nach {file1} verschoben", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eine Datei oder Ordner wurden <strong>geändert</strong> oder <strong>umbenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>", + "A new file or folder has been <strong>deleted</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>gelöscht</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Benachrichtigungen über Neues und Änderungen zu Ihren <strong>favorisierten Dateien</strong> beschränken <em>(nur im Stream)</em>", + "A new file or folder has been <strong>restored</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>wiederhergestellt</strong>", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", @@ -149,8 +154,11 @@ "Error uploading file \"{fileName}\": {message}" : "Fehler beim Hochladen der Datei \"{fileName}\": {message}", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", + "Local link" : "Lokaler Link", "{newname} already exists" : "{newname} existiert bereits", "A file or folder has been <strong>changed</strong>" : "Eine Datei oder ein Ordner wurde <strong>geändert</strong>", + "A file or folder has been <strong>deleted</strong>" : "Eine Datei oder ein Ordner wurde <strong>gelöscht</strong>", + "A file or folder has been <strong>restored</strong>" : "Eine Datei oder ein Ordner wurde <strong>wiederhergestellt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\">via WebDAV auf deine Dateien zuzugreifen</a>", "Cancel upload" : "Hochladen abbrechen" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 7b593dcdc70..47ae6bd57fe 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -1,6 +1,7 @@ OC.L10N.register( "files", { + "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage invalid" : "Almacenamiento inválido", "Unknown error" : "Error desconocido", "Files" : "Archivos", @@ -14,6 +15,7 @@ OC.L10N.register( "Upload cancelled." : "Subida cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", + "Not enough free space" : "No hay espacio libre suficiente", "Uploading..." : "Subiendo...", "..." : "...", "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} hora{plural_s} pendiente", @@ -29,6 +31,8 @@ OC.L10N.register( "Actions" : "Acciones", "Download" : "Descargar", "Rename" : "Renombrar", + "Move" : "Mover", + "Target folder" : "Directorio destino", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar almacenamiento", "Unshare" : "Dejar de compartir", @@ -70,15 +74,15 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Agregado a Favoritos", "Favorite" : "Favorito", - "Local link" : "Enlace local", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "Upload" : "Subir", "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas", - "A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notificaiones acerca de la creación y cambios de sus <strong>archivos favoritos</strong><em>(Stream only)</em>", - "A file or folder has been <strong>deleted</strong>" : "Se ha <strong>eliminado</strong> un archivo o carpeta", - "A file or folder has been <strong>restored</strong>" : "Se ha <strong>restaurado</strong> un archivo o carpeta", + "Changed by %2$s" : "Cambiado por %2$s", + "Deleted by %2$s" : "Eliminado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", + "Renamed by %2$s" : "Renombrado por %2$s", + "Moved by %2$s" : "Movido por %2$s", "You created %1$s" : "Ha creado %1$s", "%2$s created %1$s" : "%2$s ha creado %1$s", "%1$s was created in a public folder" : "%1$s ha sido creado en una carpeta pública", @@ -92,11 +96,8 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s renombrado %3$s a %1$s", "You moved %2$s to %1$s" : "Has movido %2$s a %1$s", "%2$s moved %3$s to %1$s" : "%2$s movido %3$s a %1$s", - "Changed by %2$s" : "Cambiado por %2$s", - "Deleted by %2$s" : "Eliminado por %2$s", - "Restored by %2$s" : "Restaurado por %2$s", - "Renamed by %2$s" : "Renombrado por %2$s", - "Moved by %2$s" : "Movido por %2$s", + "A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notificaiones acerca de la creación y cambios de sus <strong>archivos favoritos</strong><em>(Stream only)</em>", "Upload (max. %s)" : "Subida (máx. %s)", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", @@ -116,6 +117,10 @@ OC.L10N.register( "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", + "Shared with you" : "Compartido con usted", + "Shared with others" : "Compartido con otros", + "Tags" : "Etiquetas", + "Deleted files" : "Archivos eliminados", "Text file" : "Archivo de texto", "New text file.txt" : "Nuevo archivo de texto.txt", "Storage not available" : "Almacenamiento no disponible", @@ -138,8 +143,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Error subiendo el archivo \"{fileName}\": {message}", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", + "Local link" : "Enlace local", "{newname} already exists" : "{newname} ya existe", "A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta", + "A file or folder has been <strong>deleted</strong>" : "Se ha <strong>eliminado</strong> un archivo o carpeta", + "A file or folder has been <strong>restored</strong>" : "Se ha <strong>restaurado</strong> un archivo o carpeta", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta direccioń para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV<a>", "Cancel upload" : "Cancelar la subida" }, diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 2b710c1e6f7..7373b91d2e6 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -1,4 +1,5 @@ { "translations": { + "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage invalid" : "Almacenamiento inválido", "Unknown error" : "Error desconocido", "Files" : "Archivos", @@ -12,6 +13,7 @@ "Upload cancelled." : "Subida cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", + "Not enough free space" : "No hay espacio libre suficiente", "Uploading..." : "Subiendo...", "..." : "...", "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} hora{plural_s} pendiente", @@ -27,6 +29,8 @@ "Actions" : "Acciones", "Download" : "Descargar", "Rename" : "Renombrar", + "Move" : "Mover", + "Target folder" : "Directorio destino", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar almacenamiento", "Unshare" : "Dejar de compartir", @@ -68,15 +72,15 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Agregado a Favoritos", "Favorite" : "Favorito", - "Local link" : "Enlace local", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "Upload" : "Subir", "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas", - "A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notificaiones acerca de la creación y cambios de sus <strong>archivos favoritos</strong><em>(Stream only)</em>", - "A file or folder has been <strong>deleted</strong>" : "Se ha <strong>eliminado</strong> un archivo o carpeta", - "A file or folder has been <strong>restored</strong>" : "Se ha <strong>restaurado</strong> un archivo o carpeta", + "Changed by %2$s" : "Cambiado por %2$s", + "Deleted by %2$s" : "Eliminado por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", + "Renamed by %2$s" : "Renombrado por %2$s", + "Moved by %2$s" : "Movido por %2$s", "You created %1$s" : "Ha creado %1$s", "%2$s created %1$s" : "%2$s ha creado %1$s", "%1$s was created in a public folder" : "%1$s ha sido creado en una carpeta pública", @@ -90,11 +94,8 @@ "%2$s renamed %3$s to %1$s" : "%2$s renombrado %3$s a %1$s", "You moved %2$s to %1$s" : "Has movido %2$s a %1$s", "%2$s moved %3$s to %1$s" : "%2$s movido %3$s a %1$s", - "Changed by %2$s" : "Cambiado por %2$s", - "Deleted by %2$s" : "Eliminado por %2$s", - "Restored by %2$s" : "Restaurado por %2$s", - "Renamed by %2$s" : "Renombrado por %2$s", - "Moved by %2$s" : "Movido por %2$s", + "A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitar las notificaiones acerca de la creación y cambios de sus <strong>archivos favoritos</strong><em>(Stream only)</em>", "Upload (max. %s)" : "Subida (máx. %s)", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", @@ -114,6 +115,10 @@ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "No favorites" : "No hay favoritos", "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", + "Shared with you" : "Compartido con usted", + "Shared with others" : "Compartido con otros", + "Tags" : "Etiquetas", + "Deleted files" : "Archivos eliminados", "Text file" : "Archivo de texto", "New text file.txt" : "Nuevo archivo de texto.txt", "Storage not available" : "Almacenamiento no disponible", @@ -136,8 +141,11 @@ "Error uploading file \"{fileName}\": {message}" : "Error subiendo el archivo \"{fileName}\": {message}", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", + "Local link" : "Enlace local", "{newname} already exists" : "{newname} ya existe", "A file or folder has been <strong>changed</strong>" : "Se ha <strong>modificado</strong> un archivo o carpeta", + "A file or folder has been <strong>deleted</strong>" : "Se ha <strong>eliminado</strong> un archivo o carpeta", + "A file or folder has been <strong>restored</strong>" : "Se ha <strong>restaurado</strong> un archivo o carpeta", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta direccioń para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV<a>", "Cancel upload" : "Cancelar la subida" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index 27655e4dc59..ae40cfe2725 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -70,15 +70,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", "Favorite" : "Suosikki", - "Local link" : "Paikallinen linkki", "Folder" : "Kansio", "New folder" : "Uusi kansio", "Upload" : "Lähetä", "An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe", - "A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Rajoita luomis- ja muutosilmoitukset <strong>omiin suosikkitiedostoihin</strong> <em>(Vain listaus)</em>", - "A file or folder has been <strong>deleted</strong>" : "Tiedosto tai kansio on <strong>poistettu</strong>", - "A file or folder has been <strong>restored</strong>" : "Tiedosto tai kansio on <strong>palautettu</strong>", + "Changed by %2$s" : "Muuttanut %2$s", + "Deleted by %2$s" : "Poistanut %2$s", + "Restored by %2$s" : "Palauttanut %2$s", "You created %1$s" : "Loit kohteen %1$s", "%2$s created %1$s" : "%2$s loi kohteen %1$s", "%1$s was created in a public folder" : "%1$s luotiin julkiseen kansioon", @@ -88,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s poisti kohteen %1$s", "You restored %1$s" : "Palautit kohteen %1$s", "%2$s restored %1$s" : "%2$s palautti kohteen %1$s", - "Changed by %2$s" : "Muuttanut %2$s", - "Deleted by %2$s" : "Poistanut %2$s", - "Restored by %2$s" : "Palauttanut %2$s", + "A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Rajoita luomis- ja muutosilmoitukset <strong>omiin suosikkitiedostoihin</strong> <em>(Vain listaus)</em>", "Upload (max. %s)" : "Lähetys (enintään %s)", "File handling" : "Tiedostonhallinta", "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", @@ -132,8 +129,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Virhe lähettäessä tiedostoa \"{fileName}\": {message}", "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", + "Local link" : "Paikallinen linkki", "{newname} already exists" : "{newname} on jo olemassa", "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>", + "A file or folder has been <strong>deleted</strong>" : "Tiedosto tai kansio on <strong>poistettu</strong>", + "A file or folder has been <strong>restored</strong>" : "Tiedosto tai kansio on <strong>palautettu</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAV:n yli</a>", "Cancel upload" : "Peru lähetys" }, diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index 759242905c9..8e14deb1607 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -68,15 +68,13 @@ "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", "Favorite" : "Suosikki", - "Local link" : "Paikallinen linkki", "Folder" : "Kansio", "New folder" : "Uusi kansio", "Upload" : "Lähetä", "An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe", - "A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Rajoita luomis- ja muutosilmoitukset <strong>omiin suosikkitiedostoihin</strong> <em>(Vain listaus)</em>", - "A file or folder has been <strong>deleted</strong>" : "Tiedosto tai kansio on <strong>poistettu</strong>", - "A file or folder has been <strong>restored</strong>" : "Tiedosto tai kansio on <strong>palautettu</strong>", + "Changed by %2$s" : "Muuttanut %2$s", + "Deleted by %2$s" : "Poistanut %2$s", + "Restored by %2$s" : "Palauttanut %2$s", "You created %1$s" : "Loit kohteen %1$s", "%2$s created %1$s" : "%2$s loi kohteen %1$s", "%1$s was created in a public folder" : "%1$s luotiin julkiseen kansioon", @@ -86,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s poisti kohteen %1$s", "You restored %1$s" : "Palautit kohteen %1$s", "%2$s restored %1$s" : "%2$s palautti kohteen %1$s", - "Changed by %2$s" : "Muuttanut %2$s", - "Deleted by %2$s" : "Poistanut %2$s", - "Restored by %2$s" : "Palauttanut %2$s", + "A new file or folder has been <strong>created</strong>" : "Uusi tiedosto tai kansio on <strong>luotu</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Rajoita luomis- ja muutosilmoitukset <strong>omiin suosikkitiedostoihin</strong> <em>(Vain listaus)</em>", "Upload (max. %s)" : "Lähetys (enintään %s)", "File handling" : "Tiedostonhallinta", "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", @@ -130,8 +127,11 @@ "Error uploading file \"{fileName}\": {message}" : "Virhe lähettäessä tiedostoa \"{fileName}\": {message}", "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", + "Local link" : "Paikallinen linkki", "{newname} already exists" : "{newname} on jo olemassa", "A file or folder has been <strong>changed</strong>" : "Tiedostoa tai kansiota on <strong>muutettu</strong>", + "A file or folder has been <strong>deleted</strong>" : "Tiedosto tai kansio on <strong>poistettu</strong>", + "A file or folder has been <strong>restored</strong>" : "Tiedosto tai kansio on <strong>palautettu</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAV:n yli</a>", "Cancel upload" : "Peru lähetys" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 0d5d7aa2e78..831f032d7b9 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -33,6 +33,7 @@ OC.L10N.register( "Download" : "Télécharger", "Rename" : "Renommer", "Move" : "Déplacer", + "Target folder" : "Dossier cible", "Delete" : "Supprimer", "Disconnect storage" : "Déconnecter ce support de stockage", "Unshare" : "Ne plus partager", @@ -52,6 +53,7 @@ OC.L10N.register( "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà", "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà", "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".", + "No search results in other folders for '{tag}{filter}{endtag}'" : "Aucun résultat dans d'autres dossiers n'a été trouvé pour '{tag}{filter}{endtag}'", "Name" : "Nom", "Size" : "Taille", "Modified" : "Modifié", @@ -74,34 +76,54 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marqué comme favori", "Favorite" : "Favoris", - "Local link" : "Dossier local", "Folder" : "Dossier", "New folder" : "Nouveau dossier", "Upload" : "Chargement", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", - "A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un fichier ou dossier a été <strong>modifié</strong> ou <strong>renommé</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limiter les notifications à ce qui concerne la création et la modification de vos <strong>fichiers favoris</strong> <em>(Flux uniquement)</em>", - "A file or folder has been <strong>deleted</strong>" : "Un fichier ou un répertoire a été <strong>supprimé</strong>", - "A file or folder has been <strong>restored</strong>" : "Un fichier ou un répertoire a été <strong>restauré</strong>", + "File changes" : "Modifications du fichier", + "Created by %s" : "Créé par %s", + "Created by {user1}" : "Créé par {user1}", + "Changed by %2$s" : "Modifié par %2$s", + "Changed by {user1}" : "Modifié par {user1}", + "Deleted by %2$s" : "Supprimé par %2$s", + "Deleted by {user1}" : "Supprimé par {user1}", + "Restored by %2$s" : "Restauré par %2$s", + "Restored by {user1}" : "Restauré par {user1}", + "Renamed by %2$s" : "Renommé par %2$s", + "Renamed by {user1}" : "Renommé par {user1}", + "Moved by %2$s" : "Déplacé par %2$s", + "Moved by {user1}" : "Déplacé par {user1}", "You created %1$s" : "Vous avez créé %1$s", + "You created {file1}" : "Vous avez créé {file1}", "%2$s created %1$s" : "%2$s a créé %1$s", + "{user1} created {file1}" : "{user1} a créé {file1}", "%1$s was created in a public folder" : "%1$s a été créé dans un dossier public", + "{file1} was created in a public folder" : "{file1} a été créé dans un dossier public", "You changed %1$s" : "Vous avez modifié %1$s", + "You changed {file1}" : "Vous avez modifié {file1}", "%2$s changed %1$s" : "%2$s a modifié %1$s", + "{user1} changed {file1}" : "{user1} a modifié {file1}", "You deleted %1$s" : "Vous avez supprimé %1$s", + "You deleted {file1}" : "Vous avez supprimé {file1}", "%2$s deleted %1$s" : "%2$s a supprimé %1$s", + "{user1} deleted {file1}" : "{user1} a supprimé {file1}", "You restored %1$s" : "Vous avez restauré %1$s", + "You restored {file1}" : "Vous avez restauré {file1}", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "{user1} restored {file1}" : "{user1} a restauré {file1}", "You renamed %2$s to %1$s" : "Vous avez renommé %2$s en %1$s", + "You renamed {file2} to {file1}" : "Vous avez renommé {file2} en {file1}", "%2$s renamed %3$s to %1$s" : "%2$s a renommé %3$s en %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} a renommé {file2} en {file1}", "You moved %2$s to %1$s" : "Vous avez déplacé %2$s dans %1$s", + "You moved {file2} to {file1}" : "Vous avez déplacé {file2} dans {file1}", "%2$s moved %3$s to %1$s" : "%2$s a déplacé %3$s dans %1$s", - "Changed by %2$s" : "Modifié par %2$s", - "Deleted by %2$s" : "Supprimé par %2$s", - "Restored by %2$s" : "Restauré par %2$s", - "Renamed by %2$s" : "Renommé par %2$s", - "Moved by %2$s" : "Déplacé par %2$s", + "{user1} moved {file2} to {file1}" : "{user1} a déplacé {file2} dans {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un fichier ou dossier a été <strong>modifié</strong> ou <strong>renommé</strong>", + "A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>", + "A new file or folder has been <strong>deleted</strong>" : "Un nouveau fichier ou répertoire a été <strong>supprimé</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limiter les notifications à ce qui concerne la création et la modification de vos <strong>fichiers favoris</strong> <em>(Flux uniquement)</em>", + "A new file or folder has been <strong>restored</strong>" : "Un nouveau fichier ou répertoire a été <strong>restauré</strong>", "Upload (max. %s)" : "Envoi (max. %s)", "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", @@ -148,8 +170,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Erreur lors de l'envoi du fichier \"{fileName}\" : {message}", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'", + "Local link" : "Dossier local", "{newname} already exists" : "{newname} existe déjà", "A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>", + "A file or folder has been <strong>deleted</strong>" : "Un fichier ou un répertoire a été <strong>supprimé</strong>", + "A file or folder has been <strong>restored</strong>" : "Un fichier ou un répertoire a été <strong>restauré</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>", "Cancel upload" : "Annuler le téléversement" }, diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 13d1c41739b..04d1eb94477 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -31,6 +31,7 @@ "Download" : "Télécharger", "Rename" : "Renommer", "Move" : "Déplacer", + "Target folder" : "Dossier cible", "Delete" : "Supprimer", "Disconnect storage" : "Déconnecter ce support de stockage", "Unshare" : "Ne plus partager", @@ -50,6 +51,7 @@ "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà", "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà", "Error deleting file \"{fileName}\"." : "Erreur à la suppression du fichier \"{fileName}\".", + "No search results in other folders for '{tag}{filter}{endtag}'" : "Aucun résultat dans d'autres dossiers n'a été trouvé pour '{tag}{filter}{endtag}'", "Name" : "Nom", "Size" : "Taille", "Modified" : "Modifié", @@ -72,34 +74,54 @@ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marqué comme favori", "Favorite" : "Favoris", - "Local link" : "Dossier local", "Folder" : "Dossier", "New folder" : "Nouveau dossier", "Upload" : "Chargement", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", - "A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un fichier ou dossier a été <strong>modifié</strong> ou <strong>renommé</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limiter les notifications à ce qui concerne la création et la modification de vos <strong>fichiers favoris</strong> <em>(Flux uniquement)</em>", - "A file or folder has been <strong>deleted</strong>" : "Un fichier ou un répertoire a été <strong>supprimé</strong>", - "A file or folder has been <strong>restored</strong>" : "Un fichier ou un répertoire a été <strong>restauré</strong>", + "File changes" : "Modifications du fichier", + "Created by %s" : "Créé par %s", + "Created by {user1}" : "Créé par {user1}", + "Changed by %2$s" : "Modifié par %2$s", + "Changed by {user1}" : "Modifié par {user1}", + "Deleted by %2$s" : "Supprimé par %2$s", + "Deleted by {user1}" : "Supprimé par {user1}", + "Restored by %2$s" : "Restauré par %2$s", + "Restored by {user1}" : "Restauré par {user1}", + "Renamed by %2$s" : "Renommé par %2$s", + "Renamed by {user1}" : "Renommé par {user1}", + "Moved by %2$s" : "Déplacé par %2$s", + "Moved by {user1}" : "Déplacé par {user1}", "You created %1$s" : "Vous avez créé %1$s", + "You created {file1}" : "Vous avez créé {file1}", "%2$s created %1$s" : "%2$s a créé %1$s", + "{user1} created {file1}" : "{user1} a créé {file1}", "%1$s was created in a public folder" : "%1$s a été créé dans un dossier public", + "{file1} was created in a public folder" : "{file1} a été créé dans un dossier public", "You changed %1$s" : "Vous avez modifié %1$s", + "You changed {file1}" : "Vous avez modifié {file1}", "%2$s changed %1$s" : "%2$s a modifié %1$s", + "{user1} changed {file1}" : "{user1} a modifié {file1}", "You deleted %1$s" : "Vous avez supprimé %1$s", + "You deleted {file1}" : "Vous avez supprimé {file1}", "%2$s deleted %1$s" : "%2$s a supprimé %1$s", + "{user1} deleted {file1}" : "{user1} a supprimé {file1}", "You restored %1$s" : "Vous avez restauré %1$s", + "You restored {file1}" : "Vous avez restauré {file1}", "%2$s restored %1$s" : "%2$s a restauré %1$s", + "{user1} restored {file1}" : "{user1} a restauré {file1}", "You renamed %2$s to %1$s" : "Vous avez renommé %2$s en %1$s", + "You renamed {file2} to {file1}" : "Vous avez renommé {file2} en {file1}", "%2$s renamed %3$s to %1$s" : "%2$s a renommé %3$s en %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} a renommé {file2} en {file1}", "You moved %2$s to %1$s" : "Vous avez déplacé %2$s dans %1$s", + "You moved {file2} to {file1}" : "Vous avez déplacé {file2} dans {file1}", "%2$s moved %3$s to %1$s" : "%2$s a déplacé %3$s dans %1$s", - "Changed by %2$s" : "Modifié par %2$s", - "Deleted by %2$s" : "Supprimé par %2$s", - "Restored by %2$s" : "Restauré par %2$s", - "Renamed by %2$s" : "Renommé par %2$s", - "Moved by %2$s" : "Déplacé par %2$s", + "{user1} moved {file2} to {file1}" : "{user1} a déplacé {file2} dans {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un fichier ou dossier a été <strong>modifié</strong> ou <strong>renommé</strong>", + "A new file or folder has been <strong>created</strong>" : "Un nouveau fichier ou répertoire a été <strong>créé</strong>", + "A new file or folder has been <strong>deleted</strong>" : "Un nouveau fichier ou répertoire a été <strong>supprimé</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limiter les notifications à ce qui concerne la création et la modification de vos <strong>fichiers favoris</strong> <em>(Flux uniquement)</em>", + "A new file or folder has been <strong>restored</strong>" : "Un nouveau fichier ou répertoire a été <strong>restauré</strong>", "Upload (max. %s)" : "Envoi (max. %s)", "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", @@ -146,8 +168,11 @@ "Error uploading file \"{fileName}\": {message}" : "Erreur lors de l'envoi du fichier \"{fileName}\" : {message}", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'", + "Local link" : "Dossier local", "{newname} already exists" : "{newname} existe déjà", "A file or folder has been <strong>changed</strong>" : "Un fichier ou un répertoire a été <strong>modifié</strong>", + "A file or folder has been <strong>deleted</strong>" : "Un fichier ou un répertoire a été <strong>supprimé</strong>", + "A file or folder has been <strong>restored</strong>" : "Un fichier ou un répertoire a été <strong>restauré</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>", "Cancel upload" : "Annuler le téléversement" },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js index 3b16c61da1b..a87febf2e18 100644 --- a/apps/files/l10n/hu_HU.js +++ b/apps/files/l10n/hu_HU.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Favorited" : "Kedvenc", "Favorite" : "Kedvenc", - "Local link" : "Helyi hivatkozás", "Folder" : "Mappa", "New folder" : "Új mappa", "Upload" : "Feltöltés", "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket", - "A new file or folder has been <strong>created</strong>" : "Új fájl vagy mappa <strong>létrehozva</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "A fájl vagy mappa <strong>megváltozott</strong> vagy <strong>át lett nevezve</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Szűkítse le az értesítéseket a létrehozásról és a változásokról a <strong>kedvenc fájlok</strong> <em>(Stream only)</em> -ra", - "A file or folder has been <strong>deleted</strong>" : "Fájl vagy mappa <strong>törölve</strong>", - "A file or folder has been <strong>restored</strong>" : "Fájl vagy mappa <strong>visszaállítva</strong>", + "File changes" : "Fájl változások", + "Changed by %2$s" : "Megváltoztatta: %2$s", + "Deleted by %2$s" : "Törölte: %2$s", + "Restored by %2$s" : "Visszaállította: %2$s", + "Renamed by %2$s" : "Átnevezte: %2$s", + "Moved by %2$s" : "Áthelyezte: %2$s", "You created %1$s" : "Létrehoztad: %1$s", "%2$s created %1$s" : "%2$s létrehozta: %1$s", "%1$s was created in a public folder" : "%1$s létrehozva egy nyilvános mappában", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s átnevezte ezt: %3$s erre: %1$s", "You moved %2$s to %1$s" : "Áthelyezted ezt: %2$s ide: %1$s", "%2$s moved %3$s to %1$s" : "%2$s áthelyezted ezt: %3$s ide: %1$s", - "Changed by %2$s" : "Megváltoztatta: %2$s", - "Deleted by %2$s" : "Törölte: %2$s", - "Restored by %2$s" : "Visszaállította: %2$s", - "Renamed by %2$s" : "Átnevezte: %2$s", - "Moved by %2$s" : "Áthelyezte: %2$s", - "File changes" : "Fájl változások", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "A fájl vagy mappa <strong>megváltozott</strong> vagy <strong>át lett nevezve</strong>", + "A new file or folder has been <strong>created</strong>" : "Új fájl vagy mappa <strong>létrehozva</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Szűkítse le az értesítéseket a létrehozásról és a változásokról a <strong>kedvenc fájlok</strong> <em>(Stream only)</em> -ra", "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Hiba történt a fájlfeltöltés közben: \"{fileName}\": {message}", "Could not get result from server." : "A szervertől nem kapható meg a művelet eredménye.", "No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a mappában '{filter}'", + "Local link" : "Helyi hivatkozás", "{newname} already exists" : "{newname} már létezik", "A file or folder has been <strong>changed</strong>" : "Fájl vagy mappa <strong>módosítva</strong>", + "A file or folder has been <strong>deleted</strong>" : "Fájl vagy mappa <strong>törölve</strong>", + "A file or folder has been <strong>restored</strong>" : "Fájl vagy mappa <strong>visszaállítva</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Használd ezt a címet <a href=\"%s\" target=\"_blank\">a Fájlok eléréséhez WebDAV-on keresztül</a>.", "Cancel upload" : "Feltöltés megszakítása" }, diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json index bae82270168..92161d4ae72 100644 --- a/apps/files/l10n/hu_HU.json +++ b/apps/files/l10n/hu_HU.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Favorited" : "Kedvenc", "Favorite" : "Kedvenc", - "Local link" : "Helyi hivatkozás", "Folder" : "Mappa", "New folder" : "Új mappa", "Upload" : "Feltöltés", "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket", - "A new file or folder has been <strong>created</strong>" : "Új fájl vagy mappa <strong>létrehozva</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "A fájl vagy mappa <strong>megváltozott</strong> vagy <strong>át lett nevezve</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Szűkítse le az értesítéseket a létrehozásról és a változásokról a <strong>kedvenc fájlok</strong> <em>(Stream only)</em> -ra", - "A file or folder has been <strong>deleted</strong>" : "Fájl vagy mappa <strong>törölve</strong>", - "A file or folder has been <strong>restored</strong>" : "Fájl vagy mappa <strong>visszaállítva</strong>", + "File changes" : "Fájl változások", + "Changed by %2$s" : "Megváltoztatta: %2$s", + "Deleted by %2$s" : "Törölte: %2$s", + "Restored by %2$s" : "Visszaállította: %2$s", + "Renamed by %2$s" : "Átnevezte: %2$s", + "Moved by %2$s" : "Áthelyezte: %2$s", "You created %1$s" : "Létrehoztad: %1$s", "%2$s created %1$s" : "%2$s létrehozta: %1$s", "%1$s was created in a public folder" : "%1$s létrehozva egy nyilvános mappában", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s átnevezte ezt: %3$s erre: %1$s", "You moved %2$s to %1$s" : "Áthelyezted ezt: %2$s ide: %1$s", "%2$s moved %3$s to %1$s" : "%2$s áthelyezted ezt: %3$s ide: %1$s", - "Changed by %2$s" : "Megváltoztatta: %2$s", - "Deleted by %2$s" : "Törölte: %2$s", - "Restored by %2$s" : "Visszaállította: %2$s", - "Renamed by %2$s" : "Átnevezte: %2$s", - "Moved by %2$s" : "Áthelyezte: %2$s", - "File changes" : "Fájl változások", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "A fájl vagy mappa <strong>megváltozott</strong> vagy <strong>át lett nevezve</strong>", + "A new file or folder has been <strong>created</strong>" : "Új fájl vagy mappa <strong>létrehozva</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Szűkítse le az értesítéseket a létrehozásról és a változásokról a <strong>kedvenc fájlok</strong> <em>(Stream only)</em> -ra", "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Hiba történt a fájlfeltöltés közben: \"{fileName}\": {message}", "Could not get result from server." : "A szervertől nem kapható meg a művelet eredménye.", "No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a mappában '{filter}'", + "Local link" : "Helyi hivatkozás", "{newname} already exists" : "{newname} már létezik", "A file or folder has been <strong>changed</strong>" : "Fájl vagy mappa <strong>módosítva</strong>", + "A file or folder has been <strong>deleted</strong>" : "Fájl vagy mappa <strong>törölve</strong>", + "A file or folder has been <strong>restored</strong>" : "Fájl vagy mappa <strong>visszaállítva</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Használd ezt a címet <a href=\"%s\" target=\"_blank\">a Fájlok eléréséhez WebDAV-on keresztül</a>.", "Cancel upload" : "Feltöltés megszakítása" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index fc9b9bdbb4c..237a6b0dec1 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -69,15 +69,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte"], "Favorited" : "Difavoritkan", "Favorite" : "Favorit", - "Local link" : "Pranala lokal", "Folder" : "Folder", "New folder" : "Map baru", "Upload" : "Unggah", "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label", - "A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Batas notifikasi tentang pembuatan dan perubahan <strong>berkas favorit</strong> Anda <em>(Hanya stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Sebuah berkas atau folder telah <strong>dihapus</strong>", - "A file or folder has been <strong>restored</strong>" : "Sebuah berkas atau folder telah <strong>dipulihkan</strong>", + "Changed by %2$s" : "Diubah oleh %2$s", + "Deleted by %2$s" : "Dihapus oleh %2$s", + "Restored by %2$s" : "Dipulihkan oleh %2$s", "You created %1$s" : "Anda membuat %1$s", "%2$s created %1$s" : "%2$s membuat %1$s", "%1$s was created in a public folder" : "%1$s telah dibuat di folder publik", @@ -87,9 +85,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s menghapus %1$s", "You restored %1$s" : "Anda memulihkan %1$s", "%2$s restored %1$s" : "%2$s memulihkan %1$s", - "Changed by %2$s" : "Diubah oleh %2$s", - "Deleted by %2$s" : "Dihapus oleh %2$s", - "Restored by %2$s" : "Dipulihkan oleh %2$s", + "A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Batas notifikasi tentang pembuatan dan perubahan <strong>berkas favorit</strong> Anda <em>(Hanya stream)</em>", "Upload (max. %s)" : "Unggah (maks. %s)", "File handling" : "Penanganan berkas", "Maximum upload size" : "Ukuran pengunggahan maksimum", @@ -131,8 +128,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Kesalahan saat mengunggah \"{filename}\": {message}", "Could not get result from server." : "Tidak mendapatkan hasil dari server.", "No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'", + "Local link" : "Pranala lokal", "{newname} already exists" : "{newname} sudah ada", "A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>", + "A file or folder has been <strong>deleted</strong>" : "Sebuah berkas atau folder telah <strong>dihapus</strong>", + "A file or folder has been <strong>restored</strong>" : "Sebuah berkas atau folder telah <strong>dipulihkan</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses berkas Anda melalui WebDAV</a>", "Cancel upload" : "Batalkan pengunggahan" }, diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index 663f865ecb5..7d1eaf17d53 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -67,15 +67,13 @@ "_%n byte_::_%n bytes_" : ["%n byte"], "Favorited" : "Difavoritkan", "Favorite" : "Favorit", - "Local link" : "Pranala lokal", "Folder" : "Folder", "New folder" : "Map baru", "Upload" : "Unggah", "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label", - "A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Batas notifikasi tentang pembuatan dan perubahan <strong>berkas favorit</strong> Anda <em>(Hanya stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Sebuah berkas atau folder telah <strong>dihapus</strong>", - "A file or folder has been <strong>restored</strong>" : "Sebuah berkas atau folder telah <strong>dipulihkan</strong>", + "Changed by %2$s" : "Diubah oleh %2$s", + "Deleted by %2$s" : "Dihapus oleh %2$s", + "Restored by %2$s" : "Dipulihkan oleh %2$s", "You created %1$s" : "Anda membuat %1$s", "%2$s created %1$s" : "%2$s membuat %1$s", "%1$s was created in a public folder" : "%1$s telah dibuat di folder publik", @@ -85,9 +83,8 @@ "%2$s deleted %1$s" : "%2$s menghapus %1$s", "You restored %1$s" : "Anda memulihkan %1$s", "%2$s restored %1$s" : "%2$s memulihkan %1$s", - "Changed by %2$s" : "Diubah oleh %2$s", - "Deleted by %2$s" : "Dihapus oleh %2$s", - "Restored by %2$s" : "Dipulihkan oleh %2$s", + "A new file or folder has been <strong>created</strong>" : "Sebuah berkas atau folder baru telah <strong>dibuat</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Batas notifikasi tentang pembuatan dan perubahan <strong>berkas favorit</strong> Anda <em>(Hanya stream)</em>", "Upload (max. %s)" : "Unggah (maks. %s)", "File handling" : "Penanganan berkas", "Maximum upload size" : "Ukuran pengunggahan maksimum", @@ -129,8 +126,11 @@ "Error uploading file \"{fileName}\": {message}" : "Kesalahan saat mengunggah \"{filename}\": {message}", "Could not get result from server." : "Tidak mendapatkan hasil dari server.", "No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'", + "Local link" : "Pranala lokal", "{newname} already exists" : "{newname} sudah ada", "A file or folder has been <strong>changed</strong>" : "Sebuah berkas atau folder telah <strong>diubah</strong>", + "A file or folder has been <strong>deleted</strong>" : "Sebuah berkas atau folder telah <strong>dihapus</strong>", + "A file or folder has been <strong>restored</strong>" : "Sebuah berkas atau folder telah <strong>dipulihkan</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses berkas Anda melalui WebDAV</a>", "Cancel upload" : "Batalkan pengunggahan" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 0886392a412..94d86a9a231 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -70,15 +70,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"], "Favorited" : "Sett í eftirlæti", "Favorite" : "Eftirlæti", - "Local link" : "Staðvær tengill", "Folder" : "Mappa", "New folder" : "Ný mappa", "Upload" : "Senda inn", "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin", - "A new file or folder has been <strong>created</strong>" : "Skjal eða mappa hefur verið <strong>búin til</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Takmarka tilkynningar um gerð og breytingar á <strong>eftirlætisskrám</strong> <em>(einungis streymi)</em>", - "A file or folder has been <strong>deleted</strong>" : "Skjali eða möppu hefur verið <strong>eytt</strong>", - "A file or folder has been <strong>restored</strong>" : "Skjal eða mappa hefur verið <strong>endurheimt</strong>", + "Changed by %2$s" : "Breytt af %2$s", + "Deleted by %2$s" : "Eytt af %2$s", + "Restored by %2$s" : "Endurheimt af %2$s", "You created %1$s" : "Þú bjóst til %1$s", "%2$s created %1$s" : "%2$s bjó til %1$s", "%1$s was created in a public folder" : "%1$s var búið til í opinni möppu", @@ -88,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s eyddi %1$s", "You restored %1$s" : "Þú endurheimtir %1$s", "%2$s restored %1$s" : "%2$s endurheimti %1$s", - "Changed by %2$s" : "Breytt af %2$s", - "Deleted by %2$s" : "Eytt af %2$s", - "Restored by %2$s" : "Endurheimt af %2$s", + "A new file or folder has been <strong>created</strong>" : "Skjal eða mappa hefur verið <strong>búin til</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Takmarka tilkynningar um gerð og breytingar á <strong>eftirlætisskrám</strong> <em>(einungis streymi)</em>", "Upload (max. %s)" : "Senda inn (hám. %s)", "File handling" : "Meðhöndlun skráar", "Maximum upload size" : "Hámarksstærð innsendingar", @@ -132,8 +129,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Villa við að senda inn skrána \"{fileName}\": {message}", "Could not get result from server." : "Fékk ekki niðurstöður frá þjóni.", "No entries in this folder match '{filter}'" : "Engar færslur í þessari möppu samsvara '{filter}'", + "Local link" : "Staðvær tengill", "{newname} already exists" : "{newname} er þegar til", "A file or folder has been <strong>changed</strong>" : "Skjali eða möppu hefur verið <strong>breytt</strong>", + "A file or folder has been <strong>deleted</strong>" : "Skjali eða möppu hefur verið <strong>eytt</strong>", + "A file or folder has been <strong>restored</strong>" : "Skjal eða mappa hefur verið <strong>endurheimt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\">nálgast skrárnar þínar með WebDAV</a>", "Cancel upload" : "Hætta við innsendingu" }, diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index efe8cfda39d..97f42689d32 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -68,15 +68,13 @@ "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"], "Favorited" : "Sett í eftirlæti", "Favorite" : "Eftirlæti", - "Local link" : "Staðvær tengill", "Folder" : "Mappa", "New folder" : "Ný mappa", "Upload" : "Senda inn", "An error occurred while trying to update the tags" : "Villa kom upp við að reyna að uppfæra merkin", - "A new file or folder has been <strong>created</strong>" : "Skjal eða mappa hefur verið <strong>búin til</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Takmarka tilkynningar um gerð og breytingar á <strong>eftirlætisskrám</strong> <em>(einungis streymi)</em>", - "A file or folder has been <strong>deleted</strong>" : "Skjali eða möppu hefur verið <strong>eytt</strong>", - "A file or folder has been <strong>restored</strong>" : "Skjal eða mappa hefur verið <strong>endurheimt</strong>", + "Changed by %2$s" : "Breytt af %2$s", + "Deleted by %2$s" : "Eytt af %2$s", + "Restored by %2$s" : "Endurheimt af %2$s", "You created %1$s" : "Þú bjóst til %1$s", "%2$s created %1$s" : "%2$s bjó til %1$s", "%1$s was created in a public folder" : "%1$s var búið til í opinni möppu", @@ -86,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s eyddi %1$s", "You restored %1$s" : "Þú endurheimtir %1$s", "%2$s restored %1$s" : "%2$s endurheimti %1$s", - "Changed by %2$s" : "Breytt af %2$s", - "Deleted by %2$s" : "Eytt af %2$s", - "Restored by %2$s" : "Endurheimt af %2$s", + "A new file or folder has been <strong>created</strong>" : "Skjal eða mappa hefur verið <strong>búin til</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Takmarka tilkynningar um gerð og breytingar á <strong>eftirlætisskrám</strong> <em>(einungis streymi)</em>", "Upload (max. %s)" : "Senda inn (hám. %s)", "File handling" : "Meðhöndlun skráar", "Maximum upload size" : "Hámarksstærð innsendingar", @@ -130,8 +127,11 @@ "Error uploading file \"{fileName}\": {message}" : "Villa við að senda inn skrána \"{fileName}\": {message}", "Could not get result from server." : "Fékk ekki niðurstöður frá þjóni.", "No entries in this folder match '{filter}'" : "Engar færslur í þessari möppu samsvara '{filter}'", + "Local link" : "Staðvær tengill", "{newname} already exists" : "{newname} er þegar til", "A file or folder has been <strong>changed</strong>" : "Skjali eða möppu hefur verið <strong>breytt</strong>", + "A file or folder has been <strong>deleted</strong>" : "Skjali eða möppu hefur verið <strong>eytt</strong>", + "A file or folder has been <strong>restored</strong>" : "Skjal eða mappa hefur verið <strong>endurheimt</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Notaðu þetta vistfang til að <a href=\"%s\" target=\"_blank\">nálgast skrárnar þínar með WebDAV</a>", "Cancel upload" : "Hætta við innsendingu" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index ab41af4a66c..d3293d6d1ce 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -13,7 +13,7 @@ OC.L10N.register( "Favorites" : "Preferiti", "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"", "Upload cancelled." : "Caricamento annullato.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più", "Not enough free space" : "Spazio libero insufficiente", @@ -61,7 +61,7 @@ OC.L10N.register( "_%n file_::_%n files_" : ["%n file","%n file"], "{dirs} and {files}" : "{dirs} e {files}", "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"], - "You don’t have permission to upload or create files here" : "Qui non hai i permessi di caricare o creare file", + "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"], "New" : "Nuovo", "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.", @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", - "Local link" : "Collegamento locale", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette", - "A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un file o una cartella sono stati <strong>modificato</strong> o<strong>rinominati</strong> ", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limita le notifiche relative alla creazione e alla modifica dei tuoi <strong>file preferiti</strong> <em>(Solo flusso)</em>", - "A file or folder has been <strong>deleted</strong>" : "Un file o una cartella è stato <strong>eliminato</strong>", - "A file or folder has been <strong>restored</strong>" : "Un file o una cartella è stato <strong>ripristinato</strong>", + "File changes" : "Modiche dei file", + "Changed by %2$s" : "Modificata da %2$s", + "Deleted by %2$s" : "Eliminata da %2$s", + "Restored by %2$s" : "Ripristinata da %2$s", + "Renamed by %2$s" : "Rinominata da %2$s", + "Moved by %2$s" : "Spostata da %2$s", "You created %1$s" : "Hai creato %1$s", "%2$s created %1$s" : "%2$s ha creato %1$s", "%1$s was created in a public folder" : "%1$s è stato creato in una cartella pubblica", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s ha rinominato %3$s in %1$s", "You moved %2$s to %1$s" : "Hai spostato %1$s in %2$s", "%2$s moved %3$s to %1$s" : "%2$s ha spostato %3$s in %1$s", - "Changed by %2$s" : "Modificata da %2$s", - "Deleted by %2$s" : "Eliminata da %2$s", - "Restored by %2$s" : "Ripristinata da %2$s", - "Renamed by %2$s" : "Rinominata da %2$s", - "Moved by %2$s" : "Spostata da %2$s", - "File changes" : "Modiche dei file", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un file o una cartella sono stati <strong>modificato</strong> o<strong>rinominati</strong> ", + "A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limita le notifiche relative alla creazione e alla modifica dei tuoi <strong>file preferiti</strong> <em>(Solo flusso)</em>", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", "Maximum upload size" : "Dimensione massima caricamento", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Errore durante il caricamento del file \"{fileName}\": {message}", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", + "Local link" : "Collegamento locale", "{newname} already exists" : "{newname} esiste già", "A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>", + "A file or folder has been <strong>deleted</strong>" : "Un file o una cartella è stato <strong>eliminato</strong>", + "A file or folder has been <strong>restored</strong>" : "Un file o una cartella è stato <strong>ripristinato</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>", "Cancel upload" : "Annulla caricamento" }, diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index bf637b62848..97cb9530996 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -11,7 +11,7 @@ "Favorites" : "Preferiti", "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"", "Upload cancelled." : "Caricamento annullato.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", "Target folder \"{dir}\" does not exist any more" : "La cartella di destinazione \"{dir}\" non esiste più", "Not enough free space" : "Spazio libero insufficiente", @@ -59,7 +59,7 @@ "_%n file_::_%n files_" : ["%n file","%n file"], "{dirs} and {files}" : "{dirs} e {files}", "_including %n hidden_::_including %n hidden_" : ["incluso %n nascosto","inclusi %n nascosti"], - "You don’t have permission to upload or create files here" : "Qui non hai i permessi di caricare o creare file", + "You don’t have permission to upload or create files here" : "Qui non hai i permessi per caricare o creare file", "_Uploading %n file_::_Uploading %n files_" : ["Caricamento di %n file in corso","Caricamento di %n file in corso"], "New" : "Nuovo", "\"{name}\" is an invalid file name." : "\"{name}\" non è un nome file valido.", @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", - "Local link" : "Collegamento locale", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette", - "A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un file o una cartella sono stati <strong>modificato</strong> o<strong>rinominati</strong> ", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limita le notifiche relative alla creazione e alla modifica dei tuoi <strong>file preferiti</strong> <em>(Solo flusso)</em>", - "A file or folder has been <strong>deleted</strong>" : "Un file o una cartella è stato <strong>eliminato</strong>", - "A file or folder has been <strong>restored</strong>" : "Un file o una cartella è stato <strong>ripristinato</strong>", + "File changes" : "Modiche dei file", + "Changed by %2$s" : "Modificata da %2$s", + "Deleted by %2$s" : "Eliminata da %2$s", + "Restored by %2$s" : "Ripristinata da %2$s", + "Renamed by %2$s" : "Rinominata da %2$s", + "Moved by %2$s" : "Spostata da %2$s", "You created %1$s" : "Hai creato %1$s", "%2$s created %1$s" : "%2$s ha creato %1$s", "%1$s was created in a public folder" : "%1$s è stato creato in una cartella pubblica", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s ha rinominato %3$s in %1$s", "You moved %2$s to %1$s" : "Hai spostato %1$s in %2$s", "%2$s moved %3$s to %1$s" : "%2$s ha spostato %3$s in %1$s", - "Changed by %2$s" : "Modificata da %2$s", - "Deleted by %2$s" : "Eliminata da %2$s", - "Restored by %2$s" : "Ripristinata da %2$s", - "Renamed by %2$s" : "Rinominata da %2$s", - "Moved by %2$s" : "Spostata da %2$s", - "File changes" : "Modiche dei file", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un file o una cartella sono stati <strong>modificato</strong> o<strong>rinominati</strong> ", + "A new file or folder has been <strong>created</strong>" : "Un nuovo file o cartella è stato <strong>creato</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limita le notifiche relative alla creazione e alla modifica dei tuoi <strong>file preferiti</strong> <em>(Solo flusso)</em>", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", "Maximum upload size" : "Dimensione massima caricamento", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Errore durante il caricamento del file \"{fileName}\": {message}", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", + "Local link" : "Collegamento locale", "{newname} already exists" : "{newname} esiste già", "A file or folder has been <strong>changed</strong>" : "Un file o una cartella è stato <strong>modificato</strong>", + "A file or folder has been <strong>deleted</strong>" : "Un file o una cartella è stato <strong>eliminato</strong>", + "A file or folder has been <strong>restored</strong>" : "Un file o una cartella è stato <strong>ripristinato</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>", "Cancel upload" : "Annulla caricamento" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index daedfbacda1..b24bedc3fde 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -70,15 +70,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", - "Local link" : "ローカルリンク", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", "Upload" : "アップロード", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", - "A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>お気に入りファイル</strong>の作成と変更の通知を制限する<em>(ストリームのみ)</em>", - "A file or folder has been <strong>deleted</strong>" : "ファイルまたはフォルダーを<strong>削除</strong>したとき", - "A file or folder has been <strong>restored</strong>" : "ファイルまたはフォルダーを<strong>復元</strong>したとき", + "Changed by %2$s" : "%2$s により更新", + "Deleted by %2$s" : "%2$s により削除", + "Restored by %2$s" : "%2$s により復元", "You created %1$s" : "あなたは %1$s を作成しました", "%2$s created %1$s" : "%2$s は%1$s を作成しました", "%1$s was created in a public folder" : "公開フォルダーに %1$s が作成されました", @@ -88,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s は %1$s を削除しました", "You restored %1$s" : "%1$s を復元しました", "%2$s restored %1$s" : "%2$s は、 %1$s を復元しました", - "Changed by %2$s" : "%2$s により更新", - "Deleted by %2$s" : "%2$s により削除", - "Restored by %2$s" : "%2$s により復元", + "A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>お気に入りファイル</strong>の作成と変更の通知を制限する<em>(ストリームのみ)</em>", "Upload (max. %s)" : "アップロード ( 最大 %s )", "File handling" : "ファイル操作", "Maximum upload size" : "最大アップロードサイズ", @@ -132,8 +129,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "ファイル\"{fileName}\"のアップロードエラー: {message}", "Could not get result from server." : "サーバーから結果を取得できませんでした。", "No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません", + "Local link" : "ローカルリンク", "{newname} already exists" : "{newname} はすでに存在します", "A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーを<strong>変更</strong>したとき", + "A file or folder has been <strong>deleted</strong>" : "ファイルまたはフォルダーを<strong>削除</strong>したとき", + "A file or folder has been <strong>restored</strong>" : "ファイルまたはフォルダーを<strong>復元</strong>したとき", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV 経由でファイルにアクセス</a> するにはこのアドレスを利用してください", "Cancel upload" : "アップロードをキャンセル" }, diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index acb350b2185..5053cba2033 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -68,15 +68,13 @@ "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", - "Local link" : "ローカルリンク", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", "Upload" : "アップロード", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", - "A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>お気に入りファイル</strong>の作成と変更の通知を制限する<em>(ストリームのみ)</em>", - "A file or folder has been <strong>deleted</strong>" : "ファイルまたはフォルダーを<strong>削除</strong>したとき", - "A file or folder has been <strong>restored</strong>" : "ファイルまたはフォルダーを<strong>復元</strong>したとき", + "Changed by %2$s" : "%2$s により更新", + "Deleted by %2$s" : "%2$s により削除", + "Restored by %2$s" : "%2$s により復元", "You created %1$s" : "あなたは %1$s を作成しました", "%2$s created %1$s" : "%2$s は%1$s を作成しました", "%1$s was created in a public folder" : "公開フォルダーに %1$s が作成されました", @@ -86,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s は %1$s を削除しました", "You restored %1$s" : "%1$s を復元しました", "%2$s restored %1$s" : "%2$s は、 %1$s を復元しました", - "Changed by %2$s" : "%2$s により更新", - "Deleted by %2$s" : "%2$s により削除", - "Restored by %2$s" : "%2$s により復元", + "A new file or folder has been <strong>created</strong>" : "新しいファイルまたはフォルダーを<strong>作成</strong>したとき", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>お気に入りファイル</strong>の作成と変更の通知を制限する<em>(ストリームのみ)</em>", "Upload (max. %s)" : "アップロード ( 最大 %s )", "File handling" : "ファイル操作", "Maximum upload size" : "最大アップロードサイズ", @@ -130,8 +127,11 @@ "Error uploading file \"{fileName}\": {message}" : "ファイル\"{fileName}\"のアップロードエラー: {message}", "Could not get result from server." : "サーバーから結果を取得できませんでした。", "No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません", + "Local link" : "ローカルリンク", "{newname} already exists" : "{newname} はすでに存在します", "A file or folder has been <strong>changed</strong>" : "ファイルまたはフォルダーを<strong>変更</strong>したとき", + "A file or folder has been <strong>deleted</strong>" : "ファイルまたはフォルダーを<strong>削除</strong>したとき", + "A file or folder has been <strong>restored</strong>" : "ファイルまたはフォルダーを<strong>復元</strong>したとき", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV 経由でファイルにアクセス</a> するにはこのアドレスを利用してください", "Cancel upload" : "アップロードをキャンセル" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index e07d88a617b..dfaa9479ca1 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -69,15 +69,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n baiti","%n baits","%n baiti"], "Favorited" : "Favorīti", "Favorite" : "Iecienītais", - "Local link" : "Lokāla saite", "Folder" : "Mape", "New folder" : "Jauna mape", "Upload" : "Augšupielādēt", "An error occurred while trying to update the tags" : "Notika kļūda atjaunojot atzīmi", - "A new file or folder has been <strong>created</strong>" : "<strong>Izveidota</strong> jauna datne vai mape", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitēt ziņojumus par jūsu <strong>iecienīto datņu</strong> izveidošanu un izmaiņām <em>(tikai datu straumei)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Dzēsta</strong> datne vai mape", - "A file or folder has been <strong>restored</strong>" : "<strong>Atjaunota</strong> datne vai mape", + "Changed by %2$s" : "Izmainīja %2$s", + "Deleted by %2$s" : "Dzēsa %2$s", + "Restored by %2$s" : "Atjaunoja %2$s", "You created %1$s" : "Tu izveidoji %1$s", "%2$s created %1$s" : "%2$s izveidoja %1$s", "%1$s was created in a public folder" : "%1$s tika izveidots publiskajā mapē", @@ -87,9 +85,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s izdzēsa %1$s", "You restored %1$s" : "Tu atjaunoji %1$s", "%2$s restored %1$s" : "%2$s atjaunoja %1$s", - "Changed by %2$s" : "Izmainīja %2$s", - "Deleted by %2$s" : "Dzēsa %2$s", - "Restored by %2$s" : "Atjaunoja %2$s", + "A new file or folder has been <strong>created</strong>" : "<strong>Izveidota</strong> jauna datne vai mape", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitēt ziņojumus par jūsu <strong>iecienīto datņu</strong> izveidošanu un izmaiņām <em>(tikai datu straumei)</em>", "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", @@ -131,8 +128,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Kļūda augšupielādējot datni \"{fileName}\": {message}", "Could not get result from server." : "Nevar saņemt rezultātus no servera", "No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'", + "Local link" : "Lokāla saite", "{newname} already exists" : "{newname} jau eksistē", "A file or folder has been <strong>changed</strong>" : "<strong>Izmainīta</strong> datne vai mape", + "A file or folder has been <strong>deleted</strong>" : "<strong>Dzēsta</strong> datne vai mape", + "A file or folder has been <strong>restored</strong>" : "<strong>Atjaunota</strong> datne vai mape", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmanto šo adresi, lai <a href=\"%s\" target=\"_blank\">sasniegtu savas datnes caur WebDAV</a>", "Cancel upload" : "Atcelt augšupielādi" }, diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index fb94b07e966..d9b8c77e9de 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -67,15 +67,13 @@ "_%n byte_::_%n bytes_" : ["%n baiti","%n baits","%n baiti"], "Favorited" : "Favorīti", "Favorite" : "Iecienītais", - "Local link" : "Lokāla saite", "Folder" : "Mape", "New folder" : "Jauna mape", "Upload" : "Augšupielādēt", "An error occurred while trying to update the tags" : "Notika kļūda atjaunojot atzīmi", - "A new file or folder has been <strong>created</strong>" : "<strong>Izveidota</strong> jauna datne vai mape", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitēt ziņojumus par jūsu <strong>iecienīto datņu</strong> izveidošanu un izmaiņām <em>(tikai datu straumei)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Dzēsta</strong> datne vai mape", - "A file or folder has been <strong>restored</strong>" : "<strong>Atjaunota</strong> datne vai mape", + "Changed by %2$s" : "Izmainīja %2$s", + "Deleted by %2$s" : "Dzēsa %2$s", + "Restored by %2$s" : "Atjaunoja %2$s", "You created %1$s" : "Tu izveidoji %1$s", "%2$s created %1$s" : "%2$s izveidoja %1$s", "%1$s was created in a public folder" : "%1$s tika izveidots publiskajā mapē", @@ -85,9 +83,8 @@ "%2$s deleted %1$s" : "%2$s izdzēsa %1$s", "You restored %1$s" : "Tu atjaunoji %1$s", "%2$s restored %1$s" : "%2$s atjaunoja %1$s", - "Changed by %2$s" : "Izmainīja %2$s", - "Deleted by %2$s" : "Dzēsa %2$s", - "Restored by %2$s" : "Atjaunoja %2$s", + "A new file or folder has been <strong>created</strong>" : "<strong>Izveidota</strong> jauna datne vai mape", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitēt ziņojumus par jūsu <strong>iecienīto datņu</strong> izveidošanu un izmaiņām <em>(tikai datu straumei)</em>", "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", @@ -129,8 +126,11 @@ "Error uploading file \"{fileName}\": {message}" : "Kļūda augšupielādējot datni \"{fileName}\": {message}", "Could not get result from server." : "Nevar saņemt rezultātus no servera", "No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'", + "Local link" : "Lokāla saite", "{newname} already exists" : "{newname} jau eksistē", "A file or folder has been <strong>changed</strong>" : "<strong>Izmainīta</strong> datne vai mape", + "A file or folder has been <strong>deleted</strong>" : "<strong>Dzēsta</strong> datne vai mape", + "A file or folder has been <strong>restored</strong>" : "<strong>Atjaunota</strong> datne vai mape", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmanto šo adresi, lai <a href=\"%s\" target=\"_blank\">sasniegtu savas datnes caur WebDAV</a>", "Cancel upload" : "Atcelt augšupielādi" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index 19b1f2feec2..5c0a73c9719 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Er favoritt", "Favorite" : "Gjør til favoritt", - "Local link" : "Lokal lenke", "Folder" : "Mappe", "New folder" : "Ny mappe", "Upload" : "Last opp", "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av merkelappene", - "A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "En fil eller mappe ble <strong>endret</strong> eller <strong>omdøpt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begrens varsling om oppretting og endringer til <strong>favorittfilene</strong> dine <em>(Kun strøm)</em>", - "A file or folder has been <strong>deleted</strong>" : "En fil eller mappe ble <strong>slettet</strong>", - "A file or folder has been <strong>restored</strong>" : "En fil eller mappe ble <strong>gjenopprettet</strong>", + "File changes" : "Filendringer", + "Changed by %2$s" : "Endret av %2$s", + "Deleted by %2$s" : "Slettet av %2$s", + "Restored by %2$s" : "Gjenopprettet av %2$s", + "Renamed by %2$s" : "Omdøpt av %2$s", + "Moved by %2$s" : "Flyttet av %2$s", "You created %1$s" : "Du opprettet %1$s", "%2$s created %1$s" : "%2$s opprettet %1$s", "%1$s was created in a public folder" : "%1$s ble opprettet i en offentlig mappe", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s omdøpte %3$s til %1$s", "You moved %2$s to %1$s" : "Du flyttet %2$s til %1$s", "%2$s moved %3$s to %1$s" : "%2$s flyttet %3$s til %1$s", - "Changed by %2$s" : "Endret av %2$s", - "Deleted by %2$s" : "Slettet av %2$s", - "Restored by %2$s" : "Gjenopprettet av %2$s", - "Renamed by %2$s" : "Omdøpt av %2$s", - "Moved by %2$s" : "Flyttet av %2$s", - "File changes" : "Filendringer", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "En fil eller mappe ble <strong>endret</strong> eller <strong>omdøpt</strong>", + "A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begrens varsling om oppretting og endringer til <strong>favorittfilene</strong> dine <em>(Kun strøm)</em>", "Upload (max. %s)" : "Opplasting (maks. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Største opplastingsstørrelse", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Feil ved opplasting av fil \"{fileName}\": {message}", "Could not get result from server." : "Fikk ikke resultat fra tjeneren.", "No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'", + "Local link" : "Lokal lenke", "{newname} already exists" : "{newname} finnes allerede", "A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>", + "A file or folder has been <strong>deleted</strong>" : "En fil eller mappe ble <strong>slettet</strong>", + "A file or folder has been <strong>restored</strong>" : "En fil eller mappe ble <strong>gjenopprettet</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk følgende adresse for <a href=\"%s\" target=\"_blank\">tilgang til filene via WebDAV</a>", "Cancel upload" : "Avbryt opplasting" }, diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index 0352759b26c..4c0183aec2f 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Er favoritt", "Favorite" : "Gjør til favoritt", - "Local link" : "Lokal lenke", "Folder" : "Mappe", "New folder" : "Ny mappe", "Upload" : "Last opp", "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av merkelappene", - "A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "En fil eller mappe ble <strong>endret</strong> eller <strong>omdøpt</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begrens varsling om oppretting og endringer til <strong>favorittfilene</strong> dine <em>(Kun strøm)</em>", - "A file or folder has been <strong>deleted</strong>" : "En fil eller mappe ble <strong>slettet</strong>", - "A file or folder has been <strong>restored</strong>" : "En fil eller mappe ble <strong>gjenopprettet</strong>", + "File changes" : "Filendringer", + "Changed by %2$s" : "Endret av %2$s", + "Deleted by %2$s" : "Slettet av %2$s", + "Restored by %2$s" : "Gjenopprettet av %2$s", + "Renamed by %2$s" : "Omdøpt av %2$s", + "Moved by %2$s" : "Flyttet av %2$s", "You created %1$s" : "Du opprettet %1$s", "%2$s created %1$s" : "%2$s opprettet %1$s", "%1$s was created in a public folder" : "%1$s ble opprettet i en offentlig mappe", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s omdøpte %3$s til %1$s", "You moved %2$s to %1$s" : "Du flyttet %2$s til %1$s", "%2$s moved %3$s to %1$s" : "%2$s flyttet %3$s til %1$s", - "Changed by %2$s" : "Endret av %2$s", - "Deleted by %2$s" : "Slettet av %2$s", - "Restored by %2$s" : "Gjenopprettet av %2$s", - "Renamed by %2$s" : "Omdøpt av %2$s", - "Moved by %2$s" : "Flyttet av %2$s", - "File changes" : "Filendringer", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "En fil eller mappe ble <strong>endret</strong> eller <strong>omdøpt</strong>", + "A new file or folder has been <strong>created</strong>" : "En ny fil eller mappe ble <strong>opprettet</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begrens varsling om oppretting og endringer til <strong>favorittfilene</strong> dine <em>(Kun strøm)</em>", "Upload (max. %s)" : "Opplasting (maks. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Største opplastingsstørrelse", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Feil ved opplasting av fil \"{fileName}\": {message}", "Could not get result from server." : "Fikk ikke resultat fra tjeneren.", "No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'", + "Local link" : "Lokal lenke", "{newname} already exists" : "{newname} finnes allerede", "A file or folder has been <strong>changed</strong>" : "En fil eller mappe ble <strong>endret</strong>", + "A file or folder has been <strong>deleted</strong>" : "En fil eller mappe ble <strong>slettet</strong>", + "A file or folder has been <strong>restored</strong>" : "En fil eller mappe ble <strong>gjenopprettet</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk følgende adresse for <a href=\"%s\" target=\"_blank\">tilgang til filene via WebDAV</a>", "Cancel upload" : "Avbryt opplasting" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 5dd0d6bd34c..a3e68612710 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -76,16 +76,23 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favoriet", "Favorite" : "Favoriet", - "Local link" : "Lokale link", "Folder" : "Map", "New folder" : "Nieuwe map", "Upload" : "Uploaden", "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de markeringen bij te werken", - "A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Een bestand of map is <strong>gewijzigd</strong> of <strong>hernoemd</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan je <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", - "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", + "File changes" : "Bestandswijzigingen", + "Created by %s" : "Gecreëerd door %s", + "Created by {user1}" : "Gecreëerd door {user1}", + "Changed by %2$s" : "Gewijzigd door %2$s", + "Changed by {user1}" : "Gewijzigd door {user1}", + "Deleted by %2$s" : "Verwijderd door %2$s", + "Deleted by {user1}" : "Verwijderd door {user1}", + "Restored by %2$s" : "Hersteld door %2$s", + "Restored by {user1}" : "Hersteld door {user1}", + "Renamed by %2$s" : "Hernoemd door %2$s", + "Renamed by {user1}" : "Hernoemd door {user1}", + "Moved by %2$s" : "Verplaatst door %2$s", + "Moved by {user1}" : "Verplaatst door {user1}", "You created %1$s" : "Gecreëerd: %1$s", "%2$s created %1$s" : "%2$s creëerde %1$s", "%1$s was created in a public folder" : "%1$s werd gecreëerd in een openbare map", @@ -93,18 +100,19 @@ OC.L10N.register( "%2$s changed %1$s" : "%2$s wijzigde %1$s", "You deleted %1$s" : "Je verwijderde: %1$s", "%2$s deleted %1$s" : "%2$s verwijderde %1$s", + "{user1} deleted {file1}" : "{user1} verwijderde {file1}", "You restored %1$s" : "Hersteld: %1$s", "%2$s restored %1$s" : "%2$s herstelde %1$s", + "{user1} restored {file1}" : "{user1} herstelde {file1}", "You renamed %2$s to %1$s" : "Je hernoemde %2$s naar %1$s", "%2$s renamed %3$s to %1$s" : "%2$s hernoemde %3$s naar %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} hernoemde file2} naar {file1}", "You moved %2$s to %1$s" : "Je verplaatste %2$s naar %1$s", "%2$s moved %3$s to %1$s" : "%2$s verplaatste %3$s naar %1$s", - "Changed by %2$s" : "Gewijzigd door %2$s", - "Deleted by %2$s" : "Verwijderd door %2$s", - "Restored by %2$s" : "Hersteld door %2$s", - "Renamed by %2$s" : "Hernoemd door %2$s", - "Moved by %2$s" : "Verplaatst door %2$s", - "File changes" : "Bestandswijzigingen", + "{user1} moved {file2} to {file1}" : "{user1} verplaatste {file2} naar {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Een bestand of map is <strong>gewijzigd</strong> of <strong>hernoemd</strong>", + "A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan je <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Bestand", "Maximum upload size" : "Maximale bestandsgrootte voor uploads", @@ -151,8 +159,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Fout tijdens het uploaden van bestand \"{fileName}\": {message}", "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", + "Local link" : "Lokale link", "{newname} already exists" : "{newname} bestaat al", "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>", + "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", + "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om je bestanden via WebDAV te benaderen</a>", "Cancel upload" : "Upload annuleren" }, diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 4941fa495b6..ac1627c0cbc 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -74,16 +74,23 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favoriet", "Favorite" : "Favoriet", - "Local link" : "Lokale link", "Folder" : "Map", "New folder" : "Nieuwe map", "Upload" : "Uploaden", "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de markeringen bij te werken", - "A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Een bestand of map is <strong>gewijzigd</strong> of <strong>hernoemd</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan je <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", - "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", + "File changes" : "Bestandswijzigingen", + "Created by %s" : "Gecreëerd door %s", + "Created by {user1}" : "Gecreëerd door {user1}", + "Changed by %2$s" : "Gewijzigd door %2$s", + "Changed by {user1}" : "Gewijzigd door {user1}", + "Deleted by %2$s" : "Verwijderd door %2$s", + "Deleted by {user1}" : "Verwijderd door {user1}", + "Restored by %2$s" : "Hersteld door %2$s", + "Restored by {user1}" : "Hersteld door {user1}", + "Renamed by %2$s" : "Hernoemd door %2$s", + "Renamed by {user1}" : "Hernoemd door {user1}", + "Moved by %2$s" : "Verplaatst door %2$s", + "Moved by {user1}" : "Verplaatst door {user1}", "You created %1$s" : "Gecreëerd: %1$s", "%2$s created %1$s" : "%2$s creëerde %1$s", "%1$s was created in a public folder" : "%1$s werd gecreëerd in een openbare map", @@ -91,18 +98,19 @@ "%2$s changed %1$s" : "%2$s wijzigde %1$s", "You deleted %1$s" : "Je verwijderde: %1$s", "%2$s deleted %1$s" : "%2$s verwijderde %1$s", + "{user1} deleted {file1}" : "{user1} verwijderde {file1}", "You restored %1$s" : "Hersteld: %1$s", "%2$s restored %1$s" : "%2$s herstelde %1$s", + "{user1} restored {file1}" : "{user1} herstelde {file1}", "You renamed %2$s to %1$s" : "Je hernoemde %2$s naar %1$s", "%2$s renamed %3$s to %1$s" : "%2$s hernoemde %3$s naar %1$s", + "{user1} renamed {file2} to {file1}" : "{user1} hernoemde file2} naar {file1}", "You moved %2$s to %1$s" : "Je verplaatste %2$s naar %1$s", "%2$s moved %3$s to %1$s" : "%2$s verplaatste %3$s naar %1$s", - "Changed by %2$s" : "Gewijzigd door %2$s", - "Deleted by %2$s" : "Verwijderd door %2$s", - "Restored by %2$s" : "Hersteld door %2$s", - "Renamed by %2$s" : "Hernoemd door %2$s", - "Moved by %2$s" : "Verplaatst door %2$s", - "File changes" : "Bestandswijzigingen", + "{user1} moved {file2} to {file1}" : "{user1} verplaatste {file2} naar {file1}", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Een bestand of map is <strong>gewijzigd</strong> of <strong>hernoemd</strong>", + "A new file or folder has been <strong>created</strong>" : "Een nieuw bestand of map is <strong>aangemaakt</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Beperk meldingen over aanmaken en wijzigen aan je <strong>favoriete bestanden</strong> <em>(Alleen stream)</em>", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Bestand", "Maximum upload size" : "Maximale bestandsgrootte voor uploads", @@ -149,8 +157,11 @@ "Error uploading file \"{fileName}\": {message}" : "Fout tijdens het uploaden van bestand \"{fileName}\": {message}", "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", + "Local link" : "Lokale link", "{newname} already exists" : "{newname} bestaat al", "A file or folder has been <strong>changed</strong>" : "Een bestand of map is <strong>gewijzigd</strong>", + "A file or folder has been <strong>deleted</strong>" : "Een bestand of map is <strong>verwijderd</strong>", + "A file or folder has been <strong>restored</strong>" : "Een bestand of een map is <strong>hersteld</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om je bestanden via WebDAV te benaderen</a>", "Cancel upload" : "Upload annuleren" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index e40119b49c8..779ac796364 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów"], "Favorited" : "Ulubione", "Favorite" : "Ulubione", - "Local link" : "Lokalny odnośnik", "Folder" : "Folder", "New folder" : "Nowy folder", "Upload" : "Wyślij", "An error occurred while trying to update the tags" : "Wystąpił błąd podczas aktualizacji tagów", - "A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Plik lub folder został <strong>zmieniony</ strong> lub <strong>zastąpiony</ strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plików</strong> <em>(Tylko w strumieniu aktywności)</em>", - "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", - "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócony</strong>", + "File changes" : "Zmień w plikach", + "Changed by %2$s" : "Zmienione przez %2$s", + "Deleted by %2$s" : "Usunięte przez %2$s", + "Restored by %2$s" : "Przywrócone przez %2$s", + "Renamed by %2$s" : "Zmieniony przez %2$s", + "Moved by %2$s" : "Przeniesiony przez %2$s", "You created %1$s" : "Utworzyłeś %1$s", "%2$s created %1$s" : "%2$s utworzył %1$s", "%1$s was created in a public folder" : "%1$s został utworzony w folderze publicznym", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s zmieniony %3$s na %1$s", "You moved %2$s to %1$s" : "Przeniosłeś %2$s do %1$s", "%2$s moved %3$s to %1$s" : "%2$s przeniesiony %3$s do %1$s", - "Changed by %2$s" : "Zmienione przez %2$s", - "Deleted by %2$s" : "Usunięte przez %2$s", - "Restored by %2$s" : "Przywrócone przez %2$s", - "Renamed by %2$s" : "Zmieniony przez %2$s", - "Moved by %2$s" : "Przeniesiony przez %2$s", - "File changes" : "Zmień w plikach", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Plik lub folder został <strong>zmieniony</ strong> lub <strong>zastąpiony</ strong>", + "A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plików</strong> <em>(Tylko w strumieniu aktywności)</em>", "Upload (max. %s)" : "Wysyłka (max. %s)", "File handling" : "Zarządzanie plikami", "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Błąd podczas przekazywania \"{fileName}\": {message}", "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'", + "Local link" : "Lokalny odnośnik", "{newname} already exists" : "{newname} już istnieje", "A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>", + "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", + "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócony</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\">dostęp do swoich plików poprzez WebDAV</a>", "Cancel upload" : "Anuluj wysyłanie" }, diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 0ec9e1f7ac1..d5fcb2604e1 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtów"], "Favorited" : "Ulubione", "Favorite" : "Ulubione", - "Local link" : "Lokalny odnośnik", "Folder" : "Folder", "New folder" : "Nowy folder", "Upload" : "Wyślij", "An error occurred while trying to update the tags" : "Wystąpił błąd podczas aktualizacji tagów", - "A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Plik lub folder został <strong>zmieniony</ strong> lub <strong>zastąpiony</ strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plików</strong> <em>(Tylko w strumieniu aktywności)</em>", - "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", - "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócony</strong>", + "File changes" : "Zmień w plikach", + "Changed by %2$s" : "Zmienione przez %2$s", + "Deleted by %2$s" : "Usunięte przez %2$s", + "Restored by %2$s" : "Przywrócone przez %2$s", + "Renamed by %2$s" : "Zmieniony przez %2$s", + "Moved by %2$s" : "Przeniesiony przez %2$s", "You created %1$s" : "Utworzyłeś %1$s", "%2$s created %1$s" : "%2$s utworzył %1$s", "%1$s was created in a public folder" : "%1$s został utworzony w folderze publicznym", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s zmieniony %3$s na %1$s", "You moved %2$s to %1$s" : "Przeniosłeś %2$s do %1$s", "%2$s moved %3$s to %1$s" : "%2$s przeniesiony %3$s do %1$s", - "Changed by %2$s" : "Zmienione przez %2$s", - "Deleted by %2$s" : "Usunięte przez %2$s", - "Restored by %2$s" : "Przywrócone przez %2$s", - "Renamed by %2$s" : "Zmieniony przez %2$s", - "Moved by %2$s" : "Przeniesiony przez %2$s", - "File changes" : "Zmień w plikach", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Plik lub folder został <strong>zmieniony</ strong> lub <strong>zastąpiony</ strong>", + "A new file or folder has been <strong>created</strong>" : "Nowy plik lub folder został <strong>utworzony</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ogranicz powiadomienia o utworzeniu i zmianach do swoich <strong>ulubionych plików</strong> <em>(Tylko w strumieniu aktywności)</em>", "Upload (max. %s)" : "Wysyłka (max. %s)", "File handling" : "Zarządzanie plikami", "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Błąd podczas przekazywania \"{fileName}\": {message}", "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'", + "Local link" : "Lokalny odnośnik", "{newname} already exists" : "{newname} już istnieje", "A file or folder has been <strong>changed</strong>" : "Plik lub folder został <strong>zmieniony</strong>", + "A file or folder has been <strong>deleted</strong>" : "Plik lub folder został <strong>usunięty</strong>", + "A file or folder has been <strong>restored</strong>" : "Plik lub folder został <strong>przywrócony</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu aby uzyskać <a href=\"%s\" target=\"_blank\">dostęp do swoich plików poprzez WebDAV</a>", "Cancel upload" : "Anuluj wysyłanie" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 122f7bdc603..6e3b1525982 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -76,16 +76,16 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorito", "Favorite" : "Favorito", - "Local link" : "Link local", "Folder" : "Pasta", "New folder" : "Nova pasta", "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas", - "A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite de notificações sobre a criação e alterações em seus <strong>arquivos favoritos</strong> <em>(apenas Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Um arquivo ou pasta foi <strong>excluído</strong>", - "A file or folder has been <strong>restored</strong>" : "Um arquivo ou pasta foi <strong>restaurado</strong>", + "File changes" : "Alterações do arquivo", + "Changed by %2$s" : "Modificado por %2$s", + "Deleted by %2$s" : "Excluído por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", + "Renamed by %2$s" : "Renomeado por %2$s", + "Moved by %2$s" : "Movido por %2$s", "You created %1$s" : "Você criou %1$s", "%2$s created %1$s" : "%2$s criou %1$s", "%1$s was created in a public folder" : "%1$s foi criado em uma pasta pública", @@ -99,12 +99,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s renomeado %3$s para %1$s", "You moved %2$s to %1$s" : "Você moveu %2$s para %1$s", "%2$s moved %3$s to %1$s" : "%2$s moveu %3$s para %1$s", - "Changed by %2$s" : "Modificado por %2$s", - "Deleted by %2$s" : "Excluído por %2$s", - "Restored by %2$s" : "Restaurado por %2$s", - "Renamed by %2$s" : "Renomeado por %2$s", - "Moved by %2$s" : "Movido por %2$s", - "File changes" : "Alterações do arquivo", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>", + "A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite de notificações sobre a criação e alterações em seus <strong>arquivos favoritos</strong> <em>(apenas Stream)</em>", "Upload (max. %s)" : "Envio (max. %s)", "File handling" : "Tratamento de arquivo", "Maximum upload size" : "Tamanho máximo para envio", @@ -151,8 +148,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Erro enviando o arquivo \"{fileName}\": {message}", "Could not get result from server." : "Não foi possível obter o resultado do servidor.", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", + "Local link" : "Link local", "{newname} already exists" : "{newname} já existe", "A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>", + "A file or folder has been <strong>deleted</strong>" : "Um arquivo ou pasta foi <strong>excluído</strong>", + "A file or folder has been <strong>restored</strong>" : "Um arquivo ou pasta foi <strong>restaurado</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço para <a href=\"%s\" target=\"_blank\">acessar seus arquivos via WebDAV</a>", "Cancel upload" : "Cancelar envio" }, diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index fdfc086ab7d..e1106914d0b 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -74,16 +74,16 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorito", "Favorite" : "Favorito", - "Local link" : "Link local", "Folder" : "Pasta", "New folder" : "Nova pasta", "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas", - "A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite de notificações sobre a criação e alterações em seus <strong>arquivos favoritos</strong> <em>(apenas Stream)</em>", - "A file or folder has been <strong>deleted</strong>" : "Um arquivo ou pasta foi <strong>excluído</strong>", - "A file or folder has been <strong>restored</strong>" : "Um arquivo ou pasta foi <strong>restaurado</strong>", + "File changes" : "Alterações do arquivo", + "Changed by %2$s" : "Modificado por %2$s", + "Deleted by %2$s" : "Excluído por %2$s", + "Restored by %2$s" : "Restaurado por %2$s", + "Renamed by %2$s" : "Renomeado por %2$s", + "Moved by %2$s" : "Movido por %2$s", "You created %1$s" : "Você criou %1$s", "%2$s created %1$s" : "%2$s criou %1$s", "%1$s was created in a public folder" : "%1$s foi criado em uma pasta pública", @@ -97,12 +97,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s renomeado %3$s para %1$s", "You moved %2$s to %1$s" : "Você moveu %2$s para %1$s", "%2$s moved %3$s to %1$s" : "%2$s moveu %3$s para %1$s", - "Changed by %2$s" : "Modificado por %2$s", - "Deleted by %2$s" : "Excluído por %2$s", - "Restored by %2$s" : "Restaurado por %2$s", - "Renamed by %2$s" : "Renomeado por %2$s", - "Moved by %2$s" : "Movido por %2$s", - "File changes" : "Alterações do arquivo", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>", + "A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite de notificações sobre a criação e alterações em seus <strong>arquivos favoritos</strong> <em>(apenas Stream)</em>", "Upload (max. %s)" : "Envio (max. %s)", "File handling" : "Tratamento de arquivo", "Maximum upload size" : "Tamanho máximo para envio", @@ -149,8 +146,11 @@ "Error uploading file \"{fileName}\": {message}" : "Erro enviando o arquivo \"{fileName}\": {message}", "Could not get result from server." : "Não foi possível obter o resultado do servidor.", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", + "Local link" : "Link local", "{newname} already exists" : "{newname} já existe", "A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>", + "A file or folder has been <strong>deleted</strong>" : "Um arquivo ou pasta foi <strong>excluído</strong>", + "A file or folder has been <strong>restored</strong>" : "Um arquivo ou pasta foi <strong>restaurado</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço para <a href=\"%s\" target=\"_blank\">acessar seus arquivos via WebDAV</a>", "Cancel upload" : "Cancelar envio" },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index d0a70ff74ea..07988a078ce 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -76,16 +76,15 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", - "Local link" : "Локальная ссылка", "Folder" : "Каталог", "New folder" : "Новый каталог", "Upload" : "Загрузить", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", - "A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Фаил или каталог <strong>изменён</strong> или <strong>переименован</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ограничить уведомления о создании и изменении ваших <strong>избранных файлов</strong> <em>(отображать только в приложении события)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Удалён</strong> файл или каталог", - "A file or folder has been <strong>restored</strong>" : "<strong>Восстановлен</strong> файл или каталог", + "Changed by %2$s" : "Изменено %2$s", + "Deleted by %2$s" : "Удалено %2$s", + "Restored by %2$s" : "Восстановлено %2$s", + "Renamed by %2$s" : "Переименовано %2$s", + "Moved by %2$s" : "Перемещено %2$s", "You created %1$s" : "Вы создали %1$s", "%2$s created %1$s" : "%2$s создал %1$s", "%1$s was created in a public folder" : "%1$s создан в общем каталоге", @@ -99,11 +98,9 @@ OC.L10N.register( "%2$s renamed %3$s to %1$s" : "%2$s переименовал %3$s в %1$s", "You moved %2$s to %1$s" : "Вы переместили %2$s в %1$s", "%2$s moved %3$s to %1$s" : "%2$s переместил %3$s в %1$s", - "Changed by %2$s" : "Изменено %2$s", - "Deleted by %2$s" : "Удалено %2$s", - "Restored by %2$s" : "Восстановлено %2$s", - "Renamed by %2$s" : "Переименовано %2$s", - "Moved by %2$s" : "Перемещено %2$s", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Фаил или каталог <strong>изменён</strong> или <strong>переименован</strong>", + "A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ограничить уведомления о создании и изменении ваших <strong>избранных файлов</strong> <em>(отображать только в приложении события)</em>", "Upload (max. %s)" : "Загрузка (максимум %s)", "File handling" : "Управление файлами", "Maximum upload size" : "Максимальный размер загружаемого файла", @@ -150,8 +147,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Ошибка загрузки файла \"{fileName}\": {message}", "Could not get result from server." : "Не удалось получить ответ от сервера.", "No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'", + "Local link" : "Локальная ссылка", "{newname} already exists" : "{newname} уже существует", "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог", + "A file or folder has been <strong>deleted</strong>" : "<strong>Удалён</strong> файл или каталог", + "A file or folder has been <strong>restored</strong>" : "<strong>Восстановлен</strong> файл или каталог", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">получения доступа к вашим файлам через WebDAV</a>", "Cancel upload" : "Отменить загрузку" }, diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index bc4d3f52b6b..eb7b55b13e0 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -74,16 +74,15 @@ "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", - "Local link" : "Локальная ссылка", "Folder" : "Каталог", "New folder" : "Новый каталог", "Upload" : "Загрузить", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", - "A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог", - "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Фаил или каталог <strong>изменён</strong> или <strong>переименован</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ограничить уведомления о создании и изменении ваших <strong>избранных файлов</strong> <em>(отображать только в приложении события)</em>", - "A file or folder has been <strong>deleted</strong>" : "<strong>Удалён</strong> файл или каталог", - "A file or folder has been <strong>restored</strong>" : "<strong>Восстановлен</strong> файл или каталог", + "Changed by %2$s" : "Изменено %2$s", + "Deleted by %2$s" : "Удалено %2$s", + "Restored by %2$s" : "Восстановлено %2$s", + "Renamed by %2$s" : "Переименовано %2$s", + "Moved by %2$s" : "Перемещено %2$s", "You created %1$s" : "Вы создали %1$s", "%2$s created %1$s" : "%2$s создал %1$s", "%1$s was created in a public folder" : "%1$s создан в общем каталоге", @@ -97,11 +96,9 @@ "%2$s renamed %3$s to %1$s" : "%2$s переименовал %3$s в %1$s", "You moved %2$s to %1$s" : "Вы переместили %2$s в %1$s", "%2$s moved %3$s to %1$s" : "%2$s переместил %3$s в %1$s", - "Changed by %2$s" : "Изменено %2$s", - "Deleted by %2$s" : "Удалено %2$s", - "Restored by %2$s" : "Восстановлено %2$s", - "Renamed by %2$s" : "Переименовано %2$s", - "Moved by %2$s" : "Перемещено %2$s", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Фаил или каталог <strong>изменён</strong> или <strong>переименован</strong>", + "A new file or folder has been <strong>created</strong>" : "<strong>Создан</strong> новый файл или каталог", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Ограничить уведомления о создании и изменении ваших <strong>избранных файлов</strong> <em>(отображать только в приложении события)</em>", "Upload (max. %s)" : "Загрузка (максимум %s)", "File handling" : "Управление файлами", "Maximum upload size" : "Максимальный размер загружаемого файла", @@ -148,8 +145,11 @@ "Error uploading file \"{fileName}\": {message}" : "Ошибка загрузки файла \"{fileName}\": {message}", "Could not get result from server." : "Не удалось получить ответ от сервера.", "No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'", + "Local link" : "Локальная ссылка", "{newname} already exists" : "{newname} уже существует", "A file or folder has been <strong>changed</strong>" : "<strong>Изменён</strong> файл или каталог", + "A file or folder has been <strong>deleted</strong>" : "<strong>Удалён</strong> файл или каталог", + "A file or folder has been <strong>restored</strong>" : "<strong>Восстановлен</strong> файл или каталог", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">получения доступа к вашим файлам через WebDAV</a>", "Cancel upload" : "Отменить загрузку" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 1d99d3c80a0..2498801e059 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -70,15 +70,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", - "Local link" : "Krajevna povezava", "Folder" : "Mapa", "New folder" : "Nova mapa", "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", - "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omeji obvestila o ustvarjanju in spreminjanju <strong>najpogosteje uporabljenih </strong> datotek <em>(omogoči pretok)</em>", - "A file or folder has been <strong>deleted</strong>" : "Datoteka ali mapa je <strong>izbrisana</strong>.", - "A file or folder has been <strong>restored</strong>" : "Datoteka ali mapa je <strong>obnovljena</strong>.", + "Changed by %2$s" : "Zadnja sprememba: %2$s", + "Deleted by %2$s" : "Izbrisano: %2$s", + "Restored by %2$s" : "Obnovljeno: %2$s", "You created %1$s" : "Ustvarili ste %1$s", "%2$s created %1$s" : "%2$s je ustvaril %1$s", "%1$s was created in a public folder" : "Datoteka %1$s je ustvarjena v javni mapi.", @@ -88,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s je izbrisal %1$s", "You restored %1$s" : "Obnovljen je predmet %1$s", "%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.", - "Changed by %2$s" : "Zadnja sprememba: %2$s", - "Deleted by %2$s" : "Izbrisano: %2$s", - "Restored by %2$s" : "Obnovljeno: %2$s", + "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omeji obvestila o ustvarjanju in spreminjanju <strong>najpogosteje uporabljenih </strong> datotek <em>(omogoči pretok)</em>", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", "File handling" : "Upravljanje z datotekami", "Maximum upload size" : "Največja velikost za pošiljanja", @@ -132,8 +129,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Napaka pošiljanja datoteke \"{fileName}\": {message}", "Could not get result from server." : "Ni mogoče pridobiti podatkov s strežnika.", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", + "Local link" : "Krajevna povezava", "{newname} already exists" : "{newname} že obstaja", "A file or folder has been <strong>changed</strong>" : "Datoteka ali mapa je <strong>spremenjena</strong>.", + "A file or folder has been <strong>deleted</strong>" : "Datoteka ali mapa je <strong>izbrisana</strong>.", + "A file or folder has been <strong>restored</strong>" : "Datoteka ali mapa je <strong>obnovljena</strong>.", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabi ta naslov za <a href=\"%s\" target=\"_blank\">dostop do tvojih datotek preko WebDAV</a>", "Cancel upload" : "Prekini nalaganje" }, diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index 6ebbe8c12a3..965db6b4eb1 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -68,15 +68,13 @@ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajti","%n bajtov"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", - "Local link" : "Krajevna povezava", "Folder" : "Mapa", "New folder" : "Nova mapa", "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", - "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omeji obvestila o ustvarjanju in spreminjanju <strong>najpogosteje uporabljenih </strong> datotek <em>(omogoči pretok)</em>", - "A file or folder has been <strong>deleted</strong>" : "Datoteka ali mapa je <strong>izbrisana</strong>.", - "A file or folder has been <strong>restored</strong>" : "Datoteka ali mapa je <strong>obnovljena</strong>.", + "Changed by %2$s" : "Zadnja sprememba: %2$s", + "Deleted by %2$s" : "Izbrisano: %2$s", + "Restored by %2$s" : "Obnovljeno: %2$s", "You created %1$s" : "Ustvarili ste %1$s", "%2$s created %1$s" : "%2$s je ustvaril %1$s", "%1$s was created in a public folder" : "Datoteka %1$s je ustvarjena v javni mapi.", @@ -86,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s je izbrisal %1$s", "You restored %1$s" : "Obnovljen je predmet %1$s", "%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.", - "Changed by %2$s" : "Zadnja sprememba: %2$s", - "Deleted by %2$s" : "Izbrisano: %2$s", - "Restored by %2$s" : "Obnovljeno: %2$s", + "A new file or folder has been <strong>created</strong>" : "Nova datoteka ali mapa je <strong>ustvarjena</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Omeji obvestila o ustvarjanju in spreminjanju <strong>najpogosteje uporabljenih </strong> datotek <em>(omogoči pretok)</em>", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", "File handling" : "Upravljanje z datotekami", "Maximum upload size" : "Največja velikost za pošiljanja", @@ -130,8 +127,11 @@ "Error uploading file \"{fileName}\": {message}" : "Napaka pošiljanja datoteke \"{fileName}\": {message}", "Could not get result from server." : "Ni mogoče pridobiti podatkov s strežnika.", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", + "Local link" : "Krajevna povezava", "{newname} already exists" : "{newname} že obstaja", "A file or folder has been <strong>changed</strong>" : "Datoteka ali mapa je <strong>spremenjena</strong>.", + "A file or folder has been <strong>deleted</strong>" : "Datoteka ali mapa je <strong>izbrisana</strong>.", + "A file or folder has been <strong>restored</strong>" : "Datoteka ali mapa je <strong>obnovljena</strong>.", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabi ta naslov za <a href=\"%s\" target=\"_blank\">dostop do tvojih datotek preko WebDAV</a>", "Cancel upload" : "Prekini nalaganje" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 12fffc08700..704a2ff4dd3 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -70,15 +70,13 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoriserad", "Favorite" : "Favorit", - "Local link" : "Lokal länk", "Folder" : "Mapp", "New folder" : "Ny mapp", "Upload" : "Ladda upp", "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna", - "A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begränsa notiser om skapande och ändringar till dina <strong>favoritfiler</strong> <em>(Endast ström)</em>", - "A file or folder has been <strong>deleted</strong>" : "En ny fil eller mapp har blivit <strong>raderad</strong>", - "A file or folder has been <strong>restored</strong>" : "En ny fil eller mapp har blivit <strong>återskapad</strong>", + "Changed by %2$s" : "Ändrad av %2$s", + "Deleted by %2$s" : "Bortagen av %2$s", + "Restored by %2$s" : "Återställd av %2$s", "You created %1$s" : "Du skapade %1$s", "%2$s created %1$s" : "%2$s skapade %1$s", "%1$s was created in a public folder" : "%1$s skapades i en publik mapp", @@ -88,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s raderade %1$s", "You restored %1$s" : "Du återkapade %1$s", "%2$s restored %1$s" : "%2$s återskapade %1$s", - "Changed by %2$s" : "Ändrad av %2$s", - "Deleted by %2$s" : "Bortagen av %2$s", - "Restored by %2$s" : "Återställd av %2$s", + "A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begränsa notiser om skapande och ändringar till dina <strong>favoritfiler</strong> <em>(Endast ström)</em>", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", @@ -132,8 +129,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "Fel vid uppladdning av fil \"{fileName}\": {message}", "Could not get result from server." : "Gick inte att hämta resultat från server.", "No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"", + "Local link" : "Lokal länk", "{newname} already exists" : "{newname} existerar redan", "A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>", + "A file or folder has been <strong>deleted</strong>" : "En ny fil eller mapp har blivit <strong>raderad</strong>", + "A file or folder has been <strong>restored</strong>" : "En ny fil eller mapp har blivit <strong>återskapad</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress för att <a href=\"%s\" target=\"_blank\">få tillgång till filer via WebDAV</a>", "Cancel upload" : "Avbryt uppladdning" }, diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 4e45d2d0656..34573ec50ef 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -68,15 +68,13 @@ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoriserad", "Favorite" : "Favorit", - "Local link" : "Lokal länk", "Folder" : "Mapp", "New folder" : "Ny mapp", "Upload" : "Ladda upp", "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna", - "A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begränsa notiser om skapande och ändringar till dina <strong>favoritfiler</strong> <em>(Endast ström)</em>", - "A file or folder has been <strong>deleted</strong>" : "En ny fil eller mapp har blivit <strong>raderad</strong>", - "A file or folder has been <strong>restored</strong>" : "En ny fil eller mapp har blivit <strong>återskapad</strong>", + "Changed by %2$s" : "Ändrad av %2$s", + "Deleted by %2$s" : "Bortagen av %2$s", + "Restored by %2$s" : "Återställd av %2$s", "You created %1$s" : "Du skapade %1$s", "%2$s created %1$s" : "%2$s skapade %1$s", "%1$s was created in a public folder" : "%1$s skapades i en publik mapp", @@ -86,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s raderade %1$s", "You restored %1$s" : "Du återkapade %1$s", "%2$s restored %1$s" : "%2$s återskapade %1$s", - "Changed by %2$s" : "Ändrad av %2$s", - "Deleted by %2$s" : "Bortagen av %2$s", - "Restored by %2$s" : "Återställd av %2$s", + "A new file or folder has been <strong>created</strong>" : "En ny fil eller mapp har blivit <strong>skapad</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Begränsa notiser om skapande och ändringar till dina <strong>favoritfiler</strong> <em>(Endast ström)</em>", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", @@ -130,8 +127,11 @@ "Error uploading file \"{fileName}\": {message}" : "Fel vid uppladdning av fil \"{fileName}\": {message}", "Could not get result from server." : "Gick inte att hämta resultat från server.", "No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"", + "Local link" : "Lokal länk", "{newname} already exists" : "{newname} existerar redan", "A file or folder has been <strong>changed</strong>" : "En ny fil eller mapp har blivit <strong>ändrad</strong>", + "A file or folder has been <strong>deleted</strong>" : "En ny fil eller mapp har blivit <strong>raderad</strong>", + "A file or folder has been <strong>restored</strong>" : "En ny fil eller mapp har blivit <strong>återskapad</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress för att <a href=\"%s\" target=\"_blank\">få tillgång till filer via WebDAV</a>", "Cancel upload" : "Avbryt uppladdning" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 1f52f014deb..ae78b25fda2 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -74,10 +74,9 @@ OC.L10N.register( "New folder" : "Yeni klasör", "Upload" : "Yükle", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", - "A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>Sık kullanılan dosyalarınızın</strong> oluşturulma ve değiştirilme hakkındaki bildirimlerini sınırla <em>(Sadece akışta)</em>", - "A file or folder has been <strong>deleted</strong>" : "Bir dosya veya klasör <strong>silindi</strong>", - "A file or folder has been <strong>restored</strong>" : "Bir dosya veya klasör <strong>geri alındı</strong>", + "Changed by %2$s" : "%2$s tarafından değiştirildi", + "Deleted by %2$s" : "%2$s tarafından silindi", + "Restored by %2$s" : "%2$s tarafından geri yüklendi", "You created %1$s" : "%1$s dosyasını oluşturdunuz", "%2$s created %1$s" : "%2$s, %1$s dosyasını oluşturdu", "%1$s was created in a public folder" : "%1$s herkese açık klasörde oluşturuldu", @@ -87,9 +86,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s, %1$s dosyasını sildi", "You restored %1$s" : "%1$s ögesini geri aldınız", "%2$s restored %1$s" : "%2$s, %1$s ögesini geri aldı", - "Changed by %2$s" : "%2$s tarafından değiştirildi", - "Deleted by %2$s" : "%2$s tarafından silindi", - "Restored by %2$s" : "%2$s tarafından geri yüklendi", + "A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>Sık kullanılan dosyalarınızın</strong> oluşturulma ve değiştirilme hakkındaki bildirimlerini sınırla <em>(Sadece akışta)</em>", "Upload (max. %s)" : "Yükle (azami: %s)", "File handling" : "Dosya işlemleri", "Maximum upload size" : "Azami yükleme boyutu", @@ -132,6 +130,8 @@ OC.L10N.register( "Could not get result from server." : "Sunucudan sonuç alınamadı.", "No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor", "{newname} already exists" : "{newname} zaten mevcut", - "A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>" + "A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>", + "A file or folder has been <strong>deleted</strong>" : "Bir dosya veya klasör <strong>silindi</strong>", + "A file or folder has been <strong>restored</strong>" : "Bir dosya veya klasör <strong>geri alındı</strong>" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index c9b75f91c7e..378457d6a6a 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -72,10 +72,9 @@ "New folder" : "Yeni klasör", "Upload" : "Yükle", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", - "A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>Sık kullanılan dosyalarınızın</strong> oluşturulma ve değiştirilme hakkındaki bildirimlerini sınırla <em>(Sadece akışta)</em>", - "A file or folder has been <strong>deleted</strong>" : "Bir dosya veya klasör <strong>silindi</strong>", - "A file or folder has been <strong>restored</strong>" : "Bir dosya veya klasör <strong>geri alındı</strong>", + "Changed by %2$s" : "%2$s tarafından değiştirildi", + "Deleted by %2$s" : "%2$s tarafından silindi", + "Restored by %2$s" : "%2$s tarafından geri yüklendi", "You created %1$s" : "%1$s dosyasını oluşturdunuz", "%2$s created %1$s" : "%2$s, %1$s dosyasını oluşturdu", "%1$s was created in a public folder" : "%1$s herkese açık klasörde oluşturuldu", @@ -85,9 +84,8 @@ "%2$s deleted %1$s" : "%2$s, %1$s dosyasını sildi", "You restored %1$s" : "%1$s ögesini geri aldınız", "%2$s restored %1$s" : "%2$s, %1$s ögesini geri aldı", - "Changed by %2$s" : "%2$s tarafından değiştirildi", - "Deleted by %2$s" : "%2$s tarafından silindi", - "Restored by %2$s" : "%2$s tarafından geri yüklendi", + "A new file or folder has been <strong>created</strong>" : "Yeni bir dosya veya klasör <strong>oluşturuldu</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>Sık kullanılan dosyalarınızın</strong> oluşturulma ve değiştirilme hakkındaki bildirimlerini sınırla <em>(Sadece akışta)</em>", "Upload (max. %s)" : "Yükle (azami: %s)", "File handling" : "Dosya işlemleri", "Maximum upload size" : "Azami yükleme boyutu", @@ -130,6 +128,8 @@ "Could not get result from server." : "Sunucudan sonuç alınamadı.", "No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor", "{newname} already exists" : "{newname} zaten mevcut", - "A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>" + "A file or folder has been <strong>changed</strong>" : "Bir dosya veya klasör <strong>değiştirildi</strong>", + "A file or folder has been <strong>deleted</strong>" : "Bir dosya veya klasör <strong>silindi</strong>", + "A file or folder has been <strong>restored</strong>" : "Bir dosya veya klasör <strong>geri alındı</strong>" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 8e7cb9d6239..1b9af8dc6cd 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -70,15 +70,15 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n 位元組"], "Favorited" : "已加入最愛", "Favorite" : "我的最愛", - "Local link" : "本地連結", "Folder" : "資料夾", "New folder" : "新資料夾", "Upload" : "上傳", "An error occurred while trying to update the tags" : "更新標籤時發生錯誤", - "A new file or folder has been <strong>created</strong>" : "新的檔案或目錄已被 <strong>建立</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "僅顯示<strong>已加星號的檔案</strong>的動態通知<em>(僅限訊息串)</em>", - "A file or folder has been <strong>deleted</strong>" : "檔案或目錄已被 <strong>刪除</strong>", - "A file or folder has been <strong>restored</strong>" : "檔案或目錄已被 <strong>恢復</strong>", + "Changed by %2$s" : "由 %2$s 改動", + "Deleted by %2$s" : "由 %2$s 刪除", + "Restored by %2$s" : "由 %2$s 還原", + "Renamed by %2$s" : "由 %2$s 重新命名", + "Moved by %2$s" : "由 %2$s 移動", "You created %1$s" : "您建立了 %1$s", "%2$s created %1$s" : "%2$s 已建立 %1$s", "%1$s was created in a public folder" : "%1$s 已建立於公開的目錄", @@ -88,11 +88,8 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s 已刪除 %1$s", "You restored %1$s" : "您還原了 %1$s", "%2$s restored %1$s" : "%2$s 還原了 %1$s", - "Changed by %2$s" : "由 %2$s 改動", - "Deleted by %2$s" : "由 %2$s 刪除", - "Restored by %2$s" : "由 %2$s 還原", - "Renamed by %2$s" : "由 %2$s 重新命名", - "Moved by %2$s" : "由 %2$s 移動", + "A new file or folder has been <strong>created</strong>" : "新的檔案或目錄已被 <strong>建立</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "僅顯示<strong>已加星號的檔案</strong>的動態通知<em>(僅限訊息串)</em>", "Upload (max. %s)" : "上傳(至多 %s)", "File handling" : "檔案處理", "Maximum upload size" : "上傳限制", @@ -134,8 +131,11 @@ OC.L10N.register( "Error uploading file \"{fileName}\": {message}" : "上傳檔案 \"{fileName}\" 發生錯誤:{message}", "Could not get result from server." : "無法從伺服器取回結果", "No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符", + "Local link" : "本地連結", "{newname} already exists" : "{newname} 已經存在", "A file or folder has been <strong>changed</strong>" : "檔案或目錄已被 <strong>變更</strong>", + "A file or folder has been <strong>deleted</strong>" : "檔案或目錄已被 <strong>刪除</strong>", + "A file or folder has been <strong>restored</strong>" : "檔案或目錄已被 <strong>恢復</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個位址來<a href=\"%s\" target=\"_blank\">使用 WebDAV 存取檔案</a>", "Cancel upload" : "取消上傳" }, diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index b2afff5bcd7..383628a6b53 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -68,15 +68,15 @@ "_%n byte_::_%n bytes_" : ["%n 位元組"], "Favorited" : "已加入最愛", "Favorite" : "我的最愛", - "Local link" : "本地連結", "Folder" : "資料夾", "New folder" : "新資料夾", "Upload" : "上傳", "An error occurred while trying to update the tags" : "更新標籤時發生錯誤", - "A new file or folder has been <strong>created</strong>" : "新的檔案或目錄已被 <strong>建立</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "僅顯示<strong>已加星號的檔案</strong>的動態通知<em>(僅限訊息串)</em>", - "A file or folder has been <strong>deleted</strong>" : "檔案或目錄已被 <strong>刪除</strong>", - "A file or folder has been <strong>restored</strong>" : "檔案或目錄已被 <strong>恢復</strong>", + "Changed by %2$s" : "由 %2$s 改動", + "Deleted by %2$s" : "由 %2$s 刪除", + "Restored by %2$s" : "由 %2$s 還原", + "Renamed by %2$s" : "由 %2$s 重新命名", + "Moved by %2$s" : "由 %2$s 移動", "You created %1$s" : "您建立了 %1$s", "%2$s created %1$s" : "%2$s 已建立 %1$s", "%1$s was created in a public folder" : "%1$s 已建立於公開的目錄", @@ -86,11 +86,8 @@ "%2$s deleted %1$s" : "%2$s 已刪除 %1$s", "You restored %1$s" : "您還原了 %1$s", "%2$s restored %1$s" : "%2$s 還原了 %1$s", - "Changed by %2$s" : "由 %2$s 改動", - "Deleted by %2$s" : "由 %2$s 刪除", - "Restored by %2$s" : "由 %2$s 還原", - "Renamed by %2$s" : "由 %2$s 重新命名", - "Moved by %2$s" : "由 %2$s 移動", + "A new file or folder has been <strong>created</strong>" : "新的檔案或目錄已被 <strong>建立</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "僅顯示<strong>已加星號的檔案</strong>的動態通知<em>(僅限訊息串)</em>", "Upload (max. %s)" : "上傳(至多 %s)", "File handling" : "檔案處理", "Maximum upload size" : "上傳限制", @@ -132,8 +129,11 @@ "Error uploading file \"{fileName}\": {message}" : "上傳檔案 \"{fileName}\" 發生錯誤:{message}", "Could not get result from server." : "無法從伺服器取回結果", "No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符", + "Local link" : "本地連結", "{newname} already exists" : "{newname} 已經存在", "A file or folder has been <strong>changed</strong>" : "檔案或目錄已被 <strong>變更</strong>", + "A file or folder has been <strong>deleted</strong>" : "檔案或目錄已被 <strong>刪除</strong>", + "A file or folder has been <strong>restored</strong>" : "檔案或目錄已被 <strong>恢復</strong>", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個位址來<a href=\"%s\" target=\"_blank\">使用 WebDAV 存取檔案</a>", "Cancel upload" : "取消上傳" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/lib/Activity.php b/apps/files/lib/Activity.php deleted file mode 100644 index 25146456b4c..00000000000 --- a/apps/files/lib/Activity.php +++ /dev/null @@ -1,452 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OCA\Files; - -use OCP\IDBConnection; -use OCP\L10N\IFactory; -use OCP\Activity\IExtension; -use OCP\Activity\IManager; -use OCP\IConfig; -use OCP\IL10N; -use OCP\IURLGenerator; - -class Activity implements IExtension { - const APP_FILES = 'files'; - const FILTER_FILES = 'files'; - const FILTER_FAVORITES = 'files_favorites'; - - const TYPE_SHARE_CREATED = 'file_created'; - const TYPE_SHARE_CHANGED = 'file_changed'; - const TYPE_SHARE_DELETED = 'file_deleted'; - const TYPE_SHARE_RESTORED = 'file_restored'; - const TYPE_FAVORITES = 'files_favorites'; - - /** @var IL10N */ - protected $l; - - /** @var IFactory */ - protected $languageFactory; - - /** @var IURLGenerator */ - protected $URLGenerator; - - /** @var \OCP\Activity\IManager */ - protected $activityManager; - - /** @var \OCP\IDBConnection */ - protected $connection; - - /** @var \OCP\IConfig */ - protected $config; - - /** @var \OCA\Files\ActivityHelper */ - protected $helper; - - /** - * @param IFactory $languageFactory - * @param IURLGenerator $URLGenerator - * @param IManager $activityManager - * @param ActivityHelper $helper - * @param IDBConnection $connection - * @param IConfig $config - */ - public function __construct(IFactory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager, ActivityHelper $helper, IDBConnection $connection, IConfig $config) { - $this->languageFactory = $languageFactory; - $this->URLGenerator = $URLGenerator; - $this->l = $this->getL10N(); - $this->activityManager = $activityManager; - $this->helper = $helper; - $this->connection = $connection; - $this->config = $config; - } - - /** - * @param string|null $languageCode - * @return IL10N - */ - protected function getL10N($languageCode = null) { - return $this->languageFactory->get(self::APP_FILES, $languageCode); - } - - /** - * The extension can return an array of additional notification types. - * If no additional types are to be added false is to be returned - * - * @param string $languageCode - * @return array|false Array "stringID of the type" => "translated string description for the setting" - * or Array "stringID of the type" => [ - * 'desc' => "translated string description for the setting" - * 'methods' => [self::METHOD_*], - * ] - */ - public function getNotificationTypes($languageCode) { - $l = $this->getL10N($languageCode); - return [ - self::TYPE_SHARE_CREATED => (string) $l->t('A new file or folder has been <strong>created</strong>'), - self::TYPE_SHARE_CHANGED => (string) $l->t('A file or folder has been <strong>changed</strong> or <strong>renamed</strong>'), - self::TYPE_FAVORITES => [ - 'desc' => (string) $l->t('Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>'), - 'methods' => [self::METHOD_STREAM], - ], - self::TYPE_SHARE_DELETED => (string) $l->t('A file or folder has been <strong>deleted</strong>'), - self::TYPE_SHARE_RESTORED => (string) $l->t('A file or folder has been <strong>restored</strong>'), - ]; - } - - /** - * For a given method additional types to be displayed in the settings can be returned. - * In case no additional types are to be added false is to be returned. - * - * @param string $method - * @return array|false - */ - public function getDefaultTypes($method) { - if ($method === self::METHOD_STREAM) { - $settings = array(); - $settings[] = self::TYPE_SHARE_CREATED; - $settings[] = self::TYPE_SHARE_CHANGED; - $settings[] = self::TYPE_SHARE_DELETED; - $settings[] = self::TYPE_SHARE_RESTORED; - return $settings; - } - - return false; - } - - /** - * The extension can translate a given message to the requested languages. - * If no translation is available false is to be returned. - * - * @param string $app - * @param string $text - * @param array $params - * @param boolean $stripPath - * @param boolean $highlightParams - * @param string $languageCode - * @return string|false - */ - public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { - if ($app !== self::APP_FILES) { - return false; - } - - $l = $this->getL10N($languageCode); - - if ($this->activityManager->isFormattingFilteredObject()) { - $translation = $this->translateShort($text, $l, $params); - if ($translation !== false) { - return $translation; - } - } - - return $this->translateLong($text, $l, $params); - } - - /** - * @param string $text - * @param IL10N $l - * @param array $params - * @return string|false - */ - protected function translateLong($text, IL10N $l, array $params) { - switch ($text) { - case 'created_self': - return (string) $l->t('You created %1$s', $params); - case 'created_by': - return (string) $l->t('%2$s created %1$s', $params); - case 'created_public': - return (string) $l->t('%1$s was created in a public folder', $params); - case 'changed_self': - return (string) $l->t('You changed %1$s', $params); - case 'changed_by': - return (string) $l->t('%2$s changed %1$s', $params); - case 'deleted_self': - return (string) $l->t('You deleted %1$s', $params); - case 'deleted_by': - return (string) $l->t('%2$s deleted %1$s', $params); - case 'restored_self': - return (string) $l->t('You restored %1$s', $params); - case 'restored_by': - return (string) $l->t('%2$s restored %1$s', $params); - case 'renamed_self': - return (string) $l->t('You renamed %2$s to %1$s', $params); - case 'renamed_by': - return (string) $l->t('%2$s renamed %3$s to %1$s', $params); - case 'moved_self': - return (string) $l->t('You moved %2$s to %1$s', $params); - case 'moved_by': - return (string) $l->t('%2$s moved %3$s to %1$s', $params); - - default: - return false; - } - } - - /** - * @param string $text - * @param IL10N $l - * @param array $params - * @return string|false - */ - protected function translateShort($text, IL10N $l, array $params) { - switch ($text) { - case 'changed_by': - return (string) $l->t('Changed by %2$s', $params); - case 'deleted_by': - return (string) $l->t('Deleted by %2$s', $params); - case 'restored_by': - return (string) $l->t('Restored by %2$s', $params); - case 'renamed_by': - return (string) $l->t('Renamed by %2$s', $params); - case 'moved_by': - return (string) $l->t('Moved by %2$s', $params); - - default: - return false; - } - } - - /** - * The extension can define the type of parameters for translation - * - * Currently known types are: - * * file => will strip away the path of the file and add a tooltip with it - * * username => will add the avatar of the user - * - * @param string $app - * @param string $text - * @return array|false - */ - function getSpecialParameterList($app, $text) { - if ($app === self::APP_FILES) { - switch ($text) { - case 'created_self': - case 'created_by': - case 'created_public': - case 'changed_self': - case 'changed_by': - case 'deleted_self': - case 'deleted_by': - case 'restored_self': - case 'restored_by': - return [ - 0 => 'file', - 1 => 'username', - ]; - case 'renamed_self': - case 'moved_self': - return [ - 0 => 'file', - 1 => 'file', - ]; - case 'renamed_by': - case 'moved_by': - return [ - 0 => 'file', - 1 => 'username', - 2 => 'file', - ]; - } - } - - return false; - } - - /** - * A string naming the css class for the icon to be used can be returned. - * If no icon is known for the given type false is to be returned. - * - * @param string $type - * @return string|false - */ - public function getTypeIcon($type) { - switch ($type) { - case self::TYPE_SHARE_CHANGED: - return 'icon-change'; - case self::TYPE_SHARE_CREATED: - return 'icon-add-color'; - case self::TYPE_SHARE_DELETED: - return 'icon-delete-color'; - - default: - return false; - } - } - - /** - * The extension can define the parameter grouping by returning the index as integer. - * In case no grouping is required false is to be returned. - * - * @param array $activity - * @return integer|false - */ - public function getGroupParameter($activity) { - if ($activity['app'] === self::APP_FILES) { - switch ($activity['subject']) { - case 'created_self': - case 'created_by': - case 'changed_self': - case 'changed_by': - case 'deleted_self': - case 'deleted_by': - case 'restored_self': - case 'restored_by': - return 0; - } - } - - return false; - } - - /** - * The extension can define additional navigation entries. The array returned has to contain two keys 'top' - * and 'apps' which hold arrays with the relevant entries. - * If no further entries are to be added false is no be returned. - * - * @return array|false - */ - public function getNavigation() { - return [ - 'top' => [ - self::FILTER_FAVORITES => [ - 'id' => self::FILTER_FAVORITES, - 'icon' => 'icon-favorite', - 'name' => (string) $this->l->t('Favorites'), - 'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::FILTER_FAVORITES]), - ], - ], - 'apps' => [ - self::FILTER_FILES => [ - 'id' => self::FILTER_FILES, - 'icon' => 'icon-files-dark', - 'name' => (string) $this->l->t('File changes'), - 'url' => $this->URLGenerator->linkToRoute('activity.Activities.showList', ['filter' => self::FILTER_FILES]), - ], - ], - ]; - } - - /** - * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not. - * - * @param string $filterValue - * @return boolean - */ - public function isFilterValid($filterValue) { - return $filterValue === self::FILTER_FILES || $filterValue === self::FILTER_FAVORITES; - } - - /** - * The extension can filter the types based on the filter if required. - * In case no filter is to be applied false is to be returned unchanged. - * - * @param array $types - * @param string $filter - * @return array|false - */ - public function filterNotificationTypes($types, $filter) { - if ($filter === self::FILTER_FILES || $filter === self::FILTER_FAVORITES) { - return array_intersect([ - self::TYPE_SHARE_CREATED, - self::TYPE_SHARE_CHANGED, - self::TYPE_SHARE_DELETED, - self::TYPE_SHARE_RESTORED, - ], $types); - } - return false; - } - - /** - * For a given filter the extension can specify the sql query conditions including parameters for that query. - * In case the extension does not know the filter false is to be returned. - * The query condition and the parameters are to be returned as array with two elements. - * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); - * - * @param string $filter - * @return array|false - */ - public function getQueryForFilter($filter) { - $user = $this->activityManager->getCurrentUserId(); - // Display actions from all files - if ($filter === self::FILTER_FILES) { - return ['`app` = ?', [self::APP_FILES]]; - } - - if (!$user) { - // Remaining filters only work with a user/token - return false; - } - - // Display actions from favorites only - if ($filter === self::FILTER_FAVORITES || in_array($filter, ['all', 'by', 'self']) && $this->userSettingFavoritesOnly($user)) { - try { - $favorites = $this->helper->getFavoriteFilePaths($user); - } catch (\RuntimeException $e) { - // Too many favorites, can not put them into one query anymore... - return ['`app` = ?', [self::APP_FILES]]; - } - - /* - * Display activities only, when they are not `type` create/change - * or `file` is a favorite or in a favorite folder - */ - $parameters = $fileQueryList = []; - $parameters[] = self::APP_FILES; - $parameters[] = self::APP_FILES; - - $fileQueryList[] = '(`type` <> ? AND `type` <> ?)'; - $parameters[] = self::TYPE_SHARE_CREATED; - $parameters[] = self::TYPE_SHARE_CHANGED; - - foreach ($favorites['items'] as $favorite) { - $fileQueryList[] = '`file` = ?'; - $parameters[] = $favorite; - } - foreach ($favorites['folders'] as $favorite) { - $fileQueryList[] = '`file` LIKE ?'; - $parameters[] = $this->connection->escapeLikeParameter($favorite) . '/%'; - } - - return [ - ' CASE ' - . 'WHEN `app` <> ? THEN 1 ' - . 'WHEN `app` = ? AND (' . implode(' OR ', $fileQueryList) . ') THEN 1 ' - . 'ELSE 0 ' - . 'END = 1 ', - $parameters, - ]; - } - return false; - } - - /** - * Is the file actions favorite limitation enabled? - * - * @param string $user - * @return bool - */ - protected function userSettingFavoritesOnly($user) { - return (bool) $this->config->getUserValue($user, 'activity', 'notify_' . self::METHOD_STREAM . '_' . self::TYPE_FAVORITES, false); - } -} diff --git a/apps/files/lib/Activity/Filter/Favorites.php b/apps/files/lib/Activity/Filter/Favorites.php new file mode 100644 index 00000000000..2639ae847fc --- /dev/null +++ b/apps/files/lib/Activity/Filter/Favorites.php @@ -0,0 +1,160 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Filter; + + +use OCA\Files\Activity\Helper; +use OCP\Activity\IFilter; +use OCP\Activity\IManager; +use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; +use OCP\IL10N; +use OCP\IURLGenerator; + +class Favorites implements IFilter { + + /** @var IL10N */ + protected $l; + + /** @var IURLGenerator */ + protected $url; + + /** @var IManager */ + protected $activityManager; + + /** @var Helper */ + protected $helper; + + /** @var IDBConnection */ + protected $db; + + /** + * @param IL10N $l + * @param IURLGenerator $url + * @param IManager $activityManager + * @param Helper $helper + * @param IDBConnection $db + */ + public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager, Helper $helper, IDBConnection $db) { + $this->l = $l; + $this->url = $url; + $this->activityManager = $activityManager; + $this->helper = $helper; + $this->db = $db; + } + + /** + * @return string Lowercase a-z only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'files_favorites'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('Favorites'); + } + + /** + * @return int + * @since 11.0.0 + */ + public function getPriority() { + return 10; + } + + /** + * @return string Full URL to an icon, empty string when none is given + * @since 11.0.0 + */ + public function getIcon() { + return $this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/star-dark.svg')); + } + + /** + * @param string[] $types + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function filterTypes(array $types) { + return array_intersect([ + 'file_created', + 'file_changed', + 'file_deleted', + 'file_restored', + ], $types); + } + + /** + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function allowedApps() { + return ['files']; + } + + /** + * @param IQueryBuilder $query + */ + public function filterFavorites(IQueryBuilder $query) { + try { + $user = $this->activityManager->getCurrentUserId(); + } catch (\UnexpectedValueException $e) { + return; + } + + try { + $favorites = $this->helper->getFavoriteFilePaths($user); + } catch (\RuntimeException $e) { + return; + } + + $limitations = []; + if (!empty($favorites['items'])) { + $limitations[] = $query->expr()->in('file', $query->createNamedParameter($favorites['items'], IQueryBuilder::PARAM_STR_ARRAY)); + } + foreach ($favorites['folders'] as $favorite) { + $limitations[] = $query->expr()->like('file', $query->createNamedParameter( + $this->db->escapeLikeParameter($favorite . '/') . '%' + )); + } + + if (empty($limitations)) { + return; + } + + $function = $query->createFunction(' + CASE + WHEN ' . $query->getColumnName('app') . ' <> ' . $query->createNamedParameter('files') . ' THEN 1 + WHEN ' . $query->getColumnName('app') . ' = ' . $query->createNamedParameter('files') . ' + AND (' . implode(' OR ', $limitations) . ') + THEN 1 + END = 1' + ); + + $query->andWhere($function); + } +} diff --git a/apps/files/lib/Activity/Filter/FileChanges.php b/apps/files/lib/Activity/Filter/FileChanges.php new file mode 100644 index 00000000000..dc7daf96bac --- /dev/null +++ b/apps/files/lib/Activity/Filter/FileChanges.php @@ -0,0 +1,95 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Filter; + + +use OCP\Activity\IFilter; +use OCP\IL10N; +use OCP\IURLGenerator; + +class FileChanges implements IFilter { + + /** @var IL10N */ + protected $l; + + /** @var IURLGenerator */ + protected $url; + + public function __construct(IL10N $l, IURLGenerator $url) { + $this->l = $l; + $this->url = $url; + } + + /** + * @return string Lowercase a-z only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'files'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('File changes'); + } + + /** + * @return int + * @since 11.0.0 + */ + public function getPriority() { + return 30; + } + + /** + * @return string Full URL to an icon, empty string when none is given + * @since 11.0.0 + */ + public function getIcon() { + return $this->url->getAbsoluteURL($this->url->imagePath('core', 'places/files-dark.svg')); + } + + /** + * @param string[] $types + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function filterTypes(array $types) { + return array_intersect([ + 'file_created', + 'file_changed', + 'file_deleted', + 'file_restored', + ], $types); + } + + /** + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function allowedApps() { + return ['files']; + } +} diff --git a/apps/files/lib/ActivityHelper.php b/apps/files/lib/Activity/Helper.php index f5660de4b37..d03d6e8e974 100644 --- a/apps/files/lib/ActivityHelper.php +++ b/apps/files/lib/Activity/Helper.php @@ -20,16 +20,16 @@ * */ -namespace OCA\Files; +namespace OCA\Files\Activity; use OCP\Files\Folder; use OCP\ITagManager; -class ActivityHelper { +class Helper { /** If a user has a lot of favorites the query might get too slow and long */ const FAVORITE_LIMIT = 50; - /** @var \OCP\ITagManager */ + /** @var ITagManager */ protected $tagManager; /** diff --git a/apps/files/lib/Activity/Provider.php b/apps/files/lib/Activity/Provider.php new file mode 100644 index 00000000000..e95522a7d08 --- /dev/null +++ b/apps/files/lib/Activity/Provider.php @@ -0,0 +1,276 @@ +<?php +/** + * @copyright Copyright (c) 2016, ownCloud, Inc. + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\Files\Activity; + +use OCP\Activity\IEvent; +use OCP\Activity\IManager; +use OCP\Activity\IProvider; +use OCP\IL10N; +use OCP\IURLGenerator; + +class Provider implements IProvider { + + /** @var IL10N */ + protected $l; + + /** @var IURLGenerator */ + protected $url; + + /** @var IManager */ + protected $activityManager; + + /** + * @param IL10N $l + * @param IURLGenerator $url + * @param IManager $activityManager + */ + public function __construct(IL10N $l, IURLGenerator $url, IManager $activityManager) { + $this->l = $l; + $this->url = $url; + $this->activityManager = $activityManager; + } + + /** + * @param IEvent $event + * @param IEvent|null $previousEvent + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 + */ + public function parse(IEvent $event, IEvent $previousEvent = null) { + if ($event->getApp() !== 'files') { + throw new \InvalidArgumentException(); + } + + if ($previousEvent instanceof IEvent && $event->getSubject() !== $previousEvent->getSubject()) { + // Different subject means not the same string, so no grouping + $previousEvent = null; + } + + if ($this->activityManager->isFormattingFilteredObject()) { + try { + return $this->parseShortVersion($event); + } catch (\InvalidArgumentException $e) { + // Ignore and simply use the long version... + } + } + + return $this->parseLongVersion($event); + } + + /** + * @param IEvent $event + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 + */ + public function parseShortVersion(IEvent $event) { + $parsedParameters = $this->getParsedParameters($event->getSubject(), $event->getSubjectParameters()); + $richParameters = $this->getRichParameters($event->getSubject(), $event->getSubjectParameters()); + + if ($event->getSubject() === 'created_by') { + $event->setParsedSubject($this->l->t('Created by %s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Created by {user1}'), ['user1' => $richParameters['user1']]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg'))); + } else if ($event->getSubject() === 'changed_by') { + $event->setParsedSubject($this->l->t('Changed by %2$s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Changed by {user1}'), ['user1' => $richParameters['user1']]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'deleted_by') { + $event->setParsedSubject($this->l->t('Deleted by %2$s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Deleted by {user1}'), ['user1' => $richParameters['user1']]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg'))); + } else if ($event->getSubject() === 'restored_by') { + $event->setParsedSubject($this->l->t('Restored by %2$s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Restored by {user1}'), ['user1' => $richParameters['user1']]); + } else if ($event->getSubject() === 'renamed_by') { + $event->setParsedSubject($this->l->t('Renamed by %2$s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Renamed by {user1}'), ['user1' => $richParameters['user1']]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'moved_by') { + $event->setParsedSubject($this->l->t('Moved by %2$s', [$parsedParameters[1]])) + ->setRichSubject($this->l->t('Moved by {user1}'), ['user1' => $richParameters['user1']]) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else { + throw new \InvalidArgumentException(); + } + + return $event; + } + + /** + * @param IEvent $event + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 + */ + public function parseLongVersion(IEvent $event) { + $parsedParameters = $this->getParsedParameters($event->getSubject(), $event->getSubjectParameters()); + $richParameters = $this->getRichParameters($event->getSubject(), $event->getSubjectParameters()); + + if ($event->getSubject() === 'created_self') { + $event->setParsedSubject($this->l->t('You created %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You created {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg'))); + } else if ($event->getSubject() === 'created_by') { + $event->setParsedSubject($this->l->t('%2$s created %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} created {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg'))); + } else if ($event->getSubject() === 'created_public') { + $event->setParsedSubject($this->l->t('%1$s was created in a public folder', $parsedParameters)) + ->setRichSubject($this->l->t('{file1} was created in a public folder'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'add-color.svg'))); + } else if ($event->getSubject() === 'changed_self') { + $event->setParsedSubject($this->l->t('You changed %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You changed {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'changed_by') { + $event->setParsedSubject($this->l->t('%2$s changed %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} changed {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'deleted_self') { + $event->setParsedSubject($this->l->t('You deleted %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You deleted {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg'))); + } else if ($event->getSubject() === 'deleted_by') { + $event->setParsedSubject($this->l->t('%2$s deleted %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} deleted {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'delete-color.svg'))); + } else if ($event->getSubject() === 'restored_self') { + $event->setParsedSubject($this->l->t('You restored %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You restored {file1}'), $richParameters); + } else if ($event->getSubject() === 'restored_by') { + $event->setParsedSubject($this->l->t('%2$s restored %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} restored {file1}'), $richParameters); + } else if ($event->getSubject() === 'renamed_self') { + $event->setParsedSubject($this->l->t('You renamed %2$s to %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You renamed {file2} to {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'renamed_by') { + $event->setParsedSubject($this->l->t('%2$s renamed %3$s to %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} renamed {file2} to {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'moved_self') { + $event->setParsedSubject($this->l->t('You moved %2$s to %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('You moved {file2} to {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else if ($event->getSubject() === 'moved_by') { + $event->setParsedSubject($this->l->t('%2$s moved %3$s to %1$s', $parsedParameters)) + ->setRichSubject($this->l->t('{user1} moved {file2} to {file1}'), $richParameters) + ->setIcon($this->url->getAbsoluteURL($this->url->imagePath('files', 'change.svg'))); + } else { + throw new \InvalidArgumentException(); + } + + return $event; + } + + protected function getParsedParameters($subject, array $parameters) { + switch ($subject) { + case 'created_self': + case 'created_public': + case 'changed_self': + case 'deleted_self': + case 'restored_self': + return [ + array_shift($parameters[0]), + ]; + case 'created_by': + case 'changed_by': + case 'deleted_by': + case 'restored_by': + return [ + array_shift($parameters[0]), + $parameters[1], + ]; + case 'renamed_self': + case 'moved_self': + return [ + array_shift($parameters[0]), + array_shift($parameters[1]), + ]; + case 'renamed_by': + case 'moved_by': + return [ + array_shift($parameters[0]), + $parameters[1], + array_shift($parameters[2]), + ]; + } + return []; + } + + protected function getRichParameters($subject, array $parameters) { + switch ($subject) { + case 'created_self': + case 'created_public': + case 'changed_self': + case 'deleted_self': + case 'restored_self': + return [ + 'file1' => $this->getRichFileParameter($parameters[0]), + ]; + case 'created_by': + case 'changed_by': + case 'deleted_by': + case 'restored_by': + return [ + 'file1' => $this->getRichFileParameter($parameters[0]), + 'user1' => $this->getRichUserParameter($parameters[1]), + ]; + case 'renamed_self': + case 'moved_self': + return [ + 'file1' => $this->getRichFileParameter($parameters[0]), + 'file2' => $this->getRichFileParameter($parameters[1]), + ]; + case 'renamed_by': + case 'moved_by': + return [ + 'file1' => $this->getRichFileParameter($parameters[0]), + 'user1' => $this->getRichUserParameter($parameters[1]), + 'file2' => $this->getRichFileParameter($parameters[2]), + ]; + } + return []; + } + + protected function getRichFileParameter($parameter) { + $path = reset($parameter); + $id = key($parameter); + return [ + 'type' => 'file', + 'id' => $id, + 'name' => basename($path), + 'path' => $path, + ]; + } + + protected function getRichUserParameter($parameter) { + return [ + 'type' => 'user', + 'id' => $parameter, + 'name' => $parameter,// FIXME Use display name + ]; + } +} diff --git a/apps/files/lib/Activity/Settings/FileChanged.php b/apps/files/lib/Activity/Settings/FileChanged.php new file mode 100644 index 00000000000..1c20fb6f01a --- /dev/null +++ b/apps/files/lib/Activity/Settings/FileChanged.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Settings; + + +use OCP\Activity\ISetting; +use OCP\IL10N; + +class FileChanged implements ISetting { + + /** @var IL10N */ + protected $l; + + /** + * @param IL10N $l + */ + public function __construct(IL10N $l) { + $this->l = $l; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'file_changed'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('A file or folder has been <strong>changed</strong> or <strong>renamed</strong>'); + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 1; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return false; + } +} + diff --git a/apps/files/lib/Activity/Settings/FileCreated.php b/apps/files/lib/Activity/Settings/FileCreated.php new file mode 100644 index 00000000000..dfde00ae7ec --- /dev/null +++ b/apps/files/lib/Activity/Settings/FileCreated.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Settings; + + +use OCP\Activity\ISetting; +use OCP\IL10N; + +class FileCreated implements ISetting { + + /** @var IL10N */ + protected $l; + + /** + * @param IL10N $l + */ + public function __construct(IL10N $l) { + $this->l = $l; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'file_created'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('A new file or folder has been <strong>created</strong>'); + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 0; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return false; + } +} + diff --git a/apps/files/lib/Activity/Settings/FileDeleted.php b/apps/files/lib/Activity/Settings/FileDeleted.php new file mode 100644 index 00000000000..c4948ded2fa --- /dev/null +++ b/apps/files/lib/Activity/Settings/FileDeleted.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Settings; + + +use OCP\Activity\ISetting; +use OCP\IL10N; + +class FileDeleted implements ISetting { + + /** @var IL10N */ + protected $l; + + /** + * @param IL10N $l + */ + public function __construct(IL10N $l) { + $this->l = $l; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'file_deleted'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('A new file or folder has been <strong>deleted</strong>'); + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 3; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return false; + } +} + diff --git a/apps/files/lib/Activity/Settings/FileFavorite.php b/apps/files/lib/Activity/Settings/FileFavorite.php new file mode 100644 index 00000000000..b2f20688df9 --- /dev/null +++ b/apps/files/lib/Activity/Settings/FileFavorite.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Settings; + + +use OCP\Activity\ISetting; +use OCP\IL10N; + +class FileFavorite implements ISetting { + + /** @var IL10N */ + protected $l; + + /** + * @param IL10N $l + */ + public function __construct(IL10N $l) { + $this->l = $l; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'file_favorite'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>'); + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 2; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return false; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return false; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return false; + } +} + diff --git a/apps/files/lib/Activity/Settings/FileRestored.php b/apps/files/lib/Activity/Settings/FileRestored.php new file mode 100644 index 00000000000..cedfef441ed --- /dev/null +++ b/apps/files/lib/Activity/Settings/FileRestored.php @@ -0,0 +1,98 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files\Activity\Settings; + + +use OCP\Activity\ISetting; +use OCP\IL10N; + +class FileRestored implements ISetting { + + /** @var IL10N */ + protected $l; + + /** + * @param IL10N $l + */ + public function __construct(IL10N $l) { + $this->l = $l; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return 'file_restored'; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->l->t('A new file or folder has been <strong>restored</strong>'); + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 4; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return true; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return true; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return false; + } +} + diff --git a/apps/files/lib/Command/TransferOwnership.php b/apps/files/lib/Command/TransferOwnership.php index 3b51e4a9e6d..78487ce4d96 100644 --- a/apps/files/lib/Command/TransferOwnership.php +++ b/apps/files/lib/Command/TransferOwnership.php @@ -27,6 +27,7 @@ namespace OCA\Files\Command; use OC\Files\Filesystem; use OC\Files\View; use OCP\Files\FileInfo; +use OCP\Files\IHomeStorage; use OCP\Files\Mount\IMountManager; use OCP\IUser; use OCP\IUserManager; @@ -96,12 +97,12 @@ class TransferOwnership extends Command { if (!$sourceUserObject instanceof IUser) { $output->writeln("<error>Unknown source user $this->sourceUser</error>"); - return; + return 1; } if (!$destinationUserObject instanceof IUser) { $output->writeln("<error>Unknown destination user $this->destinationUser</error>"); - return; + return 1; } $this->sourceUser = $sourceUserObject->getUID(); @@ -110,7 +111,7 @@ class TransferOwnership extends Command { // target user has to be ready if (!\OC::$server->getEncryptionManager()->isReadyForUser($this->destinationUser)) { $output->writeln("<error>The target user is not ready to accept files. The user has at least to be logged in once.</error>"); - return; + return 2; } $date = date('c'); @@ -157,6 +158,10 @@ class TransferOwnership extends Command { $this->walkFiles($view, "$this->sourceUser/files", function (FileInfo $fileInfo) use ($progress, $self) { if ($fileInfo->getType() === FileInfo::TYPE_FOLDER) { + // only analyze into folders from main storage, + if (!$fileInfo->getStorage()->instanceOfStorage(IHomeStorage::class)) { + return false; + } return true; } $progress->advance(); @@ -188,7 +193,7 @@ class TransferOwnership extends Command { $output->writeln("Collecting all share information for files and folder of $this->sourceUser ..."); $progress = new ProgressBar($output, count($this->shares)); - foreach([\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_LINK, \OCP\Share::SHARE_TYPE_REMOTE] as $shareType) { + foreach([\OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_LINK, \OCP\Share::SHARE_TYPE_REMOTE] as $shareType) { $offset = 0; while (true) { $sharePage = $this->shareManager->getSharesBy($this->sourceUser, $shareType, null, true, 50, $offset); @@ -224,22 +229,28 @@ class TransferOwnership extends Command { $progress = new ProgressBar($output, count($this->shares)); foreach($this->shares as $share) { - if ($share->getSharedWith() === $this->destinationUser) { - // Unmount the shares before deleting, so we don't try to get the storage later on. - $shareMountPoint = $this->mountManager->find('/' . $this->destinationUser . '/files' . $share->getTarget()); - if ($shareMountPoint) { - $this->mountManager->removeMount($shareMountPoint->getMountPoint()); - } - $this->shareManager->deleteShare($share); - } else { - if ($share->getShareOwner() === $this->sourceUser) { - $share->setShareOwner($this->destinationUser); - } - if ($share->getSharedBy() === $this->sourceUser) { - $share->setSharedBy($this->destinationUser); - } + try { + if ($share->getSharedWith() === $this->destinationUser) { + // Unmount the shares before deleting, so we don't try to get the storage later on. + $shareMountPoint = $this->mountManager->find('/' . $this->destinationUser . '/files' . $share->getTarget()); + if ($shareMountPoint) { + $this->mountManager->removeMount($shareMountPoint->getMountPoint()); + } + $this->shareManager->deleteShare($share); + } else { + if ($share->getShareOwner() === $this->sourceUser) { + $share->setShareOwner($this->destinationUser); + } + if ($share->getSharedBy() === $this->sourceUser) { + $share->setSharedBy($this->destinationUser); + } - $this->shareManager->updateShare($share); + $this->shareManager->updateShare($share); + } + } catch (\OCP\Files\NotFoundException $e) { + $output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>'); + } catch (\Exception $e) { + $output->writeln('<error>Could not restore share with id ' . $share->getId() . ':' . $e->getTraceAsString() . '</error>'); } $progress->advance(); } diff --git a/apps/files/tests/ActivityTest.php b/apps/files/tests/ActivityTest.php deleted file mode 100644 index 65e914c1a54..00000000000 --- a/apps/files/tests/ActivityTest.php +++ /dev/null @@ -1,374 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OCA\Files\Tests; - -use OCA\Files\Activity; -use OCP\IL10N; -use OCP\L10N\IFactory; -use Test\TestCase; - -/** - * Class ActivityTest - * - * @group DB - * @package OCA\Files\Tests - */ -class ActivityTest extends TestCase { - - /** @var \OCP\Activity\IManager */ - private $activityManager; - - /** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */ - protected $request; - - /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */ - protected $session; - - /** @var \OCP\IConfig|\PHPUnit_Framework_MockObject_MockObject */ - protected $config; - - /** @var \OCA\Files\ActivityHelper|\PHPUnit_Framework_MockObject_MockObject */ - protected $activityHelper; - - /** @var \OCP\L10N\IFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $l10nFactory; - - /** @var \OCA\Files\Activity */ - protected $activityExtension; - - protected function setUp() { - parent::setUp(); - - $this->request = $this->getMockBuilder('OCP\IRequest') - ->disableOriginalConstructor() - ->getMock(); - $this->session = $this->getMockBuilder('OCP\IUserSession') - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder('OCP\IConfig') - ->disableOriginalConstructor() - ->getMock(); - $this->activityHelper = $this->getMockBuilder('OCA\Files\ActivityHelper') - ->disableOriginalConstructor() - ->getMock(); - - $this->activityManager = new \OC\Activity\Manager( - $this->request, - $this->session, - $this->config - ); - - $this->l10nFactory = $this->createMock(IFactory::class); - $deL10n = $this->createMock(IL10N::class); - $deL10n->expects($this->any()) - ->method('t') - ->willReturnCallback(function ($argument) { - return 'translate(' . $argument . ')'; - }); - - $this->l10nFactory->expects($this->any()) - ->method('get') - ->willReturnMap([ - ['files', null, \OC::$server->getL10N('files', 'en')], - ['files', 'en', \OC::$server->getL10N('files', 'en')], - ['files', 'de', $deL10n], - ]); - - $this->activityExtension = $activityExtension = new Activity( - $this->l10nFactory, - $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->activityManager, - $this->activityHelper, - \OC::$server->getDatabaseConnection(), - $this->config - ); - - $this->activityManager->registerExtension(function() use ($activityExtension) { - return $activityExtension; - }); - } - - public function testNotificationTypes() { - $result = $this->activityExtension->getNotificationTypes('en'); - $this->assertTrue(is_array($result), 'Asserting getNotificationTypes() returns an array'); - $this->assertCount(5, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_CREATED, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_CHANGED, $result); - $this->assertArrayHasKey(Activity::TYPE_FAVORITES, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_DELETED, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_RESTORED, $result); - } - - public function testDefaultTypes() { - $result = $this->activityExtension->getDefaultTypes('stream'); - $this->assertTrue(is_array($result), 'Asserting getDefaultTypes(stream) returns an array'); - $this->assertCount(4, $result); - $result = array_flip($result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_CREATED, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_CHANGED, $result); - $this->assertArrayNotHasKey(Activity::TYPE_FAVORITES, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_DELETED, $result); - $this->assertArrayHasKey(Activity::TYPE_SHARE_RESTORED, $result); - - $result = $this->activityExtension->getDefaultTypes('email'); - $this->assertFalse($result, 'Asserting getDefaultTypes(email) returns false'); - } - - public function testTranslate() { - $this->assertFalse( - $this->activityExtension->translate('files_sharing', '', [], false, false, 'en'), - 'Asserting that no translations are set for files_sharing' - ); - - // Test english - $this->assertNotFalse( - $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'en'), - 'Asserting that translations are set for files.deleted_self' - ); - $this->assertStringStartsWith( - 'You deleted ', - $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'en') - ); - - // Test translation - $this->assertNotFalse( - $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'de'), - 'Asserting that translations are set for files.deleted_self' - ); - $this->assertStringStartsWith( - 'translate(You deleted ', - $this->activityExtension->translate('files', 'deleted_self', ['file'], false, false, 'de') - ); - } - - public function testGetSpecialParameterList() { - $this->assertFalse( - $this->activityExtension->getSpecialParameterList('files_sharing', ''), - 'Asserting that no special parameters are set for files_sharing' - ); - } - - public function typeIconData() { - return [ - [Activity::TYPE_SHARE_CHANGED, 'icon-change'], - [Activity::TYPE_SHARE_CREATED, 'icon-add-color'], - [Activity::TYPE_SHARE_DELETED, 'icon-delete-color'], - [Activity::TYPE_SHARE_RESTORED, false], - [Activity::TYPE_FAVORITES, false], - ['unknown type', false], - ]; - } - - /** - * @dataProvider typeIconData - * - * @param string $type - * @param mixed $expected - */ - public function testTypeIcon($type, $expected) { - $this->assertSame($expected, $this->activityExtension->getTypeIcon($type)); - } - - public function testGroupParameter() { - $this->assertFalse( - $this->activityExtension->getGroupParameter(['app' => 'files_sharing']), - 'Asserting that no group parameters are set for files_sharing' - ); - } - - public function testNavigation() { - $result = $this->activityExtension->getNavigation(); - $this->assertCount(1, $result['top']); - $this->assertArrayHasKey(Activity::FILTER_FAVORITES, $result['top']); - - $this->assertCount(1, $result['apps']); - $this->assertArrayHasKey(Activity::FILTER_FILES, $result['apps']); - } - - public function testIsFilterValid() { - $this->assertTrue($this->activityExtension->isFilterValid(Activity::FILTER_FAVORITES)); - $this->assertTrue($this->activityExtension->isFilterValid(Activity::FILTER_FILES)); - $this->assertFalse($this->activityExtension->isFilterValid('unknown filter')); - } - - public function filterNotificationTypesData() { - return [ - [ - Activity::FILTER_FILES, - [ - 'NT0', - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_SHARE_CHANGED, - Activity::TYPE_SHARE_DELETED, - Activity::TYPE_SHARE_RESTORED, - Activity::TYPE_FAVORITES, - ], [ - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_SHARE_CHANGED, - Activity::TYPE_SHARE_DELETED, - Activity::TYPE_SHARE_RESTORED, - ], - ], - [ - Activity::FILTER_FILES, - [ - 'NT0', - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_FAVORITES, - ], - [ - Activity::TYPE_SHARE_CREATED, - ], - ], - [ - Activity::FILTER_FAVORITES, - [ - 'NT0', - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_SHARE_CHANGED, - Activity::TYPE_SHARE_DELETED, - Activity::TYPE_SHARE_RESTORED, - Activity::TYPE_FAVORITES, - ], [ - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_SHARE_CHANGED, - Activity::TYPE_SHARE_DELETED, - Activity::TYPE_SHARE_RESTORED, - ], - ], - [ - 'unknown filter', - [ - 'NT0', - Activity::TYPE_SHARE_CREATED, - Activity::TYPE_SHARE_CHANGED, - Activity::TYPE_SHARE_DELETED, - Activity::TYPE_SHARE_RESTORED, - Activity::TYPE_FAVORITES, - ], - false, - ], - ]; - } - - /** - * @dataProvider filterNotificationTypesData - * - * @param string $filter - * @param array $types - * @param mixed $expected - */ - public function testFilterNotificationTypes($filter, $types, $expected) { - $result = $this->activityExtension->filterNotificationTypes($types, $filter); - $this->assertEquals($expected, $result); - } - - public function queryForFilterData() { - return [ - [ - new \RuntimeException(), - '`app` = ?', - ['files'] - ], - [ - [ - 'items' => [], - 'folders' => [], - ], - ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?)) THEN 1 ELSE 0 END = 1 ', - ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED] - ], - [ - [ - 'items' => ['file.txt', 'folder'], - 'folders' => ['folder'], - ], - ' CASE WHEN `app` <> ? THEN 1 WHEN `app` = ? AND ((`type` <> ? AND `type` <> ?) OR `file` = ? OR `file` = ? OR `file` LIKE ?) THEN 1 ELSE 0 END = 1 ', - ['files', 'files', Activity::TYPE_SHARE_CREATED, Activity::TYPE_SHARE_CHANGED, 'file.txt', 'folder', 'folder/%'] - ], - ]; - } - - /** - * @dataProvider queryForFilterData - * - * @param mixed $will - * @param string $query - * @param array $parameters - */ - public function testQueryForFilter($will, $query, $parameters) { - $this->mockUserSession('test'); - - $this->config->expects($this->any()) - ->method('getUserValue') - ->willReturnMap([ - ['test', 'activity', 'notify_stream_' . Activity::TYPE_FAVORITES, false, true], - ]); - if (is_array($will)) { - $this->activityHelper->expects($this->any()) - ->method('getFavoriteFilePaths') - ->with('test') - ->willReturn($will); - } else { - $this->activityHelper->expects($this->any()) - ->method('getFavoriteFilePaths') - ->with('test') - ->willThrowException($will); - } - - $result = $this->activityExtension->getQueryForFilter('all'); - $this->assertEquals([$query, $parameters], $result); - - $this->executeQueryForFilter($result); - } - - public function executeQueryForFilter(array $result) { - list($resultQuery, $resultParameters) = $result; - $resultQuery = str_replace('`file`', '`user`', $resultQuery); - $resultQuery = str_replace('`type`', '`key`', $resultQuery); - - $connection = \OC::$server->getDatabaseConnection(); - // Test the query on the privatedata table, because the activity table - // does not exist in core - $result = $connection->executeQuery('SELECT * FROM `*PREFIX*privatedata` WHERE ' . $resultQuery, $resultParameters); - $rows = $result->fetchAll(); - $result->closeCursor(); - } - - protected function mockUserSession($user) { - $mockUser = $this->getMockBuilder('\OCP\IUser') - ->disableOriginalConstructor() - ->getMock(); - $mockUser->expects($this->any()) - ->method('getUID') - ->willReturn($user); - - $this->session->expects($this->any()) - ->method('isLoggedIn') - ->willReturn(true); - $this->session->expects($this->any()) - ->method('getUser') - ->willReturn($mockUser); - } -} diff --git a/apps/files/tests/Command/DeleteOrphanedFilesTest.php b/apps/files/tests/Command/DeleteOrphanedFilesTest.php index b4d16e54617..32c8d628a80 100644 --- a/apps/files/tests/Command/DeleteOrphanedFilesTest.php +++ b/apps/files/tests/Command/DeleteOrphanedFilesTest.php @@ -24,8 +24,10 @@ namespace OCA\Files\Tests\Command; +use OC\Files\View; use OCA\Files\Command\DeleteOrphanedFiles; use OCP\Files\StorageNotAvailableException; +use Test\TestCase; /** * Class DeleteOrphanedFilesTest @@ -34,7 +36,7 @@ use OCP\Files\StorageNotAvailableException; * * @package OCA\Files\Tests\Command */ -class DeleteOrphanedFilesTest extends \Test\TestCase { +class DeleteOrphanedFilesTest extends TestCase { /** * @var DeleteOrphanedFiles @@ -94,7 +96,7 @@ class DeleteOrphanedFilesTest extends \Test\TestCase { $this->loginAsUser($this->user1); - $view = new \OC\Files\View('/' . $this->user1 . '/'); + $view = new View('/' . $this->user1 . '/'); $view->mkdir('files/test'); $fileInfo = $view->getFileInfo('files/test'); @@ -115,7 +117,7 @@ class DeleteOrphanedFilesTest extends \Test\TestCase { $output ->expects($this->once()) ->method('writeln') - ->with('4 orphaned file cache entries deleted'); + ->with('3 orphaned file cache entries deleted'); $this->command->execute($input, $output); diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index 15dab3b9882..d8fc3907d78 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -1120,6 +1120,34 @@ describe('OCA.Files.FileList tests', function() { expect(fileList.files.length).toEqual(65); expect($('#fileList tr').length).toEqual(20); }); + it('renders the full first page despite hidden rows', function() { + filesConfig.set('showhidden', false); + var files = _.map(generateFiles(0, 23), function(data) { + return _.extend(data, { + name: '.' + data.name + }); + }); + // only hidden files + one visible + files.push(testFiles[0]); + fileList.setFiles(files); + expect(fileList.files.length).toEqual(25); + // render 24 hidden elements + the visible one + expect($('#fileList tr').length).toEqual(25); + }); + it('renders the full first page despite hidden rows', function() { + filesConfig.set('showhidden', true); + var files = _.map(generateFiles(0, 23), function(data) { + return _.extend(data, { + name: '.' + data.name + }); + }); + // only hidden files + one visible + files.push(testFiles[0]); + fileList.setFiles(files); + expect(fileList.files.length).toEqual(25); + // render 20 first hidden elements as visible + expect($('#fileList tr').length).toEqual(20); + }); it('renders the second page when scrolling down (trigger nextPage)', function() { // TODO: can't simulate scrolling here, so calling nextPage directly fileList._nextPage(true); diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index 375d660bf62..c221ba4145f 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -22,7 +22,7 @@ <namespace>Files_External</namespace> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <settings> diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 40865b75add..75c40e540a8 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -25,6 +25,7 @@ OC.L10N.register( "Save" : "Enregistrer", "Empty response from the server" : "Réponse vide du serveur", "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the remote server: {code} {type}" : "Impossible d'obtenir l'information du serveur distant: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", "There was an error with message: " : "Il y a eu une erreur avec le message :", "External mount error" : "Erreur de point de montage externe", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index 93b5d28be87..d9e9f9774d4 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -23,6 +23,7 @@ "Save" : "Enregistrer", "Empty response from the server" : "Réponse vide du serveur", "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the remote server: {code} {type}" : "Impossible d'obtenir l'information du serveur distant: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", "There was an error with message: " : "Il y a eu une erreur avec le message :", "External mount error" : "Erreur de point de montage externe", diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js index c769b651d87..89f072a865b 100644 --- a/apps/files_external/l10n/zh_TW.js +++ b/apps/files_external/l10n/zh_TW.js @@ -7,6 +7,8 @@ OC.L10N.register( "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s", "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s", "External storage" : "外部儲存", + "Dropbox App Configuration" : "Dropbox 應用設置", + "Google Drive App Configuration" : "Google Drive 應用設置", "Personal" : "個人", "System" : "系統", "Grant access" : "允許存取", @@ -17,10 +19,15 @@ OC.L10N.register( "All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組", "(group)" : "(群組)", "Saved" : "已儲存", + "Saving..." : "儲存中...", "Save" : "儲存", + "Empty response from the server" : "服務器没有回應", "Couldn't access. Please logout and login to activate this mount point" : "無法存取。請重新登出再登入啟動此掛載點。", + "Couldn't get the information from the remote server: {code} {type}" : "無法從遠程伺服器上獲取資料 : {code} {type}", "Couldn't get the list of external mount points: {type}" : "無法得到外部掛載點的列表: {type}", + "There was an error with message: " : "錯誤信息:", "External mount error" : "外部掛載錯誤", + "external-storage" : "外部儲存", "Username" : "使用者名稱", "Password" : "密碼", "Storage with id \"%i\" not found" : "沒有找到編號 \"%i\" 的儲存空間 ", @@ -77,6 +84,7 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack 物件儲存", "Service name" : "服務名稱", "Request timeout (seconds)" : "請求超時 (秒)", + "External storages" : "外部儲存", "No external storage configured" : "目前尚未配置任何外部儲存", "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定", "Name" : "名稱", @@ -84,6 +92,7 @@ OC.L10N.register( "Scope" : "範圍", "Enable encryption" : "啟用加密", "Enable previews" : "啟動預覽", + "Enable sharing" : "啟動分享", "Check for changes" : "檢查變動", "Never" : "絕不", "Folder name" : "資料夾名稱", diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json index c23295d157c..9f6a9351ac8 100644 --- a/apps/files_external/l10n/zh_TW.json +++ b/apps/files_external/l10n/zh_TW.json @@ -5,6 +5,8 @@ "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s", "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s", "External storage" : "外部儲存", + "Dropbox App Configuration" : "Dropbox 應用設置", + "Google Drive App Configuration" : "Google Drive 應用設置", "Personal" : "個人", "System" : "系統", "Grant access" : "允許存取", @@ -15,10 +17,15 @@ "All users. Type to select user or group." : "所有人都可以使用,或者選擇特定使用者、群組", "(group)" : "(群組)", "Saved" : "已儲存", + "Saving..." : "儲存中...", "Save" : "儲存", + "Empty response from the server" : "服務器没有回應", "Couldn't access. Please logout and login to activate this mount point" : "無法存取。請重新登出再登入啟動此掛載點。", + "Couldn't get the information from the remote server: {code} {type}" : "無法從遠程伺服器上獲取資料 : {code} {type}", "Couldn't get the list of external mount points: {type}" : "無法得到外部掛載點的列表: {type}", + "There was an error with message: " : "錯誤信息:", "External mount error" : "外部掛載錯誤", + "external-storage" : "外部儲存", "Username" : "使用者名稱", "Password" : "密碼", "Storage with id \"%i\" not found" : "沒有找到編號 \"%i\" 的儲存空間 ", @@ -75,6 +82,7 @@ "OpenStack Object Storage" : "OpenStack 物件儲存", "Service name" : "服務名稱", "Request timeout (seconds)" : "請求超時 (秒)", + "External storages" : "外部儲存", "No external storage configured" : "目前尚未配置任何外部儲存", "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定", "Name" : "名稱", @@ -82,6 +90,7 @@ "Scope" : "範圍", "Enable encryption" : "啟用加密", "Enable previews" : "啟動預覽", + "Enable sharing" : "啟動分享", "Check for changes" : "檢查變動", "Never" : "絕不", "Folder name" : "資料夾名稱", diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php index 25b8e74b820..e6e26e3547a 100644 --- a/apps/files_external/lib/Lib/Storage/AmazonS3.php +++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php @@ -38,45 +38,30 @@ namespace OCA\Files_External\Lib\Storage; set_include_path(get_include_path() . PATH_SEPARATOR . \OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php'); -require 'aws-autoloader.php'; +require_once 'aws-autoloader.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; use Icewind\Streams\IteratorDirectory; +use OC\Files\ObjectStore\S3ConnectionTrait; class AmazonS3 extends \OC\Files\Storage\Common { + use S3ConnectionTrait; /** - * @var \Aws\S3\S3Client - */ - private $connection; - /** - * @var string - */ - private $bucket; - /** * @var array */ private static $tmpFiles = array(); - /** - * @var array - */ - private $params; - /** - * @var bool - */ - private $test = false; - /** - * @var int - */ - private $timeout = 15; + /** * @var int in seconds */ private $rescanDelay = 10; - /** @var string */ - private $id; + public function __construct($parameters) { + parent::__construct($parameters); + $this->parseParams($parameters); + } /** * @param string $path @@ -92,15 +77,6 @@ class AmazonS3 extends \OC\Files\Storage\Common { return $path; } - /** - * when running the tests wait to let the buckets catch up - */ - private function testTimeout() { - if ($this->test) { - sleep($this->timeout); - } - } - private function isRoot($path) { return $path === '.'; } @@ -112,26 +88,6 @@ class AmazonS3 extends \OC\Files\Storage\Common { return $path; } - public function __construct($params) { - if (empty($params['key']) || empty($params['secret']) || empty($params['bucket'])) { - throw new \Exception("Access Key, Secret and Bucket have to be configured."); - } - - $this->id = 'amazon::' . $params['bucket']; - $this->updateLegacyId($params); - - $this->bucket = $params['bucket']; - $this->test = isset($params['test']); - $this->timeout = (!isset($params['timeout'])) ? 15 : $params['timeout']; - $this->rescanDelay = (!isset($params['rescanDelay'])) ? 10 : $params['rescanDelay']; - $params['region'] = empty($params['region']) ? 'eu-west-1' : $params['region']; - $params['hostname'] = empty($params['hostname']) ? 's3.amazonaws.com' : $params['hostname']; - if (!isset($params['port']) || $params['port'] === '') { - $params['port'] = ($params['use_ssl'] === false) ? 80 : 443; - } - $this->params = $params; - } - /** * Updates old storage ids (v0.2.1 and older) that are based on key and secret to new ones based on the bucket name. * TODO Do this in an update.php. requires iterating over all users and loading the mount.json from their home @@ -558,54 +514,6 @@ class AmazonS3 extends \OC\Files\Storage\Common { return $this->id; } - /** - * Returns the connection - * - * @return S3Client connected client - * @throws \Exception if connection could not be made - */ - public function getConnection() { - if (!is_null($this->connection)) { - return $this->connection; - } - - $scheme = ($this->params['use_ssl'] === false) ? 'http' : 'https'; - $base_url = $scheme . '://' . $this->params['hostname'] . ':' . $this->params['port'] . '/'; - - $this->connection = S3Client::factory(array( - 'key' => $this->params['key'], - 'secret' => $this->params['secret'], - 'base_url' => $base_url, - 'region' => $this->params['region'], - S3Client::COMMAND_PARAMS => [ - 'PathStyle' => $this->params['use_path_style'], - ], - )); - - if (!$this->connection->isValidBucketName($this->bucket)) { - throw new \Exception("The configured bucket name is invalid."); - } - - if (!$this->connection->doesBucketExist($this->bucket)) { - try { - $this->connection->createBucket(array( - 'Bucket' => $this->bucket - )); - $this->connection->waitUntilBucketExists(array( - 'Bucket' => $this->bucket, - 'waiter.interval' => 1, - 'waiter.max_attempts' => 15 - )); - $this->testTimeout(); - } catch (S3Exception $e) { - \OCP\Util::logException('files_external', $e); - throw new \Exception('Creation of bucket failed. '.$e->getMessage()); - } - } - - return $this->connection; - } - public function writeBack($tmpFile) { if (!isset(self::$tmpFiles[$tmpFile])) { return false; diff --git a/apps/files_sharing/ajax/shareinfo.php b/apps/files_sharing/ajax/shareinfo.php index 75d6e6081ec..a32b0a07328 100644 --- a/apps/files_sharing/ajax/shareinfo.php +++ b/apps/files_sharing/ajax/shareinfo.php @@ -63,9 +63,12 @@ $path = $data['realPath']; $isWritable = $share->getPermissions() & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE); if (!$isWritable) { + // FIXME: should not add storage wrappers outside of preSetup, need to find a better way + $previousLog = \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper(false); \OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) { return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_SHARE)); }); + \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper($previousLog); } $rootInfo = \OC\Files\Filesystem::getFileInfo($path); diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index cc97f65a5e6..65b8d4af5d1 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -15,7 +15,7 @@ Turning the feature off removes shared files and folders on the server for all s <filesystem/> </types> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <public> <files>public.php</files> diff --git a/apps/files_sharing/css/sharetabview.css b/apps/files_sharing/css/sharetabview.css index 1de0cc7c75d..6ac6dff0a66 100644 --- a/apps/files_sharing/css/sharetabview.css +++ b/apps/files_sharing/css/sharetabview.css @@ -2,7 +2,10 @@ min-height: 100px; } -.shareTabView .oneline { white-space: nowrap; } +.shareTabView .oneline { + white-space: nowrap; + position: relative; +} .shareTabView .shareWithLoading { padding-left: 10px; @@ -12,7 +15,10 @@ .shareTabView .shareWithRemoteInfo, .shareTabView .clipboardButton { - padding-left: 10px; + position: absolute; + right: -7px; + top: -4px; + padding: 14px; } .shareTabView label { @@ -24,15 +30,14 @@ vertical-align: middle; } -.shareTabView input[type="text"], -.shareTabView input[type="password"] { - width: 94%; - margin-left: 0; -} .shareTabView input[type="text"].shareWithField, .shareTabView input[type="text"].emailField, -.shareTabView input[type="text"].linkText { - width: 80%; +.shareTabView input[type="text"].linkText, +.shareTabView input[type="password"] { + width: 100%; + box-sizing: border-box; + padding-right: 32px; + text-overflow: ellipsis; } .shareTabView form { @@ -54,16 +59,21 @@ } #shareWithList .unshare img, #shareWithList .showCruds img { - vertical-align:text-bottom; /* properly align icons */ + vertical-align: text-bottom; /* properly align icons */ } -#shareWithList .sharingOptionsGroup .icon-more, -#shareWithList .unshare .icon-delete { - vertical-align: sub; +#shareWithList .sharingOptionsGroup .icon-more { + padding: 7px; + vertical-align: middle; + opacity: .5; } #shareWithList .unshare { - padding: 0; + padding: 4px; + vertical-align: text-bottom; +} +#shareWithList .unshare .icon { + vertical-align: text-top; } #shareWithList .unshare .icon-delete { @@ -71,21 +81,23 @@ background-position-x: 0; } -#shareWithList label input[type=checkbox]{ +#shareWithList label input[type=checkbox] { margin-left: 0; position: relative; } -#shareWithList .username{ +#shareWithList .username { padding-right: 8px; white-space: nowrap; text-overflow: ellipsis; - max-width: 254px; + max-width: 110px; display: inline-block; overflow: hidden; vertical-align: middle; } -#shareWithList li label{ +#shareWithList li label { + padding: 6px; margin-right: 8px; + vertical-align: text-top; } .shareTabView .icon-loading-small { diff --git a/apps/files_sharing/js/files_drop.js b/apps/files_sharing/js/files_drop.js index 64051844d03..f9f6959c952 100644 --- a/apps/files_sharing/js/files_drop.js +++ b/apps/files_sharing/js/files_drop.js @@ -117,7 +117,7 @@ }; $(document).ready(function() { - if($('#upload-only-interface').val() === "1") { + if($('#upload-only-interface').val() === "1" && oc_config.enable_avatars) { $('.avatardiv').avatar($('#sharingUserId').val(), 128, true); } diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js index fb846b5d218..f2eba22fa17 100644 --- a/apps/files_sharing/l10n/cs_CZ.js +++ b/apps/files_sharing/l10n/cs_CZ.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Sdílení", "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>", "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz", "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s", "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Soubor %1$s sdílen pomocí emailu s %2$s byl stažen", + "Folder %1$s shared by email with %2$s was downloaded" : "Adresář %1$s sdílen pomocí emailu s %2$s byl stažen", "Downloaded via public link" : "Staženo pomocí veřejného odkazu", "Shared with %2$s" : "Sdíleno s %2$s", "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "Veřejný odkaz vypršel", "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel", "Shared by %2$s" : "%2$s sdílel(a)", + "Downloaded by %2$s" : "Staženo uživatelem %2$s", "File shares" : "Sdílení souboru", "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje", "could not delete share" : "nelze smazat sdílení", diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json index d626883ec5f..9d82343e895 100644 --- a/apps/files_sharing/l10n/cs_CZ.json +++ b/apps/files_sharing/l10n/cs_CZ.json @@ -18,6 +18,7 @@ "Sharing" : "Sdílení", "A file or folder has been <strong>shared</strong>" : "Soubor nebo adresář byl <strong>nasdílen</strong>", "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo adresář byl nasdílen z <strong>jiného serveru</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> soubor nebo adresář sdílený jako veřejný odkaz", "You received a new remote share %2$s from %1$s" : "Obdrželi jste nové vzdálené sdílení %2$s od uživatele %1$s", "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "Veřejný odkaz na %2$s pro %1$s vypršel", "%2$s shared %1$s with you" : "%2$s s vámi sdílí %1$s", "%2$s removed the share for %1$s" : "%2$s odstranil(a) sdílení pro %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Soubor %1$s sdílen pomocí emailu s %2$s byl stažen", + "Folder %1$s shared by email with %2$s was downloaded" : "Adresář %1$s sdílen pomocí emailu s %2$s byl stažen", "Downloaded via public link" : "Staženo pomocí veřejného odkazu", "Shared with %2$s" : "Sdíleno s %2$s", "Shared with %3$s by %2$s" : "%2$s sdílí s %3$s", @@ -57,6 +60,7 @@ "Public link expired" : "Veřejný odkaz vypršel", "Public link of %2$s expired" : "Veřejný odkaz %2$s vypršel", "Shared by %2$s" : "%2$s sdílel(a)", + "Downloaded by %2$s" : "Staženo uživatelem %2$s", "File shares" : "Sdílení souboru", "Wrong share ID, share doesn't exist" : "Špatné ID sdílení, sdílení neexistuje", "could not delete share" : "nelze smazat sdílení", diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js index 3ad91b3665d..c901c9826c1 100644 --- a/apps/files_sharing/l10n/de.js +++ b/apps/files_sharing/l10n/de.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Teilen", "A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>", "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Eine Datei oder ein Ordner der per E-Mail oder öffentlich geteilt ist wurde <strong>heruntergeladen</strong>", "You received a new remote share %2$s from %1$s" : "Du hast eine neue Remotefreigabe %2$s von %1$s erhalten", "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "Der öffentliche Link von %2$s für %1$s ist abgelaufen", "%2$s shared %1$s with you" : "%2$s hat %1$s mit dir geteilt", "%2$s removed the share for %1$s" : "%2$s hat die Freigabe für %1$s entfernt", + "File %1$s shared by email with %2$s was downloaded" : "Datei %1$s die per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", + "Folder %1$s shared by email with %2$s was downloaded" : "Ordner %1$s der per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", "Downloaded via public link" : "Heruntergeladen mittels öffentlichen Link", "Shared with %2$s" : "Geteilt mit %2$s", "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "öffentlicher Link ist abgelaufen", "Public link of %2$s expired" : "Öffentlicher Link von %2$s ist abgelaufen", "Shared by %2$s" : "Geteilt von %2$s", + "Downloaded by %2$s" : "Heruntergeladen von %2$s", "File shares" : "Dateifreigaben", "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht", "could not delete share" : "Freigabe konnte nicht gelöscht werden", diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json index aefd57d574a..5fa3a884906 100644 --- a/apps/files_sharing/l10n/de.json +++ b/apps/files_sharing/l10n/de.json @@ -18,6 +18,7 @@ "Sharing" : "Teilen", "A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>", "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Eine Datei oder ein Ordner der per E-Mail oder öffentlich geteilt ist wurde <strong>heruntergeladen</strong>", "You received a new remote share %2$s from %1$s" : "Du hast eine neue Remotefreigabe %2$s von %1$s erhalten", "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "Der öffentliche Link von %2$s für %1$s ist abgelaufen", "%2$s shared %1$s with you" : "%2$s hat %1$s mit dir geteilt", "%2$s removed the share for %1$s" : "%2$s hat die Freigabe für %1$s entfernt", + "File %1$s shared by email with %2$s was downloaded" : "Datei %1$s die per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", + "Folder %1$s shared by email with %2$s was downloaded" : "Ordner %1$s der per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", "Downloaded via public link" : "Heruntergeladen mittels öffentlichen Link", "Shared with %2$s" : "Geteilt mit %2$s", "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", @@ -57,6 +60,7 @@ "Public link expired" : "öffentlicher Link ist abgelaufen", "Public link of %2$s expired" : "Öffentlicher Link von %2$s ist abgelaufen", "Shared by %2$s" : "Geteilt von %2$s", + "Downloaded by %2$s" : "Heruntergeladen von %2$s", "File shares" : "Dateifreigaben", "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht", "could not delete share" : "Freigabe konnte nicht gelöscht werden", diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js index 026df92f0de..aba96ce5929 100644 --- a/apps/files_sharing/l10n/de_DE.js +++ b/apps/files_sharing/l10n/de_DE.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Teilen", "A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>", "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Eine Datei oder ein Ordner der per E-Mail oder öffentlich geteilt ist wurde <strong>heruntergeladen</strong>", "You received a new remote share %2$s from %1$s" : "Sie haben eine neue Remotefreigabe %2$s von %1$s erhalten", "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "Die Freigabe als Link von %2$s für %1$s ist abgelaufen", "%2$s shared %1$s with you" : "%2$s hat %1$s mit Ihnen geteilt", "%2$s removed the share for %1$s" : "%2$s hat die Freigabe für %1$s entfernt", + "File %1$s shared by email with %2$s was downloaded" : "Datei %1$s die per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", + "Folder %1$s shared by email with %2$s was downloaded" : "Ordner %1$s der per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", "Downloaded via public link" : "Über den öffentlichen Link heruntergeladen", "Shared with %2$s" : "Geteilt mit %2$s", "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "öffentlicher Link ist abgelaufen", "Public link of %2$s expired" : "Öffentlicher Link von %2$s ist abgelaufen", "Shared by %2$s" : "Geteilt von %2$s", + "Downloaded by %2$s" : "Heruntergeladen von %2$s", "File shares" : "Dateifreigaben", "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht", "could not delete share" : "Freigabe konnte nicht gelöscht werden", diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json index 69d64c7dfc2..cee3ede6fa9 100644 --- a/apps/files_sharing/l10n/de_DE.json +++ b/apps/files_sharing/l10n/de_DE.json @@ -18,6 +18,7 @@ "Sharing" : "Teilen", "A file or folder has been <strong>shared</strong>" : "Eine Datei oder ein Ordner wurde <strong>geteilt</strong>", "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Eine Datei oder ein Ordner der per E-Mail oder öffentlich geteilt ist wurde <strong>heruntergeladen</strong>", "You received a new remote share %2$s from %1$s" : "Sie haben eine neue Remotefreigabe %2$s von %1$s erhalten", "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "Die Freigabe als Link von %2$s für %1$s ist abgelaufen", "%2$s shared %1$s with you" : "%2$s hat %1$s mit Ihnen geteilt", "%2$s removed the share for %1$s" : "%2$s hat die Freigabe für %1$s entfernt", + "File %1$s shared by email with %2$s was downloaded" : "Datei %1$s die per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", + "Folder %1$s shared by email with %2$s was downloaded" : "Ordner %1$s der per E-Mail mit %2$s geteilt wurde, wurde heruntergeladen", "Downloaded via public link" : "Über den öffentlichen Link heruntergeladen", "Shared with %2$s" : "Geteilt mit %2$s", "Shared with %3$s by %2$s" : "Geteilt mit %3$s von %2$s", @@ -57,6 +60,7 @@ "Public link expired" : "öffentlicher Link ist abgelaufen", "Public link of %2$s expired" : "Öffentlicher Link von %2$s ist abgelaufen", "Shared by %2$s" : "Geteilt von %2$s", + "Downloaded by %2$s" : "Heruntergeladen von %2$s", "File shares" : "Dateifreigaben", "Wrong share ID, share doesn't exist" : "Fehlerhafte Freigabe-ID, Freigabe existiert nicht", "could not delete share" : "Freigabe konnte nicht gelöscht werden", diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js index 95a24aca3a9..d3f1542ad33 100644 --- a/apps/files_sharing/l10n/es.js +++ b/apps/files_sharing/l10n/es.js @@ -59,6 +59,7 @@ OC.L10N.register( "Public link expired" : "El enlace público ha expirado", "Public link of %2$s expired" : "El enlace público %2$s ha expirado", "Shared by %2$s" : "Compartido por %2$s", + "Downloaded by %2$s" : "Descargado por %2$s", "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe", "could not delete share" : "No se ha podido eliminar el recurso compartido", "Could not delete share" : "No se ha podido eliminar el recurso compartido", diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json index db98ced5661..e03957a8eaf 100644 --- a/apps/files_sharing/l10n/es.json +++ b/apps/files_sharing/l10n/es.json @@ -57,6 +57,7 @@ "Public link expired" : "El enlace público ha expirado", "Public link of %2$s expired" : "El enlace público %2$s ha expirado", "Shared by %2$s" : "Compartido por %2$s", + "Downloaded by %2$s" : "Descargado por %2$s", "Wrong share ID, share doesn't exist" : "El ID del recurso compartido no es correcto, el recurso compartido no existe", "could not delete share" : "No se ha podido eliminar el recurso compartido", "Could not delete share" : "No se ha podido eliminar el recurso compartido", diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index c61d7fbdc03..9cb19f4e288 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Partage", "A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>", "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un fichier ou un dossier partagé par mail ou par lien public a été <strong>téléchargé</strong>", "You received a new remote share %2$s from %1$s" : "L'utilisateur %1$s a partagé la ressource distante %2$s avec vous", "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", "%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "Le lien public de %2$s pour %1$s a expiré", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "%2$s removed the share for %1$s" : "%2$s a supprimé le partage pour %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Le fichier %1$s partagé par mail avec %2$s a été téléchargé", + "Folder %1$s shared by email with %2$s was downloaded" : "Le dossier %1$s partagé par mail avec %2$s a été téléchargé", "Downloaded via public link" : "Téléchargé par lien public", "Shared with %2$s" : "Partagé avec %2$s", "Shared with %3$s by %2$s" : "Partagé avec %3$s par %2$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "Lien public expiré", "Public link of %2$s expired" : "Le lien public de %2$s a expiré", "Shared by %2$s" : "Partagé par %2$s", + "Downloaded by %2$s" : "Téléchargé par %2$s", "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas", "could not delete share" : "impossible de supprimer le partage", "Could not delete share" : "Impossible de supprimer le partage", @@ -80,6 +84,7 @@ OC.L10N.register( "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ", "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public", "Cannot increase permissions" : "Impossible d'augmenter les permissions", + "%s is publicly shared" : "%s a été partagé publiquement", "Share API is disabled" : "l'API de partage est désactivée", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index 1457e9524d8..c2d370429ab 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -18,6 +18,7 @@ "Sharing" : "Partage", "A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>", "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un fichier ou un dossier partagé par mail ou par lien public a été <strong>téléchargé</strong>", "You received a new remote share %2$s from %1$s" : "L'utilisateur %1$s a partagé la ressource distante %2$s avec vous", "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", "%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "Le lien public de %2$s pour %1$s a expiré", "%2$s shared %1$s with you" : "%2$s a partagé %1$s avec vous", "%2$s removed the share for %1$s" : "%2$s a supprimé le partage pour %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Le fichier %1$s partagé par mail avec %2$s a été téléchargé", + "Folder %1$s shared by email with %2$s was downloaded" : "Le dossier %1$s partagé par mail avec %2$s a été téléchargé", "Downloaded via public link" : "Téléchargé par lien public", "Shared with %2$s" : "Partagé avec %2$s", "Shared with %3$s by %2$s" : "Partagé avec %3$s par %2$s", @@ -57,6 +60,7 @@ "Public link expired" : "Lien public expiré", "Public link of %2$s expired" : "Le lien public de %2$s a expiré", "Shared by %2$s" : "Partagé par %2$s", + "Downloaded by %2$s" : "Téléchargé par %2$s", "Wrong share ID, share doesn't exist" : "Mauvais ID de partage, le partage n'existe pas", "could not delete share" : "impossible de supprimer le partage", "Could not delete share" : "Impossible de supprimer le partage", @@ -78,6 +82,7 @@ "Wrong or no update parameter given" : "Mauvais ou aucun paramètre donné ", "Can't change permissions for public share links" : "Impossible de changer les permissions pour les liens de partage public", "Cannot increase permissions" : "Impossible d'augmenter les permissions", + "%s is publicly shared" : "%s a été partagé publiquement", "Share API is disabled" : "l'API de partage est désactivée", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js index c857b363046..d34664508b7 100644 --- a/apps/files_sharing/l10n/hu_HU.js +++ b/apps/files_sharing/l10n/hu_HU.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Megosztás", "A file or folder has been <strong>shared</strong>" : "Egy fájl vagy mappa <strong>megosztva</strong>", "A file or folder was shared from <strong>another server</strong>" : "Egy fájl vagy mappa meg lett osztva egy <strong>másik szerverről</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Egy e-mailben vagy nyilvános hivatkozással megosztott fájl vagy mappa <strong>letöltve</strong>", "You received a new remote share %2$s from %1$s" : "A %2$s távoli megosztás érkezett a %1$s -től", "You received a new remote share from %s" : "Új távoli megosztás érkezett a %s -től", "%1$s accepted remote share %2$s" : "%1$s elfogadta a távoli megosztást %2$s", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "%2$s %1$s nyilvános hivatkozása lejárt", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "%2$s removed the share for %1$s" : "%2$s eltávolította %1$s megosztását", + "File %1$s shared by email with %2$s was downloaded" : "%2$s letöltötte az e-mailben megosztott fájlt: %1$s", + "Folder %1$s shared by email with %2$s was downloaded" : "%2$s letöltötte az e-mailben megosztott mappát: %1$s", "Downloaded via public link" : "Letöltve nyilvános hivatkozással", "Shared with %2$s" : "Megosztva vele: %2$s", "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "Nyilvános hivatkozás lejárt", "Public link of %2$s expired" : "%2$s nyilvános hivatkozása lejárt", "Shared by %2$s" : "Megosztó: %2$s", + "Downloaded by %2$s" : "Letöltötte: %2$s", "File shares" : "Fájl megosztások", "Wrong share ID, share doesn't exist" : "Hibás megosztás ID, a megosztás nem létezik", "could not delete share" : "a megosztás nem törölhető", diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json index 9cc44493ca6..aa15d44fd2d 100644 --- a/apps/files_sharing/l10n/hu_HU.json +++ b/apps/files_sharing/l10n/hu_HU.json @@ -18,6 +18,7 @@ "Sharing" : "Megosztás", "A file or folder has been <strong>shared</strong>" : "Egy fájl vagy mappa <strong>megosztva</strong>", "A file or folder was shared from <strong>another server</strong>" : "Egy fájl vagy mappa meg lett osztva egy <strong>másik szerverről</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Egy e-mailben vagy nyilvános hivatkozással megosztott fájl vagy mappa <strong>letöltve</strong>", "You received a new remote share %2$s from %1$s" : "A %2$s távoli megosztás érkezett a %1$s -től", "You received a new remote share from %s" : "Új távoli megosztás érkezett a %s -től", "%1$s accepted remote share %2$s" : "%1$s elfogadta a távoli megosztást %2$s", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "%2$s %1$s nyilvános hivatkozása lejárt", "%2$s shared %1$s with you" : "%2$s megosztotta velem ezt: %1$s", "%2$s removed the share for %1$s" : "%2$s eltávolította %1$s megosztását", + "File %1$s shared by email with %2$s was downloaded" : "%2$s letöltötte az e-mailben megosztott fájlt: %1$s", + "Folder %1$s shared by email with %2$s was downloaded" : "%2$s letöltötte az e-mailben megosztott mappát: %1$s", "Downloaded via public link" : "Letöltve nyilvános hivatkozással", "Shared with %2$s" : "Megosztva vele: %2$s", "Shared with %3$s by %2$s" : "Megosztva vele: %3$s, megosztó: %2$s", @@ -57,6 +60,7 @@ "Public link expired" : "Nyilvános hivatkozás lejárt", "Public link of %2$s expired" : "%2$s nyilvános hivatkozása lejárt", "Shared by %2$s" : "Megosztó: %2$s", + "Downloaded by %2$s" : "Letöltötte: %2$s", "File shares" : "Fájl megosztások", "Wrong share ID, share doesn't exist" : "Hibás megosztás ID, a megosztás nem létezik", "could not delete share" : "a megosztás nem törölhető", diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js index 4db9c90f6b3..6fe903c0dac 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -20,6 +20,7 @@ OC.L10N.register( "Sharing" : "Condivisione", "A file or folder has been <strong>shared</strong>" : "Un file o una cartella è stato <strong>condiviso</strong>", "A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un file o una cartella condiviso via posta elettronica o collegamento pubblico è stato <strong>scaricato</strong>", "You received a new remote share %2$s from %1$s" : "Hai ricevuto una nuova condivisione remota %2$s da %1$s", "You received a new remote share from %s" : "Hai ricevuto una nuova condivisione remota da %s", "%1$s accepted remote share %2$s" : "%1$s ha accettato la condivisione remota %2$s", @@ -43,6 +44,8 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "il collegamento pubblico di %2$s per %1$s è scaduto", "%2$s shared %1$s with you" : "%2$s ha condiviso %1$s con te", "%2$s removed the share for %1$s" : "%2$s ha rimosso la condivisione per %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Il file %1$s condiviso via posta elettronica con %2$s è stato scaricato", + "Folder %1$s shared by email with %2$s was downloaded" : "La cartella %1$s condivisa via posta elettronica con %2$s è stata scaricata", "Downloaded via public link" : "Scaricata tramite collegamento pubblico", "Shared with %2$s" : "Condivisa con %2$s", "Shared with %3$s by %2$s" : "Condivisa con %3$s da %2$s", @@ -59,6 +62,7 @@ OC.L10N.register( "Public link expired" : "Collegamento pubblico scaduto", "Public link of %2$s expired" : "il collegamento pubblico di %2$s è scaduto", "Shared by %2$s" : "Condivisa da %2$s", + "Downloaded by %2$s" : "Scaricato da %2$s", "File shares" : "Condivisioni dei file", "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste", "could not delete share" : "impossibile eliminare la condivisione", diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index 5bc4b96c096..99dbf0c939b 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -18,6 +18,7 @@ "Sharing" : "Condivisione", "A file or folder has been <strong>shared</strong>" : "Un file o una cartella è stato <strong>condiviso</strong>", "A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un file o una cartella condiviso via posta elettronica o collegamento pubblico è stato <strong>scaricato</strong>", "You received a new remote share %2$s from %1$s" : "Hai ricevuto una nuova condivisione remota %2$s da %1$s", "You received a new remote share from %s" : "Hai ricevuto una nuova condivisione remota da %s", "%1$s accepted remote share %2$s" : "%1$s ha accettato la condivisione remota %2$s", @@ -41,6 +42,8 @@ "The public link of %2$s for %1$s expired" : "il collegamento pubblico di %2$s per %1$s è scaduto", "%2$s shared %1$s with you" : "%2$s ha condiviso %1$s con te", "%2$s removed the share for %1$s" : "%2$s ha rimosso la condivisione per %1$s", + "File %1$s shared by email with %2$s was downloaded" : "Il file %1$s condiviso via posta elettronica con %2$s è stato scaricato", + "Folder %1$s shared by email with %2$s was downloaded" : "La cartella %1$s condivisa via posta elettronica con %2$s è stata scaricata", "Downloaded via public link" : "Scaricata tramite collegamento pubblico", "Shared with %2$s" : "Condivisa con %2$s", "Shared with %3$s by %2$s" : "Condivisa con %3$s da %2$s", @@ -57,6 +60,7 @@ "Public link expired" : "Collegamento pubblico scaduto", "Public link of %2$s expired" : "il collegamento pubblico di %2$s è scaduto", "Shared by %2$s" : "Condivisa da %2$s", + "Downloaded by %2$s" : "Scaricato da %2$s", "File shares" : "Condivisioni dei file", "Wrong share ID, share doesn't exist" : "ID di condivisione errato, la condivisione non esiste", "could not delete share" : "impossibile eliminare la condivisione", diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js index b5fd9bc9935..7a90653289d 100644 --- a/apps/files_sharing/l10n/nl.js +++ b/apps/files_sharing/l10n/nl.js @@ -59,6 +59,7 @@ OC.L10N.register( "Public link expired" : "Openbare link is verlopen", "Public link of %2$s expired" : "Openbare link van %2$s is verlopen", "Shared by %2$s" : "Gedeeld door %2$s", + "Downloaded by %2$s" : "Gedownload door %2$s", "File shares" : "File shares", "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet", "could not delete share" : "Kon share niet verwijderen", diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json index 949702d635f..58d8fddba1f 100644 --- a/apps/files_sharing/l10n/nl.json +++ b/apps/files_sharing/l10n/nl.json @@ -57,6 +57,7 @@ "Public link expired" : "Openbare link is verlopen", "Public link of %2$s expired" : "Openbare link van %2$s is verlopen", "Shared by %2$s" : "Gedeeld door %2$s", + "Downloaded by %2$s" : "Gedownload door %2$s", "File shares" : "File shares", "Wrong share ID, share doesn't exist" : "Onjuist deel-ID, de share bestaat niet", "could not delete share" : "Kon share niet verwijderen", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index b5dfb9ff1b3..239178f6df6 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -43,7 +43,7 @@ OC.L10N.register( "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s", - "Downloaded via public link" : "Загружено по открытой ссылке", + "Downloaded via public link" : "Скачано по открытой ссылке", "Shared with %2$s" : "Поделился с %2$s", "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", "Removed share for %2$s" : "Удалён общий доступ к %2$s", @@ -59,6 +59,7 @@ OC.L10N.register( "Public link expired" : "Срок действия публичной ссылки закончился", "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился", "Shared by %2$s" : "Поделился %2$s", + "Downloaded by %2$s" : "Скачано %2$s", "Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует", "could not delete share" : "Не удалось удалить общий ресурс", "Could not delete share" : "Не удалось удалить публикацию", diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index ca06b0090b8..2548e868c70 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -41,7 +41,7 @@ "The public link of %2$s for %1$s expired" : "Срок действия публичной ссылки к %2$s для %1$s закончился", "%2$s shared %1$s with you" : "%2$s поделился с вами %1$s", "%2$s removed the share for %1$s" : "%2$s удалил общий доступ к %1$s", - "Downloaded via public link" : "Загружено по открытой ссылке", + "Downloaded via public link" : "Скачано по открытой ссылке", "Shared with %2$s" : "Поделился с %2$s", "Shared with %3$s by %2$s" : "Поделился %2$s с %3$s", "Removed share for %2$s" : "Удалён общий доступ к %2$s", @@ -57,6 +57,7 @@ "Public link expired" : "Срок действия публичной ссылки закончился", "Public link of %2$s expired" : "Срок действия публичной ссылки к %2$s закончился", "Shared by %2$s" : "Поделился %2$s", + "Downloaded by %2$s" : "Скачано %2$s", "Wrong share ID, share doesn't exist" : "Неверный идентификатор публикации, публикация не существует", "could not delete share" : "Не удалось удалить общий ресурс", "Could not delete share" : "Не удалось удалить публикацию", diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index 6444dbb8a36..bc10ddbd94f 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -43,36 +43,34 @@ class Cache extends CacheJail { private $storage; /** - * @var IStorage - */ - private $sourceStorage; - - /** * @var ICacheEntry */ private $sourceRootInfo; - /** - * @var \OCP\Files\Cache\ICache - */ - private $sourceCache; + private $rootUnchanged = true; + + private $ownerDisplayName; /** * @param \OCA\Files_Sharing\SharedStorage $storage - * @param IStorage $sourceStorage * @param ICacheEntry $sourceRootInfo */ - public function __construct($storage, IStorage $sourceStorage, ICacheEntry $sourceRootInfo) { + public function __construct($storage, ICacheEntry $sourceRootInfo) { $this->storage = $storage; - $this->sourceStorage = $sourceStorage; $this->sourceRootInfo = $sourceRootInfo; - $this->sourceCache = $sourceStorage->getCache(); parent::__construct( - $this->sourceCache, + null, $this->sourceRootInfo->getPath() ); } + public function getCache() { + if (is_null($this->cache)) { + $this->cache = $this->storage->getSourceStorage()->getCache(); + } + return $this->cache; + } + public function getNumericStorageId() { if (isset($this->numericId)) { return $this->numericId; @@ -81,6 +79,33 @@ class Cache extends CacheJail { } } + public function get($file) { + if ($this->rootUnchanged && ($file === '' || $file === $this->sourceRootInfo->getId())) { + return $this->formatCacheEntry(clone $this->sourceRootInfo); + } + return parent::get($file); + } + + public function update($id, array $data) { + $this->rootUnchanged = false; + parent::update($id, $data); + } + + public function insert($file, array $data) { + $this->rootUnchanged = false; + return parent::insert($file, $data); + } + + public function remove($file) { + $this->rootUnchanged = false; + parent::remove($file); + } + + public function moveFromCache(\OCP\Files\Cache\ICache $sourceCache, $sourcePath, $targetPath) { + $this->rootUnchanged = false; + return parent::moveFromCache($sourceCache, $sourcePath, $targetPath); + } + protected function formatCacheEntry($entry) { $path = isset($entry['path']) ? $entry['path'] : ''; $entry = parent::formatCacheEntry($entry); @@ -91,13 +116,20 @@ class Cache extends CacheJail { $entry['permissions'] = $sharePermissions; } $entry['uid_owner'] = $this->storage->getOwner($path); - $entry['displayname_owner'] = \OC_User::getDisplayName($entry['uid_owner']); + $entry['displayname_owner'] = $this->getOwnerDisplayName(); if ($path === '') { $entry['is_share_mount_point'] = true; } return $entry; } + private function getOwnerDisplayName() { + if (!$this->ownerDisplayName) { + $this->ownerDisplayName = \OC_User::getDisplayName($this->storage->getOwner('')); + } + return $this->ownerDisplayName; + } + /** * remove all entries for files that are stored on the storage from the cache */ diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index 1358663ea2b..90274beba49 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -692,6 +692,7 @@ class ShareAPIController extends OCSController { if ($newPermissions !== null) { $share->setPermissions($newPermissions); + $permissions = $newPermissions; } if ($expireDate === '') { diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index 5e01c9bfb09..09912b7758a 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -427,12 +427,23 @@ class ShareesAPIController extends OCSController { $shareTypes = [ Share::SHARE_TYPE_USER, - Share::SHARE_TYPE_REMOTE, - Share::SHARE_TYPE_EMAIL ]; - if ($this->shareManager->allowGroupSharing()) { + if ($itemType === 'file' || $itemType === 'folder') { + if ($this->shareManager->allowGroupSharing()) { + $shareTypes[] = Share::SHARE_TYPE_GROUP; + } + + if ($this->isRemoteSharingAllowed($itemType)) { + $shareTypes[] = Share::SHARE_TYPE_REMOTE; + } + + if ($this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) { + $shareTypes[] = Share::SHARE_TYPE_EMAIL; + } + } else { $shareTypes[] = Share::SHARE_TYPE_GROUP; + $shareTypes[] = Share::SHARE_TYPE_EMAIL; } if (isset($_GET['shareType']) && is_array($_GET['shareType'])) { @@ -443,16 +454,6 @@ class ShareesAPIController extends OCSController { sort($shareTypes); } - if (in_array(Share::SHARE_TYPE_REMOTE, $shareTypes) && !$this->isRemoteSharingAllowed($itemType)) { - // Remove remote shares from type array, because it is not allowed. - $shareTypes = array_diff($shareTypes, [Share::SHARE_TYPE_REMOTE]); - } - - if (!$this->shareManager->shareProviderExists(Share::SHARE_TYPE_EMAIL)) { - // Remove mail shares from type array, because the share provider is not loaded - $shareTypes = array_diff($shareTypes, [Share::SHARE_TYPE_EMAIL]); - } - $this->shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; $this->shareeEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; $this->limit = (int) $perPage; diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index 1ee6f2b35f6..40d2fb27535 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -172,6 +172,9 @@ class MountProvider implements IMountProvider { $share->setTarget($superShare->getTarget()); $this->shareManager->moveShare($share, $user->getUID()); } + if (!is_null($share->getNodeCacheEntry())) { + $superShare->setNodeCacheEntry($share->getNodeCacheEntry()); + } } $superShare->setPermissions($permissions); diff --git a/apps/files_sharing/lib/SharedPropagator.php b/apps/files_sharing/lib/SharedPropagator.php index 0273744da11..f35a5b1d22b 100644 --- a/apps/files_sharing/lib/SharedPropagator.php +++ b/apps/files_sharing/lib/SharedPropagator.php @@ -39,6 +39,6 @@ class SharedPropagator extends Propagator { public function propagateChange($internalPath, $time, $sizeDifference = 0) { /** @var \OC\Files\Storage\Storage $storage */ list($storage, $sourceInternalPath) = $this->storage->resolvePath($internalPath); - return $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference); + $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference); } } diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 8362a759135..5b4aa061800 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -71,6 +71,8 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto */ private $logger; + private $options; + public function __construct($arguments) { $this->ownerView = $arguments['ownerView']; $this->logger = \OC::$server->getLogger(); @@ -86,6 +88,20 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto ]); } + /** + * @return ICacheEntry + */ + private function getSourceRootInfo() { + if (is_null($this->sourceRootInfo)) { + if (is_null($this->superShare->getNodeCacheEntry())) { + $this->sourceRootInfo = $this->getWrapperStorage()->getCache()->get($this->rootPath); + } else { + $this->sourceRootInfo = $this->superShare->getNodeCacheEntry(); + } + } + return $this->sourceRootInfo; + } + private function init() { if ($this->initialized) { return; @@ -95,7 +111,6 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto Filesystem::initMountPoints($this->superShare->getShareOwner()); $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId()); list($this->storage, $this->rootPath) = $this->ownerView->resolvePath($sourcePath); - $this->sourceRootInfo = $this->storage->getCache()->get($this->rootPath); } catch (NotFoundException $e) { $this->storage = new FailedStorage(['exception' => $e]); $this->rootPath = ''; @@ -110,6 +125,9 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto * @inheritdoc */ public function instanceOfStorage($class) { + if ($class === '\OC\Files\Storage\Common') { + return true; + } if (in_array($class, ['\OC\Files\Storage\Home', '\OC\Files\ObjectStore\HomeObjectStoreStorage'])) { return false; } @@ -124,8 +142,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto } private function isValid() { - $this->init(); - return $this->sourceRootInfo && ($this->sourceRootInfo->getPermissions() & Constants::PERMISSION_SHARE) === Constants::PERMISSION_SHARE; + return $this->getSourceRootInfo() && ($this->getSourceRootInfo()->getPermissions() & Constants::PERMISSION_SHARE) === Constants::PERMISSION_SHARE; } /** @@ -311,14 +328,14 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto } public function getCache($path = '', $storage = null) { - $this->init(); - if (is_null($this->storage) || $this->storage instanceof FailedStorage) { - return new FailedCache(false); + if ($this->cache) { + return $this->cache; } if (!$storage) { $storage = $this; } - return new \OCA\Files_Sharing\Cache($storage, $this->storage, $this->sourceRootInfo); + $this->cache = new \OCA\Files_Sharing\Cache($storage, $this->getSourceRootInfo(), $this->superShare); + return $this->cache; } public function getScanner($path = '', $storage = null) { @@ -445,4 +462,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto return parent::file_put_contents($path, $data); } + public function setMountOptions(array $options) { + $this->mountOptions = $options; + } } diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php index 890fdb6eda0..ed4aa1dba9e 100644 --- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php @@ -1205,7 +1205,7 @@ class ShareAPIControllerTest extends \Test\TestCase { public function testUpdateLinkShareClear() { $ocs = $this->mockFormatShare(); - $node = $this->getMockBuilder('\OCP\Files\Folder')->getMock(); + $node = $this->getMockBuilder(Folder::class)->getMock(); $share = $this->newShare(); $share->setPermissions(\OCP\Constants::PERMISSION_ALL) ->setSharedBy($this->currentUser) @@ -1229,6 +1229,9 @@ class ShareAPIControllerTest extends \Test\TestCase { }) )->will($this->returnArgument(0)); + $this->shareManager->method('getSharedWith') + ->willReturn([]); + $expected = new DataResponse(null); $result = $ocs->updateShare(42, null, '', 'false', ''); @@ -1261,6 +1264,9 @@ class ShareAPIControllerTest extends \Test\TestCase { }) )->will($this->returnArgument(0)); + $this->shareManager->method('getSharedWith') + ->willReturn([]); + $expected = new DataResponse(null); $result = $ocs->updateShare(42, null, 'password', 'true', '2000-01-01'); @@ -1483,6 +1489,9 @@ class ShareAPIControllerTest extends \Test\TestCase { }) )->will($this->returnArgument(0)); + $this->shareManager->method('getSharedWith') + ->willReturn([]); + $expected = new DataResponse(null); $result = $ocs->updateShare(42, null, null, 'true', null); @@ -1633,6 +1642,52 @@ class ShareAPIControllerTest extends \Test\TestCase { } } + public function testUpdateShareCannotIncreasePermissionsLinkShare() { + $ocs = $this->mockFormatShare(); + + $folder = $this->createMock(Folder::class); + + $share = \OC::$server->getShareManager()->newShare(); + $share + ->setId(42) + ->setSharedBy($this->currentUser) + ->setShareOwner('anotheruser') + ->setShareType(\OCP\Share::SHARE_TYPE_LINK) + ->setPermissions(\OCP\Constants::PERMISSION_READ) + ->setNode($folder); + + // note: updateShare will modify the received instance but getSharedWith will reread from the database, + // so their values will be different + $incomingShare = \OC::$server->getShareManager()->newShare(); + $incomingShare + ->setId(42) + ->setSharedBy($this->currentUser) + ->setShareOwner('anotheruser') + ->setShareType(\OCP\Share::SHARE_TYPE_USER) + ->setSharedWith('currentUser') + ->setPermissions(\OCP\Constants::PERMISSION_READ) + ->setNode($folder); + + $this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share); + + $this->shareManager->expects($this->any()) + ->method('getSharedWith') + ->will($this->returnValueMap([ + ['currentUser', \OCP\Share::SHARE_TYPE_USER, $share->getNode(), -1, 0, [$incomingShare]], + ['currentUser', \OCP\Share::SHARE_TYPE_GROUP, $share->getNode(), -1, 0, []] + ])); + + $this->shareManager->expects($this->never())->method('updateShare'); + $this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true); + + try { + $ocs->updateShare(42, null, null, 'true'); + $this->fail(); + } catch (OCSNotFoundException $e) { + $this->assertEquals('Cannot increase permissions', $e->getMessage()); + } + } + public function testUpdateShareCanIncreasePermissionsIfOwner() { $ocs = $this->mockFormatShare(); diff --git a/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php index e8ee55d1845..336dcb70f0e 100644 --- a/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareesAPIControllerTest.php @@ -1221,93 +1221,121 @@ class ShareesAPIControllerTest extends TestCase { } public function dataSearch() { + $noRemote = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_EMAIL]; $allTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE, Share::SHARE_TYPE_EMAIL]; return [ - [[], '', 'yes', true, true, $allTypes, false, true, true], + [[], '', 'yes', true, true, $noRemote, false, true, true], // Test itemType [[ 'search' => '', - ], '', 'yes', true, true, $allTypes, false, true, true], + ], '', 'yes', true, true, $noRemote, false, true, true], [[ 'search' => 'foobar', - ], '', 'yes', true, true, $allTypes, false, true, true], + ], '', 'yes', true, true, $noRemote, false, true, true], [[ 'search' => 0, - ], '', 'yes', true, true, $allTypes, false, true, true], + ], '', 'yes', true, true, $noRemote, false, true, true], // Test itemType [[ 'itemType' => '', - ], '', 'yes', true, true, $allTypes, false, true, true], + ], '', 'yes', true, true, $noRemote, false, true, true], [[ 'itemType' => 'folder', ], '', 'yes', true, true, $allTypes, false, true, true], [[ 'itemType' => 0, - ], '', 'yes', true, true, $allTypes, false, true, true], + ], '', 'yes', true, true, $noRemote, false, true, true], // Test shareType [[ + 'itemType' => 'call', + ], '', 'yes', true, true, $noRemote, false, true, true], + [[ + 'itemType' => 'folder', ], '', 'yes', true, true, $allTypes, false, true, true], [[ + 'itemType' => 'folder', 'shareType' => 0, ], '', 'yes', true, false, [0], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => '0', ], '', 'yes', true, false, [0], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => 1, ], '', 'yes', true, false, [1], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => 12, ], '', 'yes', true, false, [], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => 'foobar', ], '', 'yes', true, true, $allTypes, false, true, true], [[ + 'itemType' => 'folder', 'shareType' => [0, 1, 2], ], '', 'yes', false, false, [0, 1], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => [0, 1], ], '', 'yes', false, false, [0, 1], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => $allTypes, ], '', 'yes', true, true, $allTypes, false, true, true], [[ + 'itemType' => 'folder', 'shareType' => $allTypes, ], '', 'yes', false, false, [0, 1], false, true, true], [[ + 'itemType' => 'folder', 'shareType' => $allTypes, ], '', 'yes', true, false, [0, 6], false, true, false], [[ + 'itemType' => 'folder', 'shareType' => $allTypes, ], '', 'yes', false, true, [0, 4], false, true, false], // Test pagination [[ + 'itemType' => 'folder', 'page' => 1, ], '', 'yes', true, true, $allTypes, false, true, true], [[ + 'itemType' => 'folder', 'page' => 10, ], '', 'yes', true, true, $allTypes, false, true, true], // Test perPage [[ + 'itemType' => 'folder', 'perPage' => 1, ], '', 'yes', true, true, $allTypes, false, true, true], [[ + 'itemType' => 'folder', 'perPage' => 10, ], '', 'yes', true, true, $allTypes, false, true, true], // Test $shareWithGroupOnly setting - [[], 'no', 'yes', true, true, $allTypes, false, true, true], - [[], 'yes', 'yes', true, true, $allTypes, true, true, true], + [[ + 'itemType' => 'folder', + ], 'no', 'yes', true, true, $allTypes, false, true, true], + [[ + 'itemType' => 'folder', + ], 'yes', 'yes', true, true, $allTypes, true, true, true], // Test $shareeEnumeration setting - [[], 'no', 'yes', true, true, $allTypes, false, true, true], - [[], 'no', 'no', true, true, $allTypes, false, false, true], + [[ + 'itemType' => 'folder', + ], 'no', 'yes', true, true, $allTypes, false, true, true], + [[ + 'itemType' => 'folder', + ], 'no', 'no', true, true, $allTypes, false, false, true], ]; } @@ -1318,6 +1346,7 @@ class ShareesAPIControllerTest extends TestCase { * @param string $apiSetting * @param string $enumSetting * @param bool $remoteSharingEnabled + * @param bool $emailSharingEnabled * @param array $shareTypes * @param bool $shareWithGroupOnly * @param bool $shareeEnumeration @@ -1341,7 +1370,7 @@ class ShareesAPIControllerTest extends TestCase { ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', $enumSetting], ]); - $this->shareManager->expects($this->once()) + $this->shareManager->expects($itemType === 'file' || $itemType === 'folder' ? $this->once() : $this->never()) ->method('allowGroupSharing') ->willReturn($allowGroupSharing); diff --git a/apps/files_sharing/tests/SizePropagationTest.php b/apps/files_sharing/tests/SizePropagationTest.php index 04db505e8a5..9d80633b46a 100644 --- a/apps/files_sharing/tests/SizePropagationTest.php +++ b/apps/files_sharing/tests/SizePropagationTest.php @@ -102,6 +102,7 @@ class SizePropagationTest extends TestCase { $this->assertTrue($recipientView->file_exists('/sharedfolder/subfolder/foo.txt')); $recipientRootInfo = $recipientView->getFileInfo('', false); $recipientRootInfoWithMounts = $recipientView->getFileInfo('', true); + $oldRecipientSize = $recipientRootInfoWithMounts->getSize(); // when file changed as recipient $recipientView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'foobar'); @@ -112,7 +113,7 @@ class SizePropagationTest extends TestCase { // but the size including mountpoints increases $newRecipientRootInfo = $recipientView->getFileInfo('', true); - $this->assertEquals($recipientRootInfoWithMounts->getSize() +3, $newRecipientRootInfo->getSize()); + $this->assertEquals($oldRecipientSize +3, $newRecipientRootInfo->getSize()); // size of owner's root increases $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2); diff --git a/apps/files_trashbin/appinfo/info.xml b/apps/files_trashbin/appinfo/info.xml index 2fd88ff7765..04b8a7293cb 100644 --- a/apps/files_trashbin/appinfo/info.xml +++ b/apps/files_trashbin/appinfo/info.xml @@ -16,7 +16,7 @@ To prevent a user from running out of disk space, the Deleted files app will not </types> <namespace>Files_Trashbin</namespace> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <documentation> <user>user-trashbin</user> diff --git a/apps/files_trashbin/l10n/bg_BG.js b/apps/files_trashbin/l10n/bg_BG.js index 72abc2fea14..e21523b6627 100644 --- a/apps/files_trashbin/l10n/bg_BG.js +++ b/apps/files_trashbin/l10n/bg_BG.js @@ -4,7 +4,7 @@ OC.L10N.register( "Couldn't delete %s permanently" : "Неуспешно безвъзвратно изтриване на %s.", "Couldn't restore %s" : "Неуспешно възтановяване на %s.", "Deleted files" : "Изтрити файлове", - "Restore" : "Възстановяви", + "Restore" : "Възстановяне", "Delete" : "Изтрий", "Delete permanently" : "Изтрий завинаги", "Error" : "Грешка", diff --git a/apps/files_trashbin/l10n/bg_BG.json b/apps/files_trashbin/l10n/bg_BG.json index f1efd5a4c26..ee5a21463cb 100644 --- a/apps/files_trashbin/l10n/bg_BG.json +++ b/apps/files_trashbin/l10n/bg_BG.json @@ -2,7 +2,7 @@ "Couldn't delete %s permanently" : "Неуспешно безвъзвратно изтриване на %s.", "Couldn't restore %s" : "Неуспешно възтановяване на %s.", "Deleted files" : "Изтрити файлове", - "Restore" : "Възстановяви", + "Restore" : "Възстановяне", "Delete" : "Изтрий", "Delete permanently" : "Изтрий завинаги", "Error" : "Грешка", diff --git a/apps/files_versions/appinfo/info.xml b/apps/files_versions/appinfo/info.xml index 026ed406d7c..5eb0df91d8d 100644 --- a/apps/files_versions/appinfo/info.xml +++ b/apps/files_versions/appinfo/info.xml @@ -14,7 +14,7 @@ In addition to the expiry of versions, the versions app makes certain never to u </types> <namespace>Files_Versions</namespace> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <documentation> <user>user-versions</user> diff --git a/apps/files_versions/css/versions.css b/apps/files_versions/css/versions.css index b159de82ea3..cd63a90ab51 100644 --- a/apps/files_versions/css/versions.css +++ b/apps/files_versions/css/versions.css @@ -1,6 +1,7 @@ .versionsTabView .clear-float { clear: both; } + .versionsTabView li { width: 100%; cursor: default; @@ -12,25 +13,30 @@ border-bottom: none; } -.versionsTabView li > * { +.versionsTabView a, +.versionsTabView div > span { vertical-align: middle; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=50); opacity: .5; } -.versionsTabView li > a, -.versionsTabView li > span { +.versionsTabView li a{ padding: 15px 10px 11px; } -.versionsTabView li > *:hover, -.versionsTabView li > *:focus { +.versionsTabView a:hover, +.versionsTabView a:focus { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); opacity: 1; } +.versionsTabView .preview-container { + display: inline-block; + vertical-align: top; +} + .versionsTabView img { cursor: pointer; padding-right: 4px; @@ -38,7 +44,10 @@ .versionsTabView img.preview { cursor: default; - opacity: 1; +} + +.versionsTabView .version-container { + display: inline-block; } .versionsTabView .versiondate { @@ -46,6 +55,14 @@ vertical-align: super; } +.versionsTabView .version-details { + text-align: left; +} + +.versionsTabView .version-details > span { + padding: 0 10px; +} + .versionsTabView .revertVersion { cursor: pointer; float: right; diff --git a/apps/files_versions/js/versionstabview.js b/apps/files_versions/js/versionstabview.js index 2e334edacb5..35abde6d34a 100644 --- a/apps/files_versions/js/versionstabview.js +++ b/apps/files_versions/js/versionstabview.js @@ -13,13 +13,26 @@ (function() { var TEMPLATE_ITEM = '<li data-revision="{{timestamp}}">' + + '<div>' + + '<div class="preview-container">' + '<img class="preview" src="{{previewUrl}}"/>' + + '</div>' + + '<div class="version-container">' + + '<div>' + '<a href="{{downloadUrl}}" class="downloadVersion"><img src="{{downloadIconUrl}}" />' + '<span class="versiondate has-tooltip live-relative-timestamp" data-timestamp="{{millisecondsTimestamp}}" title="{{formattedTimestamp}}">{{relativeTimestamp}}</span>' + '</a>' + + '</div>' + + '{{#hasDetails}}' + + '<div class="version-details">' + + '<span class="size has-tooltip" title="{{altSize}}">{{humanReadableSize}}</span>' + + '</div>' + + '{{/hasDetails}}' + + '</div>' + '{{#canRevert}}' + '<a href="#" class="revertVersion" title="{{revertLabel}}"><img src="{{revertIconUrl}}" /></a>' + '{{/canRevert}}' + + '</div>' + '</li>'; var TEMPLATE = @@ -182,10 +195,14 @@ _formatItem: function(version) { var timestamp = version.get('timestamp') * 1000; + var size = version.has('size') ? version.get('size') : 0; return _.extend({ millisecondsTimestamp: timestamp, formattedTimestamp: OC.Util.formatDate(timestamp), relativeTimestamp: OC.Util.relativeModifiedDate(timestamp), + humanReadableSize: OC.Util.humanFileSize(size, true), + altSize: n('files', '%n byte', '%n bytes', size), + hasDetails: version.has('size'), downloadUrl: version.getDownloadUrl(), downloadIconUrl: OC.imagePath('core', 'actions/download'), revertIconUrl: OC.imagePath('core', 'actions/history'), diff --git a/apps/files_versions/l10n/bg_BG.js b/apps/files_versions/l10n/bg_BG.js index cea297b6974..09b4ed63e0d 100644 --- a/apps/files_versions/l10n/bg_BG.js +++ b/apps/files_versions/l10n/bg_BG.js @@ -4,7 +4,7 @@ OC.L10N.register( "Could not revert: %s" : "Грешка при връщане: %s", "Versions" : "Версии", "Failed to revert {file} to revision {timestamp}." : "Грешка при връщане на {file} към версия {timestamp}.", - "Restore" : "Възтановяви", + "Restore" : "Възтановяване", "No other versions available" : "Няма други налични версии", "More versions..." : "Още версии..." }, diff --git a/apps/files_versions/l10n/bg_BG.json b/apps/files_versions/l10n/bg_BG.json index 826c7136d1a..339ea7b1a33 100644 --- a/apps/files_versions/l10n/bg_BG.json +++ b/apps/files_versions/l10n/bg_BG.json @@ -2,7 +2,7 @@ "Could not revert: %s" : "Грешка при връщане: %s", "Versions" : "Версии", "Failed to revert {file} to revision {timestamp}." : "Грешка при връщане на {file} към версия {timestamp}.", - "Restore" : "Възтановяви", + "Restore" : "Възтановяване", "No other versions available" : "Няма други налични версии", "More versions..." : "Още версии..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/tests/js/versionstabviewSpec.js b/apps/files_versions/tests/js/versionstabviewSpec.js index 94285c93aba..9b788db1970 100644 --- a/apps/files_versions/tests/js/versionstabviewSpec.js +++ b/apps/files_versions/tests/js/versionstabviewSpec.js @@ -78,12 +78,14 @@ describe('OCA.Versions.VersionsTabView', function() { var $item = $versions.eq(0); expect($item.find('.downloadVersion').attr('href')).toEqual(version1.getDownloadUrl()); expect($item.find('.versiondate').text()).toEqual('seconds ago'); + expect($item.find('.size').text()).toEqual('< 1 KB'); expect($item.find('.revertVersion').length).toEqual(1); expect($item.find('.preview').attr('src')).toEqual(version1.getPreviewUrl()); $item = $versions.eq(1); expect($item.find('.downloadVersion').attr('href')).toEqual(version2.getDownloadUrl()); expect($item.find('.versiondate').text()).toEqual('2 days ago'); + expect($item.find('.size').text()).toEqual('< 1 KB'); expect($item.find('.revertVersion').length).toEqual(1); expect($item.find('.preview').attr('src')).toEqual(version2.getPreviewUrl()); }); @@ -231,4 +233,3 @@ describe('OCA.Versions.VersionsTabView', function() { }); }); }); - diff --git a/apps/provisioning_api/appinfo/info.xml b/apps/provisioning_api/appinfo/info.xml index 009bdca0c1e..0ebcee9a7f7 100644 --- a/apps/provisioning_api/appinfo/info.xml +++ b/apps/provisioning_api/appinfo/info.xml @@ -23,6 +23,6 @@ <prevent_group_restriction/> </types> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> </info> diff --git a/apps/sharebymail/appinfo/info.xml b/apps/sharebymail/appinfo/info.xml index f1771fc9551..6c4882d349f 100644 --- a/apps/sharebymail/appinfo/info.xml +++ b/apps/sharebymail/appinfo/info.xml @@ -9,7 +9,7 @@ <namespace>ShareByMail</namespace> <category>other</category> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <default_enable/> </info> diff --git a/apps/systemtags/appinfo/info.xml b/apps/systemtags/appinfo/info.xml index 0a98d7ae680..3ed01d3d8c0 100644 --- a/apps/systemtags/appinfo/info.xml +++ b/apps/systemtags/appinfo/info.xml @@ -9,7 +9,7 @@ <default_enable/> <version>1.1.3</version> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <namespace>SystemTags</namespace> <types> diff --git a/apps/systemtags/js/systemtagsfilelist.js b/apps/systemtags/js/systemtagsfilelist.js index 56838018a2c..25f377785b7 100644 --- a/apps/systemtags/js/systemtagsfilelist.js +++ b/apps/systemtags/js/systemtagsfilelist.js @@ -115,6 +115,9 @@ escapeMarkup: function(m) { // prevent double markup escape return m; + }, + formatNoMatches: function() { + return t('systemtags', 'No tags found'); } }); this.$filterField.on('change', _.bind(this._onTagsChanged, this)); diff --git a/apps/systemtags/l10n/cs_CZ.js b/apps/systemtags/l10n/cs_CZ.js index 2a9df127eac..a58f4456d74 100644 --- a/apps/systemtags/l10n/cs_CZ.js +++ b/apps/systemtags/l10n/cs_CZ.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Zvolit značku…", "Tagged files" : "Otagované soubory", "Select tags to filter by" : "Vybrat tagy pro filtr", + "No tags found" : "Nebyly nalezeny žádné tagy", "Please select tags to filter by" : "Vyberte prosím tagy pro filtrování", "No files found for the selected tags" : "Nebyly nalezeny žádné soubory s vybranými tagy", "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny", diff --git a/apps/systemtags/l10n/cs_CZ.json b/apps/systemtags/l10n/cs_CZ.json index 2705db475c1..4c431198836 100644 --- a/apps/systemtags/l10n/cs_CZ.json +++ b/apps/systemtags/l10n/cs_CZ.json @@ -5,6 +5,7 @@ "Select tag…" : "Zvolit značku…", "Tagged files" : "Otagované soubory", "Select tags to filter by" : "Vybrat tagy pro filtr", + "No tags found" : "Nebyly nalezeny žádné tagy", "Please select tags to filter by" : "Vyberte prosím tagy pro filtrování", "No files found for the selected tags" : "Nebyly nalezeny žádné soubory s vybranými tagy", "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny", diff --git a/apps/systemtags/l10n/de.js b/apps/systemtags/l10n/de.js index 492ec7b6f7a..8539353929e 100644 --- a/apps/systemtags/l10n/de.js +++ b/apps/systemtags/l10n/de.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Tag wählen", "Tagged files" : "Mit Tags versehene Dateien", "Select tags to filter by" : "Wähle Tags nach denen gefilter werden soll", + "No tags found" : "Keine Tags gefunden", "Please select tags to filter by" : "Bitte wähle die Tags nach denen gefiltert werden soll", "No files found for the selected tags" : "Keine Dateien für die ausgewählten Tags gefunden", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden", diff --git a/apps/systemtags/l10n/de.json b/apps/systemtags/l10n/de.json index e0a676a305e..18e645fe551 100644 --- a/apps/systemtags/l10n/de.json +++ b/apps/systemtags/l10n/de.json @@ -5,6 +5,7 @@ "Select tag…" : "Tag wählen", "Tagged files" : "Mit Tags versehene Dateien", "Select tags to filter by" : "Wähle Tags nach denen gefilter werden soll", + "No tags found" : "Keine Tags gefunden", "Please select tags to filter by" : "Bitte wähle die Tags nach denen gefiltert werden soll", "No files found for the selected tags" : "Keine Dateien für die ausgewählten Tags gefunden", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden", diff --git a/apps/systemtags/l10n/de_DE.js b/apps/systemtags/l10n/de_DE.js index 4b35bfd7dfc..e1dc3a6e9ce 100644 --- a/apps/systemtags/l10n/de_DE.js +++ b/apps/systemtags/l10n/de_DE.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Tag wählen", "Tagged files" : "Getaggte Dateien", "Select tags to filter by" : "Wählen Sie Tags nach denen gefiltert werden soll", + "No tags found" : "Keine Tags gefunden", "Please select tags to filter by" : "Bitte wählen Sie Tags nach denen gefiltert werden sollen", "No files found for the selected tags" : "Keine Dateien für die ausgewählten Tags gefunden", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden", diff --git a/apps/systemtags/l10n/de_DE.json b/apps/systemtags/l10n/de_DE.json index 64b59ec2e52..b5390340d05 100644 --- a/apps/systemtags/l10n/de_DE.json +++ b/apps/systemtags/l10n/de_DE.json @@ -5,6 +5,7 @@ "Select tag…" : "Tag wählen", "Tagged files" : "Getaggte Dateien", "Select tags to filter by" : "Wählen Sie Tags nach denen gefiltert werden soll", + "No tags found" : "Keine Tags gefunden", "Please select tags to filter by" : "Bitte wählen Sie Tags nach denen gefiltert werden sollen", "No files found for the selected tags" : "Keine Dateien für die ausgewählten Tags gefunden", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden", diff --git a/apps/systemtags/l10n/fr.js b/apps/systemtags/l10n/fr.js index 311449ae0e3..75f2cebe771 100644 --- a/apps/systemtags/l10n/fr.js +++ b/apps/systemtags/l10n/fr.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Sélectionner une étiquette…", "Tagged files" : "Fichiers étiquetés", "Select tags to filter by" : "Sélectionner les étiquettes par lesquelles filtrer", + "No tags found" : "Aucune étiquette trouvée", "Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer", "No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", diff --git a/apps/systemtags/l10n/fr.json b/apps/systemtags/l10n/fr.json index bf87566b82d..840f2db168b 100644 --- a/apps/systemtags/l10n/fr.json +++ b/apps/systemtags/l10n/fr.json @@ -5,6 +5,7 @@ "Select tag…" : "Sélectionner une étiquette…", "Tagged files" : "Fichiers étiquetés", "Select tags to filter by" : "Sélectionner les étiquettes par lesquelles filtrer", + "No tags found" : "Aucune étiquette trouvée", "Please select tags to filter by" : "Veuillez sélectionner les étiquettes par lesquelles filtrer", "No files found for the selected tags" : "Aucun fichier pour les étiquettes sélectionnées", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", diff --git a/apps/systemtags/l10n/hu_HU.js b/apps/systemtags/l10n/hu_HU.js index a1f537f879c..3117a6727f9 100644 --- a/apps/systemtags/l10n/hu_HU.js +++ b/apps/systemtags/l10n/hu_HU.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Címke választás...", "Tagged files" : "Címkézett fájlok", "Select tags to filter by" : "Kiválasztott címkék a szűrő által:", + "No tags found" : "Nem találhatók címkék", "Please select tags to filter by" : "Kéjük, válasszon ki címkét a szűréshez:", "No files found for the selected tags" : "Nem található fájl a kiválasztott címkéhez.", "<strong>System tags</strong> for a file have been modified" : "A fájl <strong>rendszer címkéje</strong> módosítva lett", diff --git a/apps/systemtags/l10n/hu_HU.json b/apps/systemtags/l10n/hu_HU.json index acda5acdabb..b01bb83c104 100644 --- a/apps/systemtags/l10n/hu_HU.json +++ b/apps/systemtags/l10n/hu_HU.json @@ -5,6 +5,7 @@ "Select tag…" : "Címke választás...", "Tagged files" : "Címkézett fájlok", "Select tags to filter by" : "Kiválasztott címkék a szűrő által:", + "No tags found" : "Nem találhatók címkék", "Please select tags to filter by" : "Kéjük, válasszon ki címkét a szűréshez:", "No files found for the selected tags" : "Nem található fájl a kiválasztott címkéhez.", "<strong>System tags</strong> for a file have been modified" : "A fájl <strong>rendszer címkéje</strong> módosítva lett", diff --git a/apps/systemtags/l10n/it.js b/apps/systemtags/l10n/it.js index fc0f1760311..f888d641ccd 100644 --- a/apps/systemtags/l10n/it.js +++ b/apps/systemtags/l10n/it.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Seleziona etichetta...", "Tagged files" : "File etichettati", "Select tags to filter by" : "Seleziona le etichette per filtrare", + "No tags found" : "Nessuna etichetta trovata", "Please select tags to filter by" : "Seleziona le etichette per filtrare", "No files found for the selected tags" : "Nessun file trovato per le etichette selezionate", "<strong>System tags</strong> for a file have been modified" : "Le <strong>etichette di sistema</strong> per un file sono state modificate", diff --git a/apps/systemtags/l10n/it.json b/apps/systemtags/l10n/it.json index 0ec6bba1f65..9ac5a2955f5 100644 --- a/apps/systemtags/l10n/it.json +++ b/apps/systemtags/l10n/it.json @@ -5,6 +5,7 @@ "Select tag…" : "Seleziona etichetta...", "Tagged files" : "File etichettati", "Select tags to filter by" : "Seleziona le etichette per filtrare", + "No tags found" : "Nessuna etichetta trovata", "Please select tags to filter by" : "Seleziona le etichette per filtrare", "No files found for the selected tags" : "Nessun file trovato per le etichette selezionate", "<strong>System tags</strong> for a file have been modified" : "Le <strong>etichette di sistema</strong> per un file sono state modificate", diff --git a/apps/systemtags/l10n/nl.js b/apps/systemtags/l10n/nl.js index da07439d6d5..e7292e883be 100644 --- a/apps/systemtags/l10n/nl.js +++ b/apps/systemtags/l10n/nl.js @@ -7,6 +7,7 @@ OC.L10N.register( "Select tag…" : "Selecteren markering…", "Tagged files" : "Gemarkeerde bestanden", "Select tags to filter by" : "Selecteer markering om op te filteren", + "No tags found" : "Geen tags gevonden", "Please select tags to filter by" : "Selecteer markeringen om op te filteren", "No files found for the selected tags" : "Geen bestanden gevonden voor de geselecteerde markeringen", "<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd", diff --git a/apps/systemtags/l10n/nl.json b/apps/systemtags/l10n/nl.json index 3fa3fdf24d8..7895bb4ff27 100644 --- a/apps/systemtags/l10n/nl.json +++ b/apps/systemtags/l10n/nl.json @@ -5,6 +5,7 @@ "Select tag…" : "Selecteren markering…", "Tagged files" : "Gemarkeerde bestanden", "Select tags to filter by" : "Selecteer markering om op te filteren", + "No tags found" : "Geen tags gevonden", "Please select tags to filter by" : "Selecteer markeringen om op te filteren", "No files found for the selected tags" : "Geen bestanden gevonden voor de geselecteerde markeringen", "<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd", diff --git a/apps/testing/appinfo/info.xml b/apps/testing/appinfo/info.xml index 0acccf357fb..41b07447d55 100644 --- a/apps/testing/appinfo/info.xml +++ b/apps/testing/appinfo/info.xml @@ -7,6 +7,6 @@ <author>Joas Schilling</author> <version>1.1.0</version> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> </info> diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml index 423d11d2aef..3a8867dc6f4 100644 --- a/apps/theming/appinfo/info.xml +++ b/apps/theming/appinfo/info.xml @@ -10,7 +10,7 @@ <category>other</category> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <types> diff --git a/apps/theming/appinfo/routes.php b/apps/theming/appinfo/routes.php index 4a8d4bac5bc..f4aa2f93162 100644 --- a/apps/theming/appinfo/routes.php +++ b/apps/theming/appinfo/routes.php @@ -60,5 +60,23 @@ return ['routes' => [ 'url' => '/js/theming', 'verb' => 'GET', ], + [ + 'name' => 'Icon#getFavicon', + 'url' => '/favicon/{app}', + 'verb' => 'GET', + 'defaults' => array('app' => 'core'), + ], + [ + 'name' => 'Icon#getTouchIcon', + 'url' => '/icon/{app}', + 'verb' => 'GET', + 'defaults' => array('app' => 'core'), + ], + [ + 'name' => 'Icon#getThemedIcon', + 'url' => '/img/{app}/{image}', + 'verb' => 'GET', + 'requirements' => array('image' => '.+') + ], ]]; diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css index 5d2b08f5e43..60b9c080ad6 100644 --- a/apps/theming/css/settings-admin.css +++ b/apps/theming/css/settings-admin.css @@ -6,12 +6,30 @@ display: none; } +#theming div > label { + position: relative; +} + #theming .theme-undo { + position: absolute; + top: -7px; + right: 7px; cursor: pointer; - opacity: .5; - padding: 11px 5px; + opacity: .3; + padding: 7px; vertical-align: top; display: inline-block; + visibility: hidden; +} +#theming form .theme-undo { + position: relative; + top: 4px; + left: 158px; + visibility: visible; +} +#theming input[type='text']:focus + .theme-undo, +#theming input[type='text']:active + .theme-undo { + visibility: visible; } #theming .icon-loading-small:after { @@ -48,4 +66,4 @@ div#theming_settings_msg { max-width: 20%; max-height: 20%; margin-top: 20px; -}
\ No newline at end of file +} diff --git a/apps/theming/lib/Controller/IconController.php b/apps/theming/lib/Controller/IconController.php new file mode 100644 index 00000000000..4c25d911e5e --- /dev/null +++ b/apps/theming/lib/Controller/IconController.php @@ -0,0 +1,174 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Haertl <jus@bitgrid.net> + * + * @author Julius Haertl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Theming\Controller; + +use OCA\Theming\IconBuilder; +use OCA\Theming\ImageManager; +use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\NotFoundException; +use OCP\IRequest; +use OCA\Theming\Util; +use OCP\IConfig; + +class IconController extends Controller { + /** @var ThemingDefaults */ + private $themingDefaults; + /** @var Util */ + private $util; + /** @var ITimeFactory */ + private $timeFactory; + /** @var IConfig */ + private $config; + /** @var IconBuilder */ + private $iconBuilder; + /** @var ImageManager */ + private $imageManager; + + /** + * IconController constructor. + * + * @param string $appName + * @param IRequest $request + * @param ThemingDefaults $themingDefaults + * @param Util $util + * @param ITimeFactory $timeFactory + * @param IConfig $config + * @param IconBuilder $iconBuilder + * @param ImageManager $imageManager + */ + public function __construct( + $appName, + IRequest $request, + ThemingDefaults $themingDefaults, + Util $util, + ITimeFactory $timeFactory, + IConfig $config, + IconBuilder $iconBuilder, + ImageManager $imageManager + ) { + parent::__construct($appName, $request); + + $this->themingDefaults = $themingDefaults; + $this->util = $util; + $this->timeFactory = $timeFactory; + $this->config = $config; + $this->iconBuilder = $iconBuilder; + $this->imageManager = $imageManager; + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * @param $app string app name + * @param $image string image file name (svg required) + * @return FileDisplayResponse|NotFoundResponse + */ + public function getThemedIcon($app, $image) { + try { + $iconFile = $this->imageManager->getCachedImage("icon-" . $app . '-' . str_replace("/","_",$image)); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->colorSvg($app, $image); + $iconFile = $this->imageManager->setCachedImage("icon-" . $app . '-' . str_replace("/","_",$image), $icon); + } + if ($iconFile !== false) { + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); + $response->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $response->addHeader('Pragma', 'cache'); + return $response; + } else { + return new NotFoundResponse(); + } + } + + /** + * Return a 32x32 favicon as png + * + * @PublicPage + * @NoCSRFRequired + * + * @param $app string app name + * @return FileDisplayResponse|NotFoundResponse + */ + public function getFavicon($app = "core") { + if ($this->themingDefaults->shouldReplaceIcons()) { + try { + $iconFile = $this->imageManager->getCachedImage('favIcon-' . $app); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->getFavicon($app); + $iconFile = $this->imageManager->setCachedImage('favIcon-' . $app, $icon); + } + if ($iconFile !== false) { + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $response->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $response->addHeader('Pragma', 'cache'); + return $response; + } + } + return new NotFoundResponse(); + } + + /** + * Return a 512x512 icon for touch devices + * + * @PublicPage + * @NoCSRFRequired + * + * @param $app string app name + * @return FileDisplayResponse|NotFoundResponse + */ + public function getTouchIcon($app = "core") { + if ($this->themingDefaults->shouldReplaceIcons()) { + try { + $iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app); + } catch (NotFoundException $exception) { + $icon = $this->iconBuilder->getTouchIcon($app); + $iconFile = $this->imageManager->setCachedImage('touchIcon-' . $app, $icon); + } + if ($iconFile !== false) { + $response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']); + $response->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $response->addHeader('Pragma', 'cache'); + return $response; + } + } + return new NotFoundResponse(); + } +} diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index f274d245887..58e843c5d9d 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -32,9 +32,12 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\Http\NotFoundResponse; use OCP\AppFramework\Http\StreamResponse; use OCP\AppFramework\Utility\ITimeFactory; +use OCP\Files\File; use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; @@ -255,15 +258,17 @@ class ThemingController extends Controller { * @PublicPage * @NoCSRFRequired * - * @return StreamResponse|DataResponse + * @return StreamResponse|NotFoundResponse */ public function getLogo() { - $pathToLogo = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/') . '/themedinstancelogo'; - if(!file_exists($pathToLogo)) { - return new DataResponse(); + try { + /** @var File $file */ + $file = $this->rootFolder->get('themedinstancelogo'); + } catch (NotFoundException $e) { + return new NotFoundResponse(); } - $response = new Http\StreamResponse($pathToLogo); + $response = new Http\StreamResponse($file->fopen('r')); $response->cacheFor(3600); $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); $response->addHeader('Content-Disposition', 'attachment'); @@ -276,15 +281,17 @@ class ThemingController extends Controller { * @PublicPage * @NoCSRFRequired * - * @return StreamResponse|DataResponse + * @return StreamResponse|NotFoundResponse */ public function getLoginBackground() { - $pathToLogo = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/') . '/themedbackgroundlogo'; - if(!file_exists($pathToLogo)) { - return new DataResponse(); + try { + /** @var File $file */ + $file = $this->rootFolder->get('themedbackgroundlogo'); + } catch (NotFoundException $e) { + return new NotFoundResponse(); } - $response = new StreamResponse($pathToLogo); + $response = new StreamResponse($file->fopen('r')); $response->cacheFor(3600); $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); $response->addHeader('Content-Disposition', 'attachment'); @@ -319,7 +326,7 @@ class ThemingController extends Controller { $responseCss .= sprintf('input[type="checkbox"].checkbox:checked:enabled:not(.checkbox--white) + label:before {' . 'background-image:url(\'%s/core/img/actions/checkmark-white.svg\');' . 'background-color: %s; background-position: center center; background-size:contain;' . - 'width:12px; height:12px; padding:0; margin:2px 6px 6px 9px; border-radius:1px;' . + 'width:12px; height:12px; padding:0; margin:2px 6px 6px 2px; border-radius:1px;' . "}\n", \OC::$WEBROOT, $elementColor @@ -403,6 +410,15 @@ class ThemingController extends Controller { $responseCss .= '.nc-theming-contrast {color: #ffffff}' . "\n"; } + if($logo !== '' or $color !== '') { + $responseCss .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v='.$cacheBusterValue.'\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v='.$cacheBusterValue.'\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v='.$cacheBusterValue.'\')!important;' . "}\n"; + } + $response = new DataDownloadResponse($responseCss, 'style', 'text/css'); $response->addHeader('Expires', date(\DateTime::RFC2822, $this->timeFactory->getTime())); $response->addHeader('Pragma', 'cache'); @@ -416,6 +432,7 @@ class ThemingController extends Controller { * @return DataDownloadResponse */ public function getJavascript() { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); $responseJS = '(function() { OCA.Theming = { name: ' . json_encode($this->template->getName()) . ', @@ -423,6 +440,7 @@ class ThemingController extends Controller { slogan: ' . json_encode($this->template->getSlogan()) . ', color: ' . json_encode($this->template->getMailHeaderColor()) . ', inverted: ' . json_encode($this->util->invertTextColor($this->template->getMailHeaderColor())) . ', + cacheBuster: ' . json_encode($cacheBusterValue). ' }; })();'; $response = new Http\DataDisplayResponse($responseJS); diff --git a/apps/theming/lib/IconBuilder.php b/apps/theming/lib/IconBuilder.php new file mode 100644 index 00000000000..d8161051ebb --- /dev/null +++ b/apps/theming/lib/IconBuilder.php @@ -0,0 +1,182 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Theming; + +use Imagick; +use ImagickPixel; +use OCP\App\AppPathNotFoundException; + +class IconBuilder { + /** @var ThemingDefaults */ + private $themingDefaults; + /** @var Util */ + private $util; + + /** + * IconBuilder constructor. + * + * @param ThemingDefaults $themingDefaults + * @param Util $util + */ + public function __construct( + ThemingDefaults $themingDefaults, + Util $util + ) { + $this->themingDefaults = $themingDefaults; + $this->util = $util; + } + + /** + * @param $app string app name + * @return string|false image blob + */ + public function getFavicon($app) { + $icon = $this->renderAppIcon($app); + if($icon === false) { + return false; + } + $icon->resizeImage(32, 32, Imagick::FILTER_LANCZOS, 1); + $icon->setImageFormat("png24"); + $data = $icon->getImageBlob(); + $icon->destroy(); + return $data; + } + + /** + * @param $app string app name + * @return string|false image blob + */ + public function getTouchIcon($app) { + $icon = $this->renderAppIcon($app); + if($icon === false) { + return false; + } + $icon->setImageFormat("png24"); + $data = $icon->getImageBlob(); + $icon->destroy(); + return $data; + } + + /** + * Render app icon on themed background color + * fallback to logo + * + * @param $app string app name + * @return Imagick|false + */ + public function renderAppIcon($app) { + try { + $appIcon = $this->util->getAppIcon($app); + $appIconContent = file_get_contents($appIcon); + } catch (AppPathNotFoundException $e) { + return false; + } + + if($appIconContent === false) { + return false; + } + + $color = $this->themingDefaults->getMailHeaderColor(); + $mime = mime_content_type($appIcon); + + // generate background image with rounded corners + $background = '<?xml version="1.0" encoding="UTF-8"?>' . + '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" width="512" height="512" xmlns:xlink="http://www.w3.org/1999/xlink">' . + '<rect x="0" y="0" rx="75" ry="75" width="512" height="512" style="fill:' . $color . ';" />' . + '</svg>'; + // resize svg magic as this seems broken in Imagemagick + if($mime === "image/svg+xml" || substr($appIconContent, 0, 4) === "<svg") { + if(substr($appIconContent, 0, 5) !== "<?xml") { + $svg = "<?xml version=\"1.0\"?>".$appIconContent; + } else { + $svg = $appIconContent; + } + $tmp = new Imagick(); + $tmp->readImageBlob($svg); + $x = $tmp->getImageWidth(); + $y = $tmp->getImageHeight(); + $res = $tmp->getImageResolution(); + $tmp->destroy(); + + if($x>$y) { + $max = $x; + } else { + $max = $y; + } + + // convert svg to resized image + $appIconFile = new Imagick(); + $resX = (int)(512 * $res['x'] / $max * 2.53); + $resY = (int)(512 * $res['y'] / $max * 2.53); + $appIconFile->setResolution($resX, $resY); + $appIconFile->setBackgroundColor(new ImagickPixel('transparent')); + $appIconFile->readImageBlob($svg); + $appIconFile->scaleImage(512, 512, true); + } else { + $appIconFile = new Imagick(); + $appIconFile->setBackgroundColor(new ImagickPixel('transparent')); + $appIconFile->readImageBlob(file_get_contents($appIcon)); + $appIconFile->scaleImage(512, 512, true); + } + + // offset for icon positioning + $border_w = (int)($appIconFile->getImageWidth() * 0.05); + $border_h = (int)($appIconFile->getImageHeight() * 0.05); + $innerWidth = (int)($appIconFile->getImageWidth() - $border_w * 2); + $innerHeight = (int)($appIconFile->getImageHeight() - $border_h * 2); + $appIconFile->adaptiveResizeImage($innerWidth, $innerHeight); + // center icon + $offset_w = 512 / 2 - $innerWidth / 2; + $offset_h = 512 / 2 - $innerHeight / 2; + + $appIconFile->setImageFormat("png24"); + + $finalIconFile = new Imagick(); + $finalIconFile->readImageBlob($background); + $finalIconFile->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT); + $finalIconFile->setImageArtifact('compose:args', "1,0,-0.5,0.5"); + $finalIconFile->compositeImage($appIconFile, Imagick::COMPOSITE_ATOP, $offset_w, $offset_h); + $finalIconFile->resizeImage(512, 512, Imagick::FILTER_LANCZOS, 1); + + $appIconFile->destroy(); + return $finalIconFile; + } + + public function colorSvg($app, $image) { + try { + $imageFile = $this->util->getAppImage($app, $image); + } catch (AppPathNotFoundException $e) { + return false; + } + $svg = file_get_contents($imageFile); + if ($svg !== false) { + $color = $this->util->elementColor($this->themingDefaults->getMailHeaderColor()); + $svg = $this->util->colorizeSvg($svg, $color); + return $svg; + } else { + return false; + } + } + +} diff --git a/apps/theming/lib/ImageManager.php b/apps/theming/lib/ImageManager.php new file mode 100644 index 00000000000..4cd43e02054 --- /dev/null +++ b/apps/theming/lib/ImageManager.php @@ -0,0 +1,112 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OCA\Theming; + +use OCP\IConfig; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; + +class ImageManager { + + /** @var IConfig */ + private $config; + /** @var IAppData */ + private $appData; + + /** + * ImageManager constructor. + * + * @param IConfig $config + * @param IAppData $appData + */ + public function __construct(IConfig $config, + IAppData $appData + ) { + $this->config = $config; + $this->appData = $appData; + } + + /** + * Get folder for current theming files + * + * @return \OCP\Files\SimpleFS\ISimpleFolder + * @throws NotPermittedException + * @throws \RuntimeException + */ + public function getCacheFolder() { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + try { + $folder = $this->appData->getFolder($cacheBusterValue); + } catch (NotFoundException $e) { + $folder = $this->appData->newFolder($cacheBusterValue); + $this->cleanup(); + } + return $folder; + } + + /** + * Get a file from AppData + * + * @param string $filename + * @throws NotFoundException + * @return \OCP\Files\SimpleFS\ISimpleFile + */ + public function getCachedImage($filename) { + $currentFolder = $this->getCacheFolder(); + return $currentFolder->getFile($filename); + } + + /** + * Store a file for theming in AppData + * + * @param string $filename + * @param string $data + * @return \OCP\Files\SimpleFS\ISimpleFile + */ + public function setCachedImage($filename, $data) { + $currentFolder = $this->getCacheFolder(); + if ($currentFolder->fileExists($filename)) { + $file = $currentFolder->getFile($filename); + } else { + $file = $currentFolder->newFile($filename); + } + $file->putContent($data); + return $file; + } + + /** + * remove cached files that are not required any longer + */ + public function cleanup() { + $currentFolder = $this->getCacheFolder(); + $folders = $this->appData->getDirectoryListing(); + foreach ($folders as $folder) { + if ($folder->getName() !== $currentFolder->getName()) { + $folder->delete(); + } + } + } +} diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 9139dd56247..36f19157637 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -23,6 +23,7 @@ namespace OCA\Theming; +use OCP\ICacheFactory; use OCP\IConfig; use OCP\IL10N; use OCP\IURLGenerator; @@ -38,6 +39,8 @@ class ThemingDefaults extends \OC_Defaults { private $urlGenerator; /** @var IRootFolder */ private $rootFolder; + /** @var ICacheFactory */ + private $cacheFactory; /** @var string */ private $name; /** @var string */ @@ -55,18 +58,21 @@ class ThemingDefaults extends \OC_Defaults { * @param IURLGenerator $urlGenerator * @param \OC_Defaults $defaults * @param IRootFolder $rootFolder + * @param ICacheFactory $cacheFactory */ public function __construct(IConfig $config, IL10N $l, IURLGenerator $urlGenerator, \OC_Defaults $defaults, - IRootFolder $rootFolder + IRootFolder $rootFolder, + ICacheFactory $cacheFactory ) { parent::__construct(); $this->config = $config; $this->l = $l; $this->urlGenerator = $urlGenerator; $this->rootFolder = $rootFolder; + $this->cacheFactory = $cacheFactory; $this->name = $defaults->getName(); $this->url = $defaults->getBaseUrl(); @@ -145,6 +151,29 @@ class ThemingDefaults extends \OC_Defaults { } /** + * Check if Imagemagick is enabled and if SVG is supported + * otherwise we can't render custom icons + * + * @return bool + */ + public function shouldReplaceIcons() { + $cache = $this->cacheFactory->create('theming'); + if($value = $cache->get('shouldReplaceIcons')) { + return (bool)$value; + } + $value = false; + if(extension_loaded('imagick')) { + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) >= 1) { + $value = true; + } + $checkImagick->clear(); + } + $cache->set('shouldReplaceIcons', $value); + return $value; + } + + /** * Increases the cache buster key */ private function increaseCacheBuster() { diff --git a/apps/theming/lib/Util.php b/apps/theming/lib/Util.php index 71ed0958e42..9fea56838ad 100644 --- a/apps/theming/lib/Util.php +++ b/apps/theming/lib/Util.php @@ -23,8 +23,35 @@ namespace OCA\Theming; +use OCP\App\AppPathNotFoundException; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\Files\IRootFolder; + class Util { + /** @var IConfig */ + private $config; + + /** @var IRootFolder */ + private $rootFolder; + + /** @var IAppManager */ + private $appManager; + + /** + * Util constructor. + * + * @param IConfig $config + * @param IRootFolder $rootFolder + * @param IAppManager $appManager + */ + public function __construct(IConfig $config, IRootFolder $rootFolder, IAppManager $appManager) { + $this->config = $config; + $this->rootFolder = $rootFolder; + $this->appManager = $appManager; + } + /** * @param string $color rgb color value * @return bool @@ -81,4 +108,86 @@ class Util { return base64_encode($radioButtonIcon); } + + /** + * @param $app string app name + * @return string path to app icon / logo + */ + public function getAppIcon($app) { + $app = str_replace(array('\0', '/', '\\', '..'), '', $app); + try { + $appPath = $this->appManager->getAppPath($app); + $icon = $appPath . '/img/' . $app . '.svg'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/app.svg'; + if (file_exists($icon)) { + return $icon; + } + } catch (AppPathNotFoundException $e) {} + + if($this->config->getAppValue('theming', 'logoMime', '') !== '' && $this->rootFolder->nodeExists('/themedinstancelogo')) { + return $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/') . '/themedinstancelogo'; + } + return \OC::$SERVERROOT . '/core/img/logo.svg'; + } + + /** + * @param $app string app name + * @param $image string relative path to image in app folder + * @return string|false absolute path to image + */ + public function getAppImage($app, $image) { + $app = str_replace(array('\0', '/', '\\', '..'), '', $app); + $image = str_replace(array('\0', '\\', '..'), '', $image); + if ($app === "core") { + $icon = \OC::$SERVERROOT . '/core/img/' . $image; + if (file_exists($icon)) { + return $icon; + } + } + + try { + $appPath = $this->appManager->getAppPath($app); + } catch (AppPathNotFoundException $e) { + return false; + } + + $icon = $appPath . '/img/' . $image; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.svg'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.png'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.gif'; + if (file_exists($icon)) { + return $icon; + } + $icon = $appPath . '/img/' . $image . '.jpg'; + if (file_exists($icon)) { + return $icon; + } + + return false; + } + + /** + * replace default color with a custom one + * + * @param $svg string content of a svg file + * @param $color string color to match + * @return string + */ + public function colorizeSvg($svg, $color) { + $svg = preg_replace('/#0082c9/i', $color, $svg); + return $svg; + } + } diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php index b6c97040230..013b3bcf34f 100644 --- a/apps/theming/templates/settings-admin.php +++ b/apps/theming/templates/settings-admin.php @@ -34,50 +34,55 @@ style('theming', 'settings-admin'); <?php p($_['errorMessage']) ?> </p> <?php } else { ?> - <p> - <label><span><?php p($l->t('Name')) ?></span> + <div> + <label> + <span><?php p($l->t('Name')) ?></span> <input id="theming-name" type="text" placeholder="<?php p($l->t('Name')); ?>" value="<?php p($_['name']) ?>" maxlength="250" /> + <div data-setting="name" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </label> - <span data-setting="name" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> - </p> - <p> - <label><span><?php p($l->t('Web address')) ?></span> + </div> + <div> + <label> + <span><?php p($l->t('Web address')) ?></span> <input id="theming-url" type="text" placeholder="<?php p($l->t('Web address https://…')); ?>" value="<?php p($_['url']) ?>" maxlength="500" /> + <div data-setting="url" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </label> - <span data-setting="url" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> - </p> - <p> - <label><span><?php p($l->t('Slogan')) ?></span> + </div> + <div> + <label> + <span><?php p($l->t('Slogan')) ?></span> <input id="theming-slogan" type="text" placeholder="<?php p($l->t('Slogan')); ?>" value="<?php p($_['slogan']) ?>" maxlength="500" /> + <div data-setting="slogan" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </label> - <span data-setting="slogan" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> - </p> - <p> - <label><span><?php p($l->t('Color')) ?></span> + </div> + <div> + <label> + <span><?php p($l->t('Color')) ?></span> <input id="theming-color" type="text" class="jscolor" maxlength="6" value="<?php p($_['color']) ?>" /> + <div data-setting="color" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </label> - <span data-setting="color" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> - </p> - <p> - <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + </div> + <div> + <form class="uploadButton inlineblock" 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" /> <label for="uploadlogo" class="button icon-upload svg" id="uploadlogo" title="<?php p($l->t('Upload new logo')) ?>"></label> - <span data-setting="logoMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> + <div data-setting="logoMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </form> - </p> - <p> - <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + </div> + <div> + <form class="uploadButton inlineblock" 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('Log in 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> - <span data-setting="backgroundMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></span> + <div data-setting="backgroundMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> </form> - </p> - <div id="theming-preview" style="background-color:<?php p($_['color']);?>; background-image:url(<?php p($_['background']); ?>);"> - <img src="<?php p($_['logo']); ?>" id="theming-preview-logo" /> - </div> + </div> + + <div id="theming-preview" style="background-color:<?php p($_['color']);?>; background-image:url(<?php p($_['background']); ?>);"> + <img src="<?php p($_['logo']); ?>" id="theming-preview-logo" /> + </div> <?php } ?> </div> diff --git a/apps/theming/tests/Controller/IconControllerTest.php b/apps/theming/tests/Controller/IconControllerTest.php new file mode 100644 index 00000000000..591c1075492 --- /dev/null +++ b/apps/theming/tests/Controller/IconControllerTest.php @@ -0,0 +1,201 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Theming\Tests\Controller; + + +use OC\Files\SimpleFS\SimpleFile; +use OCA\Theming\ImageManager; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataDisplayResponse; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; +use OCP\IConfig; +use OCP\IRequest; +use Test\TestCase; +use OCA\Theming\Util; +use OCA\Theming\Controller\IconController; +use OCP\AppFramework\Http\FileDisplayResponse; + + +class IconControllerTest extends TestCase { + /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ + private $request; + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + private $themingDefaults; + /** @var Util */ + private $util; + /** @var \OCP\AppFramework\Utility\ITimeFactory */ + private $timeFactory; + /** @var IconController|\PHPUnit_Framework_MockObject_MockObject */ + private $iconController; + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + private $config; + /** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */ + private $iconBuilder; + /** @var ImageManager */ + private $imageManager; + + public function setUp() { + $this->request = $this->getMockBuilder('OCP\IRequest')->getMock(); + $this->themingDefaults = $this->getMockBuilder('OCA\Theming\ThemingDefaults') + ->disableOriginalConstructor()->getMock(); + $this->util = $this->getMockBuilder('\OCA\Theming\Util')->disableOriginalConstructor() + ->setMethods(['getAppImage', 'getAppIcon', 'elementColor'])->getMock(); + $this->timeFactory = $this->getMockBuilder('OCP\AppFramework\Utility\ITimeFactory') + ->disableOriginalConstructor() + ->getMock(); + $this->config = $this->getMockBuilder('OCP\IConfig')->getMock(); + $this->iconBuilder = $this->getMockBuilder('OCA\Theming\IconBuilder') + ->disableOriginalConstructor()->getMock(); + $this->imageManager = $this->getMockBuilder('OCA\Theming\ImageManager')->disableOriginalConstructor()->getMock(); + $this->timeFactory->expects($this->any()) + ->method('getTime') + ->willReturn(123); + + $this->iconController = new IconController( + 'theming', + $this->request, + $this->themingDefaults, + $this->util, + $this->timeFactory, + $this->config, + $this->iconBuilder, + $this->imageManager + ); + + parent::setUp(); + } + + private function iconFileMock($filename, $data) { + $icon = $this->getMockBuilder('OCP\Files\File')->getMock(); + $icon->expects($this->any())->method('getContent')->willReturn($data); + $icon->expects($this->any())->method('getMimeType')->willReturn('image type'); + $icon->expects($this->any())->method('getEtag')->willReturn('my etag'); + $icon->method('getName')->willReturn($filename); + return new SimpleFile($icon); + } + + public function testGetThemedIcon() { + $file = $this->iconFileMock('icon-core-filetypes_folder.svg', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->with('icon-core-filetypes_folder.svg') + ->willReturn($file); + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']); + $expected->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $expected->addHeader('Pragma', 'cache'); + @$this->assertEquals($expected, $this->iconController->getThemedIcon('core', 'filetypes/folder.svg')); + } + + public function testGetFaviconDefault() { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + $this->themingDefaults->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + + $this->iconBuilder->expects($this->once()) + ->method('getFavicon') + ->with('core') + ->willReturn('filecontent'); + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->will($this->throwException(new NotFoundException())); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']); + $expected->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $expected->addHeader('Pragma', 'cache'); + $this->assertEquals($expected, $this->iconController->getFavicon()); + } + + public function testGetFaviconFail() { + $this->themingDefaults->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $expected = new Http\Response(); + $expected->setStatus(Http::STATUS_NOT_FOUND); + $expected->cacheFor(0); + $expected->setLastModified(new \DateTime('now', new \DateTimeZone('GMT'))); + $this->assertInstanceOf(NotFoundResponse::class, $this->iconController->getFavicon()); + } + + public function testGetTouchIconDefault() { + if (!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + $this->themingDefaults->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(true); + + $this->iconBuilder->expects($this->once()) + ->method('getTouchIcon') + ->with('core') + ->willReturn('filecontent'); + $file = $this->iconFileMock('filename', 'filecontent'); + $this->imageManager->expects($this->once()) + ->method('getCachedImage') + ->will($this->throwException(new NotFoundException())); + $this->imageManager->expects($this->once()) + ->method('setCachedImage') + ->willReturn($file); + + $expected = new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'image/png']); + $expected->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $expected->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $expected->addHeader('Pragma', 'cache'); + $this->assertEquals($expected, $this->iconController->getTouchIcon()); + } + + public function testGetTouchIconFail() { + $this->themingDefaults->expects($this->any()) + ->method('shouldReplaceIcons') + ->willReturn(false); + $this->assertInstanceOf(NotFoundResponse::class, $this->iconController->getTouchIcon()); + } + +} diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index 4325e1988b2..d42e5afb245 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -26,9 +26,12 @@ namespace OCA\Theming\Tests\Controller; use OCA\Theming\Controller\ThemingController; use OCA\Theming\Util; +use OCP\App\IAppManager; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; +use OCP\Files\File; use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; use OCP\IConfig; use OCP\IL10N; use OCP\IRequest; @@ -55,18 +58,21 @@ class ThemingControllerTest extends TestCase { private $rootFolder; /** @var ITempManager */ private $tempManager; + /** @var IAppManager */ + private $appManager; public function setUp() { $this->request = $this->getMockBuilder('OCP\IRequest')->getMock(); $this->config = $this->getMockBuilder('OCP\IConfig')->getMock(); $this->template = $this->getMockBuilder('OCA\Theming\ThemingDefaults') ->disableOriginalConstructor()->getMock(); - $this->util = new Util(); $this->timeFactory = $this->getMockBuilder('OCP\AppFramework\Utility\ITimeFactory') ->disableOriginalConstructor() ->getMock(); $this->l10n = $this->getMockBuilder('OCP\IL10N')->getMock(); $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock(); + $this->appManager = $this->getMockBuilder('OCP\App\IAppManager')->getMock(); + $this->util = new Util($this->config, $this->rootFolder, $this->appManager); $this->timeFactory->expects($this->any()) ->method('getTime') ->willReturn(123); @@ -338,26 +344,30 @@ class ThemingControllerTest extends TestCase { } public function testGetLogoNotExistent() { - $expected = new DataResponse(); + $this->rootFolder->method('get') + ->with($this->equalTo('themedinstancelogo')) + ->willThrowException(new NotFoundException()); + + $expected = new Http\NotFoundResponse(); $this->assertEquals($expected, $this->themingController->getLogo()); } public function testGetLogo() { - $dataFolder = \OC::$server->getTempManager()->getTemporaryFolder(); - $tmpLogo = $dataFolder . '/themedinstancelogo'; - touch($tmpLogo); - $this->config - ->expects($this->once()) - ->method('getSystemValue') - ->with('datadirectory', \OC::$SERVERROOT . '/data/') - ->willReturn($dataFolder); + $file = $this->createMock(File::class); + $this->rootFolder->method('get') + ->with('themedinstancelogo') + ->willReturn($file); + $file->method('fopen') + ->with('r') + ->willReturn('mypath'); + $this->config ->expects($this->once()) ->method('getAppValue') ->with('theming', 'logoMime', '') ->willReturn('text/svg'); - @$expected = new Http\StreamResponse($tmpLogo); + @$expected = new Http\StreamResponse('mypath'); $expected->cacheFor(3600); $expected->addHeader('Expires', date(\DateTime::RFC2822, 123)); $expected->addHeader('Content-Disposition', 'attachment'); @@ -368,26 +378,29 @@ class ThemingControllerTest extends TestCase { public function testGetLoginBackgroundNotExistent() { - $expected = new DataResponse(); + $this->rootFolder->method('get') + ->with('themedbackgroundlogo') + ->willThrowException(new NotFoundException()); + $expected = new Http\NotFoundResponse(); $this->assertEquals($expected, $this->themingController->getLoginBackground()); } public function testGetLoginBackground() { - $dataFolder = \OC::$server->getTempManager()->getTemporaryFolder(); - $tmpLogo = $dataFolder . '/themedbackgroundlogo'; - touch($tmpLogo); - $this->config - ->expects($this->once()) - ->method('getSystemValue') - ->with('datadirectory', \OC::$SERVERROOT . '/data/') - ->willReturn($dataFolder); + $file = $this->createMock(File::class); + $this->rootFolder->method('get') + ->with('themedbackgroundlogo') + ->willReturn($file); + $file->method('fopen') + ->with('r') + ->willReturn('mypath'); + $this->config ->expects($this->once()) ->method('getAppValue') ->with('theming', 'backgroundMime', '') ->willReturn('image/png'); - @$expected = new Http\StreamResponse($tmpLogo); + @$expected = new Http\StreamResponse('mypath'); $expected->cacheFor(3600); $expected->addHeader('Expires', date(\DateTime::RFC2822, 123)); $expected->addHeader('Content-Disposition', 'attachment'); @@ -428,7 +441,7 @@ class ThemingControllerTest extends TestCase { $expectedData .= sprintf('input[type="checkbox"].checkbox:checked:enabled:not(.checkbox--white) + label:before {' . 'background-image:url(\'%s/core/img/actions/checkmark-white.svg\');' . 'background-color: %s; background-position: center center; background-size:contain;' . - 'width:12px; height:12px; padding:0; margin:2px 6px 6px 9px; border-radius:1px;' . + 'width:12px; height:12px; padding:0; margin:2px 6px 6px 2px; border-radius:1px;' . "}\n", \OC::$WEBROOT, $color @@ -475,6 +488,12 @@ class ThemingControllerTest extends TestCase { $expectedData .= sprintf('.nc-theming-main-background {background-color: %s}' . "\n", $color); $expectedData .= sprintf('.nc-theming-main-text {color: %s}' . "\n", $color); $expectedData .= '.nc-theming-contrast {color: #ffffff}' . "\n"; + $expectedData .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n"; $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); @@ -517,7 +536,7 @@ class ThemingControllerTest extends TestCase { $expectedData .= sprintf('input[type="checkbox"].checkbox:checked:enabled:not(.checkbox--white) + label:before {' . 'background-image:url(\'%s/core/img/actions/checkmark-white.svg\');' . 'background-color: #555555; background-position: center center; background-size:contain;' . - 'width:12px; height:12px; padding:0; margin:2px 6px 6px 9px; border-radius:1px;' . + 'width:12px; height:12px; padding:0; margin:2px 6px 6px 2px; border-radius:1px;' . "}\n", \OC::$WEBROOT ); @@ -569,6 +588,12 @@ class ThemingControllerTest extends TestCase { $expectedData .= '#body-login input.login { background-image: url(\'' . \OC::$WEBROOT . '/core/img/actions/confirm.svg?v=2\'); }' . "\n"; $expectedData .= '.nc-theming-contrast {color: #000000}' . "\n"; $expectedData .= '.ui-widget-header { color: #000000; }' . "\n"; + $expectedData .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n"; $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); @@ -614,6 +639,12 @@ class ThemingControllerTest extends TestCase { 'background-size: contain;' . '}' . "\n"; $expectedData .= '.nc-theming-contrast {color: #ffffff}' . "\n"; + $expectedData .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n"; $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); @@ -691,7 +722,7 @@ class ThemingControllerTest extends TestCase { $expectedData .= sprintf('input[type="checkbox"].checkbox:checked:enabled:not(.checkbox--white) + label:before {' . 'background-image:url(\'%s/core/img/actions/checkmark-white.svg\');' . 'background-color: %s; background-position: center center; background-size:contain;' . - 'width:12px; height:12px; padding:0; margin:2px 6px 6px 9px; border-radius:1px;' . + 'width:12px; height:12px; padding:0; margin:2px 6px 6px 2px; border-radius:1px;' . "}\n", \OC::$WEBROOT, $color @@ -756,6 +787,12 @@ class ThemingControllerTest extends TestCase { 'background-image: url(\'./loginbackground?v=0\');' . '}' . "\n"; $expectedData .= '.nc-theming-contrast {color: #ffffff}' . "\n"; + $expectedData .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n"; $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); $expected->cacheFor(3600); @@ -797,7 +834,7 @@ class ThemingControllerTest extends TestCase { $expectedData .= sprintf('input[type="checkbox"].checkbox:checked:enabled:not(.checkbox--white) + label:before {' . 'background-image:url(\'%s/core/img/actions/checkmark-white.svg\');' . 'background-color: #555555; background-position: center center; background-size:contain;' . - 'width:12px; height:12px; padding:0; margin:2px 6px 6px 9px; border-radius:1px;' . + 'width:12px; height:12px; padding:0; margin:2px 6px 6px 2px; border-radius:1px;' . "}\n", \OC::$WEBROOT ); @@ -867,6 +904,13 @@ class ThemingControllerTest extends TestCase { $expectedData .= '#body-login input.login { background-image: url(\'' . \OC::$WEBROOT . '/core/img/actions/confirm.svg?v=2\'); }' . "\n"; $expectedData .= '.nc-theming-contrast {color: #000000}' . "\n"; $expectedData .= '.ui-widget-header { color: #000000; }' . "\n"; + $expectedData .= '.icon-file,.icon-filetype-text {' . + 'background-image: url(\'./img/core/filetypes/text.svg?v=0\');' . "}\n" . + '.icon-folder, .icon-filetype-folder {' . + 'background-image: url(\'./img/core/filetypes/folder.svg?v=0\');' . "}\n" . + '.icon-filetype-folder-drag-accept {' . + 'background-image: url(\'./img/core/filetypes/folder-drag-accept.svg?v=0\')!important;' . "}\n"; + $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); $expected = new Http\DataDownloadResponse($expectedData, 'style', 'text/css'); $expected->cacheFor(3600); @@ -901,6 +945,7 @@ class ThemingControllerTest extends TestCase { slogan: "", color: "#000", inverted: false, + cacheBuster: null }; })();'; $expected = new Http\DataDisplayResponse($expectedResponse); @@ -935,6 +980,7 @@ class ThemingControllerTest extends TestCase { slogan: "awesome", color: "#ffffff", inverted: true, + cacheBuster: null }; })();'; $expected = new Http\DataDisplayResponse($expectedResponse); diff --git a/apps/theming/tests/IconBuilderTest.php b/apps/theming/tests/IconBuilderTest.php new file mode 100644 index 00000000000..54850c8f3c2 --- /dev/null +++ b/apps/theming/tests/IconBuilderTest.php @@ -0,0 +1,192 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Theming\Tests; + +use OCA\Theming\IconBuilder; +use OCA\Theming\ThemingDefaults; +use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\Files\IRootFolder; +use OCP\IConfig; +use Test\TestCase; + +class IconBuilderTest extends TestCase { + + /** @var IConfig */ + protected $config; + /** @var IRootFolder */ + protected $rootFolder; + /** @var ThemingDefaults */ + protected $themingDefaults; + /** @var Util */ + protected $util; + /** @var IconBuilder */ + protected $iconBuilder; + /** @var IAppManager */ + protected $appManager; + + protected function setUp() { + parent::setUp(); + + $this->config = $this->getMockBuilder('\OCP\IConfig')->getMock(); + $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock(); + $this->themingDefaults = $this->getMockBuilder('OCA\Theming\ThemingDefaults') + ->disableOriginalConstructor()->getMock(); + $this->appManager = $this->getMockBuilder('OCP\App\IAppManager')->getMock(); + $this->util = new Util($this->config, $this->rootFolder, $this->appManager); + $this->iconBuilder = new IconBuilder($this->themingDefaults, $this->util); + } + + private function checkImagick() { + if(!extension_loaded('imagick')) { + $this->markTestSkipped('Imagemagick is required for dynamic icon generation.'); + } + $checkImagick = new \Imagick(); + if (count($checkImagick->queryFormats('SVG')) < 1) { + $this->markTestSkipped('No SVG provider present.'); + } + } + + public function dataRenderAppIcon() { + return [ + ['core', '#0082c9', 'touch-original.png'], + ['core', '#FF0000', 'touch-core-red.png'], + ['testing', '#FF0000', 'touch-testing-red.png'], + ['comments', '#0082c9', 'touch-comments.png'], + ['core', '#0082c9', 'touch-original-png.png'], + ]; + } + + /** + * @dataProvider dataRenderAppIcon + * @param $app + * @param $color + * @param $file + */ + public function testRenderAppIcon($app, $color, $file) { + $this->checkImagick(); + $this->themingDefaults->expects($this->once()) + ->method('getMailHeaderColor') + ->willReturn($color); + + $expectedIcon = new \Imagick(realpath(dirname(__FILE__)). "/data/" . $file); + $icon = $this->iconBuilder->renderAppIcon($app); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(512, $icon->getImageWidth()); + $this->assertEquals(512, $icon->getImageHeight()); + $this->assertEquals($icon, $expectedIcon); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + /** + * @dataProvider dataRenderAppIcon + * @param $app + * @param $color + * @param $file + */ + public function testGetTouchIcon($app, $color, $file) { + $this->checkImagick(); + $this->themingDefaults->expects($this->once()) + ->method('getMailHeaderColor') + ->willReturn($color); + + $expectedIcon = new \Imagick(realpath(dirname(__FILE__)). "/data/" . $file); + $icon = new \Imagick(); + $icon->readImageBlob($this->iconBuilder->getTouchIcon($app)); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(512, $icon->getImageWidth()); + $this->assertEquals(512, $icon->getImageHeight()); + $this->assertEquals($icon, $expectedIcon); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + /** + * @dataProvider dataRenderAppIcon + * @param $app + * @param $color + * @param $file + */ + public function testGetFavicon($app, $color, $file) { + $this->checkImagick(); + $this->themingDefaults->expects($this->once()) + ->method('getMailHeaderColor') + ->willReturn($color); + + $expectedIcon = new \Imagick(realpath(dirname(__FILE__)). "/data/" . $file); + $icon = new \Imagick(); + $icon->readImageBlob($this->iconBuilder->getFavicon($app)); + + $this->assertEquals(true, $icon->valid()); + $this->assertEquals(32, $icon->getImageWidth()); + $this->assertEquals(32, $icon->getImageHeight()); + $icon->destroy(); + $expectedIcon->destroy(); + // FIXME: We may need some comparison of the generated and the test images + // cloud be something like $expectedIcon->compareImages($icon, Imagick::METRIC_MEANABSOLUTEERROR)[1]) + } + + /** + * @expectedException \PHPUnit_Framework_Error_Warning + */ + public function testGetFaviconNotFound() { + $util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock(); + $iconBuilder = new IconBuilder($this->themingDefaults, $util); + $util->expects($this->once()) + ->method('getAppIcon') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->getFavicon('noapp')); + } + + /** + * @expectedException \PHPUnit_Framework_Error_Warning + */ + public function testGetTouchIconNotFound() { + $util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock(); + $iconBuilder = new IconBuilder($this->themingDefaults, $util); + $util->expects($this->once()) + ->method('getAppIcon') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->getTouchIcon('noapp')); + } + + /** + * @expectedException \PHPUnit_Framework_Error_Warning + */ + public function testColorSvgNotFound() { + $util = $this->getMockBuilder(Util::class)->disableOriginalConstructor()->getMock(); + $iconBuilder = new IconBuilder($this->themingDefaults, $util); + $util->expects($this->once()) + ->method('getAppImage') + ->willReturn('notexistingfile'); + $this->assertFalse($iconBuilder->colorSvg('noapp','noimage')); + } +} diff --git a/apps/theming/tests/ImageManagerTest.php b/apps/theming/tests/ImageManagerTest.php new file mode 100644 index 00000000000..4df49633d80 --- /dev/null +++ b/apps/theming/tests/ImageManagerTest.php @@ -0,0 +1,183 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Theming\Tests; + +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\IConfig; +use Test\TestCase; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; + +class ImageManager extends TestCase { + + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + protected $config; + /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */ + protected $appData; + /** @var ImageManager */ + protected $imageManager; + + protected function setUp() { + parent::setUp(); + $this->config = $this->getMockBuilder('\OCP\IConfig')->getMock(); + $this->appData = $this->getMockBuilder('OCP\Files\IAppData')->getMock(); + $this->imageManager = new \OCA\Theming\ImageManager( + $this->config, + $this->appData + ); + } + + public function testGetCacheFolder() { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->appData->expects($this->at(0)) + ->method('getFolder') + ->with('0') + ->willReturn($folder); + $this->assertEquals($folder, $this->imageManager->getCacheFolder()); + } + public function testGetCacheFolderCreate() { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->exactly(2)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->appData->expects($this->at(0)) + ->method('getFolder') + ->willThrowException(new NotFoundException()); + $this->appData->expects($this->at(1)) + ->method('newFolder') + ->with('0') + ->willReturn($folder); + $this->appData->expects($this->at(2)) + ->method('getFolder') + ->with('0') + ->willReturn($folder); + $this->appData->expects($this->once()) + ->method('getDirectoryListing') + ->willReturn([]); + $this->assertEquals($folder, $this->imageManager->getCacheFolder()); + } + + public function testGetCachedImage() { + $folder = $this->setupCacheFolder(); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->willReturn('filecontent'); + $expected = 'filecontent'; + $this->assertEquals($expected, $this->imageManager->getCachedImage('filename')); + } + + /** + * @expectedException \OCP\Files\NotFoundException + */ + public function testGetCachedImageNotFound() { + $folder = $this->setupCacheFolder(); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->will($this->throwException(new \OCP\Files\NotFoundException())); + $image = $this->imageManager->getCachedImage('filename'); + } + + public function testSetCachedImage() { + $folder = $this->setupCacheFolder(); + $file = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('fileExists') + ->with('filename') + ->willReturn(true); + $folder->expects($this->once()) + ->method('getFile') + ->with('filename') + ->willReturn($file); + $file->expects($this->once()) + ->method('putContent') + ->with('filecontent'); + $this->assertEquals($file, $this->imageManager->setCachedImage('filename', 'filecontent')); + } + + public function testSetCachedImageCreate() { + $folder = $this->setupCacheFolder(); + $file = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('fileExists') + ->with('filename') + ->willReturn(false); + $folder->expects($this->once()) + ->method('newFile') + ->with('filename') + ->willReturn($file); + $file->expects($this->once()) + ->method('putContent') + ->with('filecontent'); + $this->assertEquals($file, $this->imageManager->setCachedImage('filename', 'filecontent')); + } + + private function setupCacheFolder() { + $folder = $this->createMock(ISimpleFolder::class); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); + $this->appData->expects($this->at(0)) + ->method('getFolder') + ->with('0') + ->willReturn($folder); + return $folder; + } + + public function testCleanup() { + $folders = [ + $this->createMock(ISimpleFolder::class), + $this->createMock(ISimpleFolder::class), + $this->createMock(ISimpleFolder::class) + ]; + foreach ($folders as $index=>$folder) { + $folder->expects($this->any()) + ->method('getName') + ->willReturn($index); + } + $folders[0]->expects($this->once())->method('delete'); + $folders[1]->expects($this->once())->method('delete'); + $folders[2]->expects($this->never())->method('delete'); + $this->config->expects($this->once()) + ->method('getAppValue') + ->with('theming','cachebuster','0') + ->willReturn('2'); + $this->appData->expects($this->once()) + ->method('getDirectoryListing') + ->willReturn($folders); + $this->appData->expects($this->once()) + ->method('getFolder') + ->with('2') + ->willReturn($folders[2]); + $this->imageManager->cleanup(); + } + +} diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 204c96d86d5..cd3a90e760a 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -24,6 +24,7 @@ namespace OCA\Theming\Tests; use OCA\Theming\ThemingDefaults; +use OCP\ICacheFactory; use OCP\IConfig; use OCP\IL10N; use OCP\IURLGenerator; @@ -43,6 +44,8 @@ class ThemingDefaultsTest extends TestCase { private $template; /** @var IRootFolder */ private $rootFolder; + /** @var ICacheFactory */ + private $cacheFactory; public function setUp() { parent::setUp(); @@ -52,6 +55,7 @@ class ThemingDefaultsTest extends TestCase { $this->rootFolder = $this->getMockBuilder(IRootFolder::class) ->disableOriginalConstructor() ->getMock(); + $this->cacheFactory = $this->getMockBuilder(ICacheFactory::class)->getMock(); $this->defaults = $this->getMockBuilder(\OC_Defaults::class) ->disableOriginalConstructor() ->getMock(); @@ -76,7 +80,8 @@ class ThemingDefaultsTest extends TestCase { $this->l10n, $this->urlGenerator, $this->defaults, - $this->rootFolder + $this->rootFolder, + $this->cacheFactory ); } diff --git a/apps/theming/tests/UtilTest.php b/apps/theming/tests/UtilTest.php index c7fc385d25d..83895208fea 100644 --- a/apps/theming/tests/UtilTest.php +++ b/apps/theming/tests/UtilTest.php @@ -23,16 +23,28 @@ namespace OCA\Theming\Tests; use OCA\Theming\Util; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\Files\IRootFolder; use Test\TestCase; class UtilTest extends TestCase { /** @var Util */ protected $util; + /** @var IConfig */ + protected $config; + /** @var IRootFolder */ + protected $rootFolder; + /** @var IAppManager */ + protected $appManager; protected function setUp() { parent::setUp(); - $this->util = new Util(); + $this->config = $this->getMockBuilder('\OCP\IConfig')->getMock(); + $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock(); + $this->appManager = $this->getMockBuilder('OCP\App\IAppManager')->getMock(); + $this->util = new Util($this->config, $this->rootFolder, $this->appManager); } public function testInvertTextColorLight() { @@ -89,9 +101,70 @@ class UtilTest extends TestCase { $expected = 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+PHBhdGggZD0iTTggMWE3IDcgMCAwIDAtNyA3IDcgNyAwIDAgMCA3IDcgNyA3IDAgMCAwIDctNyA3IDcgMCAwIDAtNy03em0wIDFhNiA2IDAgMCAxIDYgNiA2IDYgMCAwIDEtNiA2IDYgNiAwIDAgMS02LTYgNiA2IDAgMCAxIDYtNnptMCAyYTQgNCAwIDEgMCAwIDggNCA0IDAgMCAwIDAtOHoiIGZpbGw9IiNmZmZmZmYiLz48L3N2Zz4='; $this->assertEquals($expected, $button); } + public function testGenerateRadioButtonBlack() { $button = $this->util->generateRadioButton('#000000'); $expected = 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+PHBhdGggZD0iTTggMWE3IDcgMCAwIDAtNyA3IDcgNyAwIDAgMCA3IDcgNyA3IDAgMCAwIDctNyA3IDcgMCAwIDAtNy03em0wIDFhNiA2IDAgMCAxIDYgNiA2IDYgMCAwIDEtNiA2IDYgNiAwIDAgMS02LTYgNiA2IDAgMCAxIDYtNnptMCAyYTQgNCAwIDEgMCAwIDggNCA0IDAgMCAwIDAtOHoiIGZpbGw9IiMwMDAwMDAiLz48L3N2Zz4='; $this->assertEquals($expected, $button); } + + /** + * @dataProvider dataGetAppIcon + */ + public function testGetAppIcon($app, $expected) { + $this->appManager->expects($this->once()) + ->method('getAppPath') + ->with($app) + ->willReturn(\OC_App::getAppPath($app)); + $icon = $this->util->getAppIcon($app); + $this->assertEquals($expected, $icon); + } + + public function dataGetAppIcon() { + return [ + ['user_ldap', \OC_App::getAppPath('user_ldap') . '/img/app.svg'], + ['noapplikethis', \OC::$SERVERROOT . '/core/img/logo.svg'], + ['comments', \OC_App::getAppPath('comments') . '/img/comments.svg'], + ]; + } + + public function testGetAppIconThemed() { + $this->rootFolder->expects($this->once()) + ->method('nodeExists') + ->with('/themedinstancelogo') + ->willReturn(true); + $expected = '/themedinstancelogo'; + $icon = $this->util->getAppIcon('noapplikethis'); + $this->assertEquals($expected, $icon); + } + + /** + * @dataProvider dataGetAppImage + */ + public function testGetAppImage($app, $image, $expected) { + if($app !== 'core') { + $this->appManager->expects($this->once()) + ->method('getAppPath') + ->with($app) + ->willReturn(\OC_App::getAppPath($app)); + } + $this->assertEquals($expected, $this->util->getAppImage($app, $image)); + } + + public function dataGetAppImage() { + return [ + ['core', 'logo.svg', \OC::$SERVERROOT . '/core/img/logo.svg'], + ['files', 'external', \OC::$SERVERROOT . '/apps/files/img/external.svg'], + ['files', 'external.svg', \OC::$SERVERROOT . '/apps/files/img/external.svg'], + ['noapplikethis', 'foobar.svg', false], + ]; + } + + public function testColorizeSvg() { + $input = "#0082c9 #0082C9 #000000 #FFFFFF"; + $expected = "#AAAAAA #AAAAAA #000000 #FFFFFF"; + $result = $this->util->colorizeSvg($input, '#AAAAAA'); + $this->assertEquals($expected, $result); + } + } diff --git a/apps/theming/tests/data/favicon-original.ico b/apps/theming/tests/data/favicon-original.ico Binary files differnew file mode 100644 index 00000000000..fab2f7f0231 --- /dev/null +++ b/apps/theming/tests/data/favicon-original.ico diff --git a/apps/theming/tests/data/touch-comments.png b/apps/theming/tests/data/touch-comments.png Binary files differnew file mode 100644 index 00000000000..af0d2ca579b --- /dev/null +++ b/apps/theming/tests/data/touch-comments.png diff --git a/apps/theming/tests/data/touch-core-red.png b/apps/theming/tests/data/touch-core-red.png Binary files differnew file mode 100644 index 00000000000..7a492f10e21 --- /dev/null +++ b/apps/theming/tests/data/touch-core-red.png diff --git a/apps/theming/tests/data/touch-original-png.png b/apps/theming/tests/data/touch-original-png.png Binary files differnew file mode 100644 index 00000000000..6997dfc6b88 --- /dev/null +++ b/apps/theming/tests/data/touch-original-png.png diff --git a/apps/theming/tests/data/touch-original.png b/apps/theming/tests/data/touch-original.png Binary files differnew file mode 100644 index 00000000000..ac39872aa6e --- /dev/null +++ b/apps/theming/tests/data/touch-original.png diff --git a/apps/theming/tests/data/touch-testing-red.png b/apps/theming/tests/data/touch-testing-red.png Binary files differnew file mode 100644 index 00000000000..4cbdfbbb42c --- /dev/null +++ b/apps/theming/tests/data/touch-testing-red.png diff --git a/apps/twofactor_backupcodes/appinfo/info.xml b/apps/twofactor_backupcodes/appinfo/info.xml index 7b9ef2d90e4..d5dd3f4db9e 100644 --- a/apps/twofactor_backupcodes/appinfo/info.xml +++ b/apps/twofactor_backupcodes/appinfo/info.xml @@ -14,6 +14,6 @@ </two-factor-providers> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> </info> diff --git a/apps/twofactor_backupcodes/js/settingsview.js b/apps/twofactor_backupcodes/js/settingsview.js index 224f5f4797f..76396023120 100644 --- a/apps/twofactor_backupcodes/js/settingsview.js +++ b/apps/twofactor_backupcodes/js/settingsview.js @@ -89,6 +89,11 @@ }.bind(this)); }, _onGenerateBackupCodes: function () { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this._onGenerateBackupCodes, this)); + return; + } + // Hide old codes this._enabled = false; this.render(); diff --git a/apps/twofactor_backupcodes/l10n/ja.js b/apps/twofactor_backupcodes/l10n/ja.js new file mode 100644 index 00000000000..b9fb61e74bf --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/ja.js @@ -0,0 +1,17 @@ +OC.L10N.register( + "twofactor_backupcodes", + { + "Generate backup codes" : "バックアップコードを生成する", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "バックアップコードが生成されました。 {{total}} 中の {{used}} コードが使用されています。", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "これらはあなたのバックアップコードです。 後からこのコードは見ることはできないので、保存するか印刷しておいてください", + "Save backup codes" : "バックアップコードを保存", + "Print backup codes" : "バックアップコードを印刷", + "Regenerate backup codes" : "バックアップコードを再生成", + "If you regenerate backup codes, you automatically invalidate old codes." : "バックアップコードを再生成すると、自動的に古いコードが無効になります。", + "An error occurred while generating your backup codes" : "バックアップコードの生成中にエラーが発生しました", + "Nextcloud backup codes" : "Nextcloud バックアップコード", + "Backup code" : "バックアップコード", + "Use backup code" : "バックアップコードを使用する", + "Second-factor backup codes" : "第2因子バックアップコード" +}, +"nplurals=1; plural=0;"); diff --git a/apps/twofactor_backupcodes/l10n/ja.json b/apps/twofactor_backupcodes/l10n/ja.json new file mode 100644 index 00000000000..1d01299981f --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/ja.json @@ -0,0 +1,15 @@ +{ "translations": { + "Generate backup codes" : "バックアップコードを生成する", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "バックアップコードが生成されました。 {{total}} 中の {{used}} コードが使用されています。", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "これらはあなたのバックアップコードです。 後からこのコードは見ることはできないので、保存するか印刷しておいてください", + "Save backup codes" : "バックアップコードを保存", + "Print backup codes" : "バックアップコードを印刷", + "Regenerate backup codes" : "バックアップコードを再生成", + "If you regenerate backup codes, you automatically invalidate old codes." : "バックアップコードを再生成すると、自動的に古いコードが無効になります。", + "An error occurred while generating your backup codes" : "バックアップコードの生成中にエラーが発生しました", + "Nextcloud backup codes" : "Nextcloud バックアップコード", + "Backup code" : "バックアップコード", + "Use backup code" : "バックアップコードを使用する", + "Second-factor backup codes" : "第2因子バックアップコード" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/lib/Controller/SettingsController.php b/apps/twofactor_backupcodes/lib/Controller/SettingsController.php index fed7634643d..9b0b0fc57ba 100644 --- a/apps/twofactor_backupcodes/lib/Controller/SettingsController.php +++ b/apps/twofactor_backupcodes/lib/Controller/SettingsController.php @@ -59,15 +59,17 @@ class SettingsController extends Controller { /** * @NoAdminRequired + * @PasswordConfirmationRequired + * * @return JSONResponse */ public function createCodes() { $user = $this->userSession->getUser(); $codes = $this->storage->createCodes($user); - return [ - 'codes' => $codes, - 'state' => $this->storage->getBackupCodesState($user), - ]; + return new JSONResponse([ + 'codes' => $codes, + 'state' => $this->storage->getBackupCodesState($user), + ]); } } diff --git a/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php b/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php index c7ac33467b3..8427c10e839 100644 --- a/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php +++ b/apps/twofactor_backupcodes/tests/Unit/Controller/SettingsControllerTest.php @@ -24,6 +24,7 @@ namespace OCA\TwoFactorBackupCodes\Tests\Unit\Controller; use OCA\TwoFactorBackupCodes\Controller\SettingsController; use OCA\TwoFactorBackupCodes\Service\BackupCodeStorage; +use OCP\AppFramework\Http\JSONResponse; use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; @@ -89,7 +90,9 @@ class SettingsControllerTest extends TestCase { 'codes' => $codes, 'state' => 'state', ]; - $this->assertEquals($expected, $this->controller->createCodes()); + $response = $this->controller->createCodes(); + $this->assertInstanceOf(JSONResponse::class, $response); + $this->assertEquals($expected, $response->getData()); } } diff --git a/apps/updatenotification/appinfo/info.xml b/apps/updatenotification/appinfo/info.xml index 2fe400a3587..4cd84ac827b 100644 --- a/apps/updatenotification/appinfo/info.xml +++ b/apps/updatenotification/appinfo/info.xml @@ -9,7 +9,7 @@ <namespace>UpdateNotification</namespace> <default_enable/> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <background-jobs> diff --git a/apps/updatenotification/js/admin.js b/apps/updatenotification/js/admin.js index 813ec48c87a..589765348af 100644 --- a/apps/updatenotification/js/admin.js +++ b/apps/updatenotification/js/admin.js @@ -72,4 +72,6 @@ $(document).ready(function(){ groups = JSON.stringify(groups); OCP.AppConfig.setValue('updatenotification', 'notify_groups', groups); }); + + $('#oca_updatenotification_section .icon-info').tooltip({placement: 'right'}); }); diff --git a/apps/updatenotification/l10n/ru.js b/apps/updatenotification/l10n/ru.js index efae143234f..3d9cfe465e7 100644 --- a/apps/updatenotification/l10n/ru.js +++ b/apps/updatenotification/l10n/ru.js @@ -9,7 +9,7 @@ OC.L10N.register( "Update for %1$s to version %2$s is available." : "Доступно обновление для %1$s до версии %2$s.", "A new version is available: %s" : "Доступна новая версия: %s", "Open updater" : "Открыть окно обновления", - "Download now" : "Загрузить сейчас", + "Download now" : "Скачать сейчас", "Your version is up to date." : "Версия не требует обновления.", "Checked on %s" : "Проверено %s", "Update channel:" : "Канал обновлений:", diff --git a/apps/updatenotification/l10n/ru.json b/apps/updatenotification/l10n/ru.json index 0d51af107e0..1568dfa1e35 100644 --- a/apps/updatenotification/l10n/ru.json +++ b/apps/updatenotification/l10n/ru.json @@ -7,7 +7,7 @@ "Update for %1$s to version %2$s is available." : "Доступно обновление для %1$s до версии %2$s.", "A new version is available: %s" : "Доступна новая версия: %s", "Open updater" : "Открыть окно обновления", - "Download now" : "Загрузить сейчас", + "Download now" : "Скачать сейчас", "Your version is up to date." : "Версия не требует обновления.", "Checked on %s" : "Проверено %s", "Update channel:" : "Канал обновлений:", diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml index b16824925c0..87eb61a0fba 100644 --- a/apps/user_ldap/appinfo/info.xml +++ b/apps/user_ldap/appinfo/info.xml @@ -18,7 +18,7 @@ A user logs into ownCloud with their LDAP or AD credentials, and is granted acce </documentation> <dependencies> <lib>ldap</lib> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <namespace>User_LDAP</namespace> diff --git a/apps/workflowengine/appinfo/info.xml b/apps/workflowengine/appinfo/info.xml index aae234cc717..83f4be9e398 100644 --- a/apps/workflowengine/appinfo/info.xml +++ b/apps/workflowengine/appinfo/info.xml @@ -18,7 +18,7 @@ </types> <dependencies> - <owncloud min-version="9.2" max-version="9.2" /> + <nextcloud min-version="11" max-version="11" /> </dependencies> <settings> diff --git a/apps/workflowengine/js/admin.js b/apps/workflowengine/js/admin.js index 0357d741ab1..7f9a709ec14 100644 --- a/apps/workflowengine/js/admin.js +++ b/apps/workflowengine/js/admin.js @@ -163,6 +163,11 @@ } }, delete: function() { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.delete, this)); + return; + } + this.model.destroy(); this.remove(); }, @@ -173,6 +178,11 @@ this.render(); }, save: function() { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.save, this)); + return; + } + var success = function(model, response, options) { this.saving = false; this.originalModel = JSON.parse(JSON.stringify(this.model)); diff --git a/apps/workflowengine/l10n/fr.js b/apps/workflowengine/l10n/fr.js new file mode 100644 index 00000000000..8c9a7f2eed0 --- /dev/null +++ b/apps/workflowengine/l10n/fr.js @@ -0,0 +1,60 @@ +OC.L10N.register( + "workflowengine", + { + "Successfully saved" : "Enregistré avec succès", + "Saving failed:" : "L'enregistrement a échoué:", + "File mime type" : "Type MIME du fichier", + "is" : "est", + "is not" : "n'est pas", + "matches" : "correspond", + "does not match" : "ne correspond pas", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Taille du fichier ( à télécharger )", + "less" : "moins", + "less or equals" : "inférieur ou égal", + "greater or equals" : "supérieur ou égal", + "greater" : "plus grand que", + "File system tag" : "Étiquette collaborative du fichier", + "is tagged with" : "est étiqueté avec", + "is not tagged with" : "n'est pas étiqueté avec", + "Select tag…" : "Sélectionner une étiquette...", + "Request remote address" : "Demander une adresse distante", + "Request time" : "Temps de requête", + "between" : "entre", + "not between" : "en dehors de", + "Start" : "Commencer", + "End" : "Fin", + "Select timezone…" : "Sélectionner le fuseau horaire...", + "Request URL" : "Demande d'URL", + "Predefined URLs" : "URL prédéfinis", + "Files WebDAV" : "Fichiers WebDAV", + "Request user agent" : "Agent utilisateur requis", + "Sync clients" : "Clients de synchronisation", + "Android client" : "Client Android", + "iOS client" : "Client iOS", + "Desktop client" : "Client de bureau", + "is member of" : "est membre de", + "is not member of" : "n'est pas membre de", + "The given operator is invalid" : "L'opérateur donné est invalide", + "The given regular expression is invalid" : "L'expression régulière donnée est invalide", + "The given file size is invalid" : "La taille du fichier donné est invalide", + "The given tag id is invalid" : "L’identifiant de l'étiquette donné est invalide", + "The given IP range is invalid" : "La plage d'adresse IP donnée est invalide", + "The given IP range is not valid for IPv4" : "La plage d'adresse IP donnée n'est pas valide pour l'IPv4", + "The given IP range is not valid for IPv6" : "La plage d'adresse IP donnée n'est pas valide pour l'IPv6", + "The given start time is invalid" : "La date de début est invalide", + "The given end time is invalid" : "La date de fin est invalide", + "The given group does not exist" : "Le groupe donné n'existe pas", + "Check %s is invalid or does not exist" : "Vérifiez si %s est invalide ou n'existe pas", + "Operation #%s does not exist" : "L'opération #%s n'existe pas", + "Operation %s does not exist" : "L'opération %s n'existe pas", + "Operation %s is invalid" : "L'opération %s est invalide", + "Open documentation" : "Voir la documentation", + "Add rule group" : "Ajouter une règle de groupe", + "Add rule" : "Ajouter règle", + "Reset" : "Réinitialiser", + "Save" : "Enregistrer", + "Saving…" : "Enregistrement...", + "Loading…" : "Chargement..." +}, +"nplurals=2; plural=(n > 1);"); diff --git a/apps/workflowengine/l10n/fr.json b/apps/workflowengine/l10n/fr.json new file mode 100644 index 00000000000..099be959b7a --- /dev/null +++ b/apps/workflowengine/l10n/fr.json @@ -0,0 +1,58 @@ +{ "translations": { + "Successfully saved" : "Enregistré avec succès", + "Saving failed:" : "L'enregistrement a échoué:", + "File mime type" : "Type MIME du fichier", + "is" : "est", + "is not" : "n'est pas", + "matches" : "correspond", + "does not match" : "ne correspond pas", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Taille du fichier ( à télécharger )", + "less" : "moins", + "less or equals" : "inférieur ou égal", + "greater or equals" : "supérieur ou égal", + "greater" : "plus grand que", + "File system tag" : "Étiquette collaborative du fichier", + "is tagged with" : "est étiqueté avec", + "is not tagged with" : "n'est pas étiqueté avec", + "Select tag…" : "Sélectionner une étiquette...", + "Request remote address" : "Demander une adresse distante", + "Request time" : "Temps de requête", + "between" : "entre", + "not between" : "en dehors de", + "Start" : "Commencer", + "End" : "Fin", + "Select timezone…" : "Sélectionner le fuseau horaire...", + "Request URL" : "Demande d'URL", + "Predefined URLs" : "URL prédéfinis", + "Files WebDAV" : "Fichiers WebDAV", + "Request user agent" : "Agent utilisateur requis", + "Sync clients" : "Clients de synchronisation", + "Android client" : "Client Android", + "iOS client" : "Client iOS", + "Desktop client" : "Client de bureau", + "is member of" : "est membre de", + "is not member of" : "n'est pas membre de", + "The given operator is invalid" : "L'opérateur donné est invalide", + "The given regular expression is invalid" : "L'expression régulière donnée est invalide", + "The given file size is invalid" : "La taille du fichier donné est invalide", + "The given tag id is invalid" : "L’identifiant de l'étiquette donné est invalide", + "The given IP range is invalid" : "La plage d'adresse IP donnée est invalide", + "The given IP range is not valid for IPv4" : "La plage d'adresse IP donnée n'est pas valide pour l'IPv4", + "The given IP range is not valid for IPv6" : "La plage d'adresse IP donnée n'est pas valide pour l'IPv6", + "The given start time is invalid" : "La date de début est invalide", + "The given end time is invalid" : "La date de fin est invalide", + "The given group does not exist" : "Le groupe donné n'existe pas", + "Check %s is invalid or does not exist" : "Vérifiez si %s est invalide ou n'existe pas", + "Operation #%s does not exist" : "L'opération #%s n'existe pas", + "Operation %s does not exist" : "L'opération %s n'existe pas", + "Operation %s is invalid" : "L'opération %s est invalide", + "Open documentation" : "Voir la documentation", + "Add rule group" : "Ajouter une règle de groupe", + "Add rule" : "Ajouter règle", + "Reset" : "Réinitialiser", + "Save" : "Enregistrer", + "Saving…" : "Enregistrement...", + "Loading…" : "Chargement..." +},"pluralForm" :"nplurals=2; plural=(n > 1);" +}
\ No newline at end of file diff --git a/apps/workflowengine/l10n/ja.js b/apps/workflowengine/l10n/ja.js new file mode 100644 index 00000000000..bcdc41f0691 --- /dev/null +++ b/apps/workflowengine/l10n/ja.js @@ -0,0 +1,63 @@ +OC.L10N.register( + "workflowengine", + { + "Successfully saved" : "保存しました", + "Saving failed:" : "保存に失敗しました:", + "matches" : "合致", + "does not match" : "合致しない", + "File size (upload)" : "ファイルサイズ(アップロード)", + "less or equals" : "より小さいか等しい", + "greater or equals" : "大きいか等しい", + "greater" : "大きい", + "File system tag" : "ファイルシステムタグ", + "is tagged with" : "に次のタグが付いている", + "is not tagged with" : "に次のタグが付いていない", + "Select tag…" : "タグを選択...", + "matches IPv4" : "次の IPv4アドレスに合致", + "does not match IPv4" : "次の IPv4アドレスに合致しない", + "matches IPv6" : "次の IPv6アドレスに合致", + "does not match IPv6" : "次の IPv6アドレスに合致しない", + "Request time" : "ルール適用の時刻", + "Start" : "開始", + "End" : "終了", + "Select timezone…" : "タイムゾーンを選択...", + "Request URL" : "呼びだしたURL", + "Predefined URLs" : "定義済みのURL", + "Files WebDAV" : "ファイルWebDAV", + "Request user agent" : "リクエスト時のユーザーエージェント", + "Sync clients" : "同期クライアントタイプ", + "Android client" : "アンドロイドクライアント", + "iOS client" : "iOSクライアント", + "Desktop client" : "デスクトップクライアント", + "User group membership" : "ユーザーがグループのメンバーかどうか", + "is member of" : "が次のグループのメンバーである", + "is not member of" : "が次のグループのメンバーではない", + "The given operator is invalid" : "指定された演算子は無効", + "The given regular expression is invalid" : "指定の正規表現は無効", + "The given file size is invalid" : "指定されたファイルサイズは無効", + "The given tag id is invalid" : "指定されたIDタグは無効", + "The given IP range is invalid" : "指定されたIP範囲は無効", + "The given IP range is not valid for IPv4" : "指定されたIPはIPv4の範囲ではありません", + "The given IP range is not valid for IPv6" : "指定されたIPはIPv6の範囲ではありません", + "The given time span is invalid" : "指定された期間は無効です", + "The given start time is invalid" : "指定された開始時刻は無効です", + "The given end time is invalid" : "指定された終了時刻は無効です", + "The given group does not exist" : "指定されたグループは存在しません", + "Check %s is invalid or does not exist" : "%sのチェックは無効か存在しません", + "Operation #%s does not exist" : "#%s 操作は存在しません", + "Operation %s does not exist" : "%s 操作は存在しません", + "Operation %s is invalid" : "%s 操作は無効です", + "Check %s does not exist" : "チェック %s は存在しません", + "Check %s is invalid" : "チェック %s は無効です", + "Check #%s does not exist" : "チェック #%s は存在しません", + "Workflow" : "ワークフロー", + "Open documentation" : "ドキュメントを開く", + "Add rule group" : "ルールグループを追加する", + "Short rule description" : "ルールの簡潔な説明", + "Add rule" : "ルールを追加", + "Reset" : "リセット", + "Save" : "保存", + "Saving…" : "保存中...", + "Loading…" : "読み込み中..." +}, +"nplurals=1; plural=0;"); diff --git a/apps/workflowengine/l10n/ja.json b/apps/workflowengine/l10n/ja.json new file mode 100644 index 00000000000..670baa856ec --- /dev/null +++ b/apps/workflowengine/l10n/ja.json @@ -0,0 +1,61 @@ +{ "translations": { + "Successfully saved" : "保存しました", + "Saving failed:" : "保存に失敗しました:", + "matches" : "合致", + "does not match" : "合致しない", + "File size (upload)" : "ファイルサイズ(アップロード)", + "less or equals" : "より小さいか等しい", + "greater or equals" : "大きいか等しい", + "greater" : "大きい", + "File system tag" : "ファイルシステムタグ", + "is tagged with" : "に次のタグが付いている", + "is not tagged with" : "に次のタグが付いていない", + "Select tag…" : "タグを選択...", + "matches IPv4" : "次の IPv4アドレスに合致", + "does not match IPv4" : "次の IPv4アドレスに合致しない", + "matches IPv6" : "次の IPv6アドレスに合致", + "does not match IPv6" : "次の IPv6アドレスに合致しない", + "Request time" : "ルール適用の時刻", + "Start" : "開始", + "End" : "終了", + "Select timezone…" : "タイムゾーンを選択...", + "Request URL" : "呼びだしたURL", + "Predefined URLs" : "定義済みのURL", + "Files WebDAV" : "ファイルWebDAV", + "Request user agent" : "リクエスト時のユーザーエージェント", + "Sync clients" : "同期クライアントタイプ", + "Android client" : "アンドロイドクライアント", + "iOS client" : "iOSクライアント", + "Desktop client" : "デスクトップクライアント", + "User group membership" : "ユーザーがグループのメンバーかどうか", + "is member of" : "が次のグループのメンバーである", + "is not member of" : "が次のグループのメンバーではない", + "The given operator is invalid" : "指定された演算子は無効", + "The given regular expression is invalid" : "指定の正規表現は無効", + "The given file size is invalid" : "指定されたファイルサイズは無効", + "The given tag id is invalid" : "指定されたIDタグは無効", + "The given IP range is invalid" : "指定されたIP範囲は無効", + "The given IP range is not valid for IPv4" : "指定されたIPはIPv4の範囲ではありません", + "The given IP range is not valid for IPv6" : "指定されたIPはIPv6の範囲ではありません", + "The given time span is invalid" : "指定された期間は無効です", + "The given start time is invalid" : "指定された開始時刻は無効です", + "The given end time is invalid" : "指定された終了時刻は無効です", + "The given group does not exist" : "指定されたグループは存在しません", + "Check %s is invalid or does not exist" : "%sのチェックは無効か存在しません", + "Operation #%s does not exist" : "#%s 操作は存在しません", + "Operation %s does not exist" : "%s 操作は存在しません", + "Operation %s is invalid" : "%s 操作は無効です", + "Check %s does not exist" : "チェック %s は存在しません", + "Check %s is invalid" : "チェック %s は無効です", + "Check #%s does not exist" : "チェック #%s は存在しません", + "Workflow" : "ワークフロー", + "Open documentation" : "ドキュメントを開く", + "Add rule group" : "ルールグループを追加する", + "Short rule description" : "ルールの簡潔な説明", + "Add rule" : "ルールを追加", + "Reset" : "リセット", + "Save" : "保存", + "Saving…" : "保存中...", + "Loading…" : "読み込み中..." +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/workflowengine/l10n/zh_TW.js b/apps/workflowengine/l10n/zh_TW.js new file mode 100644 index 00000000000..dc258533eb2 --- /dev/null +++ b/apps/workflowengine/l10n/zh_TW.js @@ -0,0 +1,67 @@ +OC.L10N.register( + "workflowengine", + { + "Successfully saved" : "成功保存", + "Saving failed:" : "保存失敗:", + "File mime type" : "檔案mime類型", + "is" : "是", + "is not" : "不是", + "matches" : "匹配", + "does not match" : "不能匹配", + "Example: {placeholder}" : "例子:{placeholder}", + "File size (upload)" : "檔案大小(上傳)", + "less" : "更少", + "less or equals" : "小於或等於", + "greater or equals" : "大於或等於", + "greater" : "更大", + "File system tag" : "檔案系統標籤", + "is tagged with" : "標記為", + "is not tagged with" : "没有標記為", + "Select tag…" : "選擇標籤", + "Request remote address" : "請求遠端地址", + "matches IPv4" : "匹配 IPv4", + "does not match IPv4" : "不能匹配 IPv4", + "matches IPv6" : "匹配 IPv6", + "does not match IPv6" : "不能匹配 IPv6", + "Request time" : "請求時間", + "between" : "之間", + "Start" : "開始", + "End" : "結束", + "Select timezone…" : "選擇時區...", + "Request URL" : "請求網址", + "Predefined URLs" : "預定義網址", + "Files WebDAV" : "檔案 WebDAV", + "Request user agent" : "請求用戶代理", + "Sync clients" : "同步客戶端", + "Android client" : "Android 客戶端", + "iOS client" : "iOS 客戶端", + "Desktop client" : "桌面客戶端", + "The given operator is invalid" : "指定的操作無效", + "The given regular expression is invalid" : "指定的規則表達式無效", + "The given file size is invalid" : "指定的檔案大小無效", + "The given tag id is invalid" : "指定的標籤 Id無效", + "The given IP range is invalid" : "指定的IP 範圍無效", + "The given IP range is not valid for IPv4" : "指定的IP範圍不是有效的IPv4", + "The given IP range is not valid for IPv6" : "指定的IP範圍不是有效的IPv6", + "The given time span is invalid" : "指定的時間範圍無效", + "The given start time is invalid" : "指定的開始時間無效", + "The given end time is invalid" : "指定的結束時間無效", + "The given group does not exist" : "指定的群組不存在", + "Check %s is invalid or does not exist" : "檢查 %s 無效或不存在", + "Operation #%s does not exist" : "操作 #%s 不存在", + "Operation %s does not exist" : "操作 %s 不存在", + "Operation %s is invalid" : "操作 #%s 無效", + "Check %s does not exist" : "檢查 %s 不存在", + "Check %s is invalid" : "檢查 %s 無效", + "Check #%s does not exist" : "檢查 #%s 不存在", + "Workflow" : "工作流程", + "Open documentation" : "開啟說明文件", + "Add rule group" : "新增群組規則", + "Short rule description" : "簡短規則描述", + "Add rule" : "添加規則", + "Reset" : "重設", + "Save" : "儲存", + "Saving…" : "儲存中...", + "Loading…" : "載入中…" +}, +"nplurals=1; plural=0;"); diff --git a/apps/workflowengine/l10n/zh_TW.json b/apps/workflowengine/l10n/zh_TW.json new file mode 100644 index 00000000000..09496de4892 --- /dev/null +++ b/apps/workflowengine/l10n/zh_TW.json @@ -0,0 +1,65 @@ +{ "translations": { + "Successfully saved" : "成功保存", + "Saving failed:" : "保存失敗:", + "File mime type" : "檔案mime類型", + "is" : "是", + "is not" : "不是", + "matches" : "匹配", + "does not match" : "不能匹配", + "Example: {placeholder}" : "例子:{placeholder}", + "File size (upload)" : "檔案大小(上傳)", + "less" : "更少", + "less or equals" : "小於或等於", + "greater or equals" : "大於或等於", + "greater" : "更大", + "File system tag" : "檔案系統標籤", + "is tagged with" : "標記為", + "is not tagged with" : "没有標記為", + "Select tag…" : "選擇標籤", + "Request remote address" : "請求遠端地址", + "matches IPv4" : "匹配 IPv4", + "does not match IPv4" : "不能匹配 IPv4", + "matches IPv6" : "匹配 IPv6", + "does not match IPv6" : "不能匹配 IPv6", + "Request time" : "請求時間", + "between" : "之間", + "Start" : "開始", + "End" : "結束", + "Select timezone…" : "選擇時區...", + "Request URL" : "請求網址", + "Predefined URLs" : "預定義網址", + "Files WebDAV" : "檔案 WebDAV", + "Request user agent" : "請求用戶代理", + "Sync clients" : "同步客戶端", + "Android client" : "Android 客戶端", + "iOS client" : "iOS 客戶端", + "Desktop client" : "桌面客戶端", + "The given operator is invalid" : "指定的操作無效", + "The given regular expression is invalid" : "指定的規則表達式無效", + "The given file size is invalid" : "指定的檔案大小無效", + "The given tag id is invalid" : "指定的標籤 Id無效", + "The given IP range is invalid" : "指定的IP 範圍無效", + "The given IP range is not valid for IPv4" : "指定的IP範圍不是有效的IPv4", + "The given IP range is not valid for IPv6" : "指定的IP範圍不是有效的IPv6", + "The given time span is invalid" : "指定的時間範圍無效", + "The given start time is invalid" : "指定的開始時間無效", + "The given end time is invalid" : "指定的結束時間無效", + "The given group does not exist" : "指定的群組不存在", + "Check %s is invalid or does not exist" : "檢查 %s 無效或不存在", + "Operation #%s does not exist" : "操作 #%s 不存在", + "Operation %s does not exist" : "操作 %s 不存在", + "Operation %s is invalid" : "操作 #%s 無效", + "Check %s does not exist" : "檢查 %s 不存在", + "Check %s is invalid" : "檢查 %s 無效", + "Check #%s does not exist" : "檢查 #%s 不存在", + "Workflow" : "工作流程", + "Open documentation" : "開啟說明文件", + "Add rule group" : "新增群組規則", + "Short rule description" : "簡短規則描述", + "Add rule" : "添加規則", + "Reset" : "重設", + "Save" : "儲存", + "Saving…" : "儲存中...", + "Loading…" : "載入中…" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/workflowengine/lib/Controller/FlowOperations.php b/apps/workflowengine/lib/Controller/FlowOperations.php index 94b8b9ddc79..753aa2c26a7 100644 --- a/apps/workflowengine/lib/Controller/FlowOperations.php +++ b/apps/workflowengine/lib/Controller/FlowOperations.php @@ -58,6 +58,8 @@ class FlowOperations extends Controller { } /** + * @PasswordConfirmationRequired + * * @param string $class * @param string $name * @param array[] $checks @@ -75,6 +77,8 @@ class FlowOperations extends Controller { } /** + * @PasswordConfirmationRequired + * * @param int $id * @param string $name * @param array[] $checks @@ -92,6 +96,8 @@ class FlowOperations extends Controller { } /** + * @PasswordConfirmationRequired + * * @param int $id * @return JSONResponse */ diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index 07237ac7218..acfeb0e611f 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -971,3 +971,20 @@ Feature: sharing When Deleting last share Then etag of element "/" of user "user1" has changed And etag of element "/PARENT" of user "user0" has not changed + + Scenario: do not allow to increase link share permissions on reshare + Given As an "admin" + And user "admin" created a folder "/TMP" + And user "user0" exists + And creating a share with + | path | TMP | + | shareType | 0 | + | shareWith | user0 | + | permissions | 17 | + When As an "user0" + And creating a share with + | path | TMP | + | shareType | 3 | + And Updating last share with + | publicUpload | true | + Then the OCS status code should be "404" diff --git a/config/config.sample.php b/config/config.sample.php index fc52edbc778..e95e99e229a 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -1005,9 +1005,9 @@ $CONFIG = array( * * One way to test is applying for a trystack account at http://trystack.org/ */ -'objectstore' => array( +'objectstore' => [ 'class' => 'OC\\Files\\ObjectStore\\Swift', - 'arguments' => array( + 'arguments' => [ // trystack will user your facebook id as the user name 'username' => 'facebook100000123456789', // in the trystack dashboard go to user -> settings -> API Password to @@ -1015,6 +1015,8 @@ $CONFIG = array( 'password' => 'Secr3tPaSSWoRdt7', // must already exist in the objectstore, name can be different 'container' => 'nextcloud', + // prefix to prepend to the fileid, default is 'oid:urn:' + 'objectPrefix' => 'oid:urn:', // create the container if it does not exist. default is false 'autocreate' => true, // required, dev-/trystack defaults to 'RegionOne' @@ -1028,8 +1030,8 @@ $CONFIG = array( 'serviceName' => 'swift', // The Interface / url Type, optional 'urlType' => 'internal' - ), -), + ], +], /** diff --git a/core/Command/Encryption/DecryptAll.php b/core/Command/Encryption/DecryptAll.php index 7d77cc62e67..e02d7be5bb6 100644 --- a/core/Command/Encryption/DecryptAll.php +++ b/core/Command/Encryption/DecryptAll.php @@ -134,7 +134,7 @@ class DecryptAll extends Command { $uid = $input->getArgument('user'); if ($uid === '') { - $message = 'your ownCloud'; + $message = 'your Nextcloud'; } else { $message = "$uid's account"; } diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php index 71478470ffe..b1542de5d3c 100644 --- a/core/Controller/LoginController.php +++ b/core/Controller/LoginController.php @@ -1,5 +1,6 @@ <?php /** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> * @copyright Copyright (c) 2016, ownCloud, Inc. * * @author Christoph Wurst <christoph@owncloud.com> @@ -31,6 +32,8 @@ use OC\User\Session; use OC_App; use OC_Util; use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; use OCP\Authentication\TwoFactorAuth\IProvider; @@ -242,6 +245,8 @@ class LoginController extends Controller { // User has successfully logged in, now remove the password reset link, when it is available $this->config->deleteUserValue($loginResult->getUID(), 'core', 'lostpassword'); + $this->session->set('last-password-confirm', $loginResult->getLastLogin()); + if ($this->twoFactorManager->isTwoFactorAuthenticated($loginResult)) { $this->twoFactorManager->prepareTwoFactorLogin($loginResult, $remember_login); @@ -273,4 +278,36 @@ class LoginController extends Controller { return $this->generateRedirect($redirect_url); } + /** + * @NoAdminRequired + * @UseSession + * + * @license GNU AGPL version 3 or any later version + * + * @param string $password + * @return DataResponse + */ + public function confirmPassword($password) { + $currentDelay = $this->throttler->getDelay($this->request->getRemoteAddress()); + $this->throttler->sleepDelay($this->request->getRemoteAddress()); + + $user = $this->userSession->getUser(); + if (!$user instanceof IUser) { + return new DataResponse([], Http::STATUS_UNAUTHORIZED); + } + + $loginResult = $this->userManager->checkPassword($user->getUID(), $password); + if ($loginResult === false) { + $this->throttler->registerAttempt('sudo', $this->request->getRemoteAddress(), ['user' => $user->getUID()]); + if ($currentDelay === 0) { + $this->throttler->sleepDelay($this->request->getRemoteAddress()); + } + + return new DataResponse([], Http::STATUS_FORBIDDEN); + } + + $confirmTimestamp = time(); + $this->session->set('last-password-confirm', $confirmTimestamp); + return new DataResponse(['lastLogin' => $confirmTimestamp], Http::STATUS_OK); + } } diff --git a/core/Controller/OCJSController.php b/core/Controller/OCJSController.php index b1c2208377e..c2292a6733e 100644 --- a/core/Controller/OCJSController.php +++ b/core/Controller/OCJSController.php @@ -32,6 +32,7 @@ use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; use OCP\IRequest; +use OCP\ISession; use OCP\IURLGenerator; use OCP\IUserSession; @@ -48,7 +49,8 @@ class OCJSController extends Controller { * @param IL10N $l * @param \OC_Defaults $defaults * @param IAppManager $appManager - * @param IUserSession $session + * @param ISession $session + * @param IUserSession $userSession * @param IConfig $config * @param IGroupManager $groupManager * @param IniGetWrapper $iniWrapper @@ -59,7 +61,8 @@ class OCJSController extends Controller { IL10N $l, \OC_Defaults $defaults, IAppManager $appManager, - IUserSession $session, + ISession $session, + IUserSession $userSession, IConfig $config, IGroupManager $groupManager, IniGetWrapper $iniWrapper, @@ -70,7 +73,8 @@ class OCJSController extends Controller { $l, $defaults, $appManager, - $session->getUser(), + $session, + $userSession->getUser(), $config, $groupManager, $iniWrapper, diff --git a/core/Controller/OCSController.php b/core/Controller/OCSController.php index 13cc4d8ce2c..27ab9deb08a 100644 --- a/core/Controller/OCSController.php +++ b/core/Controller/OCSController.php @@ -22,8 +22,10 @@ namespace OC\Core\Controller; use OC\CapabilitiesManager; +use OC\Security\Bruteforce\Throttler; use OCP\AppFramework\Http\DataResponse; use OCP\IRequest; +use OCP\IUserManager; use OCP\IUserSession; class OCSController extends \OCP\AppFramework\OCSController { @@ -34,6 +36,12 @@ class OCSController extends \OCP\AppFramework\OCSController { /** @var IUserSession */ private $userSession; + /** @var IUserManager */ + private $userManager; + + /** @var Throttler */ + private $throttler; + /** * OCSController constructor. * @@ -41,15 +49,21 @@ class OCSController extends \OCP\AppFramework\OCSController { * @param IRequest $request * @param CapabilitiesManager $capabilitiesManager * @param IUserSession $userSession + * @param IUserManager $userManager + * @param Throttler $throttler */ public function __construct($appName, IRequest $request, CapabilitiesManager $capabilitiesManager, - IUserSession $userSession) { + IUserSession $userSession, + IUserManager $userManager, + Throttler $throttler) { parent::__construct($appName, $request); $this->capabilitiesManager = $capabilitiesManager; $this->userSession = $userSession; + $this->userManager = $userManager; + $this->throttler = $throttler; } /** @@ -102,4 +116,27 @@ class OCSController extends \OCP\AppFramework\OCSController { ]; return new DataResponse($data); } + + /** + * @PublicPage + * + * @param string $login + * @param string $password + * @return DataResponse + */ + public function personCheck($login = '', $password = '') { + if ($login !== '' && $password !== '') { + $this->throttler->sleepDelay($this->request->getRemoteAddress()); + if ($this->userManager->checkPassword($login, $password)) { + return new DataResponse([ + 'person' => [ + 'personid' => $login + ] + ]); + } + $this->throttler->registerAttempt('login', $this->request->getRemoteAddress()); + return new DataResponse(null, 102); + } + return new DataResponse(null, 101); + } } diff --git a/core/css/apps.css b/core/css/apps.css index 440b188dc19..e7aad0676cd 100644 --- a/core/css/apps.css +++ b/core/css/apps.css @@ -632,7 +632,7 @@ em { clear: left; } .tabsContainer .tab { - padding: 15px; + padding: 0 15px 15px; } /* popover menu styles (use together with "bubble" class) */ diff --git a/core/css/icons.css b/core/css/icons.css index d62ab1504db..7618491cf90 100644 --- a/core/css/icons.css +++ b/core/css/icons.css @@ -118,7 +118,13 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading- background-image: url('../img/actions/audio.svg?v=1'); } .icon-audio-white { - background-image: url('../img/actions/audio-white.svg?v=1'); + background-image: url('../img/actions/audio-white.svg?v=2'); +} +.icon-audio-off { + background-image: url('../img/actions/audio-off.svg?v=1'); +} +.icon-audio-off-white { + background-image: url('../img/actions/audio-off-white.svg?v=1'); } .icon-caret { @@ -138,6 +144,10 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading- background-image: url('../img/actions/checkmark-color.svg?v=1'); } +.icon-clippy { + background-image: url('../img/actions/clippy.svg?v=2'); +} + .icon-close { background-image: url('../img/actions/close.svg?v=1'); } @@ -199,7 +209,7 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading- background-image: url('../img/actions/fullscreen.svg?v=1'); } .icon-fullscreen-white { - background-image: url('../img/actions/fullscreen-white.svg?v=1'); + background-image: url('../img/actions/fullscreen-white.svg?v=2'); } .icon-history { @@ -341,7 +351,13 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading- background-image: url('../img/actions/video.svg?v=1'); } .icon-video-white { - background-image: url('../img/actions/video-white.svg?v=1'); + background-image: url('../img/actions/video-white.svg?v=2'); +} +.icon-video-off { + background-image: url('../img/actions/video-off.svg?v=1'); +} +.icon-video-off-white { + background-image: url('../img/actions/video-off-white.svg?v=1'); } .icon-view-close { @@ -410,7 +426,3 @@ img.icon-loading-small-dark, object.icon-loading-small-dark, video.icon-loading- .icon-picture { background-image: url('../img/places/picture.svg?v=1'); } - -.icon-clippy { - background-image: url('../img/actions/clippy.svg?v=1'); -} diff --git a/core/css/inputs.css b/core/css/inputs.css index 37fedb9a44e..4497c00139f 100644 --- a/core/css/inputs.css +++ b/core/css/inputs.css @@ -254,12 +254,18 @@ select:hover { position: relative !important; } .select2-results { - max-height: 220px !important; + max-height: 250px !important; margin: 0 !important; padding: 0 !important; } .select2-results .select2-result-label { padding: 12px !important; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.select2-results .select2-result-label span { + cursor: pointer; } .select2-choices { @@ -326,6 +332,12 @@ select:hover { margin-right: 8px; vertical-align: middle; } +#select2-drop .avatar img, +.select2-chosen .avatar img, +#select2-drop .avatar, +.select2-chosen .avatar { + cursor: pointer; +} .select2-results .select2-no-results, .select2-results .select2-searching, diff --git a/core/css/jquery-ui-fixes.css b/core/css/jquery-ui-fixes.css index db0e5b0357e..e8cf2b769b8 100644 --- a/core/css/jquery-ui-fixes.css +++ b/core/css/jquery-ui-fixes.css @@ -136,3 +136,7 @@ opacity: .2; border-radius: 5px; } + +.ui-menu .ui-menu-item a { + padding: 6px; +} diff --git a/core/css/jquery.ocdialog.css b/core/css/jquery.ocdialog.css index 0e46ff20152..d1a42694589 100644 --- a/core/css/jquery.ocdialog.css +++ b/core/css/jquery.ocdialog.css @@ -22,7 +22,6 @@ .oc-dialog-buttonrow { display: block; background: transparent; - position: absolute; right: 0; bottom: 0; padding: 10px; diff --git a/core/css/multiselect.css b/core/css/multiselect.css index cc1d6a3b468..8bcbd0e563d 100644 --- a/core/css/multiselect.css +++ b/core/css/multiselect.css @@ -31,9 +31,6 @@ ul.multiselectoptions.up { ul.multiselectoptions>li { overflow: hidden; white-space: nowrap; -} - -ul.multiselectoptions > li > input[type="checkbox"]+label:before { margin-left: 7px; } ul.multiselectoptions > li input[type='checkbox']+label { @@ -106,6 +103,7 @@ ul.multiselectoptions input.new { ul.multiselectoptions > li.creator { padding: 10px; + margin: 0; font-weight: bold; } ul.multiselectoptions > li.creator > input { diff --git a/core/css/share.css b/core/css/share.css index b2c47608933..9a984912760 100644 --- a/core/css/share.css +++ b/core/css/share.css @@ -82,8 +82,8 @@ } #shareWithList .sharingOptionsGroup .popovermenu { - right: -22px; - top: 30px; + right: -14px; + top: 40px; } #shareWithList .shareOption { @@ -182,9 +182,9 @@ a.showCruds:hover,a.unshare:hover { } .ui-autocomplete { /* limit dropdown height to 4 1/2 entries */ - max-height:103px; - overflow-y:auto; - overflow-x:hidden; + max-height: 200px; + overflow-y: auto; + overflow-x: hidden; } .notCreatable { diff --git a/core/css/styles.css b/core/css/styles.css index 84d3229bda9..f0c4c4f33ff 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -901,11 +901,12 @@ div.crumb > span { color: #555; } div.crumb.last a { - padding-right: 0px; + padding-right: 0; } div.crumb:first-child a { position: relative; top: 13px; + padding-right: 14px; } div.crumb.last { font-weight: 600; diff --git a/core/img/actions/audio-off-white.svg b/core/img/actions/audio-off-white.svg new file mode 100644 index 00000000000..1968e4c7cfc --- /dev/null +++ b/core/img/actions/audio-off-white.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.3148" width="1.4203" y="-.15742" x="-.21014"> + <feGaussianBlur stdDeviation="0.91827834"/> + </filter> + </defs> + <path opacity=".5" d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z" filter="url(#a)"/> + <path fill="#fff" d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z"/> +</svg> diff --git a/core/img/actions/audio-off.svg b/core/img/actions/audio-off.svg new file mode 100644 index 00000000000..8cf7fbcb5ca --- /dev/null +++ b/core/img/actions/audio-off.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <path d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z"/> +</svg> diff --git a/core/img/actions/audio-white.svg b/core/img/actions/audio-white.svg index 36523ef17d5..ac5d888a51c 100644 --- a/core/img/actions/audio-white.svg +++ b/core/img/actions/audio-white.svg @@ -1 +1,10 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2s2-.892 2-2V3c0-1.108-.892-2-2-2zM4 5c-.554 0-1 .446-1 1v1a4.988 4.988 0 0 0 4 4.9V13H5v2h6v-2H9v-1.1c2.287-.46 4-2.473 4-4.9V6c0-.554-.446-1-1-1s-1 .446-1 1v1c0 1.662-1.338 3-3 3S5 8.662 5 7V6c0-.554-.446-1-1-1z" fill-rule="evenodd" fill="#fff"/></svg>
\ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.3086" width="1.432" y="-.15429" x="-0.216"> + <feGaussianBlur stdDeviation="0.90000044"/> + </filter> + </defs> + <path opacity=".5" d="m8 1c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-4 4c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 4 4.9v1.1h-2v2h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.554-0.446-1-1-1s-1 0.446-1 1v1c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1c0-0.554-0.446-1-1-1z" fill-rule="evenodd" filter="url(#a)"/> + <path fill="#fff" d="m8 1c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-4 4c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 4 4.9v1.1h-2v2h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.554-0.446-1-1-1s-1 0.446-1 1v1c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1c0-0.554-0.446-1-1-1z" fill-rule="evenodd"/> +</svg> diff --git a/core/img/actions/audio.svg b/core/img/actions/audio.svg index d1719a0b965..fa55c949a9d 100644 --- a/core/img/actions/audio.svg +++ b/core/img/actions/audio.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M8 1c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2s2-.892 2-2V3c0-1.108-.892-2-2-2zM4 5c-.554 0-1 .446-1 1v1a4.988 4.988 0 0 0 4 4.9V13H5v2h6v-2H9v-1.1c2.287-.46 4-2.473 4-4.9V6c0-.554-.446-1-1-1s-1 .446-1 1v1c0 1.662-1.338 3-3 3S5 8.662 5 7V6c0-.554-.446-1-1-1z" fill-rule="evenodd"/></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16"><path d="M8 1c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2s2-.892 2-2V3c0-1.108-.892-2-2-2zM4 5c-.554 0-1 .446-1 1v1a4.988 4.988 0 0 0 4 4.9V13H5v2h6v-2H9v-1.1c2.287-.46 4-2.473 4-4.9V6c0-.554-.446-1-1-1s-1 .446-1 1v1c0 1.662-1.338 3-3 3S5 8.662 5 7V6c0-.554-.446-1-1-1z" fill-rule="evenodd"/></svg> diff --git a/core/img/actions/clippy.svg b/core/img/actions/clippy.svg index 4a978a1beb2..af496f39386 100644 --- a/core/img/actions/clippy.svg +++ b/core/img/actions/clippy.svg @@ -1 +1,4 @@ -<svg height="1024" width="896" xmlns="http://www.w3.org/2000/svg"><path opacity=".5" d="M704 896H64V320h640v192h64V192c0-35-29-64-64-64H512C512 57 455 0 384 0S256 57 256 128H64c-35 0-64 29-64 64v704c0 35 29 64 64 64h640c35 0 64-29 64-64V768h-64v128zM192 192h64c35 0 64-29 64-64s29-64 64-64 64 29 64 64 32 64 64 64h64c31 0 64 29 64 64H128c0-39 28-64 64-64zm-64 512h128v-64H128v64zm448-128V448L320 640l256 192V704h320V576H576zM128 832h192v-64H128v64zm320-448H128v64h320v-64zM256 512H128v64h128v-64z"/></svg>
\ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <path opacity=".5" d="m13 15h-11l0.0005-10h11v3.0002l1-0.0004 0.0005-5.0001c0.000058-0.5834-0.4165-1.0002-1.0005-1.0001l-3.467 0.0005c0.0008-1.183-0.9492-2.0001-2.1325-2.0001s-2.1333 0.8171-2.1333 2.0004h-3.2c-0.5834 0-1.0662 0.4166-1.0662 0.9999l-0.0005 12c-0.0000243 0.584 0.4833 1 1.0667 1l10.933-0.0005c0.584-0.001 1-0.416 1-1v-3h-1zm-8.8005-12h1.0672c0.5833 0 1.0666-0.4162 1.0666-0.9996 0-0.5833 0.4834-0.9337 1.0667-0.9337s1.0667 0.3504 1.0667 0.9337c0 0.5834 0.5333 0.9996 1.0666 0.9996h1.2667c0.517 0 1.2 0.4166 1.2 1h-9c-0.0004-0.65 0.5988-1 1.1988-1zm-1.1995 8h2v-1h-2zm7.9998-2v-2l-4 3 3.9998 3v-2l5.0002-0.00005v-2l-4.9998-0.00005zm-8 4h4v-1h-4zm6-7h-6v1h6zm-3 2h-3v1h3z"/> +</svg> diff --git a/core/img/actions/confirm.svg b/core/img/actions/confirm.svg index f12084ed40e..fd954cdcb1f 100644 --- a/core/img/actions/confirm.svg +++ b/core/img/actions/confirm.svg @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> <path d="m8.6328 0.63477c-0.2556 0-0.5112 0.0971-0.707 0.29296-0.3918 0.39177-0.3918 1.0224 0 1.4141l4.6582 4.6582h-11.584c-0.554 0-1 0.446-1 1s0.446 1 1 1h11.586l-4.6583 4.658c-0.3917 0.392-0.3917 1.023 0 1.414 0.3918 0.392 1.0224 0.392 1.4141 0l6.3632-6.363v-0.002h0.002c0.093-0.093 0.166-0.2041 0.217-0.3281l0.002-0.0019v-0.002c0.02-0.0508 0.019-0.1053 0.031-0.1582 0.016-0.0718 0.043-0.14 0.043-0.2168 0-0.0714-0.027-0.1341-0.041-0.2012-0.012-0.0578-0.012-0.1202-0.033-0.1738v-0.002c-0.001-0.0013-0.002-0.0026-0.002-0.0039-0.051-0.1233-0.124-0.2335-0.217-0.3261-0.001-0.0007-0.001-0.0013-0.002-0.002l-6.3632-6.3633c-0.1959-0.19583-0.4534-0.29293-0.709-0.29293z" fill-rule="evenodd"/> </svg> diff --git a/core/img/actions/fullscreen-white.svg b/core/img/actions/fullscreen-white.svg index 77052945fb2..887cd99ee5f 100644 --- a/core/img/actions/fullscreen-white.svg +++ b/core/img/actions/fullscreen-white.svg @@ -1,4 +1,10 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> - <path d="m8 1c-0.554 0-1 0.446-1 1s0.446 1 1 1h5v5c0 0.554 0.446 1 1 1s1-0.446 1-1v-6c0-0.554-0.446-1-1-1h-6zm-6 6c-0.554 0-1 0.446-1 1v6c0 0.554 0.446 1 1 1h6c0.554 0 1-0.446 1-1s-0.446-1-1-1h-5v-5c0-0.554-0.446-1-1-1z" fill-rule="evenodd" fill="#fff"/> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.36" width="1.36" y="-.18" x="-.18"> + <feGaussianBlur stdDeviation="1.05"/> + </filter> + </defs> + <path opacity=".5" d="m8 1c-0.554 0-1 0.446-1 1s0.446 1 1 1h5v5c0 0.554 0.446 1 1 1s1-0.446 1-1v-6c0-0.554-0.446-1-1-1h-6zm-6 6c-0.554 0-1 0.446-1 1v6c0 0.554 0.446 1 1 1h6c0.554 0 1-0.446 1-1s-0.446-1-1-1h-5v-5c0-0.554-0.446-1-1-1z" fill-rule="evenodd" filter="url(#a)"/> + <path fill-rule="evenodd" fill="#fff" d="m8 1c-0.554 0-1 0.446-1 1s0.446 1 1 1h5v5c0 0.554 0.446 1 1 1s1-0.446 1-1v-6c0-0.554-0.446-1-1-1h-6zm-6 6c-0.554 0-1 0.446-1 1v6c0 0.554 0.446 1 1 1h6c0.554 0 1-0.446 1-1s-0.446-1-1-1h-5v-5c0-0.554-0.446-1-1-1z"/> </svg> diff --git a/core/img/actions/video-off-white.svg b/core/img/actions/video-off-white.svg new file mode 100644 index 00000000000..dbd3120a33a --- /dev/null +++ b/core/img/actions/video-off-white.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.3818" width="1.3405" y="-.19090" x="-.17027"> + <feGaussianBlur stdDeviation="0.99326857"/> + </filter> + </defs> + <path opacity=".5" d="m13.486 1.5137c-0.255 0-0.511 0.0971-0.707 0.2929l-10.486 10.484c-0.3918 0.392-0.3918 1.024 0 1.416 0.3917 0.392 1.0242 0.392 1.416 0l10.484-10.486c0.392-0.392 0.392-1.0226 0-1.4144-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-10.486 1.4863c-1.108 0-2 0.892-2 2v6c0 0.368 0.1054 0.706 0.2773 1.002 0.0849-0.149 0.1825-0.292 0.3086-0.418l8.3457-8.3457c-0.2792-0.1477-0.5926-0.2383-0.9316-0.2383h-6zm12 0.8066c-0.034 0.0401-0.062 0.0835-0.1 0.1211l-9.0699 9.0723h3.1699c1.108 0 2-0.892 2-2v-1.334l4 3.334v-9.1934z" filter="url(#a)"/> + <path fill="#fff" d="m13.486 1.5137c-0.255 0-0.511 0.0971-0.707 0.2929l-10.486 10.484c-0.3918 0.392-0.3918 1.024 0 1.416 0.3917 0.392 1.0242 0.392 1.416 0l10.484-10.486c0.392-0.392 0.392-1.0226 0-1.4144-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-10.486 1.4863c-1.108 0-2 0.892-2 2v6c0 0.368 0.1054 0.706 0.2773 1.002 0.0849-0.149 0.1825-0.292 0.3086-0.418l8.3457-8.3457c-0.2792-0.1477-0.5926-0.2383-0.9316-0.2383h-6zm12 0.8066c-0.034 0.0401-0.062 0.0835-0.1 0.1211l-9.0699 9.0723h3.1699c1.108 0 2-0.892 2-2v-1.334l4 3.334v-9.1934z"/> +</svg> diff --git a/core/img/actions/video-off.svg b/core/img/actions/video-off.svg new file mode 100644 index 00000000000..cb61fe51986 --- /dev/null +++ b/core/img/actions/video-off.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <path d="m13.486 1.5137c-0.255 0-0.511 0.0971-0.707 0.2929l-10.486 10.484c-0.3918 0.392-0.3918 1.024 0 1.416 0.3917 0.392 1.0242 0.392 1.416 0l10.484-10.486c0.392-0.392 0.392-1.0226 0-1.4144-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-10.486 1.4863c-1.108 0-2 0.892-2 2v6c0 0.368 0.1054 0.706 0.2773 1.002 0.0849-0.149 0.1825-0.292 0.3086-0.418l8.3457-8.3457c-0.2792-0.1477-0.5926-0.2383-0.9316-0.2383h-6zm12 0.8066c-0.034 0.0401-0.062 0.0835-0.1 0.1211l-9.0699 9.0723h3.1699c1.108 0 2-0.892 2-2v-1.334l4 3.334v-9.1934z"/> +</svg> diff --git a/core/img/actions/video-white.svg b/core/img/actions/video-white.svg index 4499ff8c617..59dc1b25321 100644 --- a/core/img/actions/video-white.svg +++ b/core/img/actions/video-white.svg @@ -1 +1,10 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M3 3c-1.108 0-2 .892-2 2v6c0 1.108.892 2 2 2h6c1.108 0 2-.892 2-2V9.666L15 13V3l-4 3.334V5c0-1.108-.892-2-2-2z" fill="#fff"/></svg>
\ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"> + <defs> + <filter id="a" style="color-interpolation-filters:sRGB" height="1.432" width="1.3086" y="-.216" x="-.15429"> + <feGaussianBlur stdDeviation="0.9"/> + </filter> + </defs> + <path opacity=".5" d="m3 3c-1.108 0-2 0.892-2 2v6c0 1.108 0.892 2 2 2h6c1.108 0 2-0.892 2-2v-1.334l4 3.334v-10l-4 3.334v-1.334c0-1.108-0.892-2-2-2z" filter="url(#a)"/> + <path d="m3 3c-1.108 0-2 0.892-2 2v6c0 1.108 0.892 2 2 2h6c1.108 0 2-0.892 2-2v-1.334l4 3.334v-10l-4 3.334v-1.334c0-1.108-0.892-2-2-2z" fill="#fff"/> +</svg> diff --git a/core/img/actions/video.svg b/core/img/actions/video.svg index 6c74ec7e1f7..002198dc0ab 100644 --- a/core/img/actions/video.svg +++ b/core/img/actions/video.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M3 3c-1.108 0-2 .892-2 2v6c0 1.108.892 2 2 2h6c1.108 0 2-.892 2-2V9.666L15 13V3l-4 3.334V5c0-1.108-.892-2-2-2z"/></svg>
\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16"><path d="M3 3c-1.108 0-2 .892-2 2v6c0 1.108.892 2 2 2h6c1.108 0 2-.892 2-2V9.666L15 13V3l-4 3.334V5c0-1.108-.892-2-2-2z"/></svg> diff --git a/core/js/files/client.js b/core/js/files/client.js index fdc51c4a197..87559b2084c 100644 --- a/core/js/files/client.js +++ b/core/js/files/client.js @@ -734,7 +734,7 @@ /** * Returns the dav.Client instance used internally * - * @since 9.2 + * @since 11.0.0 * @return {dav.Client} */ getClient: function() { @@ -744,7 +744,7 @@ /** * Returns the user name * - * @since 9.2 + * @since 11.0.0 * @return {String} userName */ getUserName: function() { @@ -754,7 +754,7 @@ /** * Returns the password * - * @since 9.2 + * @since 11.0.0 * @return {String} password */ getPassword: function() { @@ -764,7 +764,7 @@ /** * Returns the base URL * - * @since 9.2 + * @since 11.0.0 * @return {String} base URL */ getBaseUrl: function() { diff --git a/core/js/js.js b/core/js/js.js index 54b103a7b7d..64c7dda31e2 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1512,8 +1512,80 @@ function initCore() { $(this).text(OC.Util.relativeModifiedDate(parseInt($(this).attr('data-timestamp'), 10))); }); }, 30 * 1000); + + OC.PasswordConfirmation.init(); } +OC.PasswordConfirmation = { + callback: null, + + init: function() { + $('.password-confirm-required').on('click', _.bind(this.requirePasswordConfirmation, this)); + }, + + requiresPasswordConfirmation: function() { + var timeSinceLogin = moment.now() - nc_lastLogin * 1000; + return timeSinceLogin > 10 * 1000; // 30 minutes + return timeSinceLogin > 30 * 60 * 1000; // 30 minutes + }, + + /** + * @param {function} callback + */ + requirePasswordConfirmation: function(callback) { + var self = this; + + if (this.requiresPasswordConfirmation()) { + OC.dialogs.prompt( + t( + 'core', + 'This action requires you to confirm your password' + ), + t('core','Authentication required'), + function (result, password) { + if (result && password !== '') { + self._confirmPassword(password); + } + }, + true, + t('core','Password'), + true + ).then(function() { + var $dialog = $('.oc-dialog:visible'); + $dialog.find('.ui-icon').remove(); + + var $buttons = $dialog.find('button'); + $buttons.eq(0).text(t('core', 'Cancel')); + $buttons.eq(1).text(t('core', 'Confirm')); + }); + } + + this.callback = callback; + }, + + _confirmPassword: function(password) { + var self = this; + + $.ajax({ + url: OC.generateUrl('/login/confirm'), + data: { + password: password + }, + type: 'POST', + success: function(response) { + nc_lastLogin = response.lastLogin; + + if (_.isFunction(self.callback)) { + self.callback(); + } + }, + error: function() { + OC.Notification.showTemporary(t('core', 'Failed to authenticate, try again')); + } + }); + } +}; + $(document).ready(initCore); /** diff --git a/core/js/mimetype.js b/core/js/mimetype.js index 0d30da26c26..8920fe09a7e 100644 --- a/core/js/mimetype.js +++ b/core/js/mimetype.js @@ -91,6 +91,11 @@ OC.MimeType = { path += icon; } } + if(OCA.Theming) { + path = OC.generateUrl('/apps/theming/img/core/filetypes/'); + path += OC.MimeType._getFile(mimeType, OC.MimeTypeList.files); + gotIcon = true; + } // If we do not yet have an icon fall back to the default if (gotIcon === null) { @@ -100,6 +105,10 @@ OC.MimeType = { path += '.svg'; + if(OCA.Theming) { + path += "?v=" + OCA.Theming.cacheBuster; + } + // Cache the result OC.MimeType._mimeTypeIcons[mimeType] = path; return path; diff --git a/core/js/public/appconfig.js b/core/js/public/appconfig.js index cde2700c86c..d84ddaab404 100644 --- a/core/js/public/appconfig.js +++ b/core/js/public/appconfig.js @@ -20,7 +20,7 @@ /** * @namespace - * @since 9.2.0 + * @since 11.0.0 */ OCP.AppConfig = { /** @@ -33,6 +33,10 @@ OCP.AppConfig = { * @internal */ _call: function(method, endpoint, options) { + if ((method === 'post' || method === 'delete') && OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this._call, this, method, endpoint, options)); + return; + } $.ajax({ type: method.toUpperCase(), @@ -46,7 +50,7 @@ OCP.AppConfig = { /** * @param {Object} [options] * @param {function} [options.success] - * @since 9.2.0 + * @since 11.0.0 */ getApps: function(options) { this._call('get', '', options); @@ -57,7 +61,7 @@ OCP.AppConfig = { * @param {Object} [options] * @param {function} [options.success] * @param {function} [options.error] - * @since 9.2.0 + * @since 11.0.0 */ getKeys: function(app, options) { this._call('get', '/' + app, options); @@ -70,7 +74,7 @@ OCP.AppConfig = { * @param {Object} [options] * @param {function} [options.success] * @param {function} [options.error] - * @since 9.2.0 + * @since 11.0.0 */ getValue: function(app, key, defaultValue, options) { options = options || {}; @@ -88,7 +92,7 @@ OCP.AppConfig = { * @param {Object} [options] * @param {function} [options.success] * @param {function} [options.error] - * @since 9.2.0 + * @since 11.0.0 */ setValue: function(app, key, value, options) { options = options || {}; @@ -105,7 +109,7 @@ OCP.AppConfig = { * @param {Object} [options] * @param {function} [options.success] * @param {function} [options.error] - * @since 9.2.0 + * @since 11.0.0 */ deleteKey: function(app, key, options) { this._call('delete', '/' + app + '/' + key, options); diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index 936d742ce46..4764efc035d 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -124,7 +124,7 @@ } if(!data.forwardedForHeadersWorking) { messages.push({ - msg: t('core', 'The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target="_blank" rel="noreferrer" href="{docLink}">documentation</a>.', {docLink: data.reverseProxyDocs}), + msg: t('core', '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>.', {docLink: data.reverseProxyDocs}), type: OC.SetupChecks.MESSAGE_TYPE_WARNING }); } diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js index bbc8f1b4547..85a20dce01a 100644 --- a/core/js/sharedialoglinkshareview.js +++ b/core/js/sharedialoglinkshareview.js @@ -134,10 +134,15 @@ var clipboard = new Clipboard('.clipboardButton'); clipboard.on('success', function(e) { var $input = $(e.trigger); - $input.tooltip({placement: 'bottom', trigger: 'manual', title: t('core', 'Copied!')}); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copied!')) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function() { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); clipboard.on('error', function (e) { @@ -151,14 +156,15 @@ actionMsg = t('core', 'Press Ctrl-C to copy.'); } - $input.tooltip({ - placement: 'bottom', - trigger: 'manual', - title: actionMsg - }); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', actionMsg) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function () { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); @@ -336,6 +342,8 @@ mailButtonText: t('core', 'Send') })); + this.$el.find('.clipboardButton').tooltip({placement: 'bottom', title: t('core', 'Copy'), trigger: 'hover'}); + this.delegateEvents(); return this; diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js index 3a72ab7266d..96bbf94fa1c 100644 --- a/core/js/sharedialogshareelistview.js +++ b/core/js/sharedialogshareelistview.js @@ -78,7 +78,6 @@ '</ul>' + '</div>' + '{{/unless}}' + - '<a href="#" class="unshare"><span class="icon-loading-small hidden"></span><span class="icon icon-delete"></span><span class="hidden-visually">{{unshareLabel}}</span></a>' + '</span>' + '</li>' + '{{/each}}' + diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index b277a1226c7..0a29dec73ca 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -400,7 +400,7 @@ var infoTemplate = this._getRemoteShareInfoTemplate(); remoteShareInfo = infoTemplate({ docLink: this.configModel.getFederatedShareDocLink(), - tooltip: t('core', 'Share with people on other servers using the syntax username@example.com/nextcloud') + tooltip: t('core', 'Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud') }); } diff --git a/core/js/systemtags/systemtagsinputfield.js b/core/js/systemtags/systemtagsinputfield.js index 2eb8d0a44cb..5d986d17290 100644 --- a/core/js/systemtags/systemtagsinputfield.js +++ b/core/js/systemtags/systemtagsinputfield.js @@ -408,6 +408,9 @@ return 1; }); return results; + }, + formatNoMatches: function() { + return t('core', 'No tags found'); } }) .on('select2-selecting', this._onSelectTag) diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js index 0972bf76fc3..5b2a7881df9 100644 --- a/core/js/tests/specs/setupchecksSpec.js +++ b/core/js/tests/specs/setupchecksSpec.js @@ -309,7 +309,7 @@ describe('OC.SetupChecks tests', function() { async.done(function( data, s, x ){ expect(data).toEqual([{ - msg: 'The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target="_blank" rel="noreferrer" href="https://docs.owncloud.org/foo/bar.html">documentation</a>.', + msg: '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="https://docs.owncloud.org/foo/bar.html">documentation</a>.', type: OC.SetupChecks.MESSAGE_TYPE_WARNING }]); done(); diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index 893ac7b09a6..97706f88edf 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -88,7 +88,6 @@ OC.L10N.register( "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>." : "Nebyla nakonfigurována paměťová cache. Pokud je dostupná, nakonfigurujte ji prosím pro zlepšení výkonu. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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>." : "PHP nemá práva pro čtení v /dev/urandom, to je ale z bezpečnostních důvodů velmi doporučováno. Více informací lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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." : "Aktuálně používáte PHP {version}. Doporučujeme aktualizovat verzi PHP, abyste mohli využít <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">výkonnostních a bezpečnostních aktualizací poskytovaných autory PHP</a> tak rychle, jak to vaše distribuce umožňuje.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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>." : "Je nakonfigurován memcached jako distribuovaná cache, ale je nainstalovaný nesprávný PHP modul \"memcache\". \\OC\\Memcache\\Memcached podporuje pouze \"memcached\" a ne \"memcache\". Podívejte se na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki o obou modulech</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>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)", "Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě", @@ -108,6 +107,7 @@ OC.L10N.register( "Expiration date" : "Datum vypršení platnosti", "Choose a password for the public link" : "Zadej heslo pro tento veřejný odkaz", "Copied!" : "Zkopírováno!", + "Copy" : "Zkopírovat", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", "Press Ctrl-C to copy." : "Zmáčknout Ctrl-C pro kopírování.", @@ -142,7 +142,7 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (vzdálený)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Sdílet", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Ke sdílení s lidmi na jiných serverech použijte syntaxi username@example.com/nextcloud", + "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "Sdílet s uživateli na jiných serverech za použití jejich sdílených cloud ID username@example.com/nextcloud", "Share with users or by mail..." : "Sdílejte s uživateli, nebo emailem...", "Share with users or remote users..." : "Sdílet s uživateli nebo vzdálenými uživateli...", "Share with users, remote users or by mail..." : "Sdílet s uživateli, vzdálenými uživateli, nebo emailem...", @@ -159,6 +159,7 @@ OC.L10N.register( "Delete" : "Smazat", "Rename" : "Přejmenovat", "Collaborative tags" : "Tagy spolupráce", + "No tags found" : "Nebyly nalezeny žádné tagy", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", "Add" : "Přidat", @@ -331,6 +332,7 @@ OC.L10N.register( "Nov." : "listopad", "Dec." : "prosinec", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>.", "Allow editing" : "Povolit úpravy", "Sending ..." : "Odesílám ...", "Email sent" : "Email odeslán", @@ -341,7 +343,6 @@ OC.L10N.register( "change" : "změnit", "delete" : "smazat", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "Share with users…" : "Sdílet s uživateli...", "Share with users, groups or remote users…" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli...", "Share with users or groups…" : "Sdílet s uživateli nebo skupinami...", @@ -366,6 +367,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a target=\"_blank\" href=\"{docLink}\">dokumentaci</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimum \"{seconds}\" sekund. Pro vylepšení bezpečnosti doporučujeme povolit HSTS dle popisu v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.", "An error occured. Please try again" : "Došlo k chybě. Zkuste to prosím znovu", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "not assignable" : "nepřiřaditelné", "Updating {productName} to version {version}, this may take a while." : "Aktualizace {productName} na verzi {version}, to chvíli potrvá.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Pro informace, jak správně nastavit váš server, se podívejte do <a href=\"%s\" target=\"_blank\">dokumentace</a>.", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index feda05ef662..ab4a1068991 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -86,7 +86,6 @@ "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>." : "Nebyla nakonfigurována paměťová cache. Pokud je dostupná, nakonfigurujte ji prosím pro zlepšení výkonu. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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>." : "PHP nemá práva pro čtení v /dev/urandom, to je ale z bezpečnostních důvodů velmi doporučováno. Více informací lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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." : "Aktuálně používáte PHP {version}. Doporučujeme aktualizovat verzi PHP, abyste mohli využít <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">výkonnostních a bezpečnostních aktualizací poskytovaných autory PHP</a> tak rychle, jak to vaše distribuce umožňuje.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</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>." : "Je nakonfigurován memcached jako distribuovaná cache, ale je nainstalovaný nesprávný PHP modul \"memcache\". \\OC\\Memcache\\Memcached podporuje pouze \"memcached\" a ne \"memcache\". Podívejte se na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki o obou modulech</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>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)", "Error occurred while checking server setup" : "Při ověřování nastavení serveru došlo k chybě", @@ -106,6 +105,7 @@ "Expiration date" : "Datum vypršení platnosti", "Choose a password for the public link" : "Zadej heslo pro tento veřejný odkaz", "Copied!" : "Zkopírováno!", + "Copy" : "Zkopírovat", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", "Press Ctrl-C to copy." : "Zmáčknout Ctrl-C pro kopírování.", @@ -140,7 +140,7 @@ "{sharee} (remote)" : "{sharee} (vzdálený)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Sdílet", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Ke sdílení s lidmi na jiných serverech použijte syntaxi username@example.com/nextcloud", + "Share with people on other servers using their Federated Cloud ID username@example.com/nextcloud" : "Sdílet s uživateli na jiných serverech za použití jejich sdílených cloud ID username@example.com/nextcloud", "Share with users or by mail..." : "Sdílejte s uživateli, nebo emailem...", "Share with users or remote users..." : "Sdílet s uživateli nebo vzdálenými uživateli...", "Share with users, remote users or by mail..." : "Sdílet s uživateli, vzdálenými uživateli, nebo emailem...", @@ -157,6 +157,7 @@ "Delete" : "Smazat", "Rename" : "Přejmenovat", "Collaborative tags" : "Tagy spolupráce", + "No tags found" : "Nebyly nalezeny žádné tagy", "The object type is not specified." : "Není určen typ objektu.", "Enter new" : "Zadat nový", "Add" : "Přidat", @@ -329,6 +330,7 @@ "Nov." : "listopad", "Dec." : "prosinec", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Tento server nemá funkční připojení k Internetu. Některé moduly jako např. externí úložiště, oznámení o dostupných aktualizacích nebo instalace aplikací třetích stran nebudou fungovat. Přístup k souborům z jiných míst a odesílání oznamovacích emailů také nemusí fungovat. Pokud chcete využívat všechny možnosti ownCloud, doporučujeme povolit pro tento server připojení k Internetu.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurace hlaviček reverzní proxy není správná nebo přistupujete na ownCloud z důvěryhodné proxy. Pokud nepřistupujete k ownCloud z důvěryhodné proxy, potom je toto bezpečností chyba a může útočníkovi umožnit falšovat IP adresu, kterou ownCloud vidí. Další informace lze nalézt v naší <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaci</a>.", "Allow editing" : "Povolit úpravy", "Sending ..." : "Odesílám ...", "Email sent" : "Email odeslán", @@ -339,7 +341,6 @@ "change" : "změnit", "delete" : "smazat", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "Share with users…" : "Sdílet s uživateli...", "Share with users, groups or remote users…" : "Sdílet s uživateli, skupinami nebo vzdálenými uživateli...", "Share with users or groups…" : "Sdílet s uživateli nebo skupinami...", @@ -364,6 +365,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Některé soubory neprošly kontrolou integrity. Více informací o tom jak tento problém vyřešit, lze nalézt v naší <a target=\"_blank\" href=\"{docLink}\">dokumentaci</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Seznam neplatných souborů…</a> / <a href=\"{rescanEndpoint}\">Znovu ověřit…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "HTTP hlavička \"Strict-Transport-Security\" není nakonfigurována na minimum \"{seconds}\" sekund. Pro vylepšení bezpečnosti doporučujeme povolit HSTS dle popisu v našich <a href=\"{docUrl}\">bezpečnostních tipech</a>.", "An error occured. Please try again" : "Došlo k chybě. Zkuste to prosím znovu", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sdílejte s lidmi na ownClouds použitím syntaxe username@example.com/owncloud", "not assignable" : "nepřiřaditelné", "Updating {productName} to version {version}, this may take a while." : "Aktualizace {productName} na verzi {version}, to chvíli potrvá.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Pro informace, jak správně nastavit váš server, se podívejte do <a href=\"%s\" target=\"_blank\">dokumentace</a>.", diff --git a/core/l10n/da.js b/core/l10n/da.js index ddb54560185..e11cbb1d729 100644 --- a/core/l10n/da.js +++ b/core/l10n/da.js @@ -78,7 +78,6 @@ OC.L10N.register( "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>." : "Der er ikke konfigureret noget hukommelsesmellemlager. For at forbedre din ydelse bør du om muligt konfigurere en mamcache. Yderligere information findes i <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentationen</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 kan ikke læses af PHP, hvilket stærkt frarådes af sikkerhedsgrunde. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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." : "Du kører i øjeblikket med PHP {version}. Vi anbefaler dig at opgradere din PHP version for at få glæde af <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">ydelses- og sikkerhedsopdateringer udgivet af the PHP Group</a> så snart din dintribution understøtter dem.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 er konfigureret som et distribueret mellemlager, men det forkerte PHP-modul \"memcache\" er installeret. \\OC\\Memcache\\Memcached understøtter kun \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached-wikien om begge moduler</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>)" : "Nogle filer har ikke bestået integritetskontrollen. Yderligere information om hvordan man løser dette problem kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dodumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste over ugyldige filer...</a> / <a href=\"{rescanEndpoint}\">Scan igen…</a>)", "Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen", @@ -280,6 +279,7 @@ OC.L10N.register( "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.", "Allow editing" : "Tillad redigering", "Sending ..." : "Sender ...", "Email sent" : "E-mail afsendt", @@ -289,7 +289,6 @@ OC.L10N.register( "create" : "opret", "change" : "tilpas", "delete" : "slet", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med andre på ownCloud ved hjælp af syntaxen username@example.com/owncloud", "Share with users…" : "Del med brugere...", "Share with users, groups or remote users…" : "Del med brugere, grupper eller eksterne brugere...", "Share with users or groups…" : "Del med brugere eller grupper...", @@ -297,6 +296,7 @@ OC.L10N.register( "Warning" : "Advarsel", "Error while sending notification" : "Fejl ved afsendelse af notifikation", "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", - "Cancel login" : "Annuller login" + "Cancel login" : "Annuller login", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med andre på ownCloud ved hjælp af syntaxen username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/da.json b/core/l10n/da.json index 8298b9f2506..e74611484f9 100644 --- a/core/l10n/da.json +++ b/core/l10n/da.json @@ -76,7 +76,6 @@ "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>." : "Der er ikke konfigureret noget hukommelsesmellemlager. For at forbedre din ydelse bør du om muligt konfigurere en mamcache. Yderligere information findes i <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentationen</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 kan ikke læses af PHP, hvilket stærkt frarådes af sikkerhedsgrunde. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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." : "Du kører i øjeblikket med PHP {version}. Vi anbefaler dig at opgradere din PHP version for at få glæde af <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">ydelses- og sikkerhedsopdateringer udgivet af the PHP Group</a> så snart din dintribution understøtter dem.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 er konfigureret som et distribueret mellemlager, men det forkerte PHP-modul \"memcache\" er installeret. \\OC\\Memcache\\Memcached understøtter kun \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached-wikien om begge moduler</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>)" : "Nogle filer har ikke bestået integritetskontrollen. Yderligere information om hvordan man løser dette problem kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dodumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste over ugyldige filer...</a> / <a href=\"{rescanEndpoint}\">Scan igen…</a>)", "Error occurred while checking server setup" : "Der opstod fejl under tjek af serveropsætningen", @@ -278,6 +277,7 @@ "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurationen af reverse proxy-headere er ikke korrekt eller du tilgår ownCloud fra en betroet proxy. Hvis du ikke tilgår ownCloud fra en betroet proxy, så er dette et sikkerhedsproblem og kan tillade en angriber af forfalske deres IP-adresse som synlig for ownCloud. Yderligere information kan findes i vores <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.", "Allow editing" : "Tillad redigering", "Sending ..." : "Sender ...", "Email sent" : "E-mail afsendt", @@ -287,7 +287,6 @@ "create" : "opret", "change" : "tilpas", "delete" : "slet", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med andre på ownCloud ved hjælp af syntaxen username@example.com/owncloud", "Share with users…" : "Del med brugere...", "Share with users, groups or remote users…" : "Del med brugere, grupper eller eksterne brugere...", "Share with users or groups…" : "Del med brugere eller grupper...", @@ -295,6 +294,7 @@ "Warning" : "Advarsel", "Error while sending notification" : "Fejl ved afsendelse af notifikation", "No search results in other folders" : "Søgning gav ingen resultater in andre mapper", - "Cancel login" : "Annuller login" + "Cancel login" : "Annuller login", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med andre på ownCloud ved hjælp af syntaxen username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/de.js b/core/l10n/de.js index c855408a614..2430153ab3b 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -88,7 +88,7 @@ OC.L10N.register( "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>." : "Es wurde kein PHP Memory Cache konfiguriert. Zur Erhöhung der Leistungsfähigkeit kann ein Memory-Cache konfiguriert werden. Weitere Informationen findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "PHP hat keine Leserechte auf /dev/urandom wovon aus Sicherheitsgründen höchst abzuraten ist. Weitere Informationen sind in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a> zu finden.", "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." : "Du verwendest derzeit PHP {version}. Wir empfehlen ein Upgrade deiner PHP-Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP-Gruppe bereitgestellt werden</a>, sobald diese deine Distribution unterstützt.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Die Reverse-Proxy-Header-Konfiguration ist fehlerhaft oder Du greist auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn Du auf Nextcloud nicht über einen vertrauenswürdigen Proxy zugreifst, dann besteht ein Sicherheitsproblem, das einem Angreifer erlaubt die IP-Adresse, die für Nextcloud sichtbar ist, auszuspähen. Weitere Informationen hierzu findest Du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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 ist als distributed cache konfiguriert aber das falsche PHP-Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" jedoch nicht \"memcache\". Im <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki nach beiden Modulen suchen</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>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", @@ -142,7 +142,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (remote)", "{sharee} (email)" : "{sharee} (E-Mail)", "Share" : "Teilen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Teile es mit Nutzern in anderen Server. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users or by mail..." : "Mit Benutzern oder per E-Mail teilen…", "Share with users or remote users..." : "Mit Benutzern oder externen Benutzern teilen…", "Share with users, remote users or by mail..." : "Mit Benutzern, externen Benutzern oder per E-Mail teilen…", @@ -159,6 +158,7 @@ OC.L10N.register( "Delete" : "Löschen", "Rename" : "Umbenennen", "Collaborative tags" : "Zusammenarbeits-Tags", + "No tags found" : "Keine Tags gefunden", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Add" : "Hinzufügen", @@ -331,6 +331,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn du alle Funktionen nutzen möchtest.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.", "Allow editing" : "Bearbeitung erlauben", "Sending ..." : "Senden…", "Email sent" : "E-Mail wurde verschickt", @@ -341,7 +342,6 @@ OC.L10N.register( "change" : "Ändern", "delete" : "löschen", "{sharee} (at {server})" : "{sharee} (auf {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teile es mit Nutzern auf anderen Nextclouds. Die Syntax hierfür lautet: username@example.com/nextcloud", "Share with users…" : "Mit Benutzern teilen…", "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder externen Benutzern teilen…", "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…", @@ -366,6 +366,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information zum Lösen des Problems findest du in unserer <a target=\"_blank\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Um die Sicherheit zu erhöhen, empfehlen wir das Aktivieren von HSTS, wie es in den <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "An error occured. Please try again" : "Es ist ein Fehler aufgetreten. Bitte versuche es noch einmal", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teile es mit Nutzern auf anderen Nextclouds. Die Syntax hierfür lautet: username@example.com/nextcloud", "not assignable" : "nicht zuweisbar", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}, dies kann eine Weile dauern.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren deines Servers kannst du der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/de.json b/core/l10n/de.json index 54c759e2453..777d3bd413f 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -86,7 +86,7 @@ "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>." : "Es wurde kein PHP Memory Cache konfiguriert. Zur Erhöhung der Leistungsfähigkeit kann ein Memory-Cache konfiguriert werden. Weitere Informationen findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "PHP hat keine Leserechte auf /dev/urandom wovon aus Sicherheitsgründen höchst abzuraten ist. Weitere Informationen sind in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a> zu finden.", "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." : "Du verwendest derzeit PHP {version}. Wir empfehlen ein Upgrade deiner PHP-Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP-Gruppe bereitgestellt werden</a>, sobald diese deine Distribution unterstützt.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Die Reverse-Proxy-Header-Konfiguration ist fehlerhaft oder Du greist auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn Du auf Nextcloud nicht über einen vertrauenswürdigen Proxy zugreifst, dann besteht ein Sicherheitsproblem, das einem Angreifer erlaubt die IP-Adresse, die für Nextcloud sichtbar ist, auszuspähen. Weitere Informationen hierzu findest Du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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 ist als distributed cache konfiguriert aber das falsche PHP-Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" jedoch nicht \"memcache\". Im <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki nach beiden Modulen suchen</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>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", @@ -140,7 +140,6 @@ "{sharee} (remote)" : "{sharee} (remote)", "{sharee} (email)" : "{sharee} (E-Mail)", "Share" : "Teilen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Teile es mit Nutzern in anderen Server. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users or by mail..." : "Mit Benutzern oder per E-Mail teilen…", "Share with users or remote users..." : "Mit Benutzern oder externen Benutzern teilen…", "Share with users, remote users or by mail..." : "Mit Benutzern, externen Benutzern oder per E-Mail teilen…", @@ -157,6 +156,7 @@ "Delete" : "Löschen", "Rename" : "Umbenennen", "Collaborative tags" : "Zusammenarbeits-Tags", + "No tags found" : "Keine Tags gefunden", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Add" : "Hinzufügen", @@ -329,6 +329,7 @@ "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn du alle Funktionen nutzen möchtest.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder du greifst auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn du nicht über einen vertrauenswürdigen Proxy zugreifst, dann liegt ein Sicherheitsproblem vor, das es einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fälschen. Weitere Informationen hierzu findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.", "Allow editing" : "Bearbeitung erlauben", "Sending ..." : "Senden…", "Email sent" : "E-Mail wurde verschickt", @@ -339,7 +340,6 @@ "change" : "Ändern", "delete" : "löschen", "{sharee} (at {server})" : "{sharee} (auf {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teile es mit Nutzern auf anderen Nextclouds. Die Syntax hierfür lautet: username@example.com/nextcloud", "Share with users…" : "Mit Benutzern teilen…", "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder externen Benutzern teilen…", "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…", @@ -364,6 +364,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information zum Lösen des Problems findest du in unserer <a target=\"_blank\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Um die Sicherheit zu erhöhen, empfehlen wir das Aktivieren von HSTS, wie es in den <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "An error occured. Please try again" : "Es ist ein Fehler aufgetreten. Bitte versuche es noch einmal", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teile es mit Nutzern auf anderen Nextclouds. Die Syntax hierfür lautet: username@example.com/nextcloud", "not assignable" : "nicht zuweisbar", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}, dies kann eine Weile dauern.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren deines Servers kannst du der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 1446ae985ca..bb593055723 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -88,7 +88,7 @@ OC.L10N.register( "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>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfigurieren Sie zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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 ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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." : "Sie verwenden im Moment PHP {version}. Wir empfehlen ein Upgrade ihrer PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald ihre Distribution diese unterstützt.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Die Reverse-Proxy-Header-Konfiguration ist fehlerhaft oder Sie greifen auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn Sie auf Nextcloud nicht über einen vertrauenswürdigen Proxy zugreifen, dann besteht ein Sicherheitsproblem, das einem Angreifer erlaubt die IP-Adresse, die für Nextcloud sichtbar ist, auszuspähen. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" und nicht \"memcache\". Siehe <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</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>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", @@ -142,7 +142,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (entfernt)", "{sharee} (email)" : "{sharee} (E-Mail)", "Share" : "Teilen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Teilen Sie es mit Nutzern in anderen Server. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users or by mail..." : "Mit Benutzern oder per E-Mail teilen…", "Share with users or remote users..." : "Mit Benutzern oder externen Benutzern teilen…", "Share with users, remote users or by mail..." : "Mit Benutzern, externen Benutzern oder per E-Mail teilen…", @@ -159,6 +158,7 @@ OC.L10N.register( "Delete" : "Löschen", "Rename" : "Umbenennen", "Collaborative tags" : "Zusammenarbeits-Tags", + "No tags found" : "Keine Tags gefunden", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Add" : "Hinzufügen", @@ -331,6 +331,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.", "Allow editing" : "Bearbeitung erlauben", "Sending ..." : "Senden…", "Email sent" : "E-Mail gesendet", @@ -341,7 +342,6 @@ OC.L10N.register( "change" : "ändern", "delete" : "löschen", "{sharee} (at {server})" : "{sharee} (auf {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teilen Sie es mit Nutzern in anderen Nextclouds. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users…" : "Mit Benutzern teilen…", "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder externen Benutzern teilen…", "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…", @@ -366,6 +366,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" >Sicherheitshinweisen</a> erläutert ist.", "An error occured. Please try again" : "Fehler aufgetreten. Bitte erneut versuchen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teilen Sie es mit Nutzern in anderen Nextclouds. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "not assignable" : "nicht zuweisbar", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}, dies kann etwas dauern.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren Ihres Servers können Sie der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index ccad03a137d..e1da36047e8 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -86,7 +86,7 @@ "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>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfigurieren Sie zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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 ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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." : "Sie verwenden im Moment PHP {version}. Wir empfehlen ein Upgrade ihrer PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald ihre Distribution diese unterstützt.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Die Reverse-Proxy-Header-Konfiguration ist fehlerhaft oder Sie greifen auf Nextcloud über einen vertrauenswürdigen Proxy zu. Wenn Sie auf Nextcloud nicht über einen vertrauenswürdigen Proxy zugreifen, dann besteht ein Sicherheitsproblem, das einem Angreifer erlaubt die IP-Adresse, die für Nextcloud sichtbar ist, auszuspähen. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</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>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" und nicht \"memcache\". Siehe <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</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>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)", "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung", @@ -140,7 +140,6 @@ "{sharee} (remote)" : "{sharee} (entfernt)", "{sharee} (email)" : "{sharee} (E-Mail)", "Share" : "Teilen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Teilen Sie es mit Nutzern in anderen Server. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users or by mail..." : "Mit Benutzern oder per E-Mail teilen…", "Share with users or remote users..." : "Mit Benutzern oder externen Benutzern teilen…", "Share with users, remote users or by mail..." : "Mit Benutzern, externen Benutzern oder per E-Mail teilen…", @@ -157,6 +156,7 @@ "Delete" : "Löschen", "Rename" : "Umbenennen", "Collaborative tags" : "Zusammenarbeits-Tags", + "No tags found" : "Keine Tags gefunden", "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", "Enter new" : "Neuen eingeben", "Add" : "Hinzufügen", @@ -329,6 +329,7 @@ "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Sie alle Funktionen nutzen möchten.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Der REVERSE PROXY HEADER ist falsch, oder Sie greifen auf die Nextcloud von einem vertrauenswürdigen Proxy zu. Wenn Sie auf die Nextcloud nicht von einem vertrauenswürdigen Proxy zugreifen, dann liegt ein Sicherheitsproblem vor, das einem Angreifer ermöglichen könnte, die für Nextcloud sichtbare IP-Adresse zu fäschen. Weitere Informationen hierzu finden Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.", "Allow editing" : "Bearbeitung erlauben", "Sending ..." : "Senden…", "Email sent" : "E-Mail gesendet", @@ -339,7 +340,6 @@ "change" : "ändern", "delete" : "löschen", "{sharee} (at {server})" : "{sharee} (auf {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teilen Sie es mit Nutzern in anderen Nextclouds. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "Share with users…" : "Mit Benutzern teilen…", "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder externen Benutzern teilen…", "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…", @@ -364,6 +364,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Der „Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens „{seconds}“ Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" >Sicherheitshinweisen</a> erläutert ist.", "An error occured. Please try again" : "Fehler aufgetreten. Bitte erneut versuchen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Teilen Sie es mit Nutzern in anderen Nextclouds. Die Syntax hierfür lautet: username@beispiel.de/nextcloud", "not assignable" : "nicht zuweisbar", "Updating {productName} to version {version}, this may take a while." : "Aktualisiere {productName} auf Version {version}, dies kann etwas dauern.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Informationen zum richtigen Konfigurieren Ihres Servers können Sie der <a href=\"%s\" target=\"_blank\">Dokumentation</a> entnehmen.", diff --git a/core/l10n/el.js b/core/l10n/el.js index 8ea147c3b68..836876a8b87 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -283,7 +283,6 @@ OC.L10N.register( "create" : "δημιουργία", "change" : "αλλαγή", "delete" : "διαγραφή", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Share with users…" : "Διαμοιρασμός με χρήστες...", "Share with users or groups…" : "Διαμοιρασμός με χρήστες και ομάδες ...", "Share with users or remote users…" : "Διαμοιρασμός με χρήστες ή με απομακρυσμένους χρήστες...", @@ -291,6 +290,7 @@ OC.L10N.register( "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", "Updating to {version}" : "Ενημέρωση στην έκδοση {version}", "The update was successful. There were warnings." : "Η ενημέρωση ήταν επιτυχής. Υπάρχουν προειδοποιήσεις.", - "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους" + "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/el.json b/core/l10n/el.json index f52b07e9e5c..9522723e677 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -281,7 +281,6 @@ "create" : "δημιουργία", "change" : "αλλαγή", "delete" : "διαγραφή", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud", "Share with users…" : "Διαμοιρασμός με χρήστες...", "Share with users or groups…" : "Διαμοιρασμός με χρήστες και ομάδες ...", "Share with users or remote users…" : "Διαμοιρασμός με χρήστες ή με απομακρυσμένους χρήστες...", @@ -289,6 +288,7 @@ "Error while sending notification" : "Σφάλμα κατά την αποστολή ειδοποίησης", "Updating to {version}" : "Ενημέρωση στην έκδοση {version}", "The update was successful. There were warnings." : "Η ενημέρωση ήταν επιτυχής. Υπάρχουν προειδοποιήσεις.", - "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους" + "No search results in other folders" : "Δεν υπάρχουν αποτελέσματα αναζήτησης σε άλλους φακέλους", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Διαμοιρασμός με άτομα σε άλλα ownClouds χρησιμοποιώντας την σύνταξη username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js index 13bb45388fc..2384041503d 100644 --- a/core/l10n/en_GB.js +++ b/core/l10n/en_GB.js @@ -81,7 +81,6 @@ OC.L10N.register( "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>." : "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>.", "/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 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>.", "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." : "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.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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 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>.", "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>)" : "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>)", "Error occurred while checking server setup" : "Error occurred whilst checking server setup", @@ -293,6 +292,7 @@ OC.L10N.register( "Oct." : "Oct.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", "Allow editing" : "Allow editing", "Sending ..." : "Sending ...", "Email sent" : "Email sent", @@ -303,7 +303,6 @@ OC.L10N.register( "change" : "change", "delete" : "delete", "{sharee} (at {server})" : "{sharee} (at {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Share with people on other ownClouds using the syntax username@example.com/owncloud", "Share with users…" : "Share with users…", "Share with users, groups or remote users…" : "Share with users, groups or remote users…", "Share with users or groups…" : "Share with users or groups…", @@ -315,6 +314,7 @@ OC.L10N.register( "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Enhanced security has been enabled for your account. Please authenticate using a second factor.", "Cancel login" : "Cancel login", "Please authenticate using the selected factor." : "Please authenticate using the selected factor.", - "An error occured while verifying the token" : "An error occured while verifying the token" + "An error occured while verifying the token" : "An error occured while verifying the token", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Share with people on other ownClouds using the syntax username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json index f8814721e69..ab3d1b4e419 100644 --- a/core/l10n/en_GB.json +++ b/core/l10n/en_GB.json @@ -79,7 +79,6 @@ "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>." : "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>.", "/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 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>.", "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." : "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.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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 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>.", "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>)" : "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>)", "Error occurred while checking server setup" : "Error occurred whilst checking server setup", @@ -291,6 +290,7 @@ "Oct." : "Oct.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.", "Allow editing" : "Allow editing", "Sending ..." : "Sending ...", "Email sent" : "Email sent", @@ -301,7 +301,6 @@ "change" : "change", "delete" : "delete", "{sharee} (at {server})" : "{sharee} (at {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Share with people on other ownClouds using the syntax username@example.com/owncloud", "Share with users…" : "Share with users…", "Share with users, groups or remote users…" : "Share with users, groups or remote users…", "Share with users or groups…" : "Share with users or groups…", @@ -313,6 +312,7 @@ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Enhanced security has been enabled for your account. Please authenticate using a second factor.", "Cancel login" : "Cancel login", "Please authenticate using the selected factor." : "Please authenticate using the selected factor.", - "An error occured while verifying the token" : "An error occured while verifying the token" + "An error occured while verifying the token" : "An error occured while verifying the token", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Share with people on other ownClouds using the syntax username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/es.js b/core/l10n/es.js index 8913c1cbd13..c0757e7fd45 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -3,6 +3,8 @@ OC.L10N.register( { "Please select a file." : "Por favor, seleccione un archivo.", "File is too big" : "El archivo es demasiado grande", + "The selected file is not an image." : "El archivo seleccionado no es una imagen.", + "The selected file cannot be read." : "El archivo seleccionado no puede ser leído.", "Invalid file provided" : "Archivo no válido", "No image or file provided" : "No se especificó ningún archivo o imagen", "Unknown filetype" : "Tipo de archivo desconocido", @@ -57,6 +59,7 @@ OC.L10N.register( "Password can not be changed. Please contact your administrator." : "La contraseña no se puede cambiar. Por favor, contacte a su administrador.", "No" : "No", "Yes" : "Sí", + "No files in here" : "Aquí no hay archivos", "Choose" : "Seleccionar", "Error loading file picker template: {error}" : "Error al cargar plantilla del seleccionador de archivos: {error}", "Ok" : "Aceptar", @@ -73,6 +76,7 @@ OC.L10N.register( "(all selected)" : "(seleccionados todos)", "({count} selected)" : "({count} seleccionados)", "Error loading file exists template" : "Error cargando plantilla de archivo existente", + "Pending" : "Pendiente", "Very weak password" : "Contraseña muy débil", "Weak password" : "Contraseña débil", "So-so password" : "Contraseña pasable", @@ -84,7 +88,6 @@ OC.L10N.register( "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>." : "La memoria caché no ha sido configurada. Para mejorar su desempeño, por favor, configure la memcache si está disponible. Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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>." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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." : "Actualmente utiliza PHP {version}. Le aconsejamos que actualice su versión de PHP para beneficiarse de <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">mejoras de desempeño y seguridad que aporta PHP Group</a> en cuanto su distribución lo soporte.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</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 es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</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>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra documentación <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", @@ -121,6 +124,7 @@ OC.L10N.register( "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} compartido por medio de un link", "group" : "grupo", "remote" : "remoto", + "email" : "email", "Unshare" : "Dejar de compartir", "can edit" : "puede editar", "access control" : "control de acceso", @@ -132,6 +136,8 @@ OC.L10N.register( "{sharee} (group)" : "{sharee} (grupo)", "{sharee} (remote)" : "{sharee} (remoto)", "Share" : "Compartir", + "Share with users or groups..." : "Compartir con usuarios o grupos...", + "Share with users, groups or remote users..." : "Compartir con usuarios, grupos o usuarios remotos...", "Error removing share" : "Error quitando el comparto", "Non-existing tag #{tag}" : "Categoría #{tag} no existente", "restricted" : "Restringido", @@ -311,6 +317,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dic.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionarán. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.", "Allow editing" : "Permitir edición", "Sending ..." : "Enviando...", "Email sent" : "Correo electrónico enviado", @@ -321,7 +328,6 @@ OC.L10N.register( "change" : "cambio", "delete" : "eliminar", "{sharee} (at {server})" : "{sharee} (en {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share with users…" : "Compartir con usuarios...", "Share with users, groups or remote users…" : "Compartir con usuarios, grupos o usuarios remotos...", "Share with users or groups…" : "Compartir con usuarios o grupos...", @@ -346,6 +352,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de archivos no válidos…</a> / <a href=\"{rescanEndpoint}\">Rescanear…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como se describe en <a href=\"{docUrl}\">security tips</a>.", "An error occured. Please try again" : "Ha ocurrido un error. Por favor inténtelo de nuevo", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "not assignable" : "No asignable", "Updating {productName} to version {version}, this may take a while." : "Actualizando {productName} a la versión {version}, esto puede tardar un rato.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Para información sobre cómo configurar adecuadamente el servidor, por favor revise la <a href=\"%s\" target=\"_blank\">documentación</a>.", diff --git a/core/l10n/es.json b/core/l10n/es.json index 1e47476e770..95ec94ea2fd 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -1,6 +1,8 @@ { "translations": { "Please select a file." : "Por favor, seleccione un archivo.", "File is too big" : "El archivo es demasiado grande", + "The selected file is not an image." : "El archivo seleccionado no es una imagen.", + "The selected file cannot be read." : "El archivo seleccionado no puede ser leído.", "Invalid file provided" : "Archivo no válido", "No image or file provided" : "No se especificó ningún archivo o imagen", "Unknown filetype" : "Tipo de archivo desconocido", @@ -55,6 +57,7 @@ "Password can not be changed. Please contact your administrator." : "La contraseña no se puede cambiar. Por favor, contacte a su administrador.", "No" : "No", "Yes" : "Sí", + "No files in here" : "Aquí no hay archivos", "Choose" : "Seleccionar", "Error loading file picker template: {error}" : "Error al cargar plantilla del seleccionador de archivos: {error}", "Ok" : "Aceptar", @@ -71,6 +74,7 @@ "(all selected)" : "(seleccionados todos)", "({count} selected)" : "({count} seleccionados)", "Error loading file exists template" : "Error cargando plantilla de archivo existente", + "Pending" : "Pendiente", "Very weak password" : "Contraseña muy débil", "Weak password" : "Contraseña débil", "So-so password" : "Contraseña pasable", @@ -82,7 +86,6 @@ "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>." : "La memoria caché no ha sido configurada. Para mejorar su desempeño, por favor, configure la memcache si está disponible. Puede encontrar más información en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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>." : "PHP no tiene acceso a /dev/urandom lo cual es desaconsejable por razones de seguridad. Puede encontrar más información en nuestra our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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." : "Actualmente utiliza PHP {version}. Le aconsejamos que actualice su versión de PHP para beneficiarse de <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">mejoras de desempeño y seguridad que aporta PHP Group</a> en cuanto su distribución lo soporte.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</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 es un sistema de cache distribuido. pero ha sido instalado por error el modulo PHP memcache.\nConsulte <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki acerca de ambos modulos</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>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra documentación <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", @@ -119,6 +122,7 @@ "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} compartido por medio de un link", "group" : "grupo", "remote" : "remoto", + "email" : "email", "Unshare" : "Dejar de compartir", "can edit" : "puede editar", "access control" : "control de acceso", @@ -130,6 +134,8 @@ "{sharee} (group)" : "{sharee} (grupo)", "{sharee} (remote)" : "{sharee} (remoto)", "Share" : "Compartir", + "Share with users or groups..." : "Compartir con usuarios o grupos...", + "Share with users, groups or remote users..." : "Compartir con usuarios, grupos o usuarios remotos...", "Error removing share" : "Error quitando el comparto", "Non-existing tag #{tag}" : "Categoría #{tag} no existente", "restricted" : "Restringido", @@ -309,6 +315,7 @@ "Nov." : "Nov.", "Dec." : "Dic.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor no tiene una conexión a Internet. Esto significa que algunas de las características como el montaje de almacenamiento externo, las notificaciones sobre actualizaciones o instalación de aplicaciones de terceros no funcionarán. Podría no funcionar el acceso a los archivos de forma remota y el envío de correos electrónicos de notificación. Sugerimos habilitar la conexión a Internet de este servidor, si quiere tener todas las funciones.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuración de las cabeceras inversas del proxy son incorrectas, o está accediendo a ownCloud desde un proxy confiable. Si no está accediendo a ownCloud desde un proxy certificado y confiable, este es un problema de seguridad y puede permitirle a un hacker camuflar su dirección IP a ownCloud. Más información puede ser encontrada en nuestra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentación</a>.", "Allow editing" : "Permitir edición", "Sending ..." : "Enviando...", "Email sent" : "Correo electrónico enviado", @@ -319,7 +326,6 @@ "change" : "cambio", "delete" : "eliminar", "{sharee} (at {server})" : "{sharee} (en {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share with users…" : "Compartir con usuarios...", "Share with users, groups or remote users…" : "Compartir con usuarios, grupos o usuarios remotos...", "Share with users or groups…" : "Compartir con usuarios o grupos...", @@ -344,6 +350,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Algunos archivos no han superado la comprobación de integridad. Para más información sobre cómo resolver este inconveniente consulte nuestra <a target=\"_blank\" href=\"{docLink}\">documentación</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de archivos no válidos…</a> / <a href=\"{rescanEndpoint}\">Rescanear…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como se describe en <a href=\"{docUrl}\">security tips</a>.", "An error occured. Please try again" : "Ha ocurrido un error. Por favor inténtelo de nuevo", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "not assignable" : "No asignable", "Updating {productName} to version {version}, this may take a while." : "Actualizando {productName} a la versión {version}, esto puede tardar un rato.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Para información sobre cómo configurar adecuadamente el servidor, por favor revise la <a href=\"%s\" target=\"_blank\">documentación</a>.", diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index 19167452ffb..204de4c08ab 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -320,7 +320,6 @@ OC.L10N.register( "change" : "muuta", "delete" : "poista", "{sharee} (at {server})" : "{sharee} (palvelimella {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Jaa toisia ownCloud-järjestelmiä käyttävien kesken käyttäen merkintää käyttäjätunnus@example.com/owncloud", "Share with users…" : "Jaa käyttäjien kanssa…", "Share with users, groups or remote users…" : "Jaa käyttäjien, ryhmien tai etäkäyttäjien kanssa…", "Share with users or groups…" : "Jaa käyttäjien tai ryhmien kanssa…", @@ -342,6 +341,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Jotkin tiedostot eivät ole läpäisseet eheystarkistusta. Lisätietoa ongelman korjaamiseksi löytyy meidän <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP otsake ei ole määritelty vähintään \"{seconds}\" sekuntiin. Paremman tietoturvan vuoksi suosittelemme määrittelemään HSTS:n kuten kerrottu <a href=\"{docUrl}\">tietoturvaohjeissa</a>.", "An error occured. Please try again" : "Tapahtui virhe, yritä uudelleen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Jaa toisia ownCloud-järjestelmiä käyttävien kesken käyttäen merkintää käyttäjätunnus@example.com/owncloud", "not assignable" : "ei liitettävissä", "Updating {productName} to version {version}, this may take a while." : "Päivittämässä sovellusta {productName} versioon {version}, tämä voi kestää hetken.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Lisätietoja palvelimen oikeaoppiseen määritykseen on saatavilla <a href=\"%s\" target=\"_blank\">dokumentaatiossa</a>.", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index 201d04393ff..62c2a6c12de 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -318,7 +318,6 @@ "change" : "muuta", "delete" : "poista", "{sharee} (at {server})" : "{sharee} (palvelimella {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Jaa toisia ownCloud-järjestelmiä käyttävien kesken käyttäen merkintää käyttäjätunnus@example.com/owncloud", "Share with users…" : "Jaa käyttäjien kanssa…", "Share with users, groups or remote users…" : "Jaa käyttäjien, ryhmien tai etäkäyttäjien kanssa…", "Share with users or groups…" : "Jaa käyttäjien tai ryhmien kanssa…", @@ -340,6 +339,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Jotkin tiedostot eivät ole läpäisseet eheystarkistusta. Lisätietoa ongelman korjaamiseksi löytyy meidän <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP otsake ei ole määritelty vähintään \"{seconds}\" sekuntiin. Paremman tietoturvan vuoksi suosittelemme määrittelemään HSTS:n kuten kerrottu <a href=\"{docUrl}\">tietoturvaohjeissa</a>.", "An error occured. Please try again" : "Tapahtui virhe, yritä uudelleen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Jaa toisia ownCloud-järjestelmiä käyttävien kesken käyttäen merkintää käyttäjätunnus@example.com/owncloud", "not assignable" : "ei liitettävissä", "Updating {productName} to version {version}, this may take a while." : "Päivittämässä sovellusta {productName} versioon {version}, tämä voi kestää hetken.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Lisätietoja palvelimen oikeaoppiseen määritykseen on saatavilla <a href=\"%s\" target=\"_blank\">dokumentaatiossa</a>.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 4367edbc561..a4bb8ae1365 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -52,6 +52,7 @@ OC.L10N.register( "Saving..." : "Enregistrement…", "Dismiss" : "Ignorer", "seconds ago" : "à l'instant", + "Logging in …" : "Connexion…", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", "I know what I'm doing" : "Je sais ce que je fais", @@ -87,7 +88,7 @@ OC.L10N.register( "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>." : "Aucun cache mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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'est pas lisible par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "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." : "Vous utilisez actuellement PHP {version}. Nous vous encourageons à mettre à jour votre version de PHP afin de tirer avantage des amélioration liées à <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">la performance et la sécurité fournies par le PHP Group</a>, dès que votre distribution le supportera.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", + "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>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à Nextcloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à Nextcloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant d'usurper l'adresse IP affichée à Nextcloud. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "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 configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">Consulter le wiki de memcached à propos de ces deux modules.</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>)" : "Des fichiers n'ont pas réussi à passer la vérification d’intégrité. Plus d'information sur comment résoudre ce problème dans notre <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers invalides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)", "Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur", @@ -141,11 +142,13 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (distant)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Partager", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Partagez avec des personnes sur d'autres serveurs en utilisant la syntaxe utilisateur@exemple.com/nextcloud", "Share with users or by mail..." : "Partager avec des utilisateurs ou par mail…", "Share with users or remote users..." : "Partager avec des utilisateurs ou des utilisateurs distants...", + "Share with users, remote users or by mail..." : "Partager avec des utilisateurs, des utilisateurs distants ou par mail…", "Share with users or groups..." : "Partager avec des utilisateurs ou des groupes...", + "Share with users, groups or by mail..." : "Partager avec des utilisateurs, des groupes ou par mail…", "Share with users, groups or remote users..." : "Partager avec des utilisateurs, groupes ou utilisateurs distants...", + "Share with users, groups, remote users or by mail..." : "Partager avec des utilisateurs, des groupes, des utilisateurs distants ou par mail…", "Share with users..." : "Partager avec des utilisateurs...", "Error removing share" : "Erreur lors de l'arrêt du partage", "Non-existing tag #{tag}" : "Étiquette #{tag} inexistante", @@ -155,6 +158,7 @@ OC.L10N.register( "Delete" : "Supprimer", "Rename" : "Renommer", "Collaborative tags" : "Étiquettes collaboratives ", + "No tags found" : "Aucune étiquette n'a été trouvée", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", "Add" : "Ajouter", @@ -177,6 +181,7 @@ OC.L10N.register( "Continue to Nextcloud" : "Continuer sur Nextcloud", "The update was successful. Redirecting you to Nextcloud now." : "La mise à jour a réussi. Vous allez être redirigé vers votre Nextcloud.", "Searching other places" : "Recherche en cours dans d'autres emplacements", + "No search results in other folders for '{tag}{filter}{endtag}'" : "Aucun résultat dans d'autres dossiers n'a été trouvé pour '{tag}{filter}{endtag}'", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], "Personal" : "Personnel", "Users" : "Utilisateurs", @@ -326,6 +331,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Déc.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par mail peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "Allow editing" : "Permettre la modification", "Sending ..." : "Envoi…", "Email sent" : "Courriel envoyé", @@ -336,7 +342,6 @@ OC.L10N.register( "change" : "modification", "delete" : "suppression", "{sharee} (at {server})" : "{sharee} (sur {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "Share with users…" : "Partager avec des utilisateurs...", "Share with users, groups or remote users…" : "Partager avec des utilisateurs, groupes ou utilisateurs distants...", "Share with users or groups…" : "Partager avec des utilisateurs ou des groupes...", @@ -361,6 +366,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Plusieurs fichiers n'ont pas passé le test d'intégrité. Plus d'informations pour résoudre ce problème peuvent être trouvé sur notre <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers invalides.../a> / <a href=\"{rescanEndpoint}\">Réanalyser...</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'entête HTTP \"Strict-Transport-Security\" n'est pas configuré pour les dernières \"{seconds}\" secondes. Pour améliorer votre sécurité nous recommandons d'activer HSTS comme décrit dans notre <a href=\"{docUrl}\">aide de sécurité</a>.", "An error occured. Please try again" : "Une erreur est survenue. Merci d'essayer à nouveau", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "not assignable" : "non assignable", "Updating {productName} to version {version}, this may take a while." : "Mise à jour de {productName} vers la version {version}, cela peut prendre du temps.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "POur des informations sur comment configurer proprement votre serveur, merci de regarder la <a href=\"%s\" target=\"_blank\">documentation</a>.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 49262ff5d13..1210c70ca4f 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -50,6 +50,7 @@ "Saving..." : "Enregistrement…", "Dismiss" : "Ignorer", "seconds ago" : "à l'instant", + "Logging in …" : "Connexion…", "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Un lien permettant de réinitialiser votre mot de passe vient de vous être envoyé par courriel.<br>Si vous ne le recevez pas dans un délai raisonnable, contactez votre administrateur.<br>N'oubliez pas de vérifier dans votre dossier pourriel / spam!", "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Vos fichiers sont chiffrés. Si vous n'avez pas activé la clé de récupération, il n'y aura aucun moyen de récupérer vos données une fois le mot de passe réinitialisé.<br />Si vous n'êtes pas sûr de ce que vous faites, veuillez contacter votre administrateur avant de continuer. <br />Voulez-vous vraiment continuer ?", "I know what I'm doing" : "Je sais ce que je fais", @@ -85,7 +86,7 @@ "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>." : "Aucun cache mémoire n'est configuré. Si possible, configurez un \"memcache\" pour augmenter les performances. Pour plus d'information consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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'est pas lisible par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "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." : "Vous utilisez actuellement PHP {version}. Nous vous encourageons à mettre à jour votre version de PHP afin de tirer avantage des amélioration liées à <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">la performance et la sécurité fournies par le PHP Group</a>, dès que votre distribution le supportera.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", + "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>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à Nextcloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à Nextcloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant d'usurper l'adresse IP affichée à Nextcloud. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "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 configuré comme cache distribué, mais le module installé est \"memcache\". \\OC\\Memcache\\Memcached ne prend en charge que \"memcached\" et non \"memcache\". <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">Consulter le wiki de memcached à propos de ces deux modules.</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>)" : "Des fichiers n'ont pas réussi à passer la vérification d’intégrité. Plus d'information sur comment résoudre ce problème dans notre <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers invalides…</a> / <a href=\"{rescanEndpoint}\">Relancer…</a>)", "Error occurred while checking server setup" : "Une erreur s'est produite lors de la vérification de la configuration du serveur", @@ -139,11 +140,13 @@ "{sharee} (remote)" : "{sharee} (distant)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Partager", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Partagez avec des personnes sur d'autres serveurs en utilisant la syntaxe utilisateur@exemple.com/nextcloud", "Share with users or by mail..." : "Partager avec des utilisateurs ou par mail…", "Share with users or remote users..." : "Partager avec des utilisateurs ou des utilisateurs distants...", + "Share with users, remote users or by mail..." : "Partager avec des utilisateurs, des utilisateurs distants ou par mail…", "Share with users or groups..." : "Partager avec des utilisateurs ou des groupes...", + "Share with users, groups or by mail..." : "Partager avec des utilisateurs, des groupes ou par mail…", "Share with users, groups or remote users..." : "Partager avec des utilisateurs, groupes ou utilisateurs distants...", + "Share with users, groups, remote users or by mail..." : "Partager avec des utilisateurs, des groupes, des utilisateurs distants ou par mail…", "Share with users..." : "Partager avec des utilisateurs...", "Error removing share" : "Erreur lors de l'arrêt du partage", "Non-existing tag #{tag}" : "Étiquette #{tag} inexistante", @@ -153,6 +156,7 @@ "Delete" : "Supprimer", "Rename" : "Renommer", "Collaborative tags" : "Étiquettes collaboratives ", + "No tags found" : "Aucune étiquette n'a été trouvée", "The object type is not specified." : "Le type d'objet n'est pas spécifié.", "Enter new" : "Saisir un nouveau", "Add" : "Ajouter", @@ -175,6 +179,7 @@ "Continue to Nextcloud" : "Continuer sur Nextcloud", "The update was successful. Redirecting you to Nextcloud now." : "La mise à jour a réussi. Vous allez être redirigé vers votre Nextcloud.", "Searching other places" : "Recherche en cours dans d'autres emplacements", + "No search results in other folders for '{tag}{filter}{endtag}'" : "Aucun résultat dans d'autres dossiers n'a été trouvé pour '{tag}{filter}{endtag}'", "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} résultat dans un autre dossier","{count} résultats dans d'autres dossiers"], "Personal" : "Personnel", "Users" : "Utilisateurs", @@ -324,6 +329,7 @@ "Nov." : "Nov.", "Dec." : "Déc.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ce serveur ne peut se connecter à internet. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que les notifications par mail peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configuration des entêtes du proxy inverse est incorrecte, ou vous accédez à ownCloud depuis un proxy de confiance. Si vous n'êtes pas en train d’accéder à ownCloud depuis un proxy de confiance, ceci est un problème de sécurité qui peut permettre à un attaquant de masquer sa véritable adresse IP. Consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a> pour avoir plus d'informations à ce sujet.", "Allow editing" : "Permettre la modification", "Sending ..." : "Envoi…", "Email sent" : "Courriel envoyé", @@ -334,7 +340,6 @@ "change" : "modification", "delete" : "suppression", "{sharee} (at {server})" : "{sharee} (sur {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "Share with users…" : "Partager avec des utilisateurs...", "Share with users, groups or remote users…" : "Partager avec des utilisateurs, groupes ou utilisateurs distants...", "Share with users or groups…" : "Partager avec des utilisateurs ou des groupes...", @@ -359,6 +364,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Plusieurs fichiers n'ont pas passé le test d'intégrité. Plus d'informations pour résoudre ce problème peuvent être trouvé sur notre <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste des fichiers invalides.../a> / <a href=\"{rescanEndpoint}\">Réanalyser...</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'entête HTTP \"Strict-Transport-Security\" n'est pas configuré pour les dernières \"{seconds}\" secondes. Pour améliorer votre sécurité nous recommandons d'activer HSTS comme décrit dans notre <a href=\"{docUrl}\">aide de sécurité</a>.", "An error occured. Please try again" : "Une erreur est survenue. Merci d'essayer à nouveau", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partagez avec des personnes sur d'autres ownClouds en utilisant la syntaxe utilisateur@exemple.com/owncloud", "not assignable" : "non assignable", "Updating {productName} to version {version}, this may take a while." : "Mise à jour de {productName} vers la version {version}, cela peut prendre du temps.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "POur des informations sur comment configurer proprement votre serveur, merci de regarder la <a href=\"%s\" target=\"_blank\">documentation</a>.", diff --git a/core/l10n/he.js b/core/l10n/he.js index 6e87409c1ba..66375b30a4f 100644 --- a/core/l10n/he.js +++ b/core/l10n/he.js @@ -81,7 +81,6 @@ OC.L10N.register( "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>." : "לא הוגדר זיכרון מטמון. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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 אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- PHP</a> ברגע שההפצה אליך תתמוך בזה.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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 מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</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>)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)", "Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת", @@ -290,6 +289,7 @@ OC.L10N.register( "Oct." : "אוק׳", "Nov." : "נוב׳", "Dec." : "דצמ׳", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", "Allow editing" : "אישור עריכה", "Sending ..." : "מתבצעת שליחה ...", "Email sent" : "הודעת הדוא״ל נשלחה", @@ -300,7 +300,6 @@ OC.L10N.register( "change" : "שינוי", "delete" : "מחיקה", "{sharee} (at {server})" : "{sharee} (ב- {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "ניתן לשתף עם אנשים אחרים המשתמשים ב- ownClouds בעזרת הפורמט הבא username@example.com/owncloud", "Share with users…" : "שיתוף עם משתמשים...", "Share with users, groups or remote users…" : "שיתוף עם משתמשים, קבוצות או משתמשים מרוחקים...", "Share with users or groups…" : "שיתוף עם משתמשים או קבוצות...", @@ -312,6 +311,7 @@ OC.L10N.register( "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "אבטחה מורחבת הופעלה בחשבון שלך. יש לאמת באמצעות גורם שני.", "Cancel login" : "ביטול התחברות", "Please authenticate using the selected factor." : "יש לאמת באמצעות גורם נבחר.", - "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת" + "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "ניתן לשתף עם אנשים אחרים המשתמשים ב- ownClouds בעזרת הפורמט הבא username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/he.json b/core/l10n/he.json index 98e657db084..2b1dc54f058 100644 --- a/core/l10n/he.json +++ b/core/l10n/he.json @@ -79,7 +79,6 @@ "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>." : "לא הוגדר זיכרון מטמון. על מנת לשפר את הביצועים יש להגדיר memcache אם קיים. מידע נוסף ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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 אינו ניתן לקריאה על ידי PHP אשר אינו מומלץ בשל סיבות אבטחה. מידע נוסף ניתן לראות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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." : "כרגע המערכת מריצה PHP {version}. מומלץ מאוד לשדרג את גרסת ה- PHP vשלך כדי לנצל את <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">עדכוני הביצועים והאבטחה המופקים על ידי קבוצת ה- PHP</a> ברגע שההפצה אליך תתמוך בזה.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</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 מוגדר כמטמון מופץ, אבל מותקן מודול PHP \"memcache\" מוטעה. רק \\OC\\Memcache\\Memcached תומך ב- \"memcached\" אבל לא ב- \"memcache\". ניתן לצפות ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki בנושא שני המודולים</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>)" : "חלק מהקבצים לא עברו את בדיקת השלמות. מידע נוסף איך לפתור את הבעיה ניתן למצוא ב- to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו. (<a href=\"{codeIntegrityDownloadEndpoint}\">רשימה של קבצים לא תקינים…</a> / <a href=\"{rescanEndpoint}\">סריקה מחדש…</a>)", "Error occurred while checking server setup" : "שגיאה אירעה בזמן בדיקת התקנת השרת", @@ -288,6 +287,7 @@ "Oct." : "אוק׳", "Nov." : "נוב׳", "Dec." : "דצמ׳", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "תצורת כותרות פרוקסי ההפוכה אינה נכונה, או שהגישה ל- ownCloud מתבצעת מ- proxy אמין. אם הגישה ל- ownCloud אינה מ- proxy אמין, מדובר בבעיית אבטחה שמאפשרת לתוקף לזייף את כתובת ה- IP כגלויה ל- ownCloud. מידע נוסף ניתן למצוא ב- <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">מסמכי התיעוד</a> שלנו.", "Allow editing" : "אישור עריכה", "Sending ..." : "מתבצעת שליחה ...", "Email sent" : "הודעת הדוא״ל נשלחה", @@ -298,7 +298,6 @@ "change" : "שינוי", "delete" : "מחיקה", "{sharee} (at {server})" : "{sharee} (ב- {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "ניתן לשתף עם אנשים אחרים המשתמשים ב- ownClouds בעזרת הפורמט הבא username@example.com/owncloud", "Share with users…" : "שיתוף עם משתמשים...", "Share with users, groups or remote users…" : "שיתוף עם משתמשים, קבוצות או משתמשים מרוחקים...", "Share with users or groups…" : "שיתוף עם משתמשים או קבוצות...", @@ -310,6 +309,7 @@ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "אבטחה מורחבת הופעלה בחשבון שלך. יש לאמת באמצעות גורם שני.", "Cancel login" : "ביטול התחברות", "Please authenticate using the selected factor." : "יש לאמת באמצעות גורם נבחר.", - "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת" + "An error occured while verifying the token" : "שגיאה אירעה בזמן אימות המחרוזת", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "ניתן לשתף עם אנשים אחרים המשתמשים ב- ownClouds בעזרת הפורמט הבא username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js index d027403bab1..300a5538744 100644 --- a/core/l10n/hu_HU.js +++ b/core/l10n/hu_HU.js @@ -88,7 +88,7 @@ OC.L10N.register( "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>." : "Nincs memória gyorsítótár beállítva. A teljesítmény növelése érdekében kérjük állítsa be a memcache-t, ha elérhető. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "/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 nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "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." : "Jelenleg {version} PHP verziót használ. Javasoljuk, hogy frissítse a PHP verziót, hogy kihasználhassa a <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">teljesítménybeli és a biztonságbeli előnyöket, amiket a PHP csoport kínál</a>, amilyen hamar a disztribúciója támogatja.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", + "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>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálod a Nextcloudot elérni. Ha nem megbízható proxy-ból próbálod elérni az Nextcloudot, akkor ez egy biztonsági probléma, a támadó az Nextcloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhatsz.", "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 be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézze meg a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</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>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", @@ -142,7 +142,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (távoli)", "{sharee} (email)" : "{sharee} (e-mail)", "Share" : "Megosztás", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Megosztás más szervert használó emberekkel, a következő szintaxissal: username@example.com/nextcloud", "Share with users or by mail..." : "Megosztás felhasználókkal e-mailben...", "Share with users or remote users..." : "Megosztás helyi vagy távoli felhasználókkal...", "Share with users, remote users or by mail..." : "Megosztás helyi vagy távoli felhasználókkal e-mailben...", @@ -159,6 +158,7 @@ OC.L10N.register( "Delete" : "Törlés", "Rename" : "Átnevezés", "Collaborative tags" : "Címke hozzárendelése", + "No tags found" : "Nem találhatók címkék", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", "Add" : "Hozzáadás", @@ -331,6 +331,7 @@ OC.L10N.register( "Nov." : "nov.", "Dec." : "dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány funkció, mint pl. külső tárolók csatolása, frissítési értesítések, vagy a harmadik féltől származó alkalmazások telepítése nem fog működni. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden funkciót használni szeretnél.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "Allow editing" : "Szerkesztés engedélyezése", "Sending ..." : "Küldés ...", "Email sent" : "Az e-mailt elküldtük!", @@ -341,7 +342,6 @@ OC.L10N.register( "change" : "módosít", "delete" : "töröl", "{sharee} (at {server})" : "{sharee} ({server} szerveren)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud", "Share with users…" : "Megosztás felhasználókkal", "Share with users, groups or remote users…" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal...", "Share with users or groups…" : "Megosztás felhasználókkal vagy csoportokkal...", @@ -366,6 +366,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" href=\"{docLink}\">dokumentációban</a> találhatsz. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezd a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", "An error occured. Please try again" : "Hiba történt. Kérjük, próbálja újra!", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud", "not assignable" : "nem hozzárendelhető", "Updating {productName} to version {version}, this may take a while." : "{productName} frissítése erre a verzióra: {version}, ez eltarthat egy ideig.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "A szerver megfelelő beállításához kérjük olvasd el a <a href=\"%s\" target=\"_blank\">dokumentációt</a>.", diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json index 8f155a5663e..01805210235 100644 --- a/core/l10n/hu_HU.json +++ b/core/l10n/hu_HU.json @@ -86,7 +86,7 @@ "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>." : "Nincs memória gyorsítótár beállítva. A teljesítmény növelése érdekében kérjük állítsa be a memcache-t, ha elérhető. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "/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 nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "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." : "Jelenleg {version} PHP verziót használ. Javasoljuk, hogy frissítse a PHP verziót, hogy kihasználhassa a <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">teljesítménybeli és a biztonságbeli előnyöket, amiket a PHP csoport kínál</a>, amilyen hamar a disztribúciója támogatja.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", + "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>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálod a Nextcloudot elérni. Ha nem megbízható proxy-ból próbálod elérni az Nextcloudot, akkor ez egy biztonsági probléma, a támadó az Nextcloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhatsz.", "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 be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézze meg a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</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>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)", "Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben", @@ -140,7 +140,6 @@ "{sharee} (remote)" : "{sharee} (távoli)", "{sharee} (email)" : "{sharee} (e-mail)", "Share" : "Megosztás", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Megosztás más szervert használó emberekkel, a következő szintaxissal: username@example.com/nextcloud", "Share with users or by mail..." : "Megosztás felhasználókkal e-mailben...", "Share with users or remote users..." : "Megosztás helyi vagy távoli felhasználókkal...", "Share with users, remote users or by mail..." : "Megosztás helyi vagy távoli felhasználókkal e-mailben...", @@ -157,6 +156,7 @@ "Delete" : "Törlés", "Rename" : "Átnevezés", "Collaborative tags" : "Címke hozzárendelése", + "No tags found" : "Nem találhatók címkék", "The object type is not specified." : "Az objektum típusa nincs megadva.", "Enter new" : "Új beírása", "Add" : "Hozzáadás", @@ -329,6 +329,7 @@ "Nov." : "nov.", "Dec." : "dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány funkció, mint pl. külső tárolók csatolása, frissítési értesítések, vagy a harmadik féltől származó alkalmazások telepítése nem fog működni. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden funkciót használni szeretnél.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.", "Allow editing" : "Szerkesztés engedélyezése", "Sending ..." : "Küldés ...", "Email sent" : "Az e-mailt elküldtük!", @@ -339,7 +340,6 @@ "change" : "módosít", "delete" : "töröl", "{sharee} (at {server})" : "{sharee} ({server} szerveren)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud", "Share with users…" : "Megosztás felhasználókkal", "Share with users, groups or remote users…" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal...", "Share with users or groups…" : "Megosztás felhasználókkal vagy csoportokkal...", @@ -364,6 +364,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" href=\"{docLink}\">dokumentációban</a> találhatsz. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezd a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban.", "An error occured. Please try again" : "Hiba történt. Kérjük, próbálja újra!", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud", "not assignable" : "nem hozzárendelhető", "Updating {productName} to version {version}, this may take a while." : "{productName} frissítése erre a verzióra: {version}, ez eltarthat egy ideig.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "A szerver megfelelő beállításához kérjük olvasd el a <a href=\"%s\" target=\"_blank\">dokumentációt</a>.", diff --git a/core/l10n/id.js b/core/l10n/id.js index 943a9167fa3..193eca9e155 100644 --- a/core/l10n/id.js +++ b/core/l10n/id.js @@ -82,7 +82,6 @@ OC.L10N.register( "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>." : "Tidak ada memory cache telah dikonfigurasi. Untuk meningkatkan kinerja, mohon mengkonfigurasi memcache jika tersedia. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "/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 tidak bisa dibaca oleh PHP dan sangat tidak disarankan untuk alasan keamanan. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "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." : "Anda sekarang menjalankan PHP {version}. Kami menyarankan Anda untuk perbarui versi PHP Anda untuk memanfaatkan <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performa dan pembaruan keamanan yang disediakan oleh PHP Group</a> saat distribusi Anda mendukungnya.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "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 terkonfigurasi sebagai cache terdistribusi, tetapi modul PHP \"memcache\" yang salah terpasang. \\OC\\Memcache\\Memcached hanya mendukung \"memcached\" dan bukan \"memcache\". Lihat <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki memcached tentang kedua modul</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>)" : "Beberapa berkas tidak lulus cek integritas. Informasi lebih lanjut tentang cara mengatasi masalah ini dapat ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami. (<a href=\"{codeIntegrityDownloadEndpoint}\">Daftar berkas yang tidak valid…</a> / <a href=\"{rescanEndpoint}\">Pindai ulang…</a>)", "Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server", @@ -302,6 +301,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Des.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "Allow editing" : "Izinkan penyuntingan", "Sending ..." : "Mengirim ...", "Email sent" : "Email terkirim", @@ -312,7 +312,6 @@ OC.L10N.register( "change" : "ubah", "delete" : "hapus", "{sharee} (at {server})" : "{sharee} (di {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "Share with users…" : "Bagikan kepada pengguna...", "Share with users, groups or remote users…" : "Bagikan kepada pengguna, grup atau remote...", "Share with users or groups…" : "Bagikan kepada pengguna atau grup...", @@ -337,6 +336,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Beberapa berkas tidak lulus cek integritas. Informasi lebih lanjut tentang cara mengatasi masalah ini dapat ditemukan di <a target=\"_blank\" href=\"{docLink}\">dokumentasi</a> kami. (<a href=\"{codeIntegrityDownloadEndpoint}\">Daftar berkas yang tidak valid…</a> / <a href=\"{rescanEndpoint}\">Pindai ulang…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Header \"Strict-Transport-Security\" HTTP tidak terkonfigurasi ke setidaknya \"{seconds}\" detik. Untuk meningkatkan kemanan kami merekomendasikan mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">saran keamanan</a> kami.", "An error occured. Please try again" : "Terjadi kesalahan. Silakan coba lagi", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "not assignable" : "tidak dapat disematkan", "Updating {productName} to version {version}, this may take a while." : "Memperbarui {productName} ke versi {version}, ini dapat memakan waktu.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Untuk informasi bagaimana menkonfigurasi server Anda dengan benar, silakan lihat <a href=\"%s\" target=\"_blank\">dokumentasi</a>.", diff --git a/core/l10n/id.json b/core/l10n/id.json index 7ad8cd6942b..1b0c65f3ad1 100644 --- a/core/l10n/id.json +++ b/core/l10n/id.json @@ -80,7 +80,6 @@ "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>." : "Tidak ada memory cache telah dikonfigurasi. Untuk meningkatkan kinerja, mohon mengkonfigurasi memcache jika tersedia. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "/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 tidak bisa dibaca oleh PHP dan sangat tidak disarankan untuk alasan keamanan. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "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." : "Anda sekarang menjalankan PHP {version}. Kami menyarankan Anda untuk perbarui versi PHP Anda untuk memanfaatkan <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performa dan pembaruan keamanan yang disediakan oleh PHP Group</a> saat distribusi Anda mendukungnya.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "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 terkonfigurasi sebagai cache terdistribusi, tetapi modul PHP \"memcache\" yang salah terpasang. \\OC\\Memcache\\Memcached hanya mendukung \"memcached\" dan bukan \"memcache\". Lihat <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki memcached tentang kedua modul</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>)" : "Beberapa berkas tidak lulus cek integritas. Informasi lebih lanjut tentang cara mengatasi masalah ini dapat ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami. (<a href=\"{codeIntegrityDownloadEndpoint}\">Daftar berkas yang tidak valid…</a> / <a href=\"{rescanEndpoint}\">Pindai ulang…</a>)", "Error occurred while checking server setup" : "Kesalahan tidak terduga saat memeriksa setelan server", @@ -300,6 +299,7 @@ "Nov." : "Nov.", "Dec." : "Des.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server ini tidak tersambung ke internet. Ini berarti beberapa fitur seperti me-mount penyimpanan eksternal, notifikasi pembaruan atau instalasi aplikasi pihak ketiga tidak akan bekerja. Mengakses berkas secara remote dan mengirim notifikasi email juga tidak bekerja. Kami menyarankan untuk mengaktifkan koneksi internet untuk server ini jika Anda ingin memiliki fitur ini.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurasi proxy header terbalik salah, atau Anda mengakses ownCloud dari proxy terpercaya. Apabila Anda tidak mengakses ownCloud dari proxy terpercaya, ini adalah masalah keamanan dan penyerang dapat memalsukan alamat IP mereka ke ownCloud. Informasi selanjutnya bisa ditemukan di <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasi</a> kami.", "Allow editing" : "Izinkan penyuntingan", "Sending ..." : "Mengirim ...", "Email sent" : "Email terkirim", @@ -310,7 +310,6 @@ "change" : "ubah", "delete" : "hapus", "{sharee} (at {server})" : "{sharee} (di {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "Share with users…" : "Bagikan kepada pengguna...", "Share with users, groups or remote users…" : "Bagikan kepada pengguna, grup atau remote...", "Share with users or groups…" : "Bagikan kepada pengguna atau grup...", @@ -335,6 +334,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Beberapa berkas tidak lulus cek integritas. Informasi lebih lanjut tentang cara mengatasi masalah ini dapat ditemukan di <a target=\"_blank\" href=\"{docLink}\">dokumentasi</a> kami. (<a href=\"{codeIntegrityDownloadEndpoint}\">Daftar berkas yang tidak valid…</a> / <a href=\"{rescanEndpoint}\">Pindai ulang…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Header \"Strict-Transport-Security\" HTTP tidak terkonfigurasi ke setidaknya \"{seconds}\" detik. Untuk meningkatkan kemanan kami merekomendasikan mengaktifkan HSTS seperti yang dijelaskan di <a href=\"{docUrl}\">saran keamanan</a> kami.", "An error occured. Please try again" : "Terjadi kesalahan. Silakan coba lagi", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Bagikan dengan orang lain di ownCloud menggunakan sintaks username@example.com/owncloud", "not assignable" : "tidak dapat disematkan", "Updating {productName} to version {version}, this may take a while." : "Memperbarui {productName} ke versi {version}, ini dapat memakan waktu.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Untuk informasi bagaimana menkonfigurasi server Anda dengan benar, silakan lihat <a href=\"%s\" target=\"_blank\">dokumentasi</a>.", diff --git a/core/l10n/is.js b/core/l10n/is.js index 92794375b77..4fc8ee663b1 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -82,7 +82,6 @@ OC.L10N.register( "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>." : "Ekkert skyndiminni (cache) hefur verið stillt. Til að auka afköst ættirðu að setja upp skyndiminni (með memcache) ef það er tiltækt. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "/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 er ekki lesanlegt af PHP sem er mjög óráðlegt af öryggisástæðum. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "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." : "Þú ert að keyra PHP {version}. Við hvetjum þig til að uppfæra PHP útgáfuna til að njóta <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">afkastaaukningar og öryggisuppfærslna frá PHP Group</a> um leið og dreifingin þín styður það.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "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 er sett upp sem dreift skyndiminni, en hinsvegar er ranga PHP-einingin \"memcache\" uppsett. \\OC\\Memcache\\Memcached styður einungis \"memcached\" en ekki \"memcache\". Skoðaðu <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki-síðurnar um báðar einingarnar</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>)" : "Sumar skrár hafa ekki staðist áreiðanleikaprófun. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listi yfir ógildar skrár…</a> / <a href=\"{rescanEndpoint}\">Endurskanna…</a>)", "Error occurred while checking server setup" : "Villa kom upp við athugun á uppsetningu þjóns", @@ -308,6 +307,7 @@ OC.L10N.register( "Nov." : "Nóv.", "Dec." : "Des.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Þessi þjónn er ekki með virka nettengingu. Þetta þýðir að sumir eiginleikar eins og að virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á forritum þriðja aðila, mun ekki virka. Fjartengdur aðgangur að skrám og sending tilkynninga í tölvupósti virka líklega ekki heldur. Við leggjum til að internettenging sé virkjuð fyrir þennan vefþjón ef þú vilt hafa alla eiginleika tiltæka.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "Allow editing" : "Leyfa breytingar", "Sending ..." : "Sendi ...", "Email sent" : "Tölvupóstur sendur", @@ -318,7 +318,6 @@ OC.L10N.register( "change" : "breyta", "delete" : "eyða", "{sharee} (at {server})" : "{sharee} (á {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólki í öðrum Nextcloud-skýjum með skipuninni notandanafn@dæmi.is/nextcloud", "Share with users…" : "Deila með notendum...", "Share with users, groups or remote users…" : "Deila með notendum, hópa eða fjartengdum notendum...", "Share with users or groups…" : "Deila með notendum eða hópum...", @@ -343,6 +342,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sumar skrár hafa ekki staðist áreiðanleikaprófun. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" href=\"{docLink}\">hjálparskjölum</a> okkar. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listi yfir ógildar skrár…</a> / <a href=\"{rescanEndpoint}\">Endurskanna…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP-hausinn er ekki stilltur á að minnsa kosti \"{seconds}\" sekúndur. Fyrir aukið öryggi mælum við með því að virkja HSTS eins og lýst er í <a href=\"{docUrl}\">öryggisleiðbeiningum</a>.", "An error occured. Please try again" : "Villa kom upp. Endilega reyndu aftur", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólki í öðrum Nextcloud-skýjum með skipuninni notandanafn@dæmi.is/nextcloud", "not assignable" : "ekki úthlutanlegt", "Updating {productName} to version {version}, this may take a while." : "Uppfæri {productName} í útgáfu {version}, þetta getur tekið smá stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Til að fá upplýsingar hvernig á að stilla miðlara almennilega, skaltu skoða <a href=\"%s\" target=\"_blank\">hjálparskjölin</a>.", diff --git a/core/l10n/is.json b/core/l10n/is.json index 5f8f6271dac..465c8f3baf1 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -80,7 +80,6 @@ "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>." : "Ekkert skyndiminni (cache) hefur verið stillt. Til að auka afköst ættirðu að setja upp skyndiminni (með memcache) ef það er tiltækt. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "/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 er ekki lesanlegt af PHP sem er mjög óráðlegt af öryggisástæðum. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "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." : "Þú ert að keyra PHP {version}. Við hvetjum þig til að uppfæra PHP útgáfuna til að njóta <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">afkastaaukningar og öryggisuppfærslna frá PHP Group</a> um leið og dreifingin þín styður það.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "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 er sett upp sem dreift skyndiminni, en hinsvegar er ranga PHP-einingin \"memcache\" uppsett. \\OC\\Memcache\\Memcached styður einungis \"memcached\" en ekki \"memcache\". Skoðaðu <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki-síðurnar um báðar einingarnar</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>)" : "Sumar skrár hafa ekki staðist áreiðanleikaprófun. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listi yfir ógildar skrár…</a> / <a href=\"{rescanEndpoint}\">Endurskanna…</a>)", "Error occurred while checking server setup" : "Villa kom upp við athugun á uppsetningu þjóns", @@ -306,6 +305,7 @@ "Nov." : "Nóv.", "Dec." : "Des.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Þessi þjónn er ekki með virka nettengingu. Þetta þýðir að sumir eiginleikar eins og að virkja ytri gagnageymslu, tilkynningar um uppfærslur eða uppsetningu á forritum þriðja aðila, mun ekki virka. Fjartengdur aðgangur að skrám og sending tilkynninga í tölvupósti virka líklega ekki heldur. Við leggjum til að internettenging sé virkjuð fyrir þennan vefþjón ef þú vilt hafa alla eiginleika tiltæka.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Uppsetning gagnstæðs milliþjónshauss (reverse proxy header) er röng, eða að þú ert að tengjast Nextcloud frá treystum milliþjóni. Ef þú ert ekki að tengjast Nextcloud frá treystum milliþjóni, þá er þetta er öryggisvandamál og getur leyft árásaraðilum að dulbúa IP-vistfang þeirra sem sýnilegt Nextcloud. Nánari upplýsingar má finna í <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">hjálparskjölum</a> okkar.", "Allow editing" : "Leyfa breytingar", "Sending ..." : "Sendi ...", "Email sent" : "Tölvupóstur sendur", @@ -316,7 +316,6 @@ "change" : "breyta", "delete" : "eyða", "{sharee} (at {server})" : "{sharee} (á {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólki í öðrum Nextcloud-skýjum með skipuninni notandanafn@dæmi.is/nextcloud", "Share with users…" : "Deila með notendum...", "Share with users, groups or remote users…" : "Deila með notendum, hópa eða fjartengdum notendum...", "Share with users or groups…" : "Deila með notendum eða hópum...", @@ -341,6 +340,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sumar skrár hafa ekki staðist áreiðanleikaprófun. Hægt er að finna nánari upplýsingar um þetta í <a target=\"_blank\" href=\"{docLink}\">hjálparskjölum</a> okkar. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listi yfir ógildar skrár…</a> / <a href=\"{rescanEndpoint}\">Endurskanna…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP-hausinn er ekki stilltur á að minnsa kosti \"{seconds}\" sekúndur. Fyrir aukið öryggi mælum við með því að virkja HSTS eins og lýst er í <a href=\"{docUrl}\">öryggisleiðbeiningum</a>.", "An error occured. Please try again" : "Villa kom upp. Endilega reyndu aftur", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Deila með fólki í öðrum Nextcloud-skýjum með skipuninni notandanafn@dæmi.is/nextcloud", "not assignable" : "ekki úthlutanlegt", "Updating {productName} to version {version}, this may take a while." : "Uppfæri {productName} í útgáfu {version}, þetta getur tekið smá stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Til að fá upplýsingar hvernig á að stilla miðlara almennilega, skaltu skoða <a href=\"%s\" target=\"_blank\">hjálparskjölin</a>.", diff --git a/core/l10n/it.js b/core/l10n/it.js index b2542848f50..e6e13e6fc0d 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -5,7 +5,7 @@ OC.L10N.register( "File is too big" : "Il file è troppo grande", "The selected file is not an image." : "Il file selezionato non è un'immagine.", "The selected file cannot be read." : "Il file selezionato non può essere letto.", - "Invalid file provided" : "File non valido fornito", + "Invalid file provided" : "File fornito non valido ", "No image or file provided" : "Non è stata fornita alcun immagine o file", "Unknown filetype" : "Tipo di file sconosciuto", "Invalid image" : "Immagine non valida", @@ -20,7 +20,7 @@ OC.L10N.register( "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", "%s password reset" : "Ripristino password di %s", "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", - "Preparing update" : "Preparazione aggiornamento", + "Preparing update" : "Preparazione all'aggiornamento", "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Avviso di riparazione", "Repair error: " : "Errore di riparazione:", @@ -32,12 +32,12 @@ OC.L10N.register( "Updating database schema" : "Aggiornamento schema database", "Updated database" : "Database aggiornato", "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Controllo che lo schema del database possa essere aggiornato (ciò potrebbe richiedere molto tempo in base alla dimensione del database)", - "Checked database schema update" : "Verificato l'aggiornamento dello schema del database", + "Checked database schema update" : "L'aggiornamento dello schema del database è stato verificato", "Checking updates of apps" : "Controllo degli aggiornamenti delle applicazioni", "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Controllo che lo schema del database di %s possa essere aggiornato (ciò potrebbe richiedere molto tempo in base alla dimensione del database)", - "Checked database schema update for apps" : "Verificato l'aggiornamento dello schema del database per le applicazioni", + "Checked database schema update for apps" : "L'aggiornamento dello schema del database per le applicazioni è stato verificato", "Updated \"%s\" to %s" : "Aggiornato \"%s\" a %s", - "Set log level to debug" : "Imposta il livello del log a debug", + "Set log level to debug" : "Imposta il livello del log per il debug", "Reset log level" : "Ripristina il livello del log", "Starting code integrity check" : "Avvio del controllo di integrità del codice", "Finished code integrity check" : "Controllo di integrità del codice terminato", @@ -88,7 +88,7 @@ OC.L10N.register( "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>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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 non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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." : "Stai eseguendo attualmente PHP {version}. Ti esortiamo ad aggiornare la tua versione di PHP per trarre vantaggio dagli aggiornamenti in termini di <a target=\"_blank\" rel=\"noreferrer\" ref=\"{phpLink}\">prestazioni e sicurezza forniti dal PHP Group</a> non appena la tua distribuzione la supporta.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a Nextcloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a Nextcloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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 è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</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>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)", "Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server", @@ -142,7 +142,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (remote)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Condividi", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Condividi con persone su altri server utilizzando la sintassi nomeutente@esempio.com/nextcloud", "Share with users or by mail..." : "Condividi con utenti o tramite posta...", "Share with users or remote users..." : "Condividi con utenti o utenti remoti...", "Share with users, remote users or by mail..." : "Condividi con utenti, utenti remoti o tramite posta...", @@ -159,6 +158,7 @@ OC.L10N.register( "Delete" : "Elimina", "Rename" : "Rinomina", "Collaborative tags" : "Etichette collaborative", + "No tags found" : "Nessuna etichetta trovata", "The object type is not specified." : "Il tipo di oggetto non è specificato.", "Enter new" : "Inserisci nuovo", "Add" : "Aggiungi", @@ -331,17 +331,17 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dic.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>.", "Allow editing" : "Consenti la modifica", "Sending ..." : "Invio in corso...", "Email sent" : "Messaggio inviato", "Send link via email" : "Invia collegamento tramite email", "notify by email" : "notifica tramite email", "can share" : "può condividere", - "create" : "creare", + "create" : "Crea", "change" : "cambia", "delete" : "elimina", "{sharee} (at {server})" : "{sharee} (su {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Condividi con persone su altri ownCloud utilizzando la sintassi nomeutente@esempio.com/owncloud", "Share with users…" : "Condividi con utenti...", "Share with users, groups or remote users…" : "Condividi con utenti, gruppi o utenti remoti...", "Share with users or groups…" : "Condividi con utenti o gruppi...", @@ -351,9 +351,9 @@ OC.L10N.register( "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "L'aggiornamento è in corso, l'abbandono di questa pagina potrebbe interrompere il processo in alcuni ambienti.", "Updating to {version}" : "Aggiornamento a {version}", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", - "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", + "No search results in other folders" : "Nessun risultato di ricerca nelle altre cartelle", "Two-step verification" : "Verifica in due fasi", - "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Una sicurezza piu efficace è stata abilitata sul tuo account. Autenticati utilizzando un secondo fattore.", "Cancel login" : "Annulla l'accesso", "Please authenticate using the selected factor." : "Autentica utilizzando il fattore selezionato.", "An error occured while verifying the token" : "Si è verificato un errore durante la verifica del token", @@ -365,9 +365,10 @@ OC.L10N.register( "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore di almeno \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", - "An error occured. Please try again" : "Si è verificato un errore. Prova ancora", + "An error occured. Please try again" : "Si è verificato un errore. Prova di nuovo", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Condividi con persone di altri server NextCloud utilizzando la sintassi nomeutente@esempio.com/nextcloud", "not assignable" : "non assegnabile", - "Updating {productName} to version {version}, this may take a while." : "Aggiornamenti di {productName} alla versione {version}, potrebbe richiedere del tempo.", + "Updating {productName} to version {version}, this may take a while." : "L'aggiornamento di {productName} alla versione {version}, potrebbe richiedere del tempo.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Per informazioni su come configurare correttamente il tuo server, vedi la <a href=\"%s\" target=\"_blank\">documentazione</a>.", "An internal error occured." : "Si è verificato un errore interno." }, diff --git a/core/l10n/it.json b/core/l10n/it.json index 305fdf1a844..a385500a5d2 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -3,7 +3,7 @@ "File is too big" : "Il file è troppo grande", "The selected file is not an image." : "Il file selezionato non è un'immagine.", "The selected file cannot be read." : "Il file selezionato non può essere letto.", - "Invalid file provided" : "File non valido fornito", + "Invalid file provided" : "File fornito non valido ", "No image or file provided" : "Non è stata fornita alcun immagine o file", "Unknown filetype" : "Tipo di file sconosciuto", "Invalid image" : "Immagine non valida", @@ -18,7 +18,7 @@ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.", "%s password reset" : "Ripristino password di %s", "Couldn't send reset email. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione. Contatta il tuo amministratore.", - "Preparing update" : "Preparazione aggiornamento", + "Preparing update" : "Preparazione all'aggiornamento", "[%d / %d]: %s" : "[%d / %d]: %s", "Repair warning: " : "Avviso di riparazione", "Repair error: " : "Errore di riparazione:", @@ -30,12 +30,12 @@ "Updating database schema" : "Aggiornamento schema database", "Updated database" : "Database aggiornato", "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Controllo che lo schema del database possa essere aggiornato (ciò potrebbe richiedere molto tempo in base alla dimensione del database)", - "Checked database schema update" : "Verificato l'aggiornamento dello schema del database", + "Checked database schema update" : "L'aggiornamento dello schema del database è stato verificato", "Checking updates of apps" : "Controllo degli aggiornamenti delle applicazioni", "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Controllo che lo schema del database di %s possa essere aggiornato (ciò potrebbe richiedere molto tempo in base alla dimensione del database)", - "Checked database schema update for apps" : "Verificato l'aggiornamento dello schema del database per le applicazioni", + "Checked database schema update for apps" : "L'aggiornamento dello schema del database per le applicazioni è stato verificato", "Updated \"%s\" to %s" : "Aggiornato \"%s\" a %s", - "Set log level to debug" : "Imposta il livello del log a debug", + "Set log level to debug" : "Imposta il livello del log per il debug", "Reset log level" : "Ripristina il livello del log", "Starting code integrity check" : "Avvio del controllo di integrità del codice", "Finished code integrity check" : "Controllo di integrità del codice terminato", @@ -86,7 +86,7 @@ "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>." : "Non è stata configurata alcuna cache di memoria. Per migliorare le prestazioni configura memcache, se disponibile. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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 non è leggibile da PHP e ciò è vivamente sconsigliato per motivi di sicurezza. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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." : "Stai eseguendo attualmente PHP {version}. Ti esortiamo ad aggiornare la tua versione di PHP per trarre vantaggio dagli aggiornamenti in termini di <a target=\"_blank\" rel=\"noreferrer\" ref=\"{phpLink}\">prestazioni e sicurezza forniti dal PHP Group</a> non appena la tua distribuzione la supporta.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a Nextcloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a Nextcloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</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 è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</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>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)", "Error occurred while checking server setup" : "Si è verificato un errore durante il controllo della configurazione del server", @@ -140,7 +140,6 @@ "{sharee} (remote)" : "{sharee} (remote)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Condividi", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Condividi con persone su altri server utilizzando la sintassi nomeutente@esempio.com/nextcloud", "Share with users or by mail..." : "Condividi con utenti o tramite posta...", "Share with users or remote users..." : "Condividi con utenti o utenti remoti...", "Share with users, remote users or by mail..." : "Condividi con utenti, utenti remoti o tramite posta...", @@ -157,6 +156,7 @@ "Delete" : "Elimina", "Rename" : "Rinomina", "Collaborative tags" : "Etichette collaborative", + "No tags found" : "Nessuna etichetta trovata", "The object type is not specified." : "Il tipo di oggetto non è specificato.", "Enter new" : "Inserisci nuovo", "Add" : "Aggiungi", @@ -329,17 +329,17 @@ "Nov." : "Nov.", "Dec." : "Dic.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Questo server non ha una connessione a Internet funzionante. Ciò significa che alcune delle funzionalità come il montaggio di archivi esterni, le notifiche degli aggiornamenti o l'installazione di applicazioni di terze parti non funzioneranno. L'accesso remoto ai file e l'invio di email di notifica potrebbero non funzionare. Ti suggeriamo di abilitare la connessione a Internet del server se desideri disporre di tutte le funzionalità.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "La configurazione delle intestazioni del proxy inverso non è corretta, o stai effettuando l'accesso a ownCloud da un proxy affidabile. Se non stai effettuando l'accesso da un proxy affidabile, questo è un problema di sicurezza e può consentire a un attaccante di falsificare il suo indirizzo IP, rendendolo visibile a ownCloud. Ulteriori informazioni sono disponibili nella nostra <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentazione</a>.", "Allow editing" : "Consenti la modifica", "Sending ..." : "Invio in corso...", "Email sent" : "Messaggio inviato", "Send link via email" : "Invia collegamento tramite email", "notify by email" : "notifica tramite email", "can share" : "può condividere", - "create" : "creare", + "create" : "Crea", "change" : "cambia", "delete" : "elimina", "{sharee} (at {server})" : "{sharee} (su {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Condividi con persone su altri ownCloud utilizzando la sintassi nomeutente@esempio.com/owncloud", "Share with users…" : "Condividi con utenti...", "Share with users, groups or remote users…" : "Condividi con utenti, gruppi o utenti remoti...", "Share with users or groups…" : "Condividi con utenti o gruppi...", @@ -349,9 +349,9 @@ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "L'aggiornamento è in corso, l'abbandono di questa pagina potrebbe interrompere il processo in alcuni ambienti.", "Updating to {version}" : "Aggiornamento a {version}", "The update was successful. There were warnings." : "L'aggiornamento è stato effettuato correttamente. Ci sono degli avvisi.", - "No search results in other folders" : "Nessun risultato di ricerca in altre cartelle", + "No search results in other folders" : "Nessun risultato di ricerca nelle altre cartelle", "Two-step verification" : "Verifica in due fasi", - "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "La sicurezza migliorata è stata abilitata per il tuo account. Autenticati utilizzando un secondo fattore.", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Una sicurezza piu efficace è stata abilitata sul tuo account. Autenticati utilizzando un secondo fattore.", "Cancel login" : "Annulla l'accesso", "Please authenticate using the selected factor." : "Autentica utilizzando il fattore selezionato.", "An error occured while verifying the token" : "Si è verificato un errore durante la verifica del token", @@ -363,9 +363,10 @@ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached è configurato come cache distribuita, ma è installato il modulo \"memcache\" errato. \\OC\\Memcache\\Memcached supporta solo \"memcached\" e non \"memcache\". Vedi il <a target=\"_blank\" href=\"{wikiLink}\">wiki di memcached per informazioni su entrambi i moduli</a>.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alcuni file non hanno superato il controllo di integrità. Ulteriori informazioni su come risolvere questo problema sono disponibili nella nostra <a target=\"_blank\" href=\"{docLink}\">documentazione</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Elenco dei file non validi…</a> / <a href=\"{rescanEndpoint}\">Nuova scansione…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore di almeno \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", - "An error occured. Please try again" : "Si è verificato un errore. Prova ancora", + "An error occured. Please try again" : "Si è verificato un errore. Prova di nuovo", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Condividi con persone di altri server NextCloud utilizzando la sintassi nomeutente@esempio.com/nextcloud", "not assignable" : "non assegnabile", - "Updating {productName} to version {version}, this may take a while." : "Aggiornamenti di {productName} alla versione {version}, potrebbe richiedere del tempo.", + "Updating {productName} to version {version}, this may take a while." : "L'aggiornamento di {productName} alla versione {version}, potrebbe richiedere del tempo.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Per informazioni su come configurare correttamente il tuo server, vedi la <a href=\"%s\" target=\"_blank\">documentazione</a>.", "An internal error occured." : "Si è verificato un errore interno." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 358ea8167dc..2f85d691f7c 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -86,7 +86,6 @@ OC.L10N.register( "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>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">を参照してください。", "/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 を PHP から読み取ることができません。この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</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." : "このサーバーでは、{version} のPHPを利用しています。パフォーマンスとセキュリティ上のメリットがあるため利用中のディストリビューションで<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">PHP グループの提供する最新のPHPのバージョン</a>になるべく早くアップデートすることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</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 は分散キャッシュとして設定されています。しかし、PHPモジュール \"memcache\"が間違ってインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしています。\"memcache\" ではありません。<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki で両方のモジュールの情報</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>)" : "いくつかのファイルでチェックサムが適合しませんでした。この問題を解決するためは、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>の詳細を見てください。(<a href=\"{codeIntegrityDownloadEndpoint}\">不適合ファイルのリスト…</a> / <a href=\"{rescanEndpoint}\">再チェック…</a>)", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", @@ -301,6 +300,7 @@ OC.L10N.register( "Oct." : "10月", "Nov." : "11月", "Dec." : "12月", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>を確認してください。", "Allow editing" : "編集を許可", "Sending ..." : "送信中...", "Email sent" : "メールを送信しました", @@ -311,7 +311,6 @@ OC.L10N.register( "change" : "更新", "delete" : "削除", "{sharee} (at {server})" : "{sharee} ({server} で)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "次の形式で指定して他のownCloudのユーザーと、共有", "Share with users…" : "ユーザーと共有...", "Share with users, groups or remote users…" : "ユーザー、グループもしくはリモートユーザーと共有 ...", "Share with users or groups…" : "ユーザーもしくはグループと共有...", @@ -325,6 +324,7 @@ OC.L10N.register( "Please authenticate using the selected factor." : "選択したデバイスを利用して認証してください。", "An error occured while verifying the token" : "トークンの整合性チェックでエラーが発生", "An error occured. Please try again" : "エラーが発生しました。再度試行してください。", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "次の形式で指定して他のownCloudのユーザーと、共有", "An internal error occured." : "内部エラーが発生しました" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 3fd878a3a8c..ed64c5b2223 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -84,7 +84,6 @@ "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>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">を参照してください。", "/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 を PHP から読み取ることができません。この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</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." : "このサーバーでは、{version} のPHPを利用しています。パフォーマンスとセキュリティ上のメリットがあるため利用中のディストリビューションで<a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">PHP グループの提供する最新のPHPのバージョン</a>になるべく早くアップデートすることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</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 は分散キャッシュとして設定されています。しかし、PHPモジュール \"memcache\"が間違ってインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしています。\"memcache\" ではありません。<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki で両方のモジュールの情報</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>)" : "いくつかのファイルでチェックサムが適合しませんでした。この問題を解決するためは、<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>の詳細を見てください。(<a href=\"{codeIntegrityDownloadEndpoint}\">不適合ファイルのリスト…</a> / <a href=\"{rescanEndpoint}\">再チェック…</a>)", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", @@ -299,6 +298,7 @@ "Oct." : "10月", "Nov." : "11月", "Dec." : "12月", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスされているのでないなら、攻撃者の詐称されたIPアドレスから ownCloudを見ることができるように許可されていて、セキュリティに問題があります。詳細な情報は、 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">ドキュメント</a>を確認してください。", "Allow editing" : "編集を許可", "Sending ..." : "送信中...", "Email sent" : "メールを送信しました", @@ -309,7 +309,6 @@ "change" : "更新", "delete" : "削除", "{sharee} (at {server})" : "{sharee} ({server} で)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "次の形式で指定して他のownCloudのユーザーと、共有", "Share with users…" : "ユーザーと共有...", "Share with users, groups or remote users…" : "ユーザー、グループもしくはリモートユーザーと共有 ...", "Share with users or groups…" : "ユーザーもしくはグループと共有...", @@ -323,6 +322,7 @@ "Please authenticate using the selected factor." : "選択したデバイスを利用して認証してください。", "An error occured while verifying the token" : "トークンの整合性チェックでエラーが発生", "An error occured. Please try again" : "エラーが発生しました。再度試行してください。", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "次の形式で指定して他のownCloudのユーザーと、共有", "An internal error occured." : "内部エラーが発生しました" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/ko.js b/core/l10n/ko.js index 14aa2fc2210..a34213ecb6c 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -317,7 +317,6 @@ OC.L10N.register( "change" : "변경", "delete" : "삭제", "{sharee} (at {server})" : "{sharee}({server}에 있음)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/nextcloud 형식으로 다른 nextcloud 사용자와 공유할 수 있습니다", "Share with users…" : "사용자와 공유 ...", "Share with users, groups or remote users…" : "사용자, 그룹 또는 원격 사용자와 공유 ...", "Share with users or groups…" : "사용자 또는 그룹과 공유 ...", @@ -336,6 +335,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "일부 파일에 대한 무결성 검사를 통과하지 않았습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 우리의 <a target=\"_blank\" href=\"{docLink}\">문서</a>에서 찾을 수 있습니다. (<a href=\"{codeIntegrityDownloadEndpoint}\">잘못된 파일 목록...</a> / <a href=\"{rescanEndpoint}\">재검색...</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"엄격한 - 전송 보안\" HTTP 헤더에 적어도 \"{seconds}\"초로 설정되어 있지 않습니다. <a href=\"{docUrl}\">보안 팁</a>에 언급 된 바와 같이 보안을 강화하기 위해, HSTS를 사용하는 것이 좋습니다.", "An error occured. Please try again" : "오류가 발생했습니다. 다시 시도하십시오.", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/nextcloud 형식으로 다른 nextcloud 사용자와 공유할 수 있습니다", "not assignable" : "할당할 수 없음", "Updating {productName} to version {version}, this may take a while." : "{productName} 버전 {version}(으)로 업데이트 중 입니다. 시간이 다소 걸릴 수 있습니다.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "서버를 올바르게 구성하는 방법에 대한 자세한 내용은 <a href=\"%s\" target=\"_blank\">설명서</a>를 참조하시기 바랍니다.", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index 6ba4f937dec..5837d3ec065 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -315,7 +315,6 @@ "change" : "변경", "delete" : "삭제", "{sharee} (at {server})" : "{sharee}({server}에 있음)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/nextcloud 형식으로 다른 nextcloud 사용자와 공유할 수 있습니다", "Share with users…" : "사용자와 공유 ...", "Share with users, groups or remote users…" : "사용자, 그룹 또는 원격 사용자와 공유 ...", "Share with users or groups…" : "사용자 또는 그룹과 공유 ...", @@ -334,6 +333,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "일부 파일에 대한 무결성 검사를 통과하지 않았습니다. 이 문제를 해결하는 방법에 대한 자세한 내용은 우리의 <a target=\"_blank\" href=\"{docLink}\">문서</a>에서 찾을 수 있습니다. (<a href=\"{codeIntegrityDownloadEndpoint}\">잘못된 파일 목록...</a> / <a href=\"{rescanEndpoint}\">재검색...</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"엄격한 - 전송 보안\" HTTP 헤더에 적어도 \"{seconds}\"초로 설정되어 있지 않습니다. <a href=\"{docUrl}\">보안 팁</a>에 언급 된 바와 같이 보안을 강화하기 위해, HSTS를 사용하는 것이 좋습니다.", "An error occured. Please try again" : "오류가 발생했습니다. 다시 시도하십시오.", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "username@example.com/nextcloud 형식으로 다른 nextcloud 사용자와 공유할 수 있습니다", "not assignable" : "할당할 수 없음", "Updating {productName} to version {version}, this may take a while." : "{productName} 버전 {version}(으)로 업데이트 중 입니다. 시간이 다소 걸릴 수 있습니다.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "서버를 올바르게 구성하는 방법에 대한 자세한 내용은 <a href=\"%s\" target=\"_blank\">설명서</a>를 참조하시기 바랍니다.", diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js index ac8dedba6ac..bb6de95e401 100644 --- a/core/l10n/nb_NO.js +++ b/core/l10n/nb_NO.js @@ -138,7 +138,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (ekstern)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Del", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Del med andre brukere på andre tjenere ved å bruker syntaksen brukernavn@eksempel.com/nextcloud", "Share with users or by mail..." : "Del med brukere eller på e-post...", "Share with users or remote users..." : "Del med brukere eller eksterne brukere...", "Share with users, remote users or by mail..." : "Del med brukere, eksterne brukere eller på e-post...", @@ -337,7 +336,6 @@ OC.L10N.register( "change" : "endre", "delete" : "slette", "{sharee} (at {server})" : "{sharee} (på {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med personer på andre ownCloud-installasjoner med syntaksen brukernavn@example.com/owncloud", "Share with users…" : "Del med brukere...", "Share with users, groups or remote users…" : "Del med brukere, grupper og eksterne brukere...", "Share with users or groups…" : "Del med brukere eller grupper...", @@ -355,6 +353,7 @@ OC.L10N.register( "An error occured while verifying the token" : "En feil oppstod under verifisering av nøkkelen", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Din webtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "An error occured. Please try again" : "Det oppstod en feil. Prøv igjen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med personer på andre ownCloud-installasjoner med syntaksen brukernavn@example.com/owncloud", "not assignable" : "ikke overdras", "Updating {productName} to version {version}, this may take a while." : "Oppdaterer {productName} til versjon {version}, dette kan ta en stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "For informasjon om hvordan du skal konfigurere tjeneren skikkelig, vennligst se i <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentasjonen</a>.", diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json index e326aac88a1..d875ca36b97 100644 --- a/core/l10n/nb_NO.json +++ b/core/l10n/nb_NO.json @@ -136,7 +136,6 @@ "{sharee} (remote)" : "{sharee} (ekstern)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Del", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Del med andre brukere på andre tjenere ved å bruker syntaksen brukernavn@eksempel.com/nextcloud", "Share with users or by mail..." : "Del med brukere eller på e-post...", "Share with users or remote users..." : "Del med brukere eller eksterne brukere...", "Share with users, remote users or by mail..." : "Del med brukere, eksterne brukere eller på e-post...", @@ -335,7 +334,6 @@ "change" : "endre", "delete" : "slette", "{sharee} (at {server})" : "{sharee} (på {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med personer på andre ownCloud-installasjoner med syntaksen brukernavn@example.com/owncloud", "Share with users…" : "Del med brukere...", "Share with users, groups or remote users…" : "Del med brukere, grupper og eksterne brukere...", "Share with users or groups…" : "Del med brukere eller grupper...", @@ -353,6 +351,7 @@ "An error occured while verifying the token" : "En feil oppstod under verifisering av nøkkelen", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Din webtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "An error occured. Please try again" : "Det oppstod en feil. Prøv igjen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Del med personer på andre ownCloud-installasjoner med syntaksen brukernavn@example.com/owncloud", "not assignable" : "ikke overdras", "Updating {productName} to version {version}, this may take a while." : "Oppdaterer {productName} til versjon {version}, dette kan ta en stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "For informasjon om hvordan du skal konfigurere tjeneren skikkelig, vennligst se i <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentasjonen</a>.", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index efd7f32a7bc..11c4b5b8f98 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -88,7 +88,6 @@ OC.L10N.register( "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>." : "Er is geen geheugencache geconfigureerd. Om de prestaties te verhogen kun je de memcache configureren als die beschikbaar is. Meer informatie vind je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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 is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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." : "Je draait momenteel PHP {version}. We adviseren je om, zo gauw je distributie dat biedt, je PHP versie bij te werken voor betere <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestaties en beveiliging geleverd door de PHP Group</a>.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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 is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki over beide modules</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>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", @@ -108,6 +107,7 @@ OC.L10N.register( "Expiration date" : "Vervaldatum", "Choose a password for the public link" : "Kies een wachtwoord voor de openbare link", "Copied!" : "Gekopieerd!", + "Copy" : "Kopiëren", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", "Press Ctrl-C to copy." : "Druk op Ctrl-C om te kopiëren.", @@ -142,7 +142,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (extern)", "{sharee} (email)" : "{sharee} (e-mail)", "Share" : "Delen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Delen met mensen bij andere servers via de syntax gebruikers@voorbeeld.nl/nextcloud", "Share with users or by mail..." : "Deel met gebruikers per e-mail...", "Share with users or remote users..." : "Deel met gebruikers of externe gebruikers...", "Share with users, remote users or by mail..." : "Deel met gebruikers, externe gebruikers of per e-mail...", @@ -159,6 +158,7 @@ OC.L10N.register( "Delete" : "Verwijder", "Rename" : "Naam wijzigen", "Collaborative tags" : "Samenwerk markeringen", + "No tags found" : "Geen tags gevonden", "The object type is not specified." : "Het object type is niet gespecificeerd.", "Enter new" : "Opgeven nieuw", "Add" : "Toevoegen", @@ -331,6 +331,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie e-mails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.", "Allow editing" : "Toestaan bewerken", "Sending ..." : "Versturen ...", "Email sent" : "E-mail verzonden", @@ -341,7 +342,6 @@ OC.L10N.register( "change" : "wijzig", "delete" : "verwijderen", "{sharee} (at {server})" : "{sharee} (op {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Delen met mensen op andere ownClouds via de syntax gebruikersnaam@voorbeeld.org/owncloud", "Share with users…" : "Delen met gebruikers...", "Share with users, groups or remote users…" : "Delen met gebruikers, groepen of externe gebruikers...", "Share with users or groups…" : "Delen met gebruikers of groepen...", @@ -366,6 +366,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw scannen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd met minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", "An error occured. Please try again" : "Er trad een fout op. Probeer het opnieuw", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Delen met mensen op andere ownClouds via de syntax gebruikersnaam@voorbeeld.org/owncloud", "not assignable" : "niet-toewijsbaar", "Updating {productName} to version {version}, this may take a while." : "Updaten {productName} naar versie {version}, dit kan even duren.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Bekijk de <a href=\"%s\" target=\"_blank\">documentatie</a> voor Informatie over het correct configureren van je server.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index 87e3d006d23..ab1b093f53f 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -86,7 +86,6 @@ "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>." : "Er is geen geheugencache geconfigureerd. Om de prestaties te verhogen kun je de memcache configureren als die beschikbaar is. Meer informatie vind je in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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 is niet leesbaar door PHP, hetgeen wordt afgeraden wegens beveiligingsredenen. Meer informatie in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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." : "Je draait momenteel PHP {version}. We adviseren je om, zo gauw je distributie dat biedt, je PHP versie bij te werken voor betere <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestaties en beveiliging geleverd door de PHP Group</a>.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</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 is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki over beide modules</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>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", @@ -106,6 +105,7 @@ "Expiration date" : "Vervaldatum", "Choose a password for the public link" : "Kies een wachtwoord voor de openbare link", "Copied!" : "Gekopieerd!", + "Copy" : "Kopiëren", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", "Press Ctrl-C to copy." : "Druk op Ctrl-C om te kopiëren.", @@ -140,7 +140,6 @@ "{sharee} (remote)" : "{sharee} (extern)", "{sharee} (email)" : "{sharee} (e-mail)", "Share" : "Delen", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Delen met mensen bij andere servers via de syntax gebruikers@voorbeeld.nl/nextcloud", "Share with users or by mail..." : "Deel met gebruikers per e-mail...", "Share with users or remote users..." : "Deel met gebruikers of externe gebruikers...", "Share with users, remote users or by mail..." : "Deel met gebruikers, externe gebruikers of per e-mail...", @@ -157,6 +156,7 @@ "Delete" : "Verwijder", "Rename" : "Naam wijzigen", "Collaborative tags" : "Samenwerk markeringen", + "No tags found" : "Geen tags gevonden", "The object type is not specified." : "Het object type is niet gespecificeerd.", "Enter new" : "Opgeven nieuw", "Add" : "Toevoegen", @@ -329,6 +329,7 @@ "Nov." : "Nov.", "Dec." : "Dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Deze server heeft geen actieve internetverbinding. Dat betekent dat sommige functies, zoals aankoppelen van externe opslag, notificaties over updates of installatie van apps van 3e partijen niet werken. Ook het benaderen van bestanden vanaf een remote locatie en het versturen van notificatie e-mails kan mislukken. We adviseren om de internetverbinding voor deze server in te schakelen als u alle functies wilt gebruiken.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of je hebt toegang tot Nextcloud via een vertrouwde proxy. Als je Nextcloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat Nextcloud ziet kan vervalsen. Meer informatie is te vinden in onze <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentatie</a>.", "Allow editing" : "Toestaan bewerken", "Sending ..." : "Versturen ...", "Email sent" : "E-mail verzonden", @@ -339,7 +340,6 @@ "change" : "wijzig", "delete" : "verwijderen", "{sharee} (at {server})" : "{sharee} (op {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Delen met mensen op andere ownClouds via de syntax gebruikersnaam@voorbeeld.org/owncloud", "Share with users…" : "Delen met gebruikers...", "Share with users, groups or remote users…" : "Delen met gebruikers, groepen of externe gebruikers...", "Share with users or groups…" : "Delen met gebruikers of groepen...", @@ -364,6 +364,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a target=\"_blank\" href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw scannen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd met minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", "An error occured. Please try again" : "Er trad een fout op. Probeer het opnieuw", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Delen met mensen op andere ownClouds via de syntax gebruikersnaam@voorbeeld.org/owncloud", "not assignable" : "niet-toewijsbaar", "Updating {productName} to version {version}, this may take a while." : "Updaten {productName} naar versie {version}, dit kan even duren.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Bekijk de <a href=\"%s\" target=\"_blank\">documentatie</a> voor Informatie over het correct configureren van je server.", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index c79f78e64d0..62a480479d1 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -114,6 +114,7 @@ OC.L10N.register( "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} udostępniane za pośrednictwem łącza", "group" : "grupa", "remote" : "zdalny", + "email" : "email", "Unshare" : "Zatrzymaj współdzielenie", "can reshare" : "mogą udostępniać", "can edit" : "może edytować", @@ -315,7 +316,6 @@ OC.L10N.register( "change" : "zmiany", "delete" : "usuń", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Współdziel z użytkownikami innych chmur ownCloud używając wzorca uzytkownik@example.com/owncloud", "Share with users…" : "Współdziel z użytkownikami...", "Share with users, groups or remote users…" : "Współdziel z użytkownikami, grupami lub zdalnym użytkownikiem...", "Share with users or groups…" : "Współdziel z użytkownikami lub grupami...", @@ -333,6 +333,7 @@ OC.L10N.register( "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" href=\"{docLink}\">dokumentacji</a>.", "An error occured. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Współdziel z użytkownikami innych chmur ownCloud używając wzorca uzytkownik@example.com/owncloud", "not assignable" : "nie przypisane", "Updating {productName} to version {version}, this may take a while." : "AKtualizowanie {productName} do wersji {version}, może to trochę potrwać.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Aby uzyskać informację jak poprawnie skonfigurować Twój serwer, zajrzyj do <a href=\"%s\" target=\"_blank\">dokumentacji</a>.", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index c49851d3702..efdcbed277a 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -112,6 +112,7 @@ "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} udostępniane za pośrednictwem łącza", "group" : "grupa", "remote" : "zdalny", + "email" : "email", "Unshare" : "Zatrzymaj współdzielenie", "can reshare" : "mogą udostępniać", "can edit" : "może edytować", @@ -313,7 +314,6 @@ "change" : "zmiany", "delete" : "usuń", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Współdziel z użytkownikami innych chmur ownCloud używając wzorca uzytkownik@example.com/owncloud", "Share with users…" : "Współdziel z użytkownikami...", "Share with users, groups or remote users…" : "Współdziel z użytkownikami, grupami lub zdalnym użytkownikiem...", "Share with users or groups…" : "Współdziel z użytkownikami lub grupami...", @@ -331,6 +331,7 @@ "An error occured while verifying the token" : "Wystąpił błąd podczas weryfikacji tokena", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>." : "Serwer WWW nie jest poprawnie skonfigurowany, aby wyświetlić \"{url}\". Więcej informacji można znaleźć w naszej <a target=\"_blank\" href=\"{docLink}\">dokumentacji</a>.", "An error occured. Please try again" : "Wystąpił błąd. Proszę spróbować ponownie.", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Współdziel z użytkownikami innych chmur ownCloud używając wzorca uzytkownik@example.com/owncloud", "not assignable" : "nie przypisane", "Updating {productName} to version {version}, this may take a while." : "AKtualizowanie {productName} do wersji {version}, może to trochę potrwać.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Aby uzyskać informację jak poprawnie skonfigurować Twój serwer, zajrzyj do <a href=\"%s\" target=\"_blank\">dokumentacji</a>.", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index ac34123583c..b076ac54a04 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -88,7 +88,6 @@ OC.L10N.register( "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 seu desempenho, por favor configurar 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ê stá atualmente em executando PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar<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 ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. 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 é 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>)", "Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor", @@ -142,7 +141,6 @@ OC.L10N.register( "{sharee} (remote)" : "{sharee} (remoto)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Compartilhar", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Compartilhe com pessoas em outros servidores utilizando a sintaxe username@example.com/nextcloud", "Share with users or by mail..." : "Compartilhe com usuários internos ou por email...", "Share with users or remote users..." : "Compartilhe com usuários internos ou usuários remotos...", "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, usuários remotos ou por email...", @@ -331,6 +329,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "Allow editing" : "Permitir edição", "Sending ..." : "Enviando ...", "Email sent" : "E-mail enviado", @@ -341,7 +340,6 @@ OC.L10N.register( "change" : "mudança", "delete" : "remover", "{sharee} (at {server})" : "{sharee} (no {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhar com usuários em outros ownClouds usando a sintaxe username@example.com/owncloud", "Share with users…" : "Compartilhar com os usuários...", "Share with users, groups or remote users…" : "Compartilhar com usuários, grupos ou usuários remoto…", "Share with users or groups…" : "Compartilhar com usuários ou grupos…", @@ -366,6 +364,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns 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\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{seconds}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nosso <a href=\"{docUrl}\">dicas de segurança</a>.", "An error occured. Please try again" : "Ocorreu um erro. Tente novamente", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhar com usuários em outros ownClouds usando a sintaxe username@example.com/owncloud", "not assignable" : "não atribuível", "Updating {productName} to version {version}, this may take a while." : "Atualizando o {productName} para a versão {version}. Isso pode levar algum tempo.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Para obter informações sobre como configurar corretamente o seu servidor, leia a <a href=\"%s\" target=\"_blank\">documentação</a>.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index d96a10dbf1e..4a143863db0 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -86,7 +86,6 @@ "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 seu desempenho, por favor configurar 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ê stá atualmente em executando PHP {version}. Nós o incentivamos a atualizar sua versão do PHP para aproveitar<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 ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. 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 é 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>)", "Error occurred while checking server setup" : "Erro ao verificar a configuração do servidor", @@ -140,7 +139,6 @@ "{sharee} (remote)" : "{sharee} (remoto)", "{sharee} (email)" : "{sharee} (email)", "Share" : "Compartilhar", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Compartilhe com pessoas em outros servidores utilizando a sintaxe username@example.com/nextcloud", "Share with users or by mail..." : "Compartilhe com usuários internos ou por email...", "Share with users or remote users..." : "Compartilhe com usuários internos ou usuários remotos...", "Share with users, remote users or by mail..." : "Compartilhe com usuários internos, usuários remotos ou por email...", @@ -329,6 +327,7 @@ "Nov." : "Nov.", "Dec." : "Dez.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Este servidor não tem nenhuma conexão com a Internet. Isso significa que alguns dos recursos como montar armazenamento externo, notificações sobre atualizações ou instalação de aplicativos de terceiros não vai funcionar. Acessar arquivos remotamente e envio de e-mails de notificação pode não funcionar, também. Sugerimos permitir conexão com a Internet para este servidor, se você quer ter todas as funcionalidades.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração de cabeçalhos do proxy reverso está incorreta, ou você está acessando ownCloud de um proxy confiável. Se você não estiver acessando ownCloud de um proxy de confiança, esta é uma questão de segurança e pode permitir a um invasor falsificar o endereço IP como visíveis para ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "Allow editing" : "Permitir edição", "Sending ..." : "Enviando ...", "Email sent" : "E-mail enviado", @@ -339,7 +338,6 @@ "change" : "mudança", "delete" : "remover", "{sharee} (at {server})" : "{sharee} (no {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhar com usuários em outros ownClouds usando a sintaxe username@example.com/owncloud", "Share with users…" : "Compartilhar com os usuários...", "Share with users, groups or remote users…" : "Compartilhar com usuários, grupos ou usuários remoto…", "Share with users or groups…" : "Compartilhar com usuários ou grupos…", @@ -364,6 +362,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns 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\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de arquivos inválidos…</a> / <a href=\"{rescanEndpoint}\">Reescanear…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{seconds}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nosso <a href=\"{docUrl}\">dicas de segurança</a>.", "An error occured. Please try again" : "Ocorreu um erro. Tente novamente", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhar com usuários em outros ownClouds usando a sintaxe username@example.com/owncloud", "not assignable" : "não atribuível", "Updating {productName} to version {version}, this may take a while." : "Atualizando o {productName} para a versão {version}. Isso pode levar algum tempo.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Para obter informações sobre como configurar corretamente o seu servidor, leia a <a href=\"%s\" target=\"_blank\">documentação</a>.", diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js index f3b3adf3d22..c7f615211ed 100644 --- a/core/l10n/pt_PT.js +++ b/core/l10n/pt_PT.js @@ -81,7 +81,6 @@ OC.L10N.register( "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>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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 é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <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." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. 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á configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)", "Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor", @@ -290,6 +289,7 @@ OC.L10N.register( "Oct." : "Out.", "Nov." : "Nov.", "Dec." : "Dez.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "Allow editing" : "Permitir edição", "Sending ..." : "A enviar...", "Email sent" : "Mensagem enviada", @@ -300,7 +300,6 @@ OC.L10N.register( "change" : "alterar", "delete" : "eliminar", "{sharee} (at {server})" : "{sharee} (em {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud", "Share with users…" : "Compartilhe com os utilizadores...", "Share with users, groups or remote users…" : "Compartilhe com os utilizadores, grupos ou utilizadores remotos...", "Share with users or groups…" : "Compartilhe com os utilizadores ou grupos...", @@ -311,6 +310,7 @@ OC.L10N.register( "Two-step verification" : "Verificação de dois passos:", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A segurança reforçada foi ativada para a sua conta. Por favor, autentique utilizando um segundo fator.", "Please authenticate using the selected factor." : "Por favor, autentique utilizando um segundo fator.", - "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha" + "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json index 5439a9411ba..0923c87cacc 100644 --- a/core/l10n/pt_PT.json +++ b/core/l10n/pt_PT.json @@ -79,7 +79,6 @@ "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>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</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 é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <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." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. 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á configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)", "Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor", @@ -288,6 +287,7 @@ "Oct." : "Out.", "Nov." : "Nov.", "Dec." : "Dez.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.", "Allow editing" : "Permitir edição", "Sending ..." : "A enviar...", "Email sent" : "Mensagem enviada", @@ -298,7 +298,6 @@ "change" : "alterar", "delete" : "eliminar", "{sharee} (at {server})" : "{sharee} (em {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud", "Share with users…" : "Compartilhe com os utilizadores...", "Share with users, groups or remote users…" : "Compartilhe com os utilizadores, grupos ou utilizadores remotos...", "Share with users or groups…" : "Compartilhe com os utilizadores ou grupos...", @@ -309,6 +308,7 @@ "Two-step verification" : "Verificação de dois passos:", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A segurança reforçada foi ativada para a sua conta. Por favor, autentique utilizando um segundo fator.", "Please authenticate using the selected factor." : "Por favor, autentique utilizando um segundo fator.", - "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha" + "An error occured while verifying the token" : "Ocorreu um erro durante a verificação da senha", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Compartilhe com as pessoas nas outras ownClouds utilizando a sintaxe username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/ru.js b/core/l10n/ru.js index 68db3db46ed..f4016fbc8e8 100644 --- a/core/l10n/ru.js +++ b/core/l10n/ru.js @@ -26,8 +26,8 @@ OC.L10N.register( "Repair error: " : "Ошибка восстановления:", "Please use the command line updater because automatic updating is disabled in the config.php." : "Пожалуйста, используйте обновление через командную строку, так как автоматические обновления отключены в config.php.", "[%d / %d]: Checking table %s" : "[%d / %d]: Проверка таблицы %s", - "Turned on maintenance mode" : "Режим отладки включён", - "Turned off maintenance mode" : "Режим отладки отключён", + "Turned on maintenance mode" : "Режим обслуживания включён", + "Turned off maintenance mode" : "Режим обслуживания отключён", "Maintenance mode is kept active" : "Режим обслуживания оставлен включенным", "Updating database schema" : "Обновление схемы базы данных", "Updated database" : "База данных обновлена", @@ -59,7 +59,7 @@ OC.L10N.register( "Password can not be changed. Please contact your administrator." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.", "No" : "Нет", "Yes" : "Да", - "No files in here" : "Тут нет файлов", + "No files in here" : "Здесь нет файлов", "Choose" : "Выбрать", "Error loading file picker template: {error}" : "Ошибка при загрузке шаблона выбора файлов: {error}", "Ok" : "Ок", @@ -88,7 +88,6 @@ OC.L10N.register( "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>." : "Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте memcache. Более подробная информация в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</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>." : "PHP не имеет доступа на чтение к /dev/urandom, что крайне нежелательно по соображениям безопасности. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </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." : "Вы используете PHP {version}. Рекомендуется обновить версию PHP, чтобы воспользоваться <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">улучшениями производительности и безопасности, внедрёнными PHP Group</a> как только новая версия будет доступна в Вашем дистрибутиве. ", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к ownCloud осуществлён через доверенный прокси. Если ownCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит ownCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</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 настроен на распределенный кеш, но установлен не поддерживаемый модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только модуль \"memcached\", но не \"memcache\". Больше информации на <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki странице memcached о обоих модулях</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>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о том, как устранить данную проблему доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)", "Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера", @@ -140,7 +139,6 @@ OC.L10N.register( "{sharee} (group)" : "{sharee} (группа)", "{sharee} (remote)" : "{sharee} (удалённо)", "Share" : "Поделиться", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Поделиться с людьми на других серверах используя формат username@example.com/nextcloud", "Share with users or remote users..." : "Общий доступ с пользователями или удаленными пользователями", "Share with users or groups..." : "Общий доступ с пользователями или группами", "Share with users, groups or remote users..." : "Поделиться с пользователями, группами или удаленными пользователями...", @@ -248,8 +246,8 @@ OC.L10N.register( "This means only administrators can use the instance." : "Это значит, что только администраторы могут использовать сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.", "Thank you for your patience." : "Спасибо за терпение.", - "Two-factor authentication" : "Двухфакторная авторизация", - "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, авторизуйтесь, используя код.", + "Two-factor authentication" : "Двухфакторная аутентификация", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, аутентифицируйтесь, используя код.", "Cancel log in" : "Отменить вход", "Use backup code" : "Использовать код восстановления", "Error while validating your second factor" : "Ошибка проверки кода", @@ -325,6 +323,7 @@ OC.L10N.register( "Nov." : "Ноя.", "Dec." : "Дек.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к nextCloud осуществлён через доверенный прокси. Если nextCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит nextCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.", "Allow editing" : "Разрешить редактирование", "Sending ..." : "Отправляется ...", "Email sent" : "Письмо отправлено", @@ -335,11 +334,10 @@ OC.L10N.register( "change" : "изменить", "delete" : "удалить", "{sharee} (at {server})" : "{sharee} (на {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах ownCloud используя формат username@example.com/owncloud", "Share with users…" : "Поделиться с пользователями...", "Share with users, groups or remote users…" : "Поделиться с пользователями, группами или удаленными пользователями...", "Share with users or groups…" : "Поделиться с пользователями или группами...", - "Share with users or remote users…" : "Общий доступ с пользователями или удалеными пользователями", + "Share with users or remote users…" : "Поделиться с пользователями или удалеными пользователями", "Warning" : "Предупреждение", "Error while sending notification" : "Ошибка при отправке уведомления", "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Идет процесс обновления. Не покидайте эту страницу во избежание поломок.", @@ -360,6 +358,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Для получения дополнительной информации о том, как устранить данную проблему, смотрите нашу <a target=\"_blank\" href=\"{docLink}\">документацию</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" должен быть настроен как минимум на \"{seconds}\" секунд. Для увеличения безопасности рекомендуется включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.", "An error occured. Please try again" : "Произошла ошибка. Попробуйте ещё раз", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах nextCloud используя формат username@example.com/nextcloud", "not assignable" : "Невозможно присвоить", "Updating {productName} to version {version}, this may take a while." : "Обновляем {productName} до версии {version}. Это может занять некоторое время.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Чтобы узнать, как правильно настроить ваш сервер, смотрите <a href=\"%s\" target=\"_blank\">документацию</a>.", diff --git a/core/l10n/ru.json b/core/l10n/ru.json index cce20e88258..93236fc326a 100644 --- a/core/l10n/ru.json +++ b/core/l10n/ru.json @@ -24,8 +24,8 @@ "Repair error: " : "Ошибка восстановления:", "Please use the command line updater because automatic updating is disabled in the config.php." : "Пожалуйста, используйте обновление через командную строку, так как автоматические обновления отключены в config.php.", "[%d / %d]: Checking table %s" : "[%d / %d]: Проверка таблицы %s", - "Turned on maintenance mode" : "Режим отладки включён", - "Turned off maintenance mode" : "Режим отладки отключён", + "Turned on maintenance mode" : "Режим обслуживания включён", + "Turned off maintenance mode" : "Режим обслуживания отключён", "Maintenance mode is kept active" : "Режим обслуживания оставлен включенным", "Updating database schema" : "Обновление схемы базы данных", "Updated database" : "База данных обновлена", @@ -57,7 +57,7 @@ "Password can not be changed. Please contact your administrator." : "Пароль не может быть изменён. Пожалуйста, свяжитесь с вашим администратором.", "No" : "Нет", "Yes" : "Да", - "No files in here" : "Тут нет файлов", + "No files in here" : "Здесь нет файлов", "Choose" : "Выбрать", "Error loading file picker template: {error}" : "Ошибка при загрузке шаблона выбора файлов: {error}", "Ok" : "Ок", @@ -86,7 +86,6 @@ "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>." : "Не настроена система кеширования. Для увеличения производительности сервера, по возможности, настройте memcache. Более подробная информация в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</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>." : "PHP не имеет доступа на чтение к /dev/urandom, что крайне нежелательно по соображениям безопасности. Дополнительную информацию можно найти в нашей <a target=\"_blank\" href=\"{docLink}\"> документации </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." : "Вы используете PHP {version}. Рекомендуется обновить версию PHP, чтобы воспользоваться <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">улучшениями производительности и безопасности, внедрёнными PHP Group</a> как только новая версия будет доступна в Вашем дистрибутиве. ", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к ownCloud осуществлён через доверенный прокси. Если ownCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит ownCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</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 настроен на распределенный кеш, но установлен не поддерживаемый модуль PHP \"memcache\". \\OC\\Memcache\\Memcached поддерживает только модуль \"memcached\", но не \"memcache\". Больше информации на <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki странице memcached о обоих модулях</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>)" : "Некоторые файлы не прошли проверку целостности. Дополнительная информация о том, как устранить данную проблему доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)", "Error occurred while checking server setup" : "Произошла ошибка при проверке настроек сервера", @@ -138,7 +137,6 @@ "{sharee} (group)" : "{sharee} (группа)", "{sharee} (remote)" : "{sharee} (удалённо)", "Share" : "Поделиться", - "Share with people on other servers using the syntax username@example.com/nextcloud" : "Поделиться с людьми на других серверах используя формат username@example.com/nextcloud", "Share with users or remote users..." : "Общий доступ с пользователями или удаленными пользователями", "Share with users or groups..." : "Общий доступ с пользователями или группами", "Share with users, groups or remote users..." : "Поделиться с пользователями, группами или удаленными пользователями...", @@ -246,8 +244,8 @@ "This means only administrators can use the instance." : "Это значит, что только администраторы могут использовать сервер.", "Contact your system administrator if this message persists or appeared unexpectedly." : "Обратитесь к вашему системному администратору если это сообщение не исчезает или появляется неожиданно.", "Thank you for your patience." : "Спасибо за терпение.", - "Two-factor authentication" : "Двухфакторная авторизация", - "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, авторизуйтесь, используя код.", + "Two-factor authentication" : "Двухфакторная аутентификация", + "Enhanced security is enabled for your account. Please authenticate using a second factor." : "Для вашей учётной записи включена повышенная безопасность. Пожалуйста, аутентифицируйтесь, используя код.", "Cancel log in" : "Отменить вход", "Use backup code" : "Использовать код восстановления", "Error while validating your second factor" : "Ошибка проверки кода", @@ -323,6 +321,7 @@ "Nov." : "Ноя.", "Dec." : "Дек.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Этот сервер не имеет подключения к Интернету. Это означает, что некоторые из функций, таких как внешнее хранилище, уведомления об обновлениях и установка сторонних приложений не будут работать. Доступ к файлам удаленно и отправки уведомлений по почте могут не работать. Рекомендуется разрешить данному серверу доступ в Интернет если хотите, чтобы все функции работали.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Конфигурация заголовков обратного прокси не верна, либо доступ к nextCloud осуществлён через доверенный прокси. Если nextCloud открыт не через доверенный прокси то это проблема безопасности, которая может позволить атакующему подделать IP адрес, который видит nextCloud. Дополнительная информация доступна в нашей <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">документации</a>.", "Allow editing" : "Разрешить редактирование", "Sending ..." : "Отправляется ...", "Email sent" : "Письмо отправлено", @@ -333,11 +332,10 @@ "change" : "изменить", "delete" : "удалить", "{sharee} (at {server})" : "{sharee} (на {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах ownCloud используя формат username@example.com/owncloud", "Share with users…" : "Поделиться с пользователями...", "Share with users, groups or remote users…" : "Поделиться с пользователями, группами или удаленными пользователями...", "Share with users or groups…" : "Поделиться с пользователями или группами...", - "Share with users or remote users…" : "Общий доступ с пользователями или удалеными пользователями", + "Share with users or remote users…" : "Поделиться с пользователями или удалеными пользователями", "Warning" : "Предупреждение", "Error while sending notification" : "Ошибка при отправке уведомления", "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Идет процесс обновления. Не покидайте эту страницу во избежание поломок.", @@ -358,6 +356,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Некоторые файлы не прошли проверку целостности. Для получения дополнительной информации о том, как устранить данную проблему, смотрите нашу <a target=\"_blank\" href=\"{docLink}\">документацию</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Список проблемных файлов…</a> / <a href=\"{rescanEndpoint}\">Сканировать ещё раз…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "Заголовок HTTP \"Strict-Transport-Security\" должен быть настроен как минимум на \"{seconds}\" секунд. Для увеличения безопасности рекомендуется включить HSTS согласно нашим <a href=\"{docUrl}\">подсказкам по безопасности</a>.", "An error occured. Please try again" : "Произошла ошибка. Попробуйте ещё раз", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поделиться с людьми на других серверах nextCloud используя формат username@example.com/nextcloud", "not assignable" : "Невозможно присвоить", "Updating {productName} to version {version}, this may take a while." : "Обновляем {productName} до версии {version}. Это может занять некоторое время.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "Чтобы узнать, как правильно настроить ваш сервер, смотрите <a href=\"%s\" target=\"_blank\">документацию</a>.", diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js index 67f62224847..c1c75559d0f 100644 --- a/core/l10n/sk_SK.js +++ b/core/l10n/sk_SK.js @@ -74,7 +74,6 @@ OC.L10N.register( "Strong password" : "Silné heslo", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.", "/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 nie je prístupný na čítanie procesom PHP, čo z bezpečnostných dôvodov nie je vôbec odporúčané. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</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 je nakonfigurovaný ako distribuovaná vyrovnávacia pamäť, ale v PHP je nainštalovaný nesprávny modul - \"memcache\". \\OC\\Memcache\\Memcached podporuje len modul \"memcached\", \"memcache\" nie je podporovaný. Viac informácií nájdete na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki stránke o oboch moduloch</a>.", "Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Váš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.", @@ -264,6 +263,7 @@ OC.L10N.register( "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.", "Allow editing" : "Povoliť úpravy", "Sending ..." : "Odosielam ...", "Email sent" : "Email odoslaný", @@ -273,13 +273,13 @@ OC.L10N.register( "change" : "zmeniť", "delete" : "vymazať", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sprístupniť ľuďom na iných serveroch ownCloud pomocou syntaxe používateľ@doména.com/owncloud", "Share with users…" : "Sprístupniť používateľom...", "Share with users, groups or remote users…" : "Sprístupniť používateľom, skupinám alebo vzdialeným používateľom...", "Share with users or groups…" : "Sprístupniť používateľom alebo skupinám...", "Share with users or remote users…" : "Sprístupniť používateľom alebo vzdialeným používateľom...", "Warning" : "Varovanie", "Error while sending notification" : "Chyba pri posielaní oznámenia", - "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch" + "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sprístupniť ľuďom na iných serveroch ownCloud pomocou syntaxe používateľ@doména.com/owncloud" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json index b7af2f1f2e6..265d1445c33 100644 --- a/core/l10n/sk_SK.json +++ b/core/l10n/sk_SK.json @@ -72,7 +72,6 @@ "Strong password" : "Silné heslo", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.", "/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 nie je prístupný na čítanie procesom PHP, čo z bezpečnostných dôvodov nie je vôbec odporúčané. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</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 je nakonfigurovaný ako distribuovaná vyrovnávacia pamäť, ale v PHP je nainštalovaný nesprávny modul - \"memcache\". \\OC\\Memcache\\Memcached podporuje len modul \"memcached\", \"memcache\" nie je podporovaný. Viac informácií nájdete na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki stránke o oboch moduloch</a>.", "Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Váš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.", @@ -262,6 +261,7 @@ "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.", "Allow editing" : "Povoliť úpravy", "Sending ..." : "Odosielam ...", "Email sent" : "Email odoslaný", @@ -271,13 +271,13 @@ "change" : "zmeniť", "delete" : "vymazať", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sprístupniť ľuďom na iných serveroch ownCloud pomocou syntaxe používateľ@doména.com/owncloud", "Share with users…" : "Sprístupniť používateľom...", "Share with users, groups or remote users…" : "Sprístupniť používateľom, skupinám alebo vzdialeným používateľom...", "Share with users or groups…" : "Sprístupniť používateľom alebo skupinám...", "Share with users or remote users…" : "Sprístupniť používateľom alebo vzdialeným používateľom...", "Warning" : "Varovanie", "Error while sending notification" : "Chyba pri posielaní oznámenia", - "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch" + "No search results in other folders" : "Žiadne výsledky vyhľadávania v ostatných priečinkoch", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Sprístupniť ľuďom na iných serveroch ownCloud pomocou syntaxe používateľ@doména.com/owncloud" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/core/l10n/sl.js b/core/l10n/sl.js index 262dc31874e..cba72095ddd 100644 --- a/core/l10n/sl.js +++ b/core/l10n/sl.js @@ -313,7 +313,6 @@ OC.L10N.register( "change" : "sprememba", "delete" : "izbriše", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud", "Share with users…" : "Omogoči souporabo z ...", "Share with users, groups or remote users…" : "Souporaba z uporabniki, skupinami ali zunanjimi uporabniki ...", "Share with users or groups…" : "Souporaba z uporabniki ali skupinami ...", @@ -330,6 +329,7 @@ OC.L10N.register( "Please authenticate using the selected factor." : "Prijavite se z izbrano metodo.", "An error occured while verifying the token" : "Napaka se je zgodila med preverjanjem ključa", "An error occured. Please try again" : "Zgodila se je napaka. Poskusi ponovno", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud", "not assignable" : "ni nastavljivo", "Updating {productName} to version {version}, this may take a while." : "Posodabljanje {productName} na različico {version}, lahko traja nekaj časa.", "An internal error occured." : "Zgodila se je interna napaka." diff --git a/core/l10n/sl.json b/core/l10n/sl.json index d418fda48c9..01fd91cbd46 100644 --- a/core/l10n/sl.json +++ b/core/l10n/sl.json @@ -311,7 +311,6 @@ "change" : "sprememba", "delete" : "izbriše", "{sharee} (at {server})" : "{sharee} (na {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud", "Share with users…" : "Omogoči souporabo z ...", "Share with users, groups or remote users…" : "Souporaba z uporabniki, skupinami ali zunanjimi uporabniki ...", "Share with users or groups…" : "Souporaba z uporabniki ali skupinami ...", @@ -328,6 +327,7 @@ "Please authenticate using the selected factor." : "Prijavite se z izbrano metodo.", "An error occured while verifying the token" : "Napaka se je zgodila med preverjanjem ključa", "An error occured. Please try again" : "Zgodila se je napaka. Poskusi ponovno", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud", "not assignable" : "ni nastavljivo", "Updating {productName} to version {version}, this may take a while." : "Posodabljanje {productName} na različico {version}, lahko traja nekaj časa.", "An internal error occured." : "Zgodila se je interna napaka." diff --git a/core/l10n/sq.js b/core/l10n/sq.js index 3d1aeececd9..e488b550421 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -81,7 +81,6 @@ OC.L10N.register( "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>." : "S’ka të formësuar fshehtinë kujtese. Që të përmirësoni punimin, ju lutemi formësoni një të tillë, në pastë. Më tepër të dhëna mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "/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 s’lexohet dot nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër të dhëna mund të gjenden te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "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." : "Po xhironi PHP {version}. Ju nxisim të përmirësoni versionin e PHP-së që të përfitoni <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">nga përditësimet e punimit dhe sigurisë të ofruara PHP Group</a>, sapo të mbulohet nga shpërndarja juaj.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "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 është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki-n mbi memcached rreth të dy moduleve</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>)" : "Disa kartela s’e kaluan dot kontrollin e pacenueshmërisë. Më tepër të dhëna se si të zgjidhet ky problem mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listë e kartelave të pavlefshme…</a> / <a href=\"{rescanEndpoint}\">Rikontrollojini…</a>)", "Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit", @@ -290,6 +289,7 @@ OC.L10N.register( "Oct." : "Tet.", "Nov." : "Nën.", "Dec." : "Dhj.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "Allow editing" : "Lejo përpunim", "Sending ..." : "Po dërgohet …", "Email sent" : "Email-i u dërgua", @@ -300,7 +300,6 @@ OC.L10N.register( "change" : "ndërroje", "delete" : "fshije", "{sharee} (at {server})" : "{sharee} (në {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud", "Share with users…" : "Ndajeni me përdorues…", "Share with users, groups or remote users…" : "Ndajeni me përdorues, grupe ose përdorues të largët…", "Share with users or groups…" : "Ndajeni me përdorues ose grupe…", @@ -312,6 +311,7 @@ OC.L10N.register( "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Siguria e zgjeruar është aktivizuar për llogarinë tuaj. Ju lutemi, bëni mirëfilltësimin duke përdorur një faktor të dytë.", "Cancel login" : "Anuloje hyrjen", "Please authenticate using the selected factor." : "Ju lutemi, bëni mirëfilltësimin duke përdorur faktorin e përzgjedhur.", - "An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it" + "An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 849d6b41cfe..aef1ab98bd7 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -79,7 +79,6 @@ "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>." : "S’ka të formësuar fshehtinë kujtese. Që të përmirësoni punimin, ju lutemi formësoni një të tillë, në pastë. Më tepër të dhëna mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "/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 s’lexohet dot nga PHP-ja, çka shkëshillohet me forcë, për arsye sigurie. Më tepër të dhëna mund të gjenden te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "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." : "Po xhironi PHP {version}. Ju nxisim të përmirësoni versionin e PHP-së që të përfitoni <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">nga përditësimet e punimit dhe sigurisë të ofruara PHP Group</a>, sapo të mbulohet nga shpërndarja juaj.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "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 është formësuar si fshehtinë e shpërndarë, por është instaluar moduli i gabuar PHP \"memcache\". \\OC\\Memcache\\Memcached mbulon vetëm \"memcached\" dhe jo \"memcache\". Shihni <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">wiki-n mbi memcached rreth të dy moduleve</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>)" : "Disa kartela s’e kaluan dot kontrollin e pacenueshmërisë. Më tepër të dhëna se si të zgjidhet ky problem mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë. (<a href=\"{codeIntegrityDownloadEndpoint}\">Listë e kartelave të pavlefshme…</a> / <a href=\"{rescanEndpoint}\">Rikontrollojini…</a>)", "Error occurred while checking server setup" : "Ndodhi një gabim gjatë kontrollit të rregullimit të shërbyesit", @@ -288,6 +287,7 @@ "Oct." : "Tet.", "Nov." : "Nën.", "Dec." : "Dhj.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Formësimi për krye ndërmjetësi prapësor është i pasaktë, ose jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar. Nëse s’jeni duke hyrë në ownCloud prej një ndërmjetësi të besuar, ky është një problem sigurie dhe mund t’i lejojë një agresori të maskojë adresën e vet IP si një të pranueshme nga ownCloud-i. Të dhëna të mëtejshme mund të gjeni te <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentimi</a> ynë.", "Allow editing" : "Lejo përpunim", "Sending ..." : "Po dërgohet …", "Email sent" : "Email-i u dërgua", @@ -298,7 +298,6 @@ "change" : "ndërroje", "delete" : "fshije", "{sharee} (at {server})" : "{sharee} (në {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud", "Share with users…" : "Ndajeni me përdorues…", "Share with users, groups or remote users…" : "Ndajeni me përdorues, grupe ose përdorues të largët…", "Share with users or groups…" : "Ndajeni me përdorues ose grupe…", @@ -310,6 +309,7 @@ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Siguria e zgjeruar është aktivizuar për llogarinë tuaj. Ju lutemi, bëni mirëfilltësimin duke përdorur një faktor të dytë.", "Cancel login" : "Anuloje hyrjen", "Please authenticate using the selected factor." : "Ju lutemi, bëni mirëfilltësimin duke përdorur faktorin e përzgjedhur.", - "An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it" + "An error occured while verifying the token" : "Ndodhi një gabim gjatë verifikimit të token-it", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Ndajeni me persona në ownCloud-e të tjera duke përdorur sintaksën username@example.com/owncloud" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/sv.js b/core/l10n/sv.js index d6862de7241..ce2992708d7 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -83,7 +83,6 @@ OC.L10N.register( "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>." : "Ingen minnes cache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 är inte läsbar av PHP vilket definitivt inte är rekommenderat av säkerhetsskäl. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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." : "Du kör för närvarande PHP {version}. Vi rekommenderar dig att uppgradera din PHP version så att ta fördel utav <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestanda och säkerhetsuppdateringar från PHP Group</a> så fort som din distribution stödjer det.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 är konfigurerad som distribuerad cache, men fel PHP modul \"memcache\" är installerad. \\OC\\Memcache\\Memcached stödjer bara \"memcached\" och inte \"memcache\". Se wiki för <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached för båda modulerna</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>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)", "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens setup gjordes", @@ -309,6 +308,7 @@ OC.L10N.register( "Nov." : "Nov.", "Dec." : "Dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner så som extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.", "Allow editing" : "Tillåt redigering", "Sending ..." : "Skickar ...", "Email sent" : "E-post skickat", @@ -319,7 +319,6 @@ OC.L10N.register( "change" : "ändra", "delete" : "radera", "{sharee} (at {server})" : "{sharee} (at {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dela med folk på andra ownClouds med följande syntax username@example.com/owncloud", "Share with users…" : "Dela med användare...", "Share with users, groups or remote users…" : "Dela med användare, grupper och fjärranvändare...", "Share with users or groups…" : "Dela med användare eller grupper...", @@ -344,6 +343,7 @@ OC.L10N.register( "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation <a target=\"_blank\" href=\"{docLink}\">dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP header är inte konfigurerad till minst \"{seconds}\" sekunder. För utökad säkerhet rekommenderas att HSTS aktiveras som beskrivs i våra <a href=\"{docUrl}\">säkerhetstips</a>.", "An error occured. Please try again" : "Ett fel inträffade. Var god försök igen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dela med folk på andra ownClouds med följande syntax username@example.com/owncloud", "not assignable" : "Inte tilldelbar", "Updating {productName} to version {version}, this may take a while." : "Uppdaterar {productName} till version {version}, detta kan ta en stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "För information om hur servern bör konfigureras, se <a href=\"%s\" target=\"_blank\">dokumentationen</a>.", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index 6e2b76d2867..9894e2a74f3 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -81,7 +81,6 @@ "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>." : "Ingen minnes cache har blivit konfigurerad. För att förbättra din prestanda var god konfigurera memcache om tillgängligt. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 är inte läsbar av PHP vilket definitivt inte är rekommenderat av säkerhetsskäl. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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." : "Du kör för närvarande PHP {version}. Vi rekommenderar dig att uppgradera din PHP version så att ta fördel utav <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">prestanda och säkerhetsuppdateringar från PHP Group</a> så fort som din distribution stödjer det.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</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 är konfigurerad som distribuerad cache, men fel PHP modul \"memcache\" är installerad. \\OC\\Memcache\\Memcached stödjer bara \"memcached\" och inte \"memcache\". Se wiki för <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached för båda modulerna</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>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)", "Error occurred while checking server setup" : "Ett fel inträffade när en kontroll utav servens setup gjordes", @@ -307,6 +306,7 @@ "Nov." : "Nov.", "Dec." : "Dec.", "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Servern har ingen fungerande internetuppkoppling. Detta betyder att vissa funktioner så som extern lagring, notifikationer om uppdateringar eller installationer utav tredjepartsapplikationer inte kommer fungera. Åtkomst av filer utifrån och att skicka notifieringar via epost kanske inte fungerar heller. Vi föreslår att internetanslutningen aktiveras för denna server om man vill använda samtliga funktioner.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfiguration för \"reverse proxy headers\" är felaktig eller så försöker du nå Owncloud från en betrodd proxy. Om du inte försöker nå Owncloud från en betrodd proxy, detta är en säkerhetsrisk och kan möjliggöra att en hacker att förfalska sin IP adress som är synlig för Owncloud. Vidare information kan finnas i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentation</a>.", "Allow editing" : "Tillåt redigering", "Sending ..." : "Skickar ...", "Email sent" : "E-post skickat", @@ -317,7 +317,6 @@ "change" : "ändra", "delete" : "radera", "{sharee} (at {server})" : "{sharee} (at {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dela med folk på andra ownClouds med följande syntax username@example.com/owncloud", "Share with users…" : "Dela med användare...", "Share with users, groups or remote users…" : "Dela med användare, grupper och fjärranvändare...", "Share with users or groups…" : "Dela med användare eller grupper...", @@ -342,6 +341,7 @@ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Några filer passerade inte integritetskontrollen. Vidare information om hur man löser dessa problem kan finnas i vår dokumentation <a target=\"_blank\" href=\"{docLink}\">dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista över felaktiga filer…</a> / <a href=\"{rescanEndpoint}\">Sök igenom igen…</a>)", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "\"Strict-Transport-Security\" HTTP header är inte konfigurerad till minst \"{seconds}\" sekunder. För utökad säkerhet rekommenderas att HSTS aktiveras som beskrivs i våra <a href=\"{docUrl}\">säkerhetstips</a>.", "An error occured. Please try again" : "Ett fel inträffade. Var god försök igen", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Dela med folk på andra ownClouds med följande syntax username@example.com/owncloud", "not assignable" : "Inte tilldelbar", "Updating {productName} to version {version}, this may take a while." : "Uppdaterar {productName} till version {version}, detta kan ta en stund.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\">documentation</a>." : "För information om hur servern bör konfigureras, se <a href=\"%s\" target=\"_blank\">dokumentationen</a>.", diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index ae126b66899..6ad1e66aa2c 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -276,11 +276,11 @@ OC.L10N.register( "create" : "สร้าง", "change" : "เปลี่ยนแปลง", "delete" : "ลบ", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ", "Share with users, groups or remote users…" : "แชร์กับผู้ใช้หรือกลุ่มหรือผู้ใช้โดยการรีโมท ...", "Share with users or remote users…" : "แชร์กับผู้ใช้หรือผู้ใช้โดยการรีโมท ...", "Warning" : "คำเตือน", "Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน", - "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ" + "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud " }, "nplurals=1; plural=0;"); diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index b876a9a37e0..9d8f6f4d779 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -274,11 +274,11 @@ "create" : "สร้าง", "change" : "เปลี่ยนแปลง", "delete" : "ลบ", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ", "Share with users, groups or remote users…" : "แชร์กับผู้ใช้หรือกลุ่มหรือผู้ใช้โดยการรีโมท ...", "Share with users or remote users…" : "แชร์กับผู้ใช้หรือผู้ใช้โดยการรีโมท ...", "Warning" : "คำเตือน", "Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน", - "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ" + "No search results in other folders" : "ไม่พบผลลัพธ์การค้นหาในโฟลเดอร์อื่นๆ", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud " },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/tr.js b/core/l10n/tr.js index 3e5c5d67526..3aaf790b0c4 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -82,7 +82,6 @@ OC.L10N.register( "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>." : "Hafıza önbelleği yapılandırılmamış. İmkanı varsa performansı iyileştirmek için bir önbellek yapılandırması yapın. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "/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>." : "Güvenlik nedeniyle çokça önerilen /dev/urandom PHP tarafından okunamıyor. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "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." : "Halen PHP {version} kullanıyorsunuz. Dağıtımınız destekler desteklemez PHP sürümünüzü güncelleyerek <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performans ve güvenlik geliştirmelerinden</a> faydalanmanızı öneriyoruz.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "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 dağıtık bellek olarak yapılandırılmış ama hatalı PHP \"memcache\" modülü kurulmuş. \\OC\\Memcache\\Memcached sadece \"memcached\" modülünü destekler, \"memcache\"i değil. <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wikisinde iki modül hakkında da</a> bilgi bulabilirsiniz.", "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>)" : "Bazı dosyalar bütünlük kontrolünü geçemedi. Bu sorunun üstesinden nasıl geleceğinizi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz. (<a href=\"{codeIntegrityDownloadEndpoint}\">Geçersiz dosyaların listesi…</a> / <a href=\"{rescanEndpoint}\">Tekrar tara…</a>)", "Error occurred while checking server setup" : "Sunucu yapılandırması denetlenirken hata oluştu", @@ -298,6 +297,7 @@ OC.L10N.register( "Oct." : "Eki.", "Nov." : "Kas.", "Dec." : "Ara.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "Allow editing" : "Düzenlemeye izin ver", "Sending ..." : "Gönderiliyor...", "Email sent" : "E-posta gönderildi", @@ -308,7 +308,6 @@ OC.L10N.register( "change" : "değiştir", "delete" : "sil", "{sharee} (at {server})" : "{sharee} ({server} sunucusunda)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş", "Share with users…" : "Kullanıcılarla paylaş...", "Share with users, groups or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Share with users or groups…" : "Kullanıcı ve gruplarla paylaş...", @@ -320,6 +319,7 @@ OC.L10N.register( "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Hesabınız için gelişmiş güvenlik etkinleştirildi. Lütfen ikinci etkeni kullanarak kimlik doğrulaması yapın.", "Cancel login" : "Girişi iptal et", "Please authenticate using the selected factor." : "Lütfen seçilen etkeni kullanarak kimlik doğrulaması yapın.", - "An error occured while verifying the token" : "Anahtarı(token) doğrularken bir hata oluştu" + "An error occured while verifying the token" : "Anahtarı(token) doğrularken bir hata oluştu", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş" }, "nplurals=2; plural=(n > 1);"); diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 86b46c4a290..362e692858b 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -80,7 +80,6 @@ "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>." : "Hafıza önbelleği yapılandırılmamış. İmkanı varsa performansı iyileştirmek için bir önbellek yapılandırması yapın. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "/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>." : "Güvenlik nedeniyle çokça önerilen /dev/urandom PHP tarafından okunamıyor. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "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." : "Halen PHP {version} kullanıyorsunuz. Dağıtımınız destekler desteklemez PHP sürümünüzü güncelleyerek <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performans ve güvenlik geliştirmelerinden</a> faydalanmanızı öneriyoruz.", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "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 dağıtık bellek olarak yapılandırılmış ama hatalı PHP \"memcache\" modülü kurulmuş. \\OC\\Memcache\\Memcached sadece \"memcached\" modülünü destekler, \"memcache\"i değil. <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wikisinde iki modül hakkında da</a> bilgi bulabilirsiniz.", "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>)" : "Bazı dosyalar bütünlük kontrolünü geçemedi. Bu sorunun üstesinden nasıl geleceğinizi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz. (<a href=\"{codeIntegrityDownloadEndpoint}\">Geçersiz dosyaların listesi…</a> / <a href=\"{rescanEndpoint}\">Tekrar tara…</a>)", "Error occurred while checking server setup" : "Sunucu yapılandırması denetlenirken hata oluştu", @@ -296,6 +295,7 @@ "Oct." : "Eki.", "Nov." : "Kas.", "Dec." : "Ara.", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ters vekil sunucu başlık yapılandırmanız hatalı veya ownCloud'a güvenilen bir vekil sunucudan erişiyorsunuz. Eğer erişiminiz güvenilen bir vekil sunucu aracılığıyla gerçekleşmiyorsa bu bir güvenlik sorunudur ve bir saldırganın IP adresini farklıymış gibi göstermesine neden olabilir. Daha fazla bilgiyi <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">belgelendirmemizde</a> bulabilirsiniz.", "Allow editing" : "Düzenlemeye izin ver", "Sending ..." : "Gönderiliyor...", "Email sent" : "E-posta gönderildi", @@ -306,7 +306,6 @@ "change" : "değiştir", "delete" : "sil", "{sharee} (at {server})" : "{sharee} ({server} sunucusunda)", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş", "Share with users…" : "Kullanıcılarla paylaş...", "Share with users, groups or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...", "Share with users or groups…" : "Kullanıcı ve gruplarla paylaş...", @@ -318,6 +317,7 @@ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Hesabınız için gelişmiş güvenlik etkinleştirildi. Lütfen ikinci etkeni kullanarak kimlik doğrulaması yapın.", "Cancel login" : "Girişi iptal et", "Please authenticate using the selected factor." : "Lütfen seçilen etkeni kullanarak kimlik doğrulaması yapın.", - "An error occured while verifying the token" : "Anahtarı(token) doğrularken bir hata oluştu" + "An error occured while verifying the token" : "Anahtarı(token) doğrularken bir hata oluştu", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/core/l10n/uk.js b/core/l10n/uk.js index 55e200f033f..ef63ff82d93 100644 --- a/core/l10n/uk.js +++ b/core/l10n/uk.js @@ -288,7 +288,6 @@ OC.L10N.register( "change" : "змінити", "delete" : "видалити", "{sharee} (at {server})" : "{sharee} (на {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поширити серед людей інших ownCloud'ів, використовуючи синтаксис ім'я_користувача@файли.укр/owncloud", "Share with users…" : "Поділитись з користувачами...", "Share with users, groups or remote users…" : "Поділитись з користувачами, групами або віддаленими користувачами...", "Share with users or groups…" : "Поділитись з користувачами або групами...", @@ -297,6 +296,7 @@ OC.L10N.register( "Error while sending notification" : "Помилка під час надсилання повідомлення", "No search results in other folders" : "В інших теках нічого не знайдено", "Two-step verification" : "Дворівнева перевірка", - "An error occured while verifying the token" : "При верифікації токена виникла помилка" + "An error occured while verifying the token" : "При верифікації токена виникла помилка", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поширити серед людей інших ownCloud'ів, використовуючи синтаксис ім'я_користувача@файли.укр/owncloud" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/core/l10n/uk.json b/core/l10n/uk.json index 7402929ecff..26052481a97 100644 --- a/core/l10n/uk.json +++ b/core/l10n/uk.json @@ -286,7 +286,6 @@ "change" : "змінити", "delete" : "видалити", "{sharee} (at {server})" : "{sharee} (на {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поширити серед людей інших ownCloud'ів, використовуючи синтаксис ім'я_користувача@файли.укр/owncloud", "Share with users…" : "Поділитись з користувачами...", "Share with users, groups or remote users…" : "Поділитись з користувачами, групами або віддаленими користувачами...", "Share with users or groups…" : "Поділитись з користувачами або групами...", @@ -295,6 +294,7 @@ "Error while sending notification" : "Помилка під час надсилання повідомлення", "No search results in other folders" : "В інших теках нічого не знайдено", "Two-step verification" : "Дворівнева перевірка", - "An error occured while verifying the token" : "При верифікації токена виникла помилка" + "An error occured while verifying the token" : "При верифікації токена виникла помилка", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Поширити серед людей інших ownCloud'ів, використовуючи синтаксис ім'я_користувача@файли.укр/owncloud" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index e0bc6c65d76..bc89978f439 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -81,7 +81,6 @@ OC.L10N.register( "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>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</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>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)", "Error occurred while checking server setup" : "当检查服务器启动时出错", @@ -290,6 +289,7 @@ OC.L10N.register( "Oct." : "十月", "Nov." : "十一月", "Dec." : "十二月", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。", "Allow editing" : "允许编辑", "Sending ..." : "正在发送...", "Email sent" : "邮件已发送", @@ -300,7 +300,6 @@ OC.L10N.register( "change" : "更改", "delete" : "删除", "{sharee} (at {server})" : "{sharee} (位于 {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户", "Share with users…" : "与用户分享...", "Share with users, groups or remote users…" : "与用户,组或远程用户分享...", "Share with users or groups…" : "与用户或组分享...", @@ -312,6 +311,7 @@ OC.L10N.register( "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。", "Cancel login" : "取消登录", "Please authenticate using the selected factor." : "请使用所选择的因素验证。", - "An error occured while verifying the token" : "在验证令牌时出错" + "An error occured while verifying the token" : "在验证令牌时出错", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index 759cbe25bc3..588b1d42b25 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -79,7 +79,6 @@ "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>." : "内存缓存未配置。如果可用,请配置 memcache 来增强性能。更多信息请查看我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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 无法被 PHP 读取,出于安全原因,这是强烈不推荐的。请查看<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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." : "你的 PHP 版本 ({version}) 不再被 <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> PHP </a>支持。我们建议您升级您的PHP版本,以便获得 PHP 性能和安全提升。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</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 配置为分布式缓存,但是已经安装的 PHP 模块是 \"memcache\" 。 \\OC\\Memcache\\Memcached 仅支持 \"memcached\" 而不是 \"memcache\"。点击 <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\"> memcached wiki 了解两个模块的不同</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>)" : "一些文件没有通过完整性检查。如何解决此问题的详细信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">无效文件列表…</a> / <a href=\"{rescanEndpoint}\">重新扫描…</a>)", "Error occurred while checking server setup" : "当检查服务器启动时出错", @@ -288,6 +287,7 @@ "Oct." : "十月", "Nov." : "十一月", "Dec." : "十二月", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "反向代理头配置不正确,或者您正从一个受信任的代理访问ownCloud。如果你不是通过受信任的代理访问 ownCloud,这将引发一个安全问题,可能由于 ownCloud IP 地址可见导致欺骗攻击。更多信息可以查看我们的 <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>。", "Allow editing" : "允许编辑", "Sending ..." : "正在发送...", "Email sent" : "邮件已发送", @@ -298,7 +298,6 @@ "change" : "更改", "delete" : "删除", "{sharee} (at {server})" : "{sharee} (位于 {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户", "Share with users…" : "与用户分享...", "Share with users, groups or remote users…" : "与用户,组或远程用户分享...", "Share with users or groups…" : "与用户或组分享...", @@ -310,6 +309,7 @@ "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "您的帐户已启用增强安全性,请使用第二因子验证。", "Cancel login" : "取消登录", "Please authenticate using the selected factor." : "请使用所选择的因素验证。", - "An error occured while verifying the token" : "在验证令牌时出错" + "An error occured while verifying the token" : "在验证令牌时出错", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index c0916432854..27d149db0d4 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -308,7 +308,6 @@ OC.L10N.register( "change" : "更動", "delete" : "刪除", "{sharee} (at {server})" : "{sharee} (在 {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "與其他在ownCloud上的人們分享,請使用此格式 username@example.com/owncloud", "Share with users…" : "分享給其他使用者…", "Share with users, groups or remote users…" : "分享給其他使用者、群組或遠端使用者…", "Share with users or groups…" : "分享給群組或使用者…", @@ -325,6 +324,7 @@ OC.L10N.register( "Please authenticate using the selected factor." : "請以選擇的二階段方式認證", "An error occured while verifying the token" : "驗證 token 時發生錯誤", "An error occured. Please try again" : "發生錯誤,請重試", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "與其他在ownCloud上的人們分享,請使用此格式 username@example.com/owncloud", "not assignable" : "不可指定", "Updating {productName} to version {version}, this may take a while." : "正在更新 {productName} 至版本 {version} ,需要一些時間", "An internal error occured." : "發生內部錯誤" diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index aacbc337553..6de08596cb2 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -306,7 +306,6 @@ "change" : "更動", "delete" : "刪除", "{sharee} (at {server})" : "{sharee} (在 {server})", - "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "與其他在ownCloud上的人們分享,請使用此格式 username@example.com/owncloud", "Share with users…" : "分享給其他使用者…", "Share with users, groups or remote users…" : "分享給其他使用者、群組或遠端使用者…", "Share with users or groups…" : "分享給群組或使用者…", @@ -323,6 +322,7 @@ "Please authenticate using the selected factor." : "請以選擇的二階段方式認證", "An error occured while verifying the token" : "驗證 token 時發生錯誤", "An error occured. Please try again" : "發生錯誤,請重試", + "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "與其他在ownCloud上的人們分享,請使用此格式 username@example.com/owncloud", "not assignable" : "不可指定", "Updating {productName} to version {version}, this may take a while." : "正在更新 {productName} 至版本 {version} ,需要一些時間", "An internal error occured." : "發生內部錯誤" diff --git a/core/routes.php b/core/routes.php index c890d232cfe..e5636ff6c00 100644 --- a/core/routes.php +++ b/core/routes.php @@ -46,6 +46,7 @@ $application->registerRoutes($this, [ ['name' => 'avatar#getTmpAvatar', 'url' => '/avatar/tmp', 'verb' => 'GET'], ['name' => 'avatar#postAvatar', 'url' => '/avatar/', 'verb' => 'POST'], ['name' => 'login#tryLogin', 'url' => '/login', 'verb' => 'POST'], + ['name' => 'login#confirmPassword', 'url' => '/login/confirm', 'verb' => 'POST'], ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'], ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#selectChallenge', 'url' => '/login/selectchallenge', 'verb' => 'GET'], @@ -59,6 +60,7 @@ $application->registerRoutes($this, [ ['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'], ['root' => '/cloud', 'name' => 'OCS#getCurrentUser', 'url' => '/user', 'verb' => 'GET'], ['root' => '', 'name' => 'OCS#getConfig', 'url' => '/config', 'verb' => 'GET'], + ['root' => '/person', 'name' => 'OCS#personCheck', 'url' => '/check', 'verb' => 'POST'], ], ]); diff --git a/core/shipped.json b/core/shipped.json index 9855a663847..f831d17f36a 100644 --- a/core/shipped.json +++ b/core/shipped.json @@ -21,6 +21,7 @@ "files_videoplayer", "firstrunwizard", "gallery", + "logreader", "notifications", "password_policy", "provisioning_api", diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index bc8edf085d0..1d0ac5fa146 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -146,6 +146,14 @@ </div> </div></nav> + <div id="sudo-login-background" class="hidden"></div> + <div id="sudo-login-form" class="hidden"> + <?php p($l->t('This action requires you to confirm your password:')); ?><br> + <input type="password" class="question" autocomplete="off" name="question" value=" <?php /* Hack against firefox ignoring autocomplete="off" */ ?>" + placeholder="<?php p($l->t('Confirm your password')); ?>" /> + <input class="confirm icon-confirm" title="<?php p($l->t('Confirm')); ?>" value="" type="submit"> + </div> + <div id="content-wrapper"> <div id="content" class="app-<?php p($_['appid']) ?>" role="main"> <?php print_unescaped($_['content']); ?> diff --git a/db_structure.xml b/db_structure.xml index 09dbde710d3..c7e1e072a8e 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -1152,6 +1152,13 @@ <length>4</length> </field> + <field> + <name>scope</name> + <type>clob</type> + <default></default> + <notnull>false</notnull> + </field> + <index> <name>authtoken_token_index</name> <unique>true</unique> diff --git a/lib/autoloader.php b/lib/autoloader.php index 08188ef8e59..3fff025080e 100644 --- a/lib/autoloader.php +++ b/lib/autoloader.php @@ -117,6 +117,13 @@ class Autoloader { // This File is considered public API, so we make sure that the class // can still be loaded, although the PSR-4 paths have not been loaded. $paths[] = \OC::$SERVERROOT . '/tests/lib/TestCase.php'; + + } elseif ($class === 'Test\\TestCasePhpUnitCompatibility') { + $paths[] = \OC::$SERVERROOT . '/tests/lib/TestCasePhpUnitCompatibility.php'; + } elseif ($class === 'Test\\TestCasePhpUnit5') { + $paths[] = \OC::$SERVERROOT . '/tests/lib/TestCasePhpUnit5.php'; + } elseif ($class === 'Test\\TestCasePhpUnit4') { + $paths[] = \OC::$SERVERROOT . '/tests/lib/TestCasePhpUnit4.php'; } return $paths; } diff --git a/lib/base.php b/lib/base.php index 909a62040ee..d6c6e17eff9 100644 --- a/lib/base.php +++ b/lib/base.php @@ -377,7 +377,7 @@ class OC { \OCP\Util::addScript('update'); \OCP\Util::addStyle('update'); - /** @var \OCP\App\IAppManager $appManager */ + /** @var \OC\App\AppManager $appManager */ $appManager = \OC::$server->getAppManager(); $tmpl = new OC_Template('', 'update.admin', 'guest'); @@ -387,14 +387,19 @@ class OC { // get third party apps $ocVersion = \OCP\Util::getVersion(); $incompatibleApps = $appManager->getIncompatibleApps($ocVersion); + $incompatibleShippedApps = []; foreach ($incompatibleApps as $appInfo) { if ($appManager->isShipped($appInfo['id'])) { - $l = \OC::$server->getL10N('core'); - $hint = $l->t('The files of the app "%$1s" (%$2s) were not replaced correctly.', [$appInfo['name'], $appInfo['id']]); - throw new \OC\HintException('The files of the app "' . $appInfo['name'] . '" (' . $appInfo['id'] . ') were not replaced correctly.', $hint); + $incompatibleShippedApps[] = $appInfo['name'] . ' (' . $appInfo['id'] . ')'; } } + if (!empty($incompatibleShippedApps)) { + $l = \OC::$server->getL10N('core'); + $hint = $l->t('The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server.', [implode(', ', $incompatibleShippedApps)]); + throw new \OC\HintException('The files of the app ' . implode(', ', $incompatibleShippedApps) . ' were not replaced correctly. Make sure it is a version compatible with the server.', $hint); + } + $tmpl->assign('appsToUpgrade', $appManager->getAppsNeedingUpgrade($ocVersion)); $tmpl->assign('incompatibleAppsList', $incompatibleApps); $tmpl->assign('productName', 'Nextcloud'); // for now diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 42cfb8c45e1..dafa46bc996 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -189,6 +189,7 @@ return array( 'OCP\\LDAP\\ILDAPProviderFactory' => $baseDir . '/lib/public/LDAP/ILDAPProviderFactory.php', 'OCP\\Lock\\ILockingProvider' => $baseDir . '/lib/public/Lock/ILockingProvider.php', 'OCP\\Lock\\LockedException' => $baseDir . '/lib/public/Lock/LockedException.php', + 'OCP\\Lockdown\\ILockdownManager' => $baseDir . '/lib/public/Lockdown/ILockdownManager.php', 'OCP\\Mail\\IMailer' => $baseDir . '/lib/public/Mail/IMailer.php', 'OCP\\Migration\\IOutput' => $baseDir . '/lib/public/Migration/IOutput.php', 'OCP\\Migration\\IRepairStep' => $baseDir . '/lib/public/Migration/IRepairStep.php', @@ -264,6 +265,7 @@ return array( 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\AppNotEnabledException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/AppNotEnabledException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\CrossSiteRequestForgeryException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/CrossSiteRequestForgeryException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotAdminException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotAdminException.php', + 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotConfirmedException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotConfirmedException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotLoggedInException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotLoggedInException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\SecurityException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/SecurityException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\StrictCookieMissingException' => $baseDir . '/lib/private/AppFramework/Middleware/Security/Exceptions/StrictCookieMissingException.php', @@ -580,6 +582,9 @@ return array( 'OC\\Lock\\DBLockingProvider' => $baseDir . '/lib/private/Lock/DBLockingProvider.php', 'OC\\Lock\\MemcacheLockingProvider' => $baseDir . '/lib/private/Lock/MemcacheLockingProvider.php', 'OC\\Lock\\NoopLockingProvider' => $baseDir . '/lib/private/Lock/NoopLockingProvider.php', + 'OC\\Lockdown\\Filesystem\\NullCache' => $baseDir . '/lib/private/Lockdown/Filesystem/NullCache.php', + 'OC\\Lockdown\\Filesystem\\NullStorage' => $baseDir . '/lib/private/Lockdown/Filesystem/NullStorage.php', + 'OC\\Lockdown\\LockdownManager' => $baseDir . '/lib/private/Lockdown/LockdownManager.php', 'OC\\Log' => $baseDir . '/lib/private/Log.php', 'OC\\Log\\ErrorHandler' => $baseDir . '/lib/private/Log/ErrorHandler.php', 'OC\\Log\\Errorlog' => $baseDir . '/lib/private/Log/Errorlog.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index d7e937577f2..5b8356785bc 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -219,6 +219,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\LDAP\\ILDAPProviderFactory' => __DIR__ . '/../../..' . '/lib/public/LDAP/ILDAPProviderFactory.php', 'OCP\\Lock\\ILockingProvider' => __DIR__ . '/../../..' . '/lib/public/Lock/ILockingProvider.php', 'OCP\\Lock\\LockedException' => __DIR__ . '/../../..' . '/lib/public/Lock/LockedException.php', + 'OCP\\Lockdown\\ILockdownManager' => __DIR__ . '/../../..' . '/lib/public/Lockdown/ILockdownManager.php', 'OCP\\Mail\\IMailer' => __DIR__ . '/../../..' . '/lib/public/Mail/IMailer.php', 'OCP\\Migration\\IOutput' => __DIR__ . '/../../..' . '/lib/public/Migration/IOutput.php', 'OCP\\Migration\\IRepairStep' => __DIR__ . '/../../..' . '/lib/public/Migration/IRepairStep.php', @@ -294,6 +295,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\AppNotEnabledException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/AppNotEnabledException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\CrossSiteRequestForgeryException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/CrossSiteRequestForgeryException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotAdminException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotAdminException.php', + 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotConfirmedException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotConfirmedException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\NotLoggedInException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/NotLoggedInException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\SecurityException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/SecurityException.php', 'OC\\AppFramework\\Middleware\\Security\\Exceptions\\StrictCookieMissingException' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Middleware/Security/Exceptions/StrictCookieMissingException.php', @@ -610,6 +612,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Lock\\DBLockingProvider' => __DIR__ . '/../../..' . '/lib/private/Lock/DBLockingProvider.php', 'OC\\Lock\\MemcacheLockingProvider' => __DIR__ . '/../../..' . '/lib/private/Lock/MemcacheLockingProvider.php', 'OC\\Lock\\NoopLockingProvider' => __DIR__ . '/../../..' . '/lib/private/Lock/NoopLockingProvider.php', + 'OC\\Lockdown\\Filesystem\\NullCache' => __DIR__ . '/../../..' . '/lib/private/Lockdown/Filesystem/NullCache.php', + 'OC\\Lockdown\\Filesystem\\NullStorage' => __DIR__ . '/../../..' . '/lib/private/Lockdown/Filesystem/NullStorage.php', + 'OC\\Lockdown\\LockdownManager' => __DIR__ . '/../../..' . '/lib/private/Lockdown/LockdownManager.php', 'OC\\Log' => __DIR__ . '/../../..' . '/lib/private/Log.php', 'OC\\Log\\ErrorHandler' => __DIR__ . '/../../..' . '/lib/private/Log/ErrorHandler.php', 'OC\\Log\\Errorlog' => __DIR__ . '/../../..' . '/lib/private/Log/Errorlog.php', diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js index c4bb85acd64..97a57585936 100644 --- a/lib/l10n/cs_CZ.js +++ b/lib/l10n/cs_CZ.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "To lze obvykle vyřešit povolením zápisu webovému serveru do konfiguračního adresáře", "See %s" : "Viz %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To lze obvykle vyřešit %spovolením zápisu webovému serveru do konfiguračního adresáře%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Soubory aplikace \"%$1s\" (%$2s) nebyly řádně nahrazeny.", "Sample configuration detected" : "Byla detekována vzorová konfigurace", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php", "PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.", diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json index 9514c96394a..f352a8db458 100644 --- a/lib/l10n/cs_CZ.json +++ b/lib/l10n/cs_CZ.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "To lze obvykle vyřešit povolením zápisu webovému serveru do konfiguračního adresáře", "See %s" : "Viz %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To lze obvykle vyřešit %spovolením zápisu webovému serveru do konfiguračního adresáře%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Soubory aplikace \"%$1s\" (%$2s) nebyly řádně nahrazeny.", "Sample configuration detected" : "Byla detekována vzorová konfigurace", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php", "PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.", diff --git a/lib/l10n/de.js b/lib/l10n/de.js index 28a4da2419e..8f6047acb47 100644 --- a/lib/l10n/de.js +++ b/lib/l10n/de.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird", "See %s" : "Siehe %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Die Dateien der App \"%$1s\" (%$2s) wurden nicht korrekt ersetzt.", "Sample configuration detected" : "Beispielkonfiguration gefunden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zunichte machen und wird nicht unterstützt. Bitte die Dokumentation lesen, bevor Änderungen an der config.php vorgenommen werden.", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", diff --git a/lib/l10n/de.json b/lib/l10n/de.json index 163965e2689..30bbe1e9b3b 100644 --- a/lib/l10n/de.json +++ b/lib/l10n/de.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird", "See %s" : "Siehe %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Die Dateien der App \"%$1s\" (%$2s) wurden nicht korrekt ersetzt.", "Sample configuration detected" : "Beispielkonfiguration gefunden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zunichte machen und wird nicht unterstützt. Bitte die Dokumentation lesen, bevor Änderungen an der config.php vorgenommen werden.", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index a71b7cf72c6..1fd8fdc18ce 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird", "See %s" : "Siehe %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Die Dateien der App \"%$1s\" (%$2s) wurden nicht korrekt ersetzt.", "Sample configuration detected" : "Beispielkonfiguration gefunden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zerstören und wird nicht unterstützt. Bitte lesen Sie die Dokumentation, bevor Sie Änderungen an der config.php vornehmen.", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 8d2953651e5..7fa221231c2 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Dies kann normalerweise repariert werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird", "See %s" : "Siehe %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Die Dateien der App \"%$1s\" (%$2s) wurden nicht korrekt ersetzt.", "Sample configuration detected" : "Beispielkonfiguration gefunden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zerstören und wird nicht unterstützt. Bitte lesen Sie die Dokumentation, bevor Sie Änderungen an der config.php vornehmen.", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index c83345221a0..14b57caa516 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -100,6 +100,51 @@ OC.L10N.register( "Expiration date is in the past" : "Ha pasado la fecha de caducidad", "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.", "Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"", + "Sunday" : "Domingo", + "Monday" : "Lunes", + "Tuesday" : "Martes", + "Wednesday" : "Miércoles", + "Thursday" : "Jueves", + "Friday" : "Viernes", + "Saturday" : "Sábado", + "Sun." : "Dom.", + "Mon." : "Lun.", + "Tue." : "Mar.", + "Wed." : "Mié.", + "Thu." : "Jue.", + "Fri." : "Vie.", + "Sat." : "Sáb.", + "Su" : "Do", + "Mo" : "Lu", + "Tu" : "Ma", + "We" : "Mi", + "Th" : "Ju", + "Fr" : "Vi", + "Sa" : "Sa", + "January" : "Enero", + "February" : "Febrero", + "March" : "Marzo", + "April" : "Abril", + "May" : "Mayo", + "June" : "Junio", + "July" : "Julio", + "August" : "Agosto", + "September" : "Septiembre", + "October" : "Octubre", + "November" : "Noviembre", + "December" : "Diciembre", + "Jan." : "Ene.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Abr.", + "May." : "May.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Ago.", + "Sep." : "Sep.", + "Oct." : "Oct.", + "Nov." : "Nov.", + "Dec." : "Dic.", "Apps" : "Aplicaciones", "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", @@ -157,6 +202,7 @@ OC.L10N.register( "Storage unauthorized. %s" : "Almacenamiento no autorizado. %s", "Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s", "Storage connection error. %s" : "Error de conexión de almacenamiento. %s", + "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", "App directory already exists" : "El directorio de la aplicación ya existe", "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 3e527515359..b712849303c 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -98,6 +98,51 @@ "Expiration date is in the past" : "Ha pasado la fecha de caducidad", "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.", "Could not find category \"%s\"" : "No puede encontrar la categoría \"%s\"", + "Sunday" : "Domingo", + "Monday" : "Lunes", + "Tuesday" : "Martes", + "Wednesday" : "Miércoles", + "Thursday" : "Jueves", + "Friday" : "Viernes", + "Saturday" : "Sábado", + "Sun." : "Dom.", + "Mon." : "Lun.", + "Tue." : "Mar.", + "Wed." : "Mié.", + "Thu." : "Jue.", + "Fri." : "Vie.", + "Sat." : "Sáb.", + "Su" : "Do", + "Mo" : "Lu", + "Tu" : "Ma", + "We" : "Mi", + "Th" : "Ju", + "Fr" : "Vi", + "Sa" : "Sa", + "January" : "Enero", + "February" : "Febrero", + "March" : "Marzo", + "April" : "Abril", + "May" : "Mayo", + "June" : "Junio", + "July" : "Julio", + "August" : "Agosto", + "September" : "Septiembre", + "October" : "Octubre", + "November" : "Noviembre", + "December" : "Diciembre", + "Jan." : "Ene.", + "Feb." : "Feb.", + "Mar." : "Mar.", + "Apr." : "Abr.", + "May." : "May.", + "Jun." : "Jun.", + "Jul." : "Jul.", + "Aug." : "Ago.", + "Sep." : "Sep.", + "Oct." : "Oct.", + "Nov." : "Nov.", + "Dec." : "Dic.", "Apps" : "Aplicaciones", "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", @@ -155,6 +200,7 @@ "Storage unauthorized. %s" : "Almacenamiento no autorizado. %s", "Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s", "Storage connection error. %s" : "Error de conexión de almacenamiento. %s", + "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", "App directory already exists" : "El directorio de la aplicación ya existe", "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index 545ee1d23b5..b1b76991b2b 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire \"config\"", "See %s" : "Voir %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire de configuration%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Les fichiers de l'application « %$1s » (%$2s) n'ont pas été remplacés correctement.", "Sample configuration detected" : "Configuration d'exemple détectée", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Il a été détecté que la configuration donnée à titre d'exemple a été copiée. Cela peut rendre votre installation inopérante et n'est pas pris en charge. Veuillez lire la documentation avant d'effectuer des modifications dans config.php", "PHP %s or higher is required." : "PHP %s ou supérieur est requis.", @@ -21,6 +20,7 @@ OC.L10N.register( "Server version %s or lower is required." : "Un serveur de version %s ou inférieure est requis.", "Unknown filetype" : "Type de fichier inconnu", "Invalid image" : "Image non valable", + "Avatar image is not square" : "L'image d'avatar n'est pas carré", "today" : "aujourd'hui", "yesterday" : "hier", "_%n day ago_::_%n days ago_" : ["il y a %n jour","il y a %n jours"], @@ -203,6 +203,7 @@ OC.L10N.register( "Storage unauthorized. %s" : "Espace de stockage non autorisé. %s", "Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s", "Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s", + "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible", "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s", "App directory already exists" : "Le dossier de l'application existe déjà", "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index e810852d851..89893d2209a 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire \"config\"", "See %s" : "Voir %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire de configuration%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Les fichiers de l'application « %$1s » (%$2s) n'ont pas été remplacés correctement.", "Sample configuration detected" : "Configuration d'exemple détectée", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Il a été détecté que la configuration donnée à titre d'exemple a été copiée. Cela peut rendre votre installation inopérante et n'est pas pris en charge. Veuillez lire la documentation avant d'effectuer des modifications dans config.php", "PHP %s or higher is required." : "PHP %s ou supérieur est requis.", @@ -19,6 +18,7 @@ "Server version %s or lower is required." : "Un serveur de version %s ou inférieure est requis.", "Unknown filetype" : "Type de fichier inconnu", "Invalid image" : "Image non valable", + "Avatar image is not square" : "L'image d'avatar n'est pas carré", "today" : "aujourd'hui", "yesterday" : "hier", "_%n day ago_::_%n days ago_" : ["il y a %n jour","il y a %n jours"], @@ -201,6 +201,7 @@ "Storage unauthorized. %s" : "Espace de stockage non autorisé. %s", "Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s", "Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s", + "Storage is temporarily not available" : "Le support de stockage est temporairement indisponible", "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s", "App directory already exists" : "Le dossier de l'application existe déjà", "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s", diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js index 92651f45303..f3d5a740ab4 100644 --- a/lib/l10n/hu_HU.js +++ b/lib/l10n/hu_HU.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Ez rendszerint úgy oldható meg, hogy írási jogot adunk a webszervernek a config könyvtárra.", "See %s" : "Lásd %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ez rendszerint úgy oldható meg, hogy %sírási jogot adunk a webszervernek a config könyvtárra%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "\"%$1s\" (%$2s) alkalmazás fájljai nem megfelelően lettek cserélve.", "Sample configuration detected" : "A példabeállítások vannak beállítva", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Úgy tűnik a példakonfigurációt próbálja ténylegesen használni. Ez nem támogatott, és működésképtelenné teheti a telepítést. Kérlek olvasd el a dokumentációt és azt követően változtas a config.php-n!", "PHP %s or higher is required." : "PHP %s vagy ennél újabb szükséges.", diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json index ae980944269..29e4504a895 100644 --- a/lib/l10n/hu_HU.json +++ b/lib/l10n/hu_HU.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Ez rendszerint úgy oldható meg, hogy írási jogot adunk a webszervernek a config könyvtárra.", "See %s" : "Lásd %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ez rendszerint úgy oldható meg, hogy %sírási jogot adunk a webszervernek a config könyvtárra%s.", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "\"%$1s\" (%$2s) alkalmazás fájljai nem megfelelően lettek cserélve.", "Sample configuration detected" : "A példabeállítások vannak beállítva", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Úgy tűnik a példakonfigurációt próbálja ténylegesen használni. Ez nem támogatott, és működésképtelenné teheti a telepítést. Kérlek olvasd el a dokumentációt és azt követően változtas a config.php-n!", "PHP %s or higher is required." : "PHP %s vagy ennél újabb szükséges.", diff --git a/lib/l10n/it.js b/lib/l10n/it.js index af47d8f9e17..c61ac244637 100644 --- a/lib/l10n/it.js +++ b/lib/l10n/it.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella \"config\"", "See %s" : "Vedi %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ciò può essere normalmente corretto %sfornendo al server web accesso in scrittura alla cartella \"config\"%s", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "I file dell'applicazione \"%1$s\" (%2$s) non sono stati sostituiti correttamente.", "Sample configuration detected" : "Configurazione di esempio rilevata", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "È stato rilevato che la configurazione di esempio è stata copiata. Ciò può compromettere la tua installazione e non è supportato. Leggi la documentazione prima di modificare il file config.php", "PHP %s or higher is required." : "Richiesto PHP %s o superiore", diff --git a/lib/l10n/it.json b/lib/l10n/it.json index cb4b4139b07..4e310444042 100644 --- a/lib/l10n/it.json +++ b/lib/l10n/it.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella \"config\"", "See %s" : "Vedi %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ciò può essere normalmente corretto %sfornendo al server web accesso in scrittura alla cartella \"config\"%s", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "I file dell'applicazione \"%1$s\" (%2$s) non sono stati sostituiti correttamente.", "Sample configuration detected" : "Configurazione di esempio rilevata", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "È stato rilevato che la configurazione di esempio è stata copiata. Ciò può compromettere la tua installazione e non è supportato. Leggi la documentazione prima di modificare il file config.php", "PHP %s or higher is required." : "Richiesto PHP %s o superiore", diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index ed9100bfaf8..f44511d8cb2 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -5,7 +5,6 @@ OC.L10N.register( "This can usually be fixed by giving the webserver write access to the config directory" : "Dit kan hersteld worden door de webserver schrijfrechten te geven op de de config directory", "See %s" : "Zie %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dit kan hersteld worden door de webserver %sschrijfrechten te geven op de de config directory%s", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Het bestand van de app \"%$1s\" (%$2s) zijn niet correct vervangen.", "Sample configuration detected" : "Voorbeeldconfiguratie gevonden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Blijkbaar is de voorbeeldconfiguratie gekopieerd. Dit kan je installatie beschadigen en wordt dan ook niet ondersteund. Lees de documentatie voordat je wijzigingen aan config.php doorvoert", "PHP %s or higher is required." : "PHP %s of hoger vereist.", diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index 53394c890ab..1cdd9430893 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -3,7 +3,6 @@ "This can usually be fixed by giving the webserver write access to the config directory" : "Dit kan hersteld worden door de webserver schrijfrechten te geven op de de config directory", "See %s" : "Zie %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dit kan hersteld worden door de webserver %sschrijfrechten te geven op de de config directory%s", - "The files of the app \"%$1s\" (%$2s) were not replaced correctly." : "Het bestand van de app \"%$1s\" (%$2s) zijn niet correct vervangen.", "Sample configuration detected" : "Voorbeeldconfiguratie gevonden", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Blijkbaar is de voorbeeldconfiguratie gekopieerd. Dit kan je installatie beschadigen en wordt dan ook niet ondersteund. Lees de documentatie voordat je wijzigingen aan config.php doorvoert", "PHP %s or higher is required." : "PHP %s of hoger vereist.", diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js index acba2269658..5d44d1a172e 100644 --- a/lib/l10n/zh_TW.js +++ b/lib/l10n/zh_TW.js @@ -100,6 +100,51 @@ OC.L10N.register( "Expiration date is in the past" : "到期日是之前的時間", "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天", "Could not find category \"%s\"" : "找不到分類:\"%s\"", + "Sunday" : "週日", + "Monday" : "週一", + "Tuesday" : "週二", + "Wednesday" : "週三", + "Thursday" : "週四", + "Friday" : "週五", + "Saturday" : "週六", + "Sun." : "日", + "Mon." : "一", + "Tue." : "二", + "Wed." : "三", + "Thu." : "四", + "Fri." : "五", + "Sat." : "六", + "Su" : "日", + "Mo" : "一", + "Tu" : "二", + "We" : "三", + "Th" : "四", + "Fr" : "五", + "Sa" : "六", + "January" : "一月", + "February" : "二月", + "March" : "三月", + "April" : "四月", + "May" : "五月", + "June" : "六月", + "July" : "七月", + "August" : "八月", + "September" : "九月", + "October" : "十月", + "November" : "十一月", + "December" : "十二月", + "Jan." : "一月", + "Feb." : "二月", + "Mar." : "三月", + "Apr." : "四月", + "May." : "五月", + "Jun." : "六月", + "Jul." : "七月", + "Aug." : "八月", + "Sep." : "九月", + "Oct." : "十月", + "Nov." : "十一月", + "Dec." : "十二月", "Apps" : "應用程式", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-'\"", "A valid username must be provided" : "必須提供一個有效的用戶名", diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json index 1356943df67..df8f6bc5de4 100644 --- a/lib/l10n/zh_TW.json +++ b/lib/l10n/zh_TW.json @@ -98,6 +98,51 @@ "Expiration date is in the past" : "到期日是之前的時間", "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天", "Could not find category \"%s\"" : "找不到分類:\"%s\"", + "Sunday" : "週日", + "Monday" : "週一", + "Tuesday" : "週二", + "Wednesday" : "週三", + "Thursday" : "週四", + "Friday" : "週五", + "Saturday" : "週六", + "Sun." : "日", + "Mon." : "一", + "Tue." : "二", + "Wed." : "三", + "Thu." : "四", + "Fri." : "五", + "Sat." : "六", + "Su" : "日", + "Mo" : "一", + "Tu" : "二", + "We" : "三", + "Th" : "四", + "Fr" : "五", + "Sa" : "六", + "January" : "一月", + "February" : "二月", + "March" : "三月", + "April" : "四月", + "May" : "五月", + "June" : "六月", + "July" : "七月", + "August" : "八月", + "September" : "九月", + "October" : "十月", + "November" : "十一月", + "December" : "十二月", + "Jan." : "一月", + "Feb." : "二月", + "Mar." : "三月", + "Apr." : "四月", + "May." : "五月", + "Jun." : "六月", + "Jul." : "七月", + "Aug." : "八月", + "Sep." : "九月", + "Oct." : "十月", + "Nov." : "十一月", + "Dec." : "十二月", "Apps" : "應用程式", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-'\"", "A valid username must be provided" : "必須提供一個有效的用戶名", diff --git a/lib/private/Activity/Event.php b/lib/private/Activity/Event.php index af0605d82c8..df6756940a0 100644 --- a/lib/private/Activity/Event.php +++ b/lib/private/Activity/Event.php @@ -24,229 +24,528 @@ namespace OC\Activity; use OCP\Activity\IEvent; +use OCP\RichObjectStrings\InvalidObjectExeption; +use OCP\RichObjectStrings\IValidator; class Event implements IEvent { + + /** @var string */ + protected $app = ''; + /** @var string */ + protected $type = ''; + /** @var string */ + protected $affectedUser = ''; + /** @var string */ + protected $author = ''; + /** @var int */ + protected $timestamp = 0; + /** @var string */ + protected $subject = ''; + /** @var array */ + protected $subjectParameters = []; + /** @var string */ + protected $subjectParsed; + /** @var string */ + protected $subjectRich; + /** @var array */ + protected $subjectRichParameters; + /** @var string */ + protected $message = ''; /** @var array */ - protected $data = [ - 'app' => null, - 'type' => null, - 'affected_user' => null, - 'author' => null, - 'timestamp' => null, - 'subject' => null, - 'subject_parameters' => null, - 'message' => '', - 'message_parameters' => [], - 'object_type' => '', - 'object_id' => 0, - 'object_name' => '', - 'link' => '', - ]; + protected $messageParameters = []; + /** @var string */ + protected $messageParsed; + /** @var string */ + protected $messageRich; + /** @var array */ + protected $messageRichParameters; + /** @var string */ + protected $objectType = ''; + /** @var int */ + protected $objectId = 0; + /** @var string */ + protected $objectName = ''; + /** @var string */ + protected $link = ''; + /** @var string */ + protected $icon = ''; + + /** @var IEvent */ + protected $child = null; + /** @var IValidator */ + protected $richValidator; + + /** + * @param IValidator $richValidator + */ + public function __construct(IValidator $richValidator) { + $this->richValidator = $richValidator; + } /** * Set the app of the activity * * @param string $app * @return IEvent + * @throws \InvalidArgumentException if the app id is invalid * @since 8.2.0 */ public function setApp($app) { - $this->data['app'] = (string) $app; + if (!is_string($app) || $app === '' || isset($app[32])) { + throw new \InvalidArgumentException('The given app is invalid'); + } + $this->app = (string) $app; return $this; } /** + * @return string + */ + public function getApp() { + return $this->app; + } + + /** * Set the type of the activity * * @param string $type * @return IEvent + * @throws \InvalidArgumentException if the type is invalid * @since 8.2.0 */ public function setType($type) { - $this->data['type'] = (string) $type; + if (!is_string($type) || $type === '' || isset($type[255])) { + throw new \InvalidArgumentException('The given type is invalid'); + } + $this->type = (string) $type; return $this; } /** + * @return string + */ + public function getType() { + return $this->type; + } + + /** * Set the affected user of the activity * * @param string $affectedUser * @return IEvent + * @throws \InvalidArgumentException if the affected user is invalid * @since 8.2.0 */ public function setAffectedUser($affectedUser) { - $this->data['affected_user'] = (string) $affectedUser; + if (!is_string($affectedUser) || $affectedUser === '' || isset($affectedUser[64])) { + throw new \InvalidArgumentException('The given affected user is invalid'); + } + $this->affectedUser = (string) $affectedUser; return $this; } /** + * @return string + */ + public function getAffectedUser() { + return $this->affectedUser; + } + + /** * Set the author of the activity * * @param string $author * @return IEvent + * @throws \InvalidArgumentException if the author is invalid * @since 8.2.0 */ public function setAuthor($author) { - $this->data['author'] = (string) $author; + if (!is_string($author) || isset($author[64])) { + throw new \InvalidArgumentException('The given author user is invalid'. serialize($author)); + } + $this->author = (string) $author; return $this; } /** + * @return string + */ + public function getAuthor() { + return $this->author; + } + + /** * Set the timestamp of the activity * * @param int $timestamp * @return IEvent + * @throws \InvalidArgumentException if the timestamp is invalid * @since 8.2.0 */ public function setTimestamp($timestamp) { - $this->data['timestamp'] = (int) $timestamp; + if (!is_int($timestamp)) { + throw new \InvalidArgumentException('The given timestamp is invalid'); + } + $this->timestamp = (int) $timestamp; return $this; } /** + * @return int + */ + public function getTimestamp() { + return $this->timestamp; + } + + /** * Set the subject of the activity * * @param string $subject * @param array $parameters * @return IEvent + * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 8.2.0 */ public function setSubject($subject, array $parameters = []) { - $this->data['subject'] = (string) $subject; - $this->data['subject_parameters'] = $parameters; + if (!is_string($subject) || isset($subject[255])) { + throw new \InvalidArgumentException('The given subject is invalid'); + } + $this->subject = (string) $subject; + $this->subjectParameters = $parameters; return $this; } /** + * @return string + */ + public function getSubject() { + return $this->subject; + } + + /** + * @return array + */ + public function getSubjectParameters() { + return $this->subjectParameters; + } + + /** + * @param string $subject + * @return $this + * @throws \InvalidArgumentException if the subject is invalid + * @since 11.0.0 + */ + public function setParsedSubject($subject) { + if (!is_string($subject) || $subject === '') { + throw new \InvalidArgumentException('The given parsed subject is invalid'); + } + $this->subjectParsed = $subject; + return $this; + } + + /** + * @return string + * @since 11.0.0 + */ + public function getParsedSubject() { + return $this->subjectParsed; + } + + /** + * @param string $subject + * @param array $parameters + * @return $this + * @throws \InvalidArgumentException if the subject or parameters are invalid + * @since 11.0.0 + */ + public function setRichSubject($subject, array $parameters = []) { + if (!is_string($subject) || $subject === '') { + throw new \InvalidArgumentException('The given parsed subject is invalid'); + } + $this->subjectRich = $subject; + + if (!is_array($parameters)) { + throw new \InvalidArgumentException('The given subject parameters are invalid'); + } + $this->subjectRichParameters = $parameters; + + return $this; + } + + /** + * @return string + * @since 11.0.0 + */ + public function getRichSubject() { + return $this->subjectRich; + } + + /** + * @return array[] + * @since 11.0.0 + */ + public function getRichSubjectParameters() { + return $this->subjectRichParameters; + } + + /** * Set the message of the activity * * @param string $message * @param array $parameters * @return IEvent + * @throws \InvalidArgumentException if the message or parameters are invalid * @since 8.2.0 */ public function setMessage($message, array $parameters = []) { - $this->data['message'] = (string) $message; - $this->data['message_parameters'] = $parameters; + if (!is_string($message) || isset($message[255])) { + throw new \InvalidArgumentException('The given message is invalid'); + } + $this->message = (string) $message; + $this->messageParameters = $parameters; return $this; } /** - * Set the object of the activity - * - * @param string $objectType - * @param int $objectId - * @param string $objectName - * @return IEvent - * @since 8.2.0 + * @return string */ - public function setObject($objectType, $objectId, $objectName = '') { - $this->data['object_type'] = (string) $objectType; - $this->data['object_id'] = (int) $objectId; - $this->data['object_name'] = (string) $objectName; + public function getMessage() { + return $this->message; + } + + /** + * @return array + */ + public function getMessageParameters() { + return $this->messageParameters; + } + + /** + * @param string $message + * @return $this + * @throws \InvalidArgumentException if the message is invalid + * @since 11.0.0 + */ + public function setParsedMessage($message) { + if (!is_string($message)) { + throw new \InvalidArgumentException('The given parsed message is invalid'); + } + $this->messageParsed = $message; return $this; } /** - * Set the link of the activity - * - * @param string $link - * @return IEvent - * @since 8.2.0 + * @return string + * @since 11.0.0 */ - public function setLink($link) { - $this->data['link'] = (string) $link; + public function getParsedMessage() { + return $this->messageParsed; + } + + /** + * @param string $message + * @param array $parameters + * @return $this + * @throws \InvalidArgumentException if the subject or parameters are invalid + * @since 11.0.0 + */ + public function setRichMessage($message, array $parameters = []) { + if (!is_string($message)) { + throw new \InvalidArgumentException('The given parsed message is invalid'); + } + $this->messageRich = $message; + + if (!is_array($parameters)) { + throw new \InvalidArgumentException('The given message parameters are invalid'); + } + $this->messageRichParameters = $parameters; + return $this; } /** * @return string + * @since 11.0.0 */ - public function getApp() { - return $this->data['app']; + public function getRichMessage() { + return $this->messageRich; + } + + /** + * @return array[] + * @since 11.0.0 + */ + public function getRichMessageParameters() { + return $this->messageRichParameters; + } + + /** + * Set the object of the activity + * + * @param string $objectType + * @param int $objectId + * @param string $objectName + * @return IEvent + * @throws \InvalidArgumentException if the object is invalid + * @since 8.2.0 + */ + public function setObject($objectType, $objectId, $objectName = '') { + if (!is_string($objectType) || isset($objectType[255])) { + throw new \InvalidArgumentException('The given object type is invalid'); + } + if (!is_int($objectId)) { + throw new \InvalidArgumentException('The given object id is invalid'); + } + if (!is_string($objectName) || isset($objectName[4000])) { + throw new \InvalidArgumentException('The given object name is invalid'); + } + $this->objectType = (string) $objectType; + $this->objectId = (int) $objectId; + $this->objectName = (string) $objectName; + return $this; } /** * @return string */ - public function getType() { - return $this->data['type']; + public function getObjectType() { + return $this->objectType; } /** * @return string */ - public function getAffectedUser() { - return $this->data['affected_user']; + public function getObjectId() { + return $this->objectId; } /** * @return string */ - public function getAuthor() { - return $this->data['author']; + public function getObjectName() { + return $this->objectName; } /** - * @return int + * Set the link of the activity + * + * @param string $link + * @return IEvent + * @throws \InvalidArgumentException if the link is invalid + * @since 8.2.0 */ - public function getTimestamp() { - return $this->data['timestamp']; + public function setLink($link) { + if (!is_string($link) || isset($link[4000])) { + throw new \InvalidArgumentException('The given link is invalid'); + } + $this->link = (string) $link; + return $this; } /** * @return string */ - public function getSubject() { - return $this->data['subject']; + public function getLink() { + return $this->link; } /** - * @return array + * @param string $icon + * @return $this + * @throws \InvalidArgumentException if the icon is invalid + * @since 11.0.0 */ - public function getSubjectParameters() { - return $this->data['subject_parameters']; + public function setIcon($icon) { + if (!is_string($icon) || isset($icon[4000])) { + throw new \InvalidArgumentException('The given icon is invalid'); + } + $this->icon = $icon; + return $this; } /** * @return string + * @since 11.0.0 */ - public function getMessage() { - return $this->data['message']; + public function getIcon() { + return $this->icon; } /** - * @return array + * @param IEvent $child + * @since 11.0.0 */ - public function getMessageParameters() { - return $this->data['message_parameters']; + public function setChildEvent(IEvent $child) { + $this->child = $child; } /** - * @return string + * @return IEvent|null + * @since 11.0.0 */ - public function getObjectType() { - return $this->data['object_type']; + public function getChildEvent() { + return $this->child; } /** - * @return string + * @return bool + * @since 8.2.0 */ - public function getObjectId() { - return $this->data['object_id']; + public function isValid() { + return + $this->isValidCommon() + && + $this->getSubject() !== '' + ; } /** - * @return string + * @return bool + * @since 8.2.0 */ - public function getObjectName() { - return $this->data['object_name']; + public function isValidParsed() { + if ($this->getRichSubject() !== '' || !empty($this->getRichSubjectParameters())) { + try { + $this->richValidator->validate($this->getRichSubject(), $this->getRichSubjectParameters()); + } catch (InvalidObjectExeption $e) { + return false; + } + } + + if ($this->getRichMessage() !== '' || !empty($this->getRichMessageParameters())) { + try { + $this->richValidator->validate($this->getRichMessage(), $this->getRichMessageParameters()); + } catch (InvalidObjectExeption $e) { + return false; + } + } + + return + $this->isValidCommon() + && + $this->getParsedSubject() !== '' + ; } /** - * @return string + * @return bool */ - public function getLink() { - return $this->data['link']; + protected function isValidCommon() { + return + $this->getApp() !== '' + && + $this->getType() !== '' + && + $this->getAffectedUser() !== '' + && + $this->getTimestamp() !== 0 + /** + * Disabled for BC with old activities + && + $this->getObjectType() !== '' + && + $this->getObjectId() !== 0 + */ + ; } } diff --git a/lib/private/Activity/LegacyFilter.php b/lib/private/Activity/LegacyFilter.php new file mode 100644 index 00000000000..eadb5b1558f --- /dev/null +++ b/lib/private/Activity/LegacyFilter.php @@ -0,0 +1,108 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Activity; + +use OCP\Activity\IFilter; +use OCP\Activity\IManager; + +class LegacyFilter implements IFilter { + + /** @var IManager */ + protected $manager; + /** @var string */ + protected $identifier; + /** @var string */ + protected $name; + /** @var bool */ + protected $isTopFilter; + + /** + * LegacySetting constructor. + * + * @param IManager $manager + * @param string $identifier + * @param string $name + * @param bool $isTopFilter + */ + public function __construct(IManager $manager, + $identifier, + $name, + $isTopFilter) { + $this->manager = $manager; + $this->identifier = $identifier; + $this->name = $name; + $this->isTopFilter = $isTopFilter; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return $this->identifier; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->name; + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return $this->isTopFilter ? 40 : 50; + } + + /** + * @return string Full URL to an icon, empty string when none is given + * @since 11.0.0 + */ + public function getIcon() { + // Old API was CSS class, so we can not use this... + return ''; + } + + /** + * @param string[] $types + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function filterTypes(array $types) { + return $this->manager->filterNotificationTypes($types, $this->getIdentifier()); + } + + /** + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function allowedApps() { + return []; + } +} + diff --git a/lib/private/Activity/LegacySetting.php b/lib/private/Activity/LegacySetting.php new file mode 100644 index 00000000000..27495afddb0 --- /dev/null +++ b/lib/private/Activity/LegacySetting.php @@ -0,0 +1,123 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Activity; + +use OCP\Activity\ISetting; + +class LegacySetting implements ISetting { + + /** @var string */ + protected $identifier; + /** @var string */ + protected $name; + /** @var bool */ + protected $canChangeStream; + /** @var bool */ + protected $isDefaultEnabledStream; + /** @var bool */ + protected $canChangeMail; + /** @var bool */ + protected $isDefaultEnabledMail; + + /** + * LegacySetting constructor. + * + * @param string $identifier + * @param string $name + * @param bool $canChangeStream + * @param bool $isDefaultEnabledStream + * @param bool $canChangeMail + * @param bool $isDefaultEnabledMail + */ + public function __construct($identifier, + $name, + $canChangeStream, + $isDefaultEnabledStream, + $canChangeMail, + $isDefaultEnabledMail) { + $this->identifier = $identifier; + $this->name = $name; + $this->canChangeStream = $canChangeStream; + $this->isDefaultEnabledStream = $isDefaultEnabledStream; + $this->canChangeMail = $canChangeMail; + $this->isDefaultEnabledMail = $isDefaultEnabledMail; + } + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier() { + return $this->identifier; + } + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName() { + return $this->name; + } + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority() { + return 70; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream() { + return $this->canChangeStream; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream() { + return $this->isDefaultEnabledStream; + } + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail() { + return $this->canChangeMail; + } + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail() { + return $this->isDefaultEnabledMail; + } +} + diff --git a/lib/private/Activity/Manager.php b/lib/private/Activity/Manager.php index 455bb3b8ee8..805124dc602 100644 --- a/lib/private/Activity/Manager.php +++ b/lib/private/Activity/Manager.php @@ -27,11 +27,15 @@ namespace OC\Activity; use OCP\Activity\IConsumer; use OCP\Activity\IEvent; use OCP\Activity\IExtension; +use OCP\Activity\IFilter; use OCP\Activity\IManager; +use OCP\Activity\IProvider; +use OCP\Activity\ISetting; use OCP\IConfig; use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; +use OCP\RichObjectStrings\IValidator; class Manager implements IManager { /** @var IRequest */ @@ -43,6 +47,9 @@ class Manager implements IManager { /** @var IConfig */ protected $config; + /** @var IValidator */ + protected $validator; + /** @var string */ protected $formattingObjectType; @@ -58,13 +65,16 @@ class Manager implements IManager { * @param IRequest $request * @param IUserSession $session * @param IConfig $config + * @param IValidator $validator */ public function __construct(IRequest $request, IUserSession $session, - IConfig $config) { + IConfig $config, + IValidator $validator) { $this->request = $request; $this->session = $session; $this->config = $config; + $this->validator = $validator; } /** @var \Closure[] */ @@ -147,7 +157,7 @@ class Manager implements IManager { * @return IEvent */ public function generateEvent() { - return new Event(); + return new Event($this->validator); } /** @@ -160,24 +170,10 @@ class Manager implements IManager { * - setSubject() * * @param IEvent $event - * @return null * @throws \BadMethodCallException if required values have not been set */ public function publish(IEvent $event) { - if (!$event->getApp()) { - throw new \BadMethodCallException('App not set', 10); - } - if (!$event->getType()) { - throw new \BadMethodCallException('Type not set', 11); - } - if ($event->getAffectedUser() === null) { - throw new \BadMethodCallException('Affected user not set', 12); - } - if ($event->getSubject() === null || $event->getSubjectParameters() === null) { - throw new \BadMethodCallException('Subject not set', 13); - } - - if ($event->getAuthor() === null) { + if ($event->getAuthor() === '') { if ($this->session->getUser() instanceof IUser) { $event->setAuthor($this->session->getUser()->getUID()); } @@ -187,6 +183,10 @@ class Manager implements IManager { $event->setTimestamp(time()); } + if (!$event->isValid()) { + throw new \BadMethodCallException('The given event is invalid'); + } + foreach ($this->getConsumers() as $c) { $c->receive($event); } @@ -203,7 +203,6 @@ class Manager implements IManager { * @param string $affectedUser Recipient of the activity * @param string $type Type of the notification * @param int $priority Priority of the notification - * @return null */ public function publishActivity($app, $subject, $subjectParams, $message, $messageParams, $file, $link, $affectedUser, $type, $priority) { $event = $this->generateEvent(); @@ -235,59 +234,195 @@ class Manager implements IManager { * In order to improve lazy loading a closure can be registered which will be called in case * activity consumers are actually requested * - * $callable has to return an instance of OCA\Activity\IConsumer + * $callable has to return an instance of OCA\Activity\IExtension * * @param \Closure $callable - * @return void */ public function registerExtension(\Closure $callable) { array_push($this->extensionsClosures, $callable); $this->extensions = []; } + /** @var string[] */ + protected $filterClasses = []; + + /** @var IFilter[] */ + protected $filters = []; + + /** @var bool */ + protected $loadedLegacyFilters = false; + /** - * Will return additional notification types as specified by other apps - * - * @param string $languageCode - * @return array + * @param string $filter Class must implement OCA\Activity\IFilter + * @return void */ - public function getNotificationTypes($languageCode) { - $filesNotificationTypes = []; - $sharingNotificationTypes = []; + public function registerFilter($filter) { + $this->filterClasses[$filter] = false; + } - $notificationTypes = array(); - foreach ($this->getExtensions() as $c) { - $result = $c->getNotificationTypes($languageCode); - if (is_array($result)) { - if (class_exists('\OCA\Files\Activity', false) && $c instanceof \OCA\Files\Activity) { - $filesNotificationTypes = $result; - continue; - } - if (class_exists('\OCA\Files_Sharing\Activity', false) && $c instanceof \OCA\Files_Sharing\Activity) { - $sharingNotificationTypes = $result; - continue; - } + /** + * @return IFilter[] + * @throws \InvalidArgumentException + */ + public function getFilters() { + if (!$this->loadedLegacyFilters) { + $legacyFilters = $this->getNavigation(); + + foreach ($legacyFilters['top'] as $filter => $data) { + $this->filters[$filter] = new LegacyFilter( + $this, $filter, $data['name'], true + ); + } - $notificationTypes = array_merge($notificationTypes, $result); + foreach ($legacyFilters['apps'] as $filter => $data) { + $this->filters[$filter] = new LegacyFilter( + $this, $filter, $data['name'], false + ); } + $this->loadedLegacyFilters = true; } - return array_merge($filesNotificationTypes, $sharingNotificationTypes, $notificationTypes); + foreach ($this->filterClasses as $class => $false) { + /** @var IFilter $filter */ + $filter = \OC::$server->query($class); + + if (!$filter instanceof IFilter) { + throw new \InvalidArgumentException('Invalid activity filter registered'); + } + + $this->filters[$filter->getIdentifier()] = $filter; + + unset($this->filterClasses[$class]); + } + return $this->filters; } /** - * @param string $method - * @return array + * @param string $id + * @return IFilter + * @throws \InvalidArgumentException when the filter was not found + * @since 11.0.0 */ - public function getDefaultTypes($method) { - $defaultTypes = array(); - foreach ($this->getExtensions() as $c) { - $types = $c->getDefaultTypes($method); - if (is_array($types)) { - $defaultTypes = array_merge($types, $defaultTypes); + public function getFilterById($id) { + $filters = $this->getFilters(); + + if (isset($filters[$id])) { + return $filters[$id]; + } + + throw new \InvalidArgumentException('Requested filter does not exist'); + } + + /** @var string[] */ + protected $providerClasses = []; + + /** @var IProvider[] */ + protected $providers = []; + + /** + * @param string $provider Class must implement OCA\Activity\IProvider + * @return void + */ + public function registerProvider($provider) { + $this->providerClasses[$provider] = false; + } + + /** + * @return IProvider[] + * @throws \InvalidArgumentException + */ + public function getProviders() { + foreach ($this->providerClasses as $class => $false) { + /** @var IProvider $provider */ + $provider = \OC::$server->query($class); + + if (!$provider instanceof IProvider) { + throw new \InvalidArgumentException('Invalid activity provider registered'); } + + $this->providers[] = $provider; + + unset($this->providerClasses[$class]); } - return $defaultTypes; + return $this->providers; + } + + /** @var string[] */ + protected $settingsClasses = []; + + /** @var ISetting[] */ + protected $settings = []; + + /** @var bool */ + protected $loadedLegacyTypes = false; + + /** + * @param string $setting Class must implement OCA\Activity\ISetting + * @return void + */ + public function registerSetting($setting) { + $this->settingsClasses[$setting] = false; + } + + /** + * @return ISetting[] + * @throws \InvalidArgumentException + */ + public function getSettings() { + if (!$this->loadedLegacyTypes) { + $l = \OC::$server->getL10N('core'); + $legacyTypes = $this->getNotificationTypes($l->getLanguageCode()); + $streamTypes = $this->getDefaultTypes(IExtension::METHOD_STREAM); + $mailTypes = $this->getDefaultTypes(IExtension::METHOD_MAIL); + foreach ($legacyTypes as $type => $data) { + if (is_string($data)) { + $desc = $data; + $canChangeStream = true; + $canChangeMail = true; + } else { + $desc = $data['desc']; + $canChangeStream = in_array(IExtension::METHOD_STREAM, $data['methods']); + $canChangeMail = in_array(IExtension::METHOD_MAIL, $data['methods']); + } + + $this->settings[$type] = new LegacySetting( + $type, $desc, + $canChangeStream, in_array($type, $streamTypes), + $canChangeMail, in_array($type, $mailTypes) + ); + } + $this->loadedLegacyTypes = true; + } + + foreach ($this->settingsClasses as $class => $false) { + /** @var ISetting $setting */ + $setting = \OC::$server->query($class); + + if (!$setting instanceof ISetting) { + throw new \InvalidArgumentException('Invalid activity filter registered'); + } + + $this->settings[$setting->getIdentifier()] = $setting; + + unset($this->settingsClasses[$class]); + } + return $this->settings; + } + + /** + * @param string $id + * @return ISetting + * @throws \InvalidArgumentException when the setting was not found + * @since 11.0.0 + */ + public function getSettingById($id) { + $settings = $this->getSettings(); + + if (isset($settings[$id])) { + return $settings[$id]; + } + + throw new \InvalidArgumentException('Requested setting does not exist'); } /** @@ -391,7 +526,62 @@ class Manager implements IManager { } /** + * Set the user we need to use + * + * @param string|null $currentUserId + * @throws \UnexpectedValueException If the user is invalid + */ + public function setCurrentUserId($currentUserId) { + if (!is_string($currentUserId) && $currentUserId !== null) { + throw new \UnexpectedValueException('The given current user is invalid'); + } + $this->currentUserId = $currentUserId; + } + + /** + * Get the user we need to use + * + * Either the user is logged in, or we try to get it from the token + * + * @return string + * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique + */ + public function getCurrentUserId() { + if ($this->currentUserId !== null) { + return $this->currentUserId; + } else if (!$this->session->isLoggedIn()) { + return $this->getUserFromToken(); + } else { + return $this->session->getUser()->getUID(); + } + } + + /** + * Get the user for the token + * + * @return string + * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique + */ + protected function getUserFromToken() { + $token = (string) $this->request->getParam('token', ''); + if (strlen($token) !== 30) { + throw new \UnexpectedValueException('The token is invalid'); + } + + $users = $this->config->getUsersForUserValue('activity', 'rsstoken', $token); + + if (sizeof($users) !== 1) { + // No unique user found + throw new \UnexpectedValueException('The token is invalid'); + } + + // Token found login as that user + return array_shift($users); + } + + /** * @return array + * @deprecated 11.0.0 - Use getFilters() instead */ public function getNavigation() { $entries = array( @@ -412,6 +602,7 @@ class Manager implements IManager { /** * @param string $filterValue * @return boolean + * @deprecated 11.0.0 - Use getFilterById() instead */ public function isFilterValid($filterValue) { if (isset($this->validFilters[$filterValue])) { @@ -433,6 +624,7 @@ class Manager implements IManager { * @param array $types * @param string $filter * @return array + * @deprecated 11.0.0 - Use getFilterById()->filterTypes() instead */ public function filterNotificationTypes($types, $filter) { if (!$this->isFilterValid($filter)) { @@ -451,6 +643,7 @@ class Manager implements IManager { /** * @param string $filter * @return array + * @deprecated 11.0.0 - Use getFilterById() instead */ public function getQueryForFilter($filter) { if (!$this->isFilterValid($filter)) { @@ -479,56 +672,42 @@ class Manager implements IManager { } /** - * Set the user we need to use + * Will return additional notification types as specified by other apps * - * @param string|null $currentUserId - * @throws \UnexpectedValueException If the user is invalid + * @param string $languageCode + * @return array + * @deprecated 11.0.0 - Use getSettings() instead */ - public function setCurrentUserId($currentUserId) { - if (!is_string($currentUserId) && $currentUserId !== null) { - throw new \UnexpectedValueException('The given current user is invalid'); - } - $this->currentUserId = $currentUserId; - } + public function getNotificationTypes($languageCode) { + $notificationTypes = $sharingNotificationTypes = []; + foreach ($this->getExtensions() as $c) { + $result = $c->getNotificationTypes($languageCode); + if (is_array($result)) { + if (class_exists('\OCA\Files_Sharing\Activity', false) && $c instanceof \OCA\Files_Sharing\Activity) { + $sharingNotificationTypes = $result; + continue; + } - /** - * Get the user we need to use - * - * Either the user is logged in, or we try to get it from the token - * - * @return string - * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique - */ - public function getCurrentUserId() { - if ($this->currentUserId !== null) { - return $this->currentUserId; - } else if (!$this->session->isLoggedIn()) { - return $this->getUserFromToken(); - } else { - return $this->session->getUser()->getUID(); + $notificationTypes = array_merge($notificationTypes, $result); + } } + + return array_merge($sharingNotificationTypes, $notificationTypes); } /** - * Get the user for the token - * - * @return string - * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique + * @param string $method + * @return array + * @deprecated 11.0.0 - Use getSettings()->isDefaulEnabled<method>() instead */ - protected function getUserFromToken() { - $token = (string) $this->request->getParam('token', ''); - if (strlen($token) !== 30) { - throw new \UnexpectedValueException('The token is invalid'); - } - - $users = $this->config->getUsersForUserValue('activity', 'rsstoken', $token); - - if (sizeof($users) !== 1) { - // No unique user found - throw new \UnexpectedValueException('The token is invalid'); + public function getDefaultTypes($method) { + $defaultTypes = array(); + foreach ($this->getExtensions() as $c) { + $types = $c->getDefaultTypes($method); + if (is_array($types)) { + $defaultTypes = array_merge($types, $defaultTypes); + } } - - // Token found login as that user - return array_shift($users); + return $defaultTypes; } } diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index af26d30d8e9..4e13d70371b 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -215,11 +215,13 @@ class AllConfig implements \OCP\IConfig { // TODO - FIXME $this->fixDIInit(); - if (isset($this->userCache[$userId][$appName][$key])) { - if ($this->userCache[$userId][$appName][$key] === (string)$value) { - return; - } else if ($preCondition !== null && $this->userCache[$userId][$appName][$key] !== (string)$preCondition) { + $prevValue = $this->getUserValue($userId, $appName, $key, null); + + if ($prevValue !== null) { + if ($prevValue === (string)$value) { return; + } else if ($preCondition !== null && $prevValue !== (string)$preCondition) { + throw new PreConditionNotMetException(); } else { $qb = $this->connection->getQueryBuilder(); $qb->update('preferences') diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index 55fd575e129..fca5c9b87ac 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -31,6 +31,7 @@ namespace OC\App; +use OCP\App\AppPathNotFoundException; use OCP\App\IAppManager; use OCP\App\ManagerEvent; use OCP\IAppConfig; @@ -266,6 +267,21 @@ class AppManager implements IAppManager { } /** + * Get the directory for the given app. + * + * @param string $appId + * @return string + * @throws AppPathNotFoundException if app folder can't be found + */ + public function getAppPath($appId) { + $appPath = \OC_App::getAppPath($appId); + if($appPath === false) { + throw new AppPathNotFoundException('Could not find path for ' . $appId); + } + return $appPath; + } + + /** * Clear the cached list of apps when enabling/disabling an app */ public function clearAppsCache() { diff --git a/lib/private/App/DependencyAnalyzer.php b/lib/private/App/DependencyAnalyzer.php index c24b25ff14d..84d87efa3d3 100644 --- a/lib/private/App/DependencyAnalyzer.php +++ b/lib/private/App/DependencyAnalyzer.php @@ -336,13 +336,9 @@ class DependencyAnalyzer { switch ($version) { case '9.1': return '10'; - case '9.2': - return '11'; default: if (strpos($version, '9.1.') === 0) { $version = '10.0.' . substr($version, 4); - } else if (strpos($version, '9.2.') === 0) { - $version = '11.0.' . substr($version, 4); } return $version; } diff --git a/lib/private/App/InfoParser.php b/lib/private/App/InfoParser.php index 44f495534c9..47ce28e6e98 100644 --- a/lib/private/App/InfoParser.php +++ b/lib/private/App/InfoParser.php @@ -110,6 +110,18 @@ class InfoParser { if (!array_key_exists('commands', $array)) { $array['commands'] = []; } + if (!array_key_exists('activity', $array)) { + $array['activity'] = []; + } + if (!array_key_exists('filters', $array['activity'])) { + $array['activity']['filters'] = []; + } + if (!array_key_exists('settings', $array['activity'])) { + $array['activity']['settings'] = []; + } + if (!array_key_exists('providers', $array['activity'])) { + $array['activity']['providers'] = []; + } if (array_key_exists('types', $array)) { if (is_array($array['types'])) { @@ -144,6 +156,15 @@ class InfoParser { if (isset($array['commands']['command']) && is_array($array['commands']['command'])) { $array['commands'] = $array['commands']['command']; } + if (isset($array['activity']['filters']['filter']) && is_array($array['activity']['filters']['filter'])) { + $array['activity']['filters'] = $array['activity']['filters']['filter']; + } + if (isset($array['activity']['settings']['setting']) && is_array($array['activity']['settings']['setting'])) { + $array['activity']['settings'] = $array['activity']['settings']['setting']; + } + if (isset($array['activity']['providers']['provider']) && is_array($array['activity']['providers']['provider'])) { + $array['activity']['providers'] = $array['activity']['providers']['provider']; + } if(!is_null($this->cache)) { $this->cache->set($fileCacheKey, json_encode($array)); diff --git a/lib/private/AppFramework/Db/Db.php b/lib/private/AppFramework/Db/Db.php index 450549ffdbb..5aacdc517a2 100644 --- a/lib/private/AppFramework/Db/Db.php +++ b/lib/private/AppFramework/Db/Db.php @@ -306,7 +306,7 @@ class Db implements IDb { * Check whether or not the current database support 4byte wide unicode * * @return bool - * @since 9.2.0 + * @since 11.0.0 */ public function supports4ByteText() { return $this->connection->supports4ByteText(); diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php index e1516c47ed6..48c9b6f4589 100644 --- a/lib/private/AppFramework/DependencyInjection/DIContainer.php +++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php @@ -383,6 +383,7 @@ class DIContainer extends SimpleContainer implements IAppContainer { $app->getServer()->getNavigationManager(), $app->getServer()->getURLGenerator(), $app->getServer()->getLogger(), + $app->getServer()->getSession(), $c['AppName'], $app->isLoggedIn(), $app->isAdminUser(), diff --git a/lib/private/AppFramework/Http/Output.php b/lib/private/AppFramework/Http/Output.php index 85f0e6f8feb..1d77350b1a2 100644 --- a/lib/private/AppFramework/Http/Output.php +++ b/lib/private/AppFramework/Http/Output.php @@ -48,12 +48,17 @@ class Output implements IOutput { } /** - * @param string $path + * @param string|resource $path or file handle * * @return bool false if an error occurred */ public function setReadfile($path) { - return @readfile($path); + if (is_resource($path)) { + $output = fopen('php://output', 'w'); + return stream_copy_to_stream($path, $output) > 0; + } else { + return @readfile($path); + } } /** diff --git a/lib/private/AppFramework/Middleware/Security/Exceptions/NotConfirmedException.php b/lib/private/AppFramework/Middleware/Security/Exceptions/NotConfirmedException.php new file mode 100644 index 00000000000..1ecd463b004 --- /dev/null +++ b/lib/private/AppFramework/Middleware/Security/Exceptions/NotConfirmedException.php @@ -0,0 +1,37 @@ +<?php + +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\AppFramework\Middleware\Security\Exceptions; + +use OCP\AppFramework\Http; + +/** + * Class NotConfirmedException is thrown when a resource has been requested by a + * user that has not confirmed their password in the last 30 minutes. + * + * @package OC\AppFramework\Middleware\Security\Exceptions + */ +class NotConfirmedException extends SecurityException { + public function __construct() { + parent::__construct('Password confirmation is required', Http::STATUS_FORBIDDEN); + } +} diff --git a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php index 183e55740ea..d5f7a7660a7 100644 --- a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php +++ b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php @@ -32,6 +32,7 @@ namespace OC\AppFramework\Middleware\Security; use OC\AppFramework\Middleware\Security\Exceptions\AppNotEnabledException; use OC\AppFramework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException; use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException; +use OC\AppFramework\Middleware\Security\Exceptions\NotConfirmedException; use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException; use OC\AppFramework\Middleware\Security\Exceptions\StrictCookieMissingException; use OC\AppFramework\Utility\ControllerMethodReflector; @@ -47,6 +48,7 @@ use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\OCSController; use OCP\INavigationManager; +use OCP\ISession; use OCP\IURLGenerator; use OCP\IRequest; use OCP\ILogger; @@ -73,6 +75,8 @@ class SecurityMiddleware extends Middleware { private $urlGenerator; /** @var ILogger */ private $logger; + /** @var ISession */ + private $session; /** @var bool */ private $isLoggedIn; /** @var bool */ @@ -90,6 +94,7 @@ class SecurityMiddleware extends Middleware { * @param INavigationManager $navigationManager * @param IURLGenerator $urlGenerator * @param ILogger $logger + * @param ISession $session * @param string $appName * @param bool $isLoggedIn * @param bool $isAdminUser @@ -102,6 +107,7 @@ class SecurityMiddleware extends Middleware { INavigationManager $navigationManager, IURLGenerator $urlGenerator, ILogger $logger, + ISession $session, $appName, $isLoggedIn, $isAdminUser, @@ -114,6 +120,7 @@ class SecurityMiddleware extends Middleware { $this->appName = $appName; $this->urlGenerator = $urlGenerator; $this->logger = $logger; + $this->session = $session; $this->isLoggedIn = $isLoggedIn; $this->isAdminUser = $isAdminUser; $this->contentSecurityPolicyManager = $contentSecurityPolicyManager; @@ -150,6 +157,13 @@ class SecurityMiddleware extends Middleware { } } + if ($this->reflector->hasAnnotation('PasswordConfirmationRequired')) { + $lastConfirm = (int) $this->session->get('last-password-confirm'); + if ($lastConfirm < (time() - (30 * 60 + 15))) { // allow 15 seconds delay + throw new NotConfirmedException(); + } + } + // Check for strict cookie requirement if($this->reflector->hasAnnotation('StrictCookieRequired') || !$this->reflector->hasAnnotation('NoCSRFRequired')) { if(!$this->request->passesStrictCookieCheck()) { diff --git a/lib/private/Authentication/Token/DefaultToken.php b/lib/private/Authentication/Token/DefaultToken.php index faef2f73b33..127430ea6cb 100644 --- a/lib/private/Authentication/Token/DefaultToken.php +++ b/lib/private/Authentication/Token/DefaultToken.php @@ -87,6 +87,17 @@ class DefaultToken extends Entity implements IToken { */ protected $lastCheck; + /** + * @var string + */ + protected $scope; + + public function __construct() { + $this->addType('type', 'int'); + $this->addType('lastActivity', 'int'); + $this->addType('lastCheck', 'int'); + } + public function getId() { return $this->id; } @@ -119,6 +130,7 @@ class DefaultToken extends Entity implements IToken { 'name' => $this->name, 'lastActivity' => $this->lastActivity, 'type' => $this->type, + 'scope' => $this->getScopeAsArray() ]; } @@ -140,4 +152,25 @@ class DefaultToken extends Entity implements IToken { return parent::setLastCheck($time); } + public function getScope() { + return parent::getScope(); + } + + public function getScopeAsArray() { + $scope = json_decode($this->getScope(), true); + if (!$scope) { + return [ + 'filesystem'=> true + ]; + } + return $scope; + } + + public function setScope($scope) { + if (is_array($scope)) { + parent::setScope(json_encode($scope)); + } else { + parent::setScope((string)$scope); + } + } } diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index 752974ff240..8848cd3ec56 100644 --- a/lib/private/Authentication/Token/DefaultTokenMapper.php +++ b/lib/private/Authentication/Token/DefaultTokenMapper.php @@ -72,10 +72,9 @@ class DefaultTokenMapper extends Mapper { public function getToken($token) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); - $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check') + $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check', 'scope') ->from('authtoken') - ->where($qb->expr()->eq('token', $qb->createParameter('token'))) - ->setParameter('token', $token) + ->where($qb->expr()->eq('token', $qb->createNamedParameter($token))) ->execute(); $data = $result->fetch(); @@ -83,6 +82,30 @@ class DefaultTokenMapper extends Mapper { if ($data === false) { throw new DoesNotExistException('token does not exist'); } +; + return DefaultToken::fromRow($data); + } + + /** + * Get the token for $id + * + * @param string $id + * @throws DoesNotExistException + * @return DefaultToken + */ + public function getTokenById($id) { + /* @var $qb IQueryBuilder */ + $qb = $this->db->getQueryBuilder(); + $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check', 'scope') + ->from('authtoken') + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))) + ->execute(); + + $data = $result->fetch(); + $result->closeCursor(); + if ($data === false) { + throw new DoesNotExistException('token does not exist'); + }; return DefaultToken::fromRow($data); } @@ -98,7 +121,7 @@ class DefaultTokenMapper extends Mapper { public function getTokenByUser(IUser $user) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); - $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check') + $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check', 'scope') ->from('authtoken') ->where($qb->expr()->eq('uid', $qb->createNamedParameter($user->getUID()))) ->setMaxResults(1000); diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 87f434c684c..ec4cc10c269 100644 --- a/lib/private/Authentication/Token/DefaultTokenProvider.php +++ b/lib/private/Authentication/Token/DefaultTokenProvider.php @@ -145,7 +145,7 @@ class DefaultTokenProvider implements IProvider { } /** - * Get a token by token id + * Get a token by token * * @param string $tokenId * @throws InvalidTokenException @@ -160,6 +160,21 @@ class DefaultTokenProvider implements IProvider { } /** + * Get a token by token id + * + * @param string $tokenId + * @throws InvalidTokenException + * @return DefaultToken + */ + public function getTokenById($tokenId) { + try { + return $this->mapper->getTokenById($tokenId); + } catch (DoesNotExistException $ex) { + throw new InvalidTokenException(); + } + } + + /** * @param string $oldSessionId * @param string $sessionId * @throws InvalidTokenException @@ -237,10 +252,10 @@ class DefaultTokenProvider implements IProvider { */ public function invalidateOldTokens() { $olderThan = $this->time->getTime() - (int) $this->config->getSystemValue('session_lifetime', 60 * 60 * 24); - $this->logger->info('Invalidating session tokens older than ' . date('c', $olderThan)); + $this->logger->debug('Invalidating session tokens older than ' . date('c', $olderThan)); $this->mapper->invalidateOld($olderThan, IToken::DO_NOT_REMEMBER); $rememberThreshold = $this->time->getTime() - (int) $this->config->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15); - $this->logger->info('Invalidating remembered session tokens older than ' . date('c', $rememberThreshold)); + $this->logger->debug('Invalidating remembered session tokens older than ' . date('c', $rememberThreshold)); $this->mapper->invalidateOld($rememberThreshold, IToken::REMEMBER); } diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php index ce14a5880c5..9f280263d76 100644 --- a/lib/private/Authentication/Token/IProvider.php +++ b/lib/private/Authentication/Token/IProvider.php @@ -50,7 +50,16 @@ interface IProvider { * @throws InvalidTokenException * @return IToken */ - public function getToken($tokenId) ; + public function getToken($tokenId); + + /** + * Get a token by token id + * + * @param string $tokenId + * @throws InvalidTokenException + * @return DefaultToken + */ + public function getTokenById($tokenId); /** * Duplicate an existing session token diff --git a/lib/private/Authentication/Token/IToken.php b/lib/private/Authentication/Token/IToken.php index 14811dd3201..49745b266c4 100644 --- a/lib/private/Authentication/Token/IToken.php +++ b/lib/private/Authentication/Token/IToken.php @@ -67,9 +67,30 @@ interface IToken extends JsonSerializable { public function getLastCheck(); /** - * Get the timestamp of the last password check + * Set the timestamp of the last password check * * @param int $time */ public function setLastCheck($time); + + /** + * Get the authentication scope for this token + * + * @return string + */ + public function getScope(); + + /** + * Get the authentication scope for this token + * + * @return array + */ + public function getScopeAsArray(); + + /** + * Set the authentication scope for this token + * + * @param array $scope + */ + public function setScope($scope); } diff --git a/lib/private/Comments/Comment.php b/lib/private/Comments/Comment.php index b5f063be323..b9a6103f67f 100644 --- a/lib/private/Comments/Comment.php +++ b/lib/private/Comments/Comment.php @@ -207,7 +207,7 @@ class Comment implements IComment { * returns an array containing mentions that are included in the comment * * @return array each mention provides a 'type' and an 'id', see example below - * @since 9.2.0 + * @since 11.0.0 * * The return array looks like: * [ diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php index 001f4f9441c..1467fef727b 100644 --- a/lib/private/Comments/Manager.php +++ b/lib/private/Comments/Manager.php @@ -768,7 +768,7 @@ class Manager implements ICommentsManager { * @param string $type * @param \Closure $closure * @throws \OutOfBoundsException - * @since 9.2.0 + * @since 11.0.0 * * Only one resolver shall be registered per type. Otherwise a * \OutOfBoundsException has to thrown. @@ -790,7 +790,7 @@ class Manager implements ICommentsManager { * @param string $id * @return string * @throws \OutOfBoundsException - * @since 9.2.0 + * @since 11.0.0 * * If a provided type was not registered, an \OutOfBoundsException shall * be thrown. It is upon the resolver discretion what to return of the diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php index 497ff0c8a26..a39dbe3783c 100644 --- a/lib/private/DB/Connection.php +++ b/lib/private/DB/Connection.php @@ -412,7 +412,7 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection { * Check whether or not the current database support 4byte wide unicode * * @return bool - * @since 9.2.0 + * @since 11.0.0 */ public function supports4ByteText() { return ! ($this->getDatabasePlatform() instanceof MySqlPlatform && $this->getParams()['charset'] !== 'utf8mb4'); diff --git a/lib/private/DB/QueryBuilder/QuoteHelper.php b/lib/private/DB/QueryBuilder/QuoteHelper.php index 6d15cec5a05..041718bce5a 100644 --- a/lib/private/DB/QueryBuilder/QuoteHelper.php +++ b/lib/private/DB/QueryBuilder/QuoteHelper.php @@ -61,6 +61,11 @@ class QuoteHelper { throw new \InvalidArgumentException('Only strings, Literals and Parameters are allowed'); } + $string = str_replace(' AS ', ' as ', $string); + if (substr_count($string, ' as ')) { + return implode(' as ', array_map([$this, 'quoteColumnName'], explode(' as ', $string, 2))); + } + if (substr_count($string, '.')) { list($alias, $columnName) = explode('.', $string, 2); diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php index 5083b99b862..3a3f51488e6 100644 --- a/lib/private/Files/Cache/Cache.php +++ b/lib/private/Files/Cache/Cache.php @@ -142,26 +142,38 @@ class Cache implements ICache { } return $data; } else { - //fix types - $data['fileid'] = (int)$data['fileid']; - $data['parent'] = (int)$data['parent']; - $data['size'] = 0 + $data['size']; - $data['mtime'] = (int)$data['mtime']; - $data['storage_mtime'] = (int)$data['storage_mtime']; - $data['encryptedVersion'] = (int)$data['encrypted']; - $data['encrypted'] = (bool)$data['encrypted']; - $data['storage'] = $this->storageId; - $data['mimetype'] = $this->mimetypeLoader->getMimetypeById($data['mimetype']); - $data['mimepart'] = $this->mimetypeLoader->getMimetypeById($data['mimepart']); - if ($data['storage_mtime'] == 0) { - $data['storage_mtime'] = $data['mtime']; - } - $data['permissions'] = (int)$data['permissions']; - return new CacheEntry($data); + return self::cacheEntryFromData($data, $this->storageId, $this->mimetypeLoader); } } /** + * Create a CacheEntry from database row + * + * @param array $data + * @param string $storageId + * @param IMimeTypeLoader $mimetypeLoader + * @return CacheEntry + */ + public static function cacheEntryFromData($data, $storageId, IMimeTypeLoader $mimetypeLoader) { + //fix types + $data['fileid'] = (int)$data['fileid']; + $data['parent'] = (int)$data['parent']; + $data['size'] = 0 + $data['size']; + $data['mtime'] = (int)$data['mtime']; + $data['storage_mtime'] = (int)$data['storage_mtime']; + $data['encryptedVersion'] = (int)$data['encrypted']; + $data['encrypted'] = (bool)$data['encrypted']; + $data['storage'] = $storageId; + $data['mimetype'] = $mimetypeLoader->getMimetypeById($data['mimetype']); + $data['mimepart'] = $mimetypeLoader->getMimetypeById($data['mimepart']); + if ($data['storage_mtime'] == 0) { + $data['storage_mtime'] = $data['mtime']; + } + $data['permissions'] = (int)$data['permissions']; + return new CacheEntry($data); + } + + /** * get the metadata of all files stored in $folder * * @param string $folder diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php index 1196c6b0760..d8bdca6a3c4 100644 --- a/lib/private/Files/Cache/Wrapper/CacheJail.php +++ b/lib/private/Files/Cache/Wrapper/CacheJail.php @@ -27,6 +27,7 @@ namespace OC\Files\Cache\Wrapper; use OC\Files\Cache\Cache; +use OCP\Files\Cache\ICacheEntry; /** * Jail to a subdirectory of the wrapped cache @@ -73,7 +74,7 @@ class CacheJail extends CacheWrapper { } /** - * @param array $entry + * @param ICacheEntry|array $entry * @return array */ protected function formatCacheEntry($entry) { @@ -111,7 +112,7 @@ class CacheJail extends CacheWrapper { * @throws \RuntimeException */ public function insert($file, array $data) { - return $this->cache->insert($this->getSourcePath($file), $data); + return $this->getCache()->insert($this->getSourcePath($file), $data); } /** @@ -121,7 +122,7 @@ class CacheJail extends CacheWrapper { * @param array $data */ public function update($id, array $data) { - $this->cache->update($id, $data); + $this->getCache()->update($id, $data); } /** @@ -131,7 +132,7 @@ class CacheJail extends CacheWrapper { * @return int */ public function getId($file) { - return $this->cache->getId($this->getSourcePath($file)); + return $this->getCache()->getId($this->getSourcePath($file)); } /** @@ -144,7 +145,7 @@ class CacheJail extends CacheWrapper { if ($file === '') { return -1; } else { - return $this->cache->getParentId($this->getSourcePath($file)); + return $this->getCache()->getParentId($this->getSourcePath($file)); } } @@ -155,7 +156,7 @@ class CacheJail extends CacheWrapper { * @return bool */ public function inCache($file) { - return $this->cache->inCache($this->getSourcePath($file)); + return $this->getCache()->inCache($this->getSourcePath($file)); } /** @@ -164,7 +165,7 @@ class CacheJail extends CacheWrapper { * @param string $file */ public function remove($file) { - $this->cache->remove($this->getSourcePath($file)); + $this->getCache()->remove($this->getSourcePath($file)); } /** @@ -174,14 +175,14 @@ class CacheJail extends CacheWrapper { * @param string $target */ public function move($source, $target) { - $this->cache->move($this->getSourcePath($source), $this->getSourcePath($target)); + $this->getCache()->move($this->getSourcePath($source), $this->getSourcePath($target)); } /** * remove all entries for files that are stored on the storage from the cache */ public function clear() { - $this->cache->remove($this->root); + $this->getCache()->remove($this->root); } /** @@ -190,7 +191,7 @@ class CacheJail extends CacheWrapper { * @return int Cache::NOT_FOUND, Cache::PARTIAL, Cache::SHALLOW or Cache::COMPLETE */ public function getStatus($file) { - return $this->cache->getStatus($this->getSourcePath($file)); + return $this->getCache()->getStatus($this->getSourcePath($file)); } private function formatSearchResults($results) { @@ -206,7 +207,7 @@ class CacheJail extends CacheWrapper { * @return array an array of file data */ public function search($pattern) { - $results = $this->cache->search($pattern); + $results = $this->getCache()->search($pattern); return $this->formatSearchResults($results); } @@ -217,7 +218,7 @@ class CacheJail extends CacheWrapper { * @return array */ public function searchByMime($mimetype) { - $results = $this->cache->searchByMime($mimetype); + $results = $this->getCache()->searchByMime($mimetype); return $this->formatSearchResults($results); } @@ -229,7 +230,7 @@ class CacheJail extends CacheWrapper { * @return array */ public function searchByTag($tag, $userId) { - $results = $this->cache->searchByTag($tag, $userId); + $results = $this->getCache()->searchByTag($tag, $userId); return $this->formatSearchResults($results); } @@ -240,8 +241,8 @@ class CacheJail extends CacheWrapper { * @param array $data (optional) meta data of the folder */ public function correctFolderSize($path, $data = null) { - if ($this->cache instanceof Cache) { - $this->cache->correctFolderSize($this->getSourcePath($path), $data); + if ($this->getCache() instanceof Cache) { + $this->getCache()->correctFolderSize($this->getSourcePath($path), $data); } } @@ -253,8 +254,8 @@ class CacheJail extends CacheWrapper { * @return int */ public function calculateFolderSize($path, $entry = null) { - if ($this->cache instanceof Cache) { - return $this->cache->calculateFolderSize($this->getSourcePath($path), $entry); + if ($this->getCache() instanceof Cache) { + return $this->getCache()->calculateFolderSize($this->getSourcePath($path), $entry); } else { return 0; } @@ -292,7 +293,7 @@ class CacheJail extends CacheWrapper { * @return string|null */ public function getPathById($id) { - $path = $this->cache->getPathById($id); + $path = $this->getCache()->getPathById($id); return $this->getJailedPath($path); } @@ -309,6 +310,6 @@ class CacheJail extends CacheWrapper { if ($sourceCache === $this) { return $this->move($sourcePath, $targetPath); } - return $this->cache->moveFromCache($sourceCache, $sourcePath, $this->getSourcePath($targetPath)); + return $this->getCache()->moveFromCache($sourceCache, $sourcePath, $this->getSourcePath($targetPath)); } } diff --git a/lib/private/Files/Cache/Wrapper/CacheWrapper.php b/lib/private/Files/Cache/Wrapper/CacheWrapper.php index 7a8177566c7..83fe7e5f43e 100644 --- a/lib/private/Files/Cache/Wrapper/CacheWrapper.php +++ b/lib/private/Files/Cache/Wrapper/CacheWrapper.php @@ -45,6 +45,10 @@ class CacheWrapper extends Cache { $this->cache = $cache; } + protected function getCache() { + return $this->cache; + } + /** * Make it easy for wrappers to modify every returned cache entry * @@ -62,7 +66,7 @@ class CacheWrapper extends Cache { * @return ICacheEntry|false */ public function get($file) { - $result = $this->cache->get($file); + $result = $this->getCache()->get($file); if ($result) { $result = $this->formatCacheEntry($result); } @@ -76,7 +80,7 @@ class CacheWrapper extends Cache { * @return ICacheEntry[] */ public function getFolderContents($folder) { - // can't do a simple $this->cache->.... call here since getFolderContentsById needs to be called on this + // can't do a simple $this->getCache()->.... call here since getFolderContentsById needs to be called on this // and not the wrapped cache $fileId = $this->getId($folder); return $this->getFolderContentsById($fileId); @@ -89,7 +93,7 @@ class CacheWrapper extends Cache { * @return array */ public function getFolderContentsById($fileId) { - $results = $this->cache->getFolderContentsById($fileId); + $results = $this->getCache()->getFolderContentsById($fileId); return array_map(array($this, 'formatCacheEntry'), $results); } @@ -121,7 +125,7 @@ class CacheWrapper extends Cache { * @throws \RuntimeException */ public function insert($file, array $data) { - return $this->cache->insert($file, $data); + return $this->getCache()->insert($file, $data); } /** @@ -131,7 +135,7 @@ class CacheWrapper extends Cache { * @param array $data */ public function update($id, array $data) { - $this->cache->update($id, $data); + $this->getCache()->update($id, $data); } /** @@ -141,7 +145,7 @@ class CacheWrapper extends Cache { * @return int */ public function getId($file) { - return $this->cache->getId($file); + return $this->getCache()->getId($file); } /** @@ -151,7 +155,7 @@ class CacheWrapper extends Cache { * @return int */ public function getParentId($file) { - return $this->cache->getParentId($file); + return $this->getCache()->getParentId($file); } /** @@ -161,7 +165,7 @@ class CacheWrapper extends Cache { * @return bool */ public function inCache($file) { - return $this->cache->inCache($file); + return $this->getCache()->inCache($file); } /** @@ -170,7 +174,7 @@ class CacheWrapper extends Cache { * @param string $file */ public function remove($file) { - $this->cache->remove($file); + $this->getCache()->remove($file); } /** @@ -180,18 +184,18 @@ class CacheWrapper extends Cache { * @param string $target */ public function move($source, $target) { - $this->cache->move($source, $target); + $this->getCache()->move($source, $target); } public function moveFromCache(ICache $sourceCache, $sourcePath, $targetPath) { - $this->cache->moveFromCache($sourceCache, $sourcePath, $targetPath); + $this->getCache()->moveFromCache($sourceCache, $sourcePath, $targetPath); } /** * remove all entries for files that are stored on the storage from the cache */ public function clear() { - $this->cache->clear(); + $this->getCache()->clear(); } /** @@ -200,7 +204,7 @@ class CacheWrapper extends Cache { * @return int Cache::NOT_FOUND, Cache::PARTIAL, Cache::SHALLOW or Cache::COMPLETE */ public function getStatus($file) { - return $this->cache->getStatus($file); + return $this->getCache()->getStatus($file); } /** @@ -210,7 +214,7 @@ class CacheWrapper extends Cache { * @return ICacheEntry[] an array of file data */ public function search($pattern) { - $results = $this->cache->search($pattern); + $results = $this->getCache()->search($pattern); return array_map(array($this, 'formatCacheEntry'), $results); } @@ -221,7 +225,7 @@ class CacheWrapper extends Cache { * @return ICacheEntry[] */ public function searchByMime($mimetype) { - $results = $this->cache->searchByMime($mimetype); + $results = $this->getCache()->searchByMime($mimetype); return array_map(array($this, 'formatCacheEntry'), $results); } @@ -233,7 +237,7 @@ class CacheWrapper extends Cache { * @return ICacheEntry[] file data */ public function searchByTag($tag, $userId) { - $results = $this->cache->searchByTag($tag, $userId); + $results = $this->getCache()->searchByTag($tag, $userId); return array_map(array($this, 'formatCacheEntry'), $results); } @@ -244,8 +248,8 @@ class CacheWrapper extends Cache { * @param array $data (optional) meta data of the folder */ public function correctFolderSize($path, $data = null) { - if ($this->cache instanceof Cache) { - $this->cache->correctFolderSize($path, $data); + if ($this->getCache() instanceof Cache) { + $this->getCache()->correctFolderSize($path, $data); } } @@ -257,8 +261,8 @@ class CacheWrapper extends Cache { * @return int */ public function calculateFolderSize($path, $entry = null) { - if ($this->cache instanceof Cache) { - return $this->cache->calculateFolderSize($path, $entry); + if ($this->getCache() instanceof Cache) { + return $this->getCache()->calculateFolderSize($path, $entry); } else { return 0; } @@ -270,7 +274,7 @@ class CacheWrapper extends Cache { * @return int[] */ public function getAll() { - return $this->cache->getAll(); + return $this->getCache()->getAll(); } /** @@ -283,7 +287,7 @@ class CacheWrapper extends Cache { * @return string|bool the path of the folder or false when no folder matched */ public function getIncomplete() { - return $this->cache->getIncomplete(); + return $this->getCache()->getIncomplete(); } /** @@ -293,7 +297,7 @@ class CacheWrapper extends Cache { * @return string|null */ public function getPathById($id) { - return $this->cache->getPathById($id); + return $this->getCache()->getPathById($id); } /** @@ -302,7 +306,7 @@ class CacheWrapper extends Cache { * @return int */ public function getNumericStorageId() { - return $this->cache->getNumericStorageId(); + return $this->getCache()->getNumericStorageId(); } /** diff --git a/lib/private/Files/FileInfo.php b/lib/private/Files/FileInfo.php index d463abfadcd..3ad2932e597 100644 --- a/lib/private/Files/FileInfo.php +++ b/lib/private/Files/FileInfo.php @@ -31,6 +31,9 @@ namespace OC\Files; use OCP\Files\Cache\ICacheEntry; +use OCP\Files\Mount\IMountPoint; +use OCP\Files\Storage\IStorage; +use OCP\Files\IHomeStorage; use OCP\IUser; class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { @@ -70,6 +73,13 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { private $childEtags = []; /** + * @var IMountPoint[] + */ + private $subMounts = []; + + private $subMountsUsed = false; + + /** * @param string|boolean $path * @param Storage\Storage $storage * @param string $internalPath @@ -103,6 +113,10 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { return $this->getType(); } else if ($offset === 'etag') { return $this->getEtag(); + } else if ($offset === 'size') { + return $this->getSize(); + } else if ($offset === 'mtime') { + return $this->getMTime(); } elseif ($offset === 'permissions') { return $this->getPermissions(); } elseif (isset($this->data[$offset])) { @@ -165,6 +179,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return string */ public function getEtag() { + $this->updateEntryfromSubMounts(); if (count($this->childEtags) > 0) { $combinedEtag = $this->data['etag'] . '::' . implode('::', $this->childEtags); return md5($combinedEtag); @@ -177,6 +192,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return int */ public function getSize() { + $this->updateEntryfromSubMounts(); return isset($this->data['size']) ? $this->data['size'] : 0; } @@ -184,6 +200,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return int */ public function getMTime() { + $this->updateEntryfromSubMounts(); return $this->data['mtime']; } @@ -289,7 +306,11 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { } public function isMounted() { - $sid = $this->getStorage()->getId(); + $storage = $this->getStorage(); + if ($storage->instanceOfStorage('\OCP\Files\IHomeStorage')) { + return false; + } + $sid = $storage->getId(); if (!is_null($sid)) { $sid = explode(':', $sid); return ($sid[0] !== 'home' and $sid[0] !== 'shared'); @@ -317,11 +338,33 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { } /** + * @param IMountPoint[] $mounts + */ + public function setSubMounts(array $mounts) { + $this->subMounts = $mounts; + } + + private function updateEntryfromSubMounts() { + if ($this->subMountsUsed) { + return; + } + $this->subMountsUsed = true; + foreach ($this->subMounts as $mount) { + $subStorage = $mount->getStorage(); + if ($subStorage) { + $subCache = $subStorage->getCache(''); + $rootEntry = $subCache->get(''); + $this->addSubEntry($rootEntry, $mount->getMountPoint()); + } + } + } + + /** * Add a cache entry which is the child of this folder * * Sets the size, etag and size to for cross-storage childs * - * @param array $data cache entry for the child + * @param array|ICacheEntry $data cache entry for the child * @param string $entryPath full path of the child entry */ public function addSubEntry($data, $entryPath) { diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index 55cf38bbdc9..51e494c372e 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -62,6 +62,7 @@ use OC\Cache\CappedMemoryCache; use OC\Files\Config\MountProviderCollection; use OC\Files\Mount\MountPoint; use OC\Files\Storage\StorageFactory; +use OC\Lockdown\Filesystem\NullStorage; use OCP\Files\Config\IMountProvider; use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; @@ -213,10 +214,13 @@ class Filesystem { /** * @param bool $shouldLog + * @return bool previous value * @internal */ public static function logWarningWhenAddingStorageWrapper($shouldLog) { + $previousValue = self::$logWarningWhenAddingStorageWrapper; self::$logWarningWhenAddingStorageWrapper = (bool) $shouldLog; + return $previousValue; } /** @@ -225,7 +229,7 @@ class Filesystem { * @param int $priority */ public static function addStorageWrapper($wrapperName, $wrapper, $priority = 50) { - if (self::$logWarningWhenAddingStorageWrapper && $wrapperName !== 'readonly') { + if (self::$logWarningWhenAddingStorageWrapper) { \OC::$server->getLogger()->warning("Storage wrapper '{wrapper}' was not registered via the 'OC_Filesystem - preSetup' hook which could cause potential problems.", [ 'wrapper' => $wrapperName, 'app' => 'filesystem', @@ -426,25 +430,36 @@ class Filesystem { self::$usersSetup[$user] = true; } - /** @var \OC\Files\Config\MountProviderCollection $mountConfigManager */ - $mountConfigManager = \OC::$server->getMountProviderCollection(); + if (\OC::$server->getLockdownManager()->canAccessFilesystem()) { + /** @var \OC\Files\Config\MountProviderCollection $mountConfigManager */ + $mountConfigManager = \OC::$server->getMountProviderCollection(); - // home mounts are handled seperate since we need to ensure this is mounted before we call the other mount providers - $homeMount = $mountConfigManager->getHomeMountForUser($userObject); + // home mounts are handled seperate since we need to ensure this is mounted before we call the other mount providers + $homeMount = $mountConfigManager->getHomeMountForUser($userObject); - self::getMountManager()->addMount($homeMount); + self::getMountManager()->addMount($homeMount); - \OC\Files\Filesystem::getStorage($user); + \OC\Files\Filesystem::getStorage($user); - // Chance to mount for other storages - if ($userObject) { - $mounts = $mountConfigManager->getMountsForUser($userObject); - array_walk($mounts, array(self::$mounts, 'addMount')); - $mounts[] = $homeMount; - $mountConfigManager->registerMounts($userObject, $mounts); - } + // Chance to mount for other storages + if ($userObject) { + $mounts = $mountConfigManager->getMountsForUser($userObject); + array_walk($mounts, array(self::$mounts, 'addMount')); + $mounts[] = $homeMount; + $mountConfigManager->registerMounts($userObject, $mounts); + } - self::listenForNewMountProviders($mountConfigManager, $userManager); + self::listenForNewMountProviders($mountConfigManager, $userManager); + } else { + self::getMountManager()->addMount(new MountPoint( + new NullStorage([]), + '/' . $user + )); + self::getMountManager()->addMount(new MountPoint( + new NullStorage([]), + '/' . $user . '/files' + )); + } \OC_Hook::emit('OC_Filesystem', 'post_initMountPoints', array('user' => $user)); } diff --git a/lib/private/Files/Mount/ObjectHomeMountProvider.php b/lib/private/Files/Mount/ObjectHomeMountProvider.php index 87878562a42..440a8bc4608 100644 --- a/lib/private/Files/Mount/ObjectHomeMountProvider.php +++ b/lib/private/Files/Mount/ObjectHomeMountProvider.php @@ -51,7 +51,7 @@ class ObjectHomeMountProvider implements IHomeMountProvider { * * @param IUser $user * @param IStorageFactory $loader - * @return \OCP\Files\Mount\IMountPoint[] + * @return \OCP\Files\Mount\IMountPoint */ public function getHomeMountForUser(IUser $user, IStorageFactory $loader) { diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index 515a795d6e0..175cb4f914f 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -378,7 +378,6 @@ class Root extends Folder implements IRootFolder { $this->newFolder('/' . $userId); } $folder = $this->newFolder('/' . $userId . '/files'); - \OC_Util::copySkeleton($userId, $folder); } $this->userFolderCache->set($userId, $folder); diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 0f0229c9ca5..2dcf830cc1e 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -48,6 +48,8 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { */ protected $user; + private $objectPrefix = 'urn:oid:'; + public function __construct($params) { if (isset($params['objectstore']) && $params['objectstore'] instanceof IObjectStore) { $this->objectStore = $params['objectstore']; @@ -59,6 +61,9 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { } else { $this->id = 'object::store:' . $this->objectStore->getStorageId(); } + if (isset($params['objectPrefix'])) { + $this->objectPrefix = $params['objectPrefix']; + } //initialize cache with root directory in cache if (!$this->is_dir('/')) { $this->mkdir('/'); @@ -216,7 +221,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { */ protected function getURN($fileId) { if (is_numeric($fileId)) { - return 'urn:oid:' . $fileId; + return $this->objectPrefix . $fileId; } return null; } diff --git a/lib/private/Files/ObjectStore/S3.php b/lib/private/Files/ObjectStore/S3.php new file mode 100644 index 00000000000..5251b473bdf --- /dev/null +++ b/lib/private/Files/ObjectStore/S3.php @@ -0,0 +1,107 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Files\ObjectStore; + +use OCP\Files\ObjectStore\IObjectStore; + +// TODO: proper composer +set_include_path(get_include_path() . PATH_SEPARATOR . + \OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php'); +require_once 'aws-autoloader.php'; + +class S3 implements IObjectStore { + use S3ConnectionTrait; + + public function __construct($parameters) { + $this->parseParams($parameters); + } + + /** + * @return string the container or bucket name where objects are stored + * @since 7.0.0 + */ + function getStorageId() { + return $this->id; + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return resource stream with the read data + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function readObject($urn) { + // Create the command and serialize the request + $request = $this->getConnection()->getCommand('GetObject', [ + 'Bucket' => $this->bucket, + 'Key' => $urn + ])->prepare(); + + $request->dispatch('request.before_send', array( + 'request' => $request + )); + + $headers = $request->getHeaderLines(); + $headers[] = 'Connection: close'; + + $opts = [ + 'http' => [ + 'method' => "GET", + 'header' => $headers + ], + 'ssl' => [ + 'verify_peer' => true + ] + ]; + + $context = stream_context_create($opts); + return fopen($request->getUrl(), 'r', false, $context); + } + + /** + * @param string $urn the unified resource name used to identify the object + * @param resource $stream stream with the data to write + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function writeObject($urn, $stream) { + $this->getConnection()->putObject([ + 'Bucket' => $this->bucket, + 'Key' => $urn, + 'Body' => $stream + ]); + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return void + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function deleteObject($urn) { + $this->getConnection()->deleteObject([ + 'Bucket' => $this->bucket, + 'Key' => $urn + ]); + } + +} diff --git a/lib/private/Files/ObjectStore/S3ConnectionTrait.php b/lib/private/Files/ObjectStore/S3ConnectionTrait.php new file mode 100644 index 00000000000..a8b57cb18d3 --- /dev/null +++ b/lib/private/Files/ObjectStore/S3ConnectionTrait.php @@ -0,0 +1,124 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Files\ObjectStore; + +use Aws\S3\Exception\S3Exception; +use Aws\S3\S3Client; + +trait S3ConnectionTrait { + /** @var array */ + protected $params; + + /** @var S3Client */ + protected $connection; + + /** @var string */ + protected $id; + + /** @var string */ + protected $bucket; + + /** @var int */ + protected $timeout; + + protected $test; + + protected function parseParams($params) { + if (empty($params['key']) || empty($params['secret']) || empty($params['bucket'])) { + throw new \Exception("Access Key, Secret and Bucket have to be configured."); + } + + $this->id = 'amazon::' . $params['bucket']; + + $this->test = isset($params['test']); + $this->bucket = $params['bucket']; + $this->timeout = (!isset($params['timeout'])) ? 15 : $params['timeout']; + $params['region'] = empty($params['region']) ? 'eu-west-1' : $params['region']; + $params['hostname'] = empty($params['hostname']) ? 's3.amazonaws.com' : $params['hostname']; + if (!isset($params['port']) || $params['port'] === '') { + $params['port'] = (isset($params['use_ssl']) && $params['use_ssl'] === false) ? 80 : 443; + } + $this->params = $params; + } + + + /** + * Returns the connection + * + * @return S3Client connected client + * @throws \Exception if connection could not be made + */ + protected function getConnection() { + if (!is_null($this->connection)) { + return $this->connection; + } + + $scheme = (isset($this->params['use_ssl']) && $this->params['use_ssl'] === false) ? 'http' : 'https'; + $base_url = $scheme . '://' . $this->params['hostname'] . ':' . $this->params['port'] . '/'; + + $options = [ + 'key' => $this->params['key'], + 'secret' => $this->params['secret'], + 'base_url' => $base_url, + 'region' => $this->params['region'], + S3Client::COMMAND_PARAMS => [ + 'PathStyle' => isset($this->params['use_path_style']) ? $this->params['use_path_style'] : false, + ] + ]; + if (isset($this->params['proxy'])) { + $options[S3Client::REQUEST_OPTIONS] = ['proxy' => $this->params['proxy']]; + } + $this->connection = S3Client::factory($options); + + if (!$this->connection->isValidBucketName($this->bucket)) { + throw new \Exception("The configured bucket name is invalid."); + } + + if (!$this->connection->doesBucketExist($this->bucket)) { + try { + $this->connection->createBucket(array( + 'Bucket' => $this->bucket + )); + $this->connection->waitUntilBucketExists(array( + 'Bucket' => $this->bucket, + 'waiter.interval' => 1, + 'waiter.max_attempts' => 15 + )); + $this->testTimeout(); + } catch (S3Exception $e) { + \OCP\Util::logException('files_external', $e); + throw new \Exception('Creation of bucket failed. ' . $e->getMessage()); + } + } + + return $this->connection; + } + + /** + * when running the tests wait to let the buckets catch up + */ + private function testTimeout() { + if ($this->test) { + sleep($this->timeout); + } + } +} diff --git a/lib/private/Files/ObjectStore/StorageObjectStore.php b/lib/private/Files/ObjectStore/StorageObjectStore.php new file mode 100644 index 00000000000..044243c1ee6 --- /dev/null +++ b/lib/private/Files/ObjectStore/StorageObjectStore.php @@ -0,0 +1,90 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OC\Files\ObjectStore; + +use OCP\Files\ObjectStore\IObjectStore; +use OCP\Files\Storage\IStorage; + +/** + * Object store that wraps a storage backend, mostly for testing purposes + */ +class StorageObjectStore implements IObjectStore { + /** @var IStorage */ + private $storage; + + /** + * @param IStorage $storage + */ + public function __construct(IStorage $storage) { + $this->storage = $storage; + } + + /** + * @return string the container or bucket name where objects are stored + * @since 7.0.0 + */ + function getStorageId() { + $this->storage->getId(); + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return resource stream with the read data + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function readObject($urn) { + $handle = $this->storage->fopen($urn, 'r'); + if ($handle) { + return $handle; + } else { + throw new \Exception(); + } + } + + /** + * @param string $urn the unified resource name used to identify the object + * @param resource $stream stream with the data to write + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function writeObject($urn, $stream) { + $handle = $this->storage->fopen($urn, 'w'); + if ($handle) { + stream_copy_to_stream($stream, $handle); + fclose($handle); + } else { + throw new \Exception(); + } + } + + /** + * @param string $urn the unified resource name used to identify the object + * @return void + * @throws \Exception when something goes wrong, message will be logged + * @since 7.0.0 + */ + function deleteObject($urn) { + $this->storage->unlink($urn); + } + +} diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index f36e2c2c64f..7866f90157e 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -56,6 +56,7 @@ use OCP\Files\Cache\ICacheEntry; use OCP\Files\FileNameTooLongException; use OCP\Files\InvalidCharacterInPathException; use OCP\Files\InvalidPathException; +use OCP\Files\Mount\IMountPoint; use OCP\Files\NotFoundException; use OCP\Files\ReservedWordException; use OCP\Files\UnseekableException; @@ -430,6 +431,7 @@ class View { echo fread($handle, $chunkSize); flush(); } + fclose($handle); $size = $this->filesize($path); return $size; } @@ -1353,18 +1355,10 @@ class View { //add the sizes of other mount points to the folder $extOnly = ($includeMountPoints === 'ext'); $mounts = Filesystem::getMountManager()->findIn($path); - foreach ($mounts as $mount) { + $info->setSubMounts(array_filter($mounts, function(IMountPoint $mount) use ($extOnly) { $subStorage = $mount->getStorage(); - if ($subStorage) { - // exclude shared storage ? - if ($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage) { - continue; - } - $subCache = $subStorage->getCache(''); - $rootEntry = $subCache->get(''); - $info->addSubEntry($rootEntry, $mount->getMountPoint()); - } - } + return !($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage); + })); } } diff --git a/lib/private/Installer.php b/lib/private/Installer.php index aff2d2194aa..db71f7b1432 100644 --- a/lib/private/Installer.php +++ b/lib/private/Installer.php @@ -278,6 +278,20 @@ class Installer { ); } + // Check if the version is lower than before + $currentVersion = OC_App::getAppVersion($appId); + $newVersion = (string)$xml->version; + if(version_compare($currentVersion, $newVersion) === 1) { + throw new \Exception( + sprintf( + 'App for id %s has version %s and tried to update to lower version %s', + $appId, + $currentVersion, + $newVersion + ) + ); + } + $baseDir = OC_App::getInstallPath() . '/' . $appId; // Remove old app with the ID if existent OC_Helper::rmdirr($baseDir); diff --git a/lib/private/Lockdown/Filesystem/NullCache.php b/lib/private/Lockdown/Filesystem/NullCache.php new file mode 100644 index 00000000000..8c6b5258aa8 --- /dev/null +++ b/lib/private/Lockdown/Filesystem/NullCache.php @@ -0,0 +1,122 @@ +<?php + +/** + * @copyright Copyright (c) 2016, Robin Appelman <robin@icewind.nl> + * + * 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\Lockdown\Filesystem; + +use OC\Files\Cache\CacheEntry; +use OCP\Constants; +use OCP\Files\Cache\ICache; +use OCP\Files\Cache\ICacheEntry; +use OCP\Files\FileInfo; + +class NullCache implements ICache { + public function getNumericStorageId() { + return -1; + } + + public function get($file) { + return $file !== '' ? null : + new CacheEntry([ + 'fileid' => -1, + 'parent' => -1, + 'name' => '', + 'path' => '', + 'size' => '0', + 'mtime' => time(), + 'storage_mtime' => time(), + 'etag' => '', + 'mimetype' => FileInfo::MIMETYPE_FOLDER, + 'mimepart' => 'httpd', + 'permissions' => Constants::PERMISSION_READ + ]); + } + + public function getFolderContents($folder) { + return []; + } + + public function getFolderContentsById($fileId) { + return []; + } + + public function put($file, array $data) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function insert($file, array $data) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function update($id, array $data) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function getId($file) { + return -1; + } + + public function getParentId($file) { + return -1; + } + + public function inCache($file) { + return $file === ''; + } + + public function remove($file) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function move($source, $target) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function moveFromCache(ICache $sourceCache, $sourcePath, $targetPath) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function getStatus($file) { + return ICache::COMPLETE; + } + + public function search($pattern) { + return []; + } + + public function searchByMime($mimetype) { + return []; + } + + public function searchByTag($tag, $userId) { + return []; + } + + public function getIncomplete() { + return []; + } + + public function getPathById($id) { + return ''; + } + + public function normalize($path) { + return $path; + } + +} diff --git a/lib/private/Lockdown/Filesystem/NullStorage.php b/lib/private/Lockdown/Filesystem/NullStorage.php new file mode 100644 index 00000000000..967b6d2c6e7 --- /dev/null +++ b/lib/private/Lockdown/Filesystem/NullStorage.php @@ -0,0 +1,177 @@ +<?php + +/** + * @copyright Copyright (c) 2016, Robin Appelman <robin@icewind.nl> + * + * 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\Lockdown\Filesystem; + +use Icewind\Streams\IteratorDirectory; +use OC\Files\Storage\Common; + +class NullStorage extends Common { + public function __construct($parameters) { + parent::__construct($parameters); + } + + public function getId() { + return 'null'; + } + + public function mkdir($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function rmdir($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function opendir($path) { + return new IteratorDirectory([]); + } + + public function is_dir($path) { + return $path === ''; + } + + public function is_file($path) { + return false; + } + + public function stat($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function filetype($path) { + return ($path === '') ? 'dir' : false; + } + + public function filesize($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function isCreatable($path) { + return false; + } + + public function isReadable($path) { + return $path === ''; + } + + public function isUpdatable($path) { + return false; + } + + public function isDeletable($path) { + return false; + } + + public function isSharable($path) { + return false; + } + + public function getPermissions($path) { + return null; + } + + public function file_exists($path) { + return $path === ''; + } + + public function filemtime($path) { + return ($path === '') ? time() : false; + } + + public function file_get_contents($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function file_put_contents($path, $data) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function unlink($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function rename($path1, $path2) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function copy($path1, $path2) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function fopen($path, $mode) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function getMimeType($path) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function hash($type, $path, $raw = false) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function free_space($path) { + return 0; + } + + public function touch($path, $mtime = null) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function getLocalFile($path) { + return false; + } + + public function hasUpdated($path, $time) { + return false; + } + + public function getETag($path) { + return ''; + } + + public function isLocal() { + return false; + } + + public function getDirectDownload($path) { + return false; + } + + public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function moveFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + throw new \OC\ForbiddenException('This request is not allowed to access the filesystem'); + } + + public function test() { + return true; + } + + public function getOwner($path) { + return null; + } + + public function getCache($path = '', $storage = null) { + return new NullCache(); + } +} diff --git a/lib/private/Lockdown/LockdownManager.php b/lib/private/Lockdown/LockdownManager.php new file mode 100644 index 00000000000..5ce52a03683 --- /dev/null +++ b/lib/private/Lockdown/LockdownManager.php @@ -0,0 +1,46 @@ +<?php + +/** + * @copyright Copyright (c) 2016, Robin Appelman <robin@icewind.nl> + * + * 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\Lockdown; + +use OC\Authentication\Token\IToken; +use OCP\Lockdown\ILockdownManager; + +class LockdownManager implements ILockdownManager { + private $enabled = false; + + /** @var array|null */ + private $scope; + + public function enable() { + $this->enabled = true; + } + + public function setToken(IToken $token) { + $this->scope = $token->getScopeAsArray(); + $this->enable(); + } + + public function canAccessFilesystem() { + if (!$this->enabled) { + return true; + } + return !$this->scope || $this->scope['filesystem']; + } +} diff --git a/lib/private/Notification/Notification.php b/lib/private/Notification/Notification.php index ffcb36af6e5..e5a8976f54d 100644 --- a/lib/private/Notification/Notification.php +++ b/lib/private/Notification/Notification.php @@ -289,7 +289,7 @@ class Notification implements INotification { * @param array $parameters * @return $this * @throws \InvalidArgumentException if the subject or parameters are invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setRichSubject($subject, array $parameters = []) { if (!is_string($subject) || $subject === '') { @@ -304,7 +304,7 @@ class Notification implements INotification { /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getRichSubject() { return $this->subjectRich; @@ -312,7 +312,7 @@ class Notification implements INotification { /** * @return array[] - * @since 9.2.0 + * @since 11.0.0 */ public function getRichSubjectParameters() { return $this->subjectRichParameters; @@ -379,7 +379,7 @@ class Notification implements INotification { * @param array $parameters * @return $this * @throws \InvalidArgumentException if the message or parameters are invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setRichMessage($message, array $parameters = []) { if (!is_string($message) || $message === '') { @@ -394,7 +394,7 @@ class Notification implements INotification { /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getRichMessage() { return $this->messageRich; @@ -402,7 +402,7 @@ class Notification implements INotification { /** * @return array[] - * @since 9.2.0 + * @since 11.0.0 */ public function getRichMessageParameters() { return $this->messageRichParameters; @@ -434,7 +434,7 @@ class Notification implements INotification { * @param string $icon * @return $this * @throws \InvalidArgumentException if the icon is invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setIcon($icon) { if (!is_string($icon) || $icon === '' || isset($icon[4000])) { @@ -446,7 +446,7 @@ class Notification implements INotification { /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getIcon() { return $this->icon; diff --git a/lib/private/OCS/Person.php b/lib/private/OCS/Person.php deleted file mode 100644 index bbb4a39e1e8..00000000000 --- a/lib/private/OCS/Person.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php -/** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Bart Visscher <bartv@thisnet.nl> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Tom Needham <tom@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * - */ - -namespace OC\OCS; - -class Person { - - public static function check() { - $login = isset($_POST['login']) ? $_POST['login'] : false; - $password = isset($_POST['password']) ? $_POST['password'] : false; - if($login && $password) { - if(\OC_User::checkPassword($login, $password)) { - $xml['person']['personid'] = $login; - return new Result($xml); - } else { - return new Result(null, 102); - } - } else { - return new Result(null, 101); - } - } - -} diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php index 799f94f2bef..36b3730a720 100644 --- a/lib/private/PreviewManager.php +++ b/lib/private/PreviewManager.php @@ -164,7 +164,7 @@ class PreviewManager implements IPreview { * @param string $mimeType * @return ISimpleFile * @throws NotFoundException - * @since 9.2.0 + * @since 11.0.0 */ public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) { if ($this->generator === null) { diff --git a/lib/private/RichObjectStrings/Validator.php b/lib/private/RichObjectStrings/Validator.php index 11d17fef645..d90a6780ea8 100644 --- a/lib/private/RichObjectStrings/Validator.php +++ b/lib/private/RichObjectStrings/Validator.php @@ -30,7 +30,7 @@ use OCP\RichObjectStrings\IValidator; * Class Validator * * @package OCP\RichObjectStrings - * @since 9.2.0 + * @since 11.0.0 */ class Validator implements IValidator { @@ -53,7 +53,7 @@ class Validator implements IValidator { * @param string $subject * @param array[] $parameters * @throws InvalidObjectExeption - * @since 9.2.0 + * @since 11.0.0 */ public function validate($subject, array $parameters) { $matches = []; diff --git a/lib/private/Server.php b/lib/private/Server.php index 995dc8ed4a4..1d3d588e9fc 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -69,6 +69,7 @@ use OC\IntegrityCheck\Helpers\FileAccessHelper; use OC\Lock\DBLockingProvider; use OC\Lock\MemcacheLockingProvider; use OC\Lock\NoopLockingProvider; +use OC\Lockdown\LockdownManager; use OC\Mail\Mailer; use OC\Memcache\ArrayCache; use OC\Notification\Manager; @@ -90,6 +91,7 @@ use OC\Tagging\TagMapper; use OCA\Theming\ThemingDefaults; use OCP\IL10N; use OCP\IServerContainer; +use OCP\RichObjectStrings\IValidator; use OCP\Security\IContentSecurityPolicyManager; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -395,9 +397,11 @@ class Server extends ServerContainer implements IServerContainer { return new \OC\Activity\Manager( $c->getRequest(), $c->getUserSession(), - $c->getConfig() + $c->getConfig(), + $c->query(IValidator::class) ); }); + $this->registerAlias(IValidator::class, Validator::class); $this->registerService('AvatarManager', function (Server $c) { return new AvatarManager( $c->getUserManager(), @@ -663,7 +667,7 @@ class Server extends ServerContainer implements IServerContainer { }); $this->registerService('NotificationManager', function (Server $c) { return new Manager( - $c->query(Validator::class) + $c->query(IValidator::class) ); }); $this->registerService('CapabilitiesManager', function (Server $c) { @@ -700,7 +704,8 @@ class Server extends ServerContainer implements IServerContainer { $c->getL10N('theming'), $c->getURLGenerator(), new \OC_Defaults(), - $c->getLazyRootFolder() + $c->getLazyRootFolder(), + $c->getMemCacheFactory() ); } return new \OC_Defaults(); @@ -779,7 +784,7 @@ class Server extends ServerContainer implements IServerContainer { $manager = new \OC\Settings\Manager( $c->getLogger(), $c->getDatabaseConnection(), - $c->getL10N('core'), + $c->getL10N('lib'), $c->getConfig(), $c->getEncryptionManager(), $c->getUserManager(), @@ -793,6 +798,9 @@ class Server extends ServerContainer implements IServerContainer { $c->getSystemConfig() ); }); + $this->registerService('LockdownManager', function (Server $c) { + return new LockdownManager(); + }); } /** @@ -1532,4 +1540,11 @@ class Server extends ServerContainer implements IServerContainer { $factory = $this->query(\OC\Files\AppData\Factory::class); return $factory->get($app); } + + /** + * @return \OCP\Lockdown\ILockdownManager + */ + public function getLockdownManager() { + return $this->query('LockdownManager'); + } } diff --git a/lib/private/Settings/Admin/ServerDevNotice.php b/lib/private/Settings/Admin/ServerDevNotice.php new file mode 100644 index 00000000000..1d7f34f782d --- /dev/null +++ b/lib/private/Settings/Admin/ServerDevNotice.php @@ -0,0 +1,62 @@ +<?php +/** + * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OC\Settings\Admin; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\DBALException; +use Doctrine\DBAL\Platforms\SqlitePlatform; +use OC\Lock\DBLockingProvider; +use OC\Lock\NoopLockingProvider; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\IL10N; +use OCP\Lock\ILockingProvider; +use OCP\Settings\ISettings; + +class ServerDevNotice implements ISettings { + /** + * @return TemplateResponse + */ + public function getForm() { + return new TemplateResponse('settings', 'admin/server.development.notice'); + } + + /** + * @return string the section ID, e.g. 'sharing' + */ + public function getSection() { + return 'server'; + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * + * E.g.: 70 + */ + public function getPriority() { + return 1000; + } +} diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index e7be3d4e77d..a6f9aacccb2 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -369,6 +369,8 @@ class Manager implements IManager { /** @var ISettings $form */ $form = new Admin\Server($this->dbc, $this->config, $this->lockingProvider, $this->l); $forms[$form->getPriority()] = [$form]; + $form = new Admin\ServerDevNotice(); + $forms[$form->getPriority()] = [$form]; } if($section === 'encryption') { /** @var ISettings $form */ diff --git a/lib/private/Setup.php b/lib/private/Setup.php index 4c72fbc9623..81a5343fe21 100644 --- a/lib/private/Setup.php +++ b/lib/private/Setup.php @@ -363,15 +363,6 @@ class Setup { $group =\OC::$server->getGroupManager()->createGroup('admin'); $group->addUser($user); - // Create a session token for the newly created user - // The token provider requires a working db, so it's not injected on setup - /* @var $userSession User\Session */ - $userSession = \OC::$server->getUserSession(); - $defaultTokenProvider = \OC::$server->query('OC\Authentication\Token\DefaultTokenProvider'); - $userSession->setTokenProvider($defaultTokenProvider); - $userSession->login($username, $password); - $userSession->createSessionToken($request, $userSession->getUser()->getUID(), $username, $password); - //guess what this does Installer::installShippedApps(); @@ -392,6 +383,15 @@ class Setup { //and we are done $config->setSystemValue('installed', true); + + // Create a session token for the newly created user + // The token provider requires a working db, so it's not injected on setup + /* @var $userSession User\Session */ + $userSession = \OC::$server->getUserSession(); + $defaultTokenProvider = \OC::$server->query('OC\Authentication\Token\DefaultTokenProvider'); + $userSession->setTokenProvider($defaultTokenProvider); + $userSession->login($username, $password); + $userSession->createSessionToken($request, $userSession->getUser()->getUID(), $username, $password); } return $error; diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index bdb6ac466ec..7a602950171 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -23,6 +23,8 @@ */ namespace OC\Share20; +use OC\Files\Cache\Cache; +use OC\Files\Cache\CacheEntry; use OCP\Files\File; use OCP\Files\Folder; use OCP\Share\IShareProvider; @@ -571,7 +573,7 @@ class DefaultShareProvider implements IShareProvider { $qb->expr()->eq('item_type', $qb->createNamedParameter('file')), $qb->expr()->eq('item_type', $qb->createNamedParameter('folder')) )); - + $cursor = $qb->execute(); $data = $cursor->fetch(); $cursor->closeCursor(); @@ -656,7 +658,11 @@ class DefaultShareProvider implements IShareProvider { if ($shareType === \OCP\Share::SHARE_TYPE_USER) { //Get shares directly with this user $qb = $this->dbConn->getQueryBuilder(); - $qb->select('s.*', 'f.fileid', 'f.path') + $qb->select('s.*', + 'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash', + 'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime', + 'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum' + ) ->selectAlias('st.id', 'storage_string_id') ->from('share', 's') ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid')) @@ -709,7 +715,11 @@ class DefaultShareProvider implements IShareProvider { } $qb = $this->dbConn->getQueryBuilder(); - $qb->select('s.*', 'f.fileid', 'f.path') + $qb->select('s.*', + 'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash', + 'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime', + 'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum' + ) ->selectAlias('st.id', 'storage_string_id') ->from('share', 's') ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid')) @@ -798,7 +808,7 @@ class DefaultShareProvider implements IShareProvider { return $share; } - + /** * Create a share object from an database row * @@ -838,6 +848,15 @@ class DefaultShareProvider implements IShareProvider { $share->setExpirationDate($expiration); } + if (isset($data['f_permissions'])) { + $entryData = $data; + $entryData['permissions'] = $entryData['f_permissions']; + $entryData['parent'] = $entryData['f_parent'];; + $share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData, + $entryData['storage_string_id'], + \OC::$server->getMimeTypeLoader())); + } + $share->setProviderId($this->identifier()); return $share; diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php index e3e8482f4e1..2e7e6d0ca2e 100644 --- a/lib/private/Share20/Share.php +++ b/lib/private/Share20/Share.php @@ -22,6 +22,7 @@ */ namespace OC\Share20; +use OCP\Files\Cache\ICacheEntry; use OCP\Files\File; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -72,6 +73,9 @@ class Share implements \OCP\Share\IShare { /** @var IUserManager */ private $userManager; + /** @var ICacheEntry|null */ + private $nodeCacheEntry; + public function __construct(IRootFolder $rootFolder, IUserManager $userManager) { $this->rootFolder = $rootFolder; $this->userManager = $userManager; @@ -418,4 +422,18 @@ class Share implements \OCP\Share\IShare { public function getMailSend() { return $this->mailSend; } + + /** + * @inheritdoc + */ + public function setNodeCacheEntry(ICacheEntry $entry) { + $this->nodeCacheEntry = $entry; + } + + /** + * @inheritdoc + */ + public function getNodeCacheEntry() { + return $this->nodeCacheEntry; + } } diff --git a/lib/private/Template/JSConfigHelper.php b/lib/private/Template/JSConfigHelper.php index a7f8c251cee..eceaed0c380 100644 --- a/lib/private/Template/JSConfigHelper.php +++ b/lib/private/Template/JSConfigHelper.php @@ -27,6 +27,7 @@ use OCP\App\IAppManager; use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; +use OCP\ISession; use OCP\IURLGenerator; use OCP\IUser; @@ -41,7 +42,10 @@ class JSConfigHelper { /** @var IAppManager */ private $appManager; - /** @var IUser */ + /** @var ISession */ + private $session; + + /** @var IUser|null */ private $currentUser; /** @var IConfig */ @@ -60,6 +64,7 @@ class JSConfigHelper { * @param IL10N $l * @param \OC_Defaults $defaults * @param IAppManager $appManager + * @param ISession $session * @param IUser|null $currentUser * @param IConfig $config * @param IGroupManager $groupManager @@ -69,6 +74,7 @@ class JSConfigHelper { public function __construct(IL10N $l, \OC_Defaults $defaults, IAppManager $appManager, + ISession $session, $currentUser, IConfig $config, IGroupManager $groupManager, @@ -77,6 +83,7 @@ class JSConfigHelper { $this->l = $l; $this->defaults = $defaults; $this->appManager = $appManager; + $this->session = $session; $this->currentUser = $currentUser; $this->config = $config; $this->groupManager = $groupManager; @@ -119,6 +126,16 @@ class JSConfigHelper { $dataLocation = false; } + if ($this->currentUser instanceof IUser) { + $lastConfirmTimestamp = $this->currentUser->getLastLogin(); + $sessionTime = $this->session->get('last-password-confirm'); + if (is_int($sessionTime)) { + $lastConfirmTimestamp = $sessionTime; + } + } else { + $lastConfirmTimestamp = 0; + } + $array = [ "oc_debug" => $this->config->getSystemValue('debug', false) ? 'true' : 'false', "oc_isadmin" => $this->groupManager->isAdmin($uid) ? 'true' : 'false', @@ -126,6 +143,7 @@ class JSConfigHelper { "oc_webroot" => "\"".\OC::$WEBROOT."\"", "oc_appswebroots" => str_replace('\\/', '/', json_encode($apps_paths)), // Ugly unescape slashes waiting for better solution "datepickerFormatDate" => json_encode($this->l->l('jsdate', null)), + 'nc_lastLogin' => $lastConfirmTimestamp, "dayNames" => json_encode([ (string)$this->l->t('Sunday'), (string)$this->l->t('Monday'), diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index 7878737bdef..8919f14216e 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -148,6 +148,7 @@ class TemplateLayout extends \OC_Template { \OC::$server->getL10N('core'), \OC::$server->getThemingDefaults(), \OC::$server->getAppManager(), + \OC::$server->getSession(), \OC::$server->getUserSession()->getUser(), \OC::$server->getConfig(), \OC::$server->getGroupManager(), diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php index 93517dc9f7e..bdf7bdafae3 100644 --- a/lib/private/URLGenerator.php +++ b/lib/private/URLGenerator.php @@ -157,7 +157,15 @@ class URLGenerator implements IURLGenerator { // Check if the app is in the app folder $path = ''; - if (file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$image")) { + if(\OCP\App::isEnabled('theming') && $image === "favicon.ico" && \OC::$server->getThemingDefaults()->shouldReplaceIcons()) { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + if($app==="") { $app = "core"; } + $path = $this->linkToRoute('theming.Icon.getFavicon', [ 'app' => $app ]) . '?v='. $cacheBusterValue; + } elseif(\OCP\App::isEnabled('theming') && $image === "favicon-touch.png" && \OC::$server->getThemingDefaults()->shouldReplaceIcons()) { + $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + if($app==="") { $app = "core"; } + $path = $this->linkToRoute('theming.Icon.getTouchIcon', [ 'app' => $app ]) . '?v='. $cacheBusterValue; + } elseif (file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$image")) { $path = \OC::$WEBROOT . "/themes/$theme/apps/$app/img/$image"; } elseif (!file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.svg") && file_exists(\OC::$SERVERROOT . "/themes/$theme/apps/$app/img/$basename.png")) { diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index c3fb8737420..3d016700ee3 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -79,14 +79,6 @@ class Manager extends PublicEmitter implements IUserManager { /** @var \OC\User\User $user */ unset($cachedUsers[$user->getUID()]); }); - $this->listen('\OC\User', 'postLogin', function ($user) { - /** @var \OC\User\User $user */ - $user->updateLastLoginTimestamp(); - }); - $this->listen('\OC\User', 'postRememberedLogin', function ($user) { - /** @var \OC\User\User $user */ - $user->updateLastLoginTimestamp(); - }); } /** @@ -383,7 +375,7 @@ class Manager extends PublicEmitter implements IUserManager { * returns how many users have logged in once * * @return int - * @since 9.2.0 + * @since 11.0.0 */ public function countSeenUsers() { $queryBuilder = \OC::$server->getDatabaseConnection()->getQueryBuilder(); @@ -403,7 +395,7 @@ class Manager extends PublicEmitter implements IUserManager { /** * @param \Closure $callback - * @since 9.2.0 + * @since 11.0.0 */ public function callForSeenUsers(\Closure $callback) { $limit = 1000; diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 7215cbe4188..a45b1dcd10f 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -51,6 +51,7 @@ use OCP\IUserSession; use OCP\Security\ISecureRandom; use OCP\Session\Exceptions\SessionNotAvailableException; use OCP\Util; +use Symfony\Component\EventDispatcher\GenericEvent; /** * Class Session @@ -396,15 +397,25 @@ class Session implements IUserSession, Emitter { } } - protected function prepareUserLogin() { + protected function prepareUserLogin($firstTimeLogin) { // TODO: mock/inject/use non-static // Refresh the token \OC::$server->getCsrfTokenManager()->refreshToken(); //we need to pass the user name, which may differ from login name $user = $this->getUser()->getUID(); OC_Util::setupFS($user); - //trigger creation of user home and /files folder - \OC::$server->getUserFolder($user); + + if ($firstTimeLogin) { + // TODO: lock necessary? + //trigger creation of user home and /files folder + $userFolder = \OC::$server->getUserFolder($user); + + // copy skeleton + \OC_Util::copySkeleton($user, $userFolder); + + // trigger any other initialization + \OC::$server->getEventDispatcher()->dispatch(IUser::class . '::firstLogin', new GenericEvent($this->getUser())); + } } /** @@ -457,9 +468,10 @@ class Session implements IUserSession, Emitter { if ($user->isEnabled()) { $this->setUser($user); $this->setLoginName($uid); - $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); + $firstTimeLogin = $user->updateLastLoginTimestamp(); + $this->manager->emit('\OC\User', 'postLogin', [$user, $password]); if ($this->isLoggedIn()) { - $this->prepareUserLogin(); + $this->prepareUserLogin($firstTimeLogin); return true; } else { // injecting l10n does not work - there is a circular dependency between session and \OCP\L10N\IFactory @@ -513,10 +525,11 @@ class Session implements IUserSession, Emitter { //login $this->setUser($user); $this->setLoginName($dbToken->getLoginName()); + \OC::$server->getLockdownManager()->setToken($dbToken); $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); if ($this->isLoggedIn()) { - $this->prepareUserLogin(); + $this->prepareUserLogin(false); // token login cant be the first } else { // injecting l10n does not work - there is a circular dependency between session and \OCP\L10N\IFactory $message = \OC::$server->getL10N('lib')->t('Login canceled by app'); @@ -725,7 +738,8 @@ class Session implements IUserSession, Emitter { //login $this->setUser($user); - $this->manager->emit('\OC\User', 'postRememberedLogin', array($user)); + $user->updateLastLoginTimestamp(); + $this->manager->emit('\OC\User', 'postRememberedLogin', [$user]); return true; } diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 68787ce60f8..3cc6dc3b7ed 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -180,9 +180,12 @@ class User implements IUser { * updates the timestamp of the most recent login of this user */ public function updateLastLoginTimestamp() { + $firstTimeLogin = ($this->lastLogin === 0); $this->lastLogin = time(); - \OC::$server->getConfig()->setUserValue( + $this->config->setUserValue( $this->uid, 'login', 'lastLogin', $this->lastLogin); + + return $firstTimeLogin; } /** diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php index a89a4650c5d..0d9adfa9d2b 100644 --- a/lib/private/legacy/app.php +++ b/lib/private/legacy/app.php @@ -162,6 +162,23 @@ class OC_App { } \OC::$server->getEventLogger()->end('load_app_' . $app); } + + $info = self::getAppInfo($app); + if (!empty($info['activity']['filters'])) { + foreach ($info['activity']['filters'] as $filter) { + \OC::$server->getActivityManager()->registerFilter($filter); + } + } + if (!empty($info['activity']['settings'])) { + foreach ($info['activity']['settings'] as $setting) { + \OC::$server->getActivityManager()->registerSetting($setting); + } + } + if (!empty($info['activity']['providers'])) { + foreach ($info['activity']['providers'] as $provider) { + \OC::$server->getActivityManager()->registerProvider($provider); + } + } } /** @@ -359,11 +376,15 @@ class OC_App { $config, $l ); + $appPath = self::getAppPath($appId); + self::registerAutoloading($appId, $appPath); $installer->installApp($appId); } else { // check for required dependencies $info = self::getAppInfo($appId); self::checkAppDependencies($config, $l, $info); + $appPath = self::getAppPath($appId); + self::registerAutoloading($appId, $appPath); $installer->installApp($appId); } diff --git a/lib/private/legacy/defaults.php b/lib/private/legacy/defaults.php index 38bbaa8daa1..23590cd9235 100644 --- a/lib/private/legacy/defaults.php +++ b/lib/private/legacy/defaults.php @@ -59,7 +59,7 @@ class OC_Defaults { $this->defaultiOSClientUrl = 'https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8'; $this->defaultiTunesAppId = '1125420102'; $this->defaultAndroidClientUrl = 'https://play.google.com/store/apps/details?id=com.nextcloud.client'; - $this->defaultDocBaseUrl = 'https://docs.nextcloud.org'; + $this->defaultDocBaseUrl = 'https://docs.nextcloud.com'; $this->defaultDocVersion = '10'; // used to generate doc links $this->defaultSlogan = $this->l->t('a safe home for all your data'); $this->defaultLogoClaim = ''; diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php index 5cd92eaa415..3bd5b5586ab 100644 --- a/lib/private/legacy/util.php +++ b/lib/private/legacy/util.php @@ -66,6 +66,9 @@ class OC_Util { private static $rootMounted = false; private static $fsSetup = false; + /** @var array Local cache of version.php */ + private static $versionCache = null; + protected static function getAppManager() { return \OC::$server->getAppManager(); } @@ -98,6 +101,11 @@ class OC_Util { } // instantiate object store implementation + $name = $config['class']; + if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { + $segments = explode('\\', $name); + OC_App::loadApp(strtolower($segments[1])); + } $config['arguments']['objectstore'] = new $config['class']($config['arguments']); // mount with plain / root object store implementation $config['class'] = '\OC\Files\ObjectStore\ObjectStoreStorage'; @@ -392,7 +400,7 @@ class OC_Util { */ public static function getVersion() { OC_Util::loadVersion(); - return \OC::$server->getSession()->get('OC_Version'); + return self::$versionCache['OC_Version']; } /** @@ -402,7 +410,7 @@ class OC_Util { */ public static function getVersionString() { OC_Util::loadVersion(); - return \OC::$server->getSession()->get('OC_VersionString'); + return self::$versionCache['OC_VersionString']; } /** @@ -419,7 +427,13 @@ class OC_Util { */ public static function getChannel() { OC_Util::loadVersion(); - return \OC::$server->getSession()->get('OC_Channel'); + + // Allow overriding update channel + if (\OC::$server->getSystemConfig()->getValue('installed', false)) { + self::$versionCache['OC_Channel'] = \OC::$server->getAppConfig()->getValue('core', 'OC_Channel'); + } + + return self::$versionCache['OC_Channel']; } /** @@ -428,42 +442,30 @@ class OC_Util { */ public static function getBuild() { OC_Util::loadVersion(); - return \OC::$server->getSession()->get('OC_Build'); + return self::$versionCache['OC_Build']; } /** * @description load the version.php into the session as cache */ private static function loadVersion() { - $timestamp = filemtime(OC::$SERVERROOT . '/version.php'); - if (!\OC::$server->getSession()->exists('OC_Version') or OC::$server->getSession()->get('OC_Version_Timestamp') != $timestamp) { - require OC::$SERVERROOT . '/version.php'; - $session = \OC::$server->getSession(); - /** @var $timestamp int */ - $session->set('OC_Version_Timestamp', $timestamp); - /** @var $OC_Version string */ - $session->set('OC_Version', $OC_Version); - /** @var $OC_VersionString string */ - $session->set('OC_VersionString', $OC_VersionString); - /** @var $OC_Build string */ - $session->set('OC_Build', $OC_Build); - - // Allow overriding update channel - - if (\OC::$server->getSystemConfig()->getValue('installed', false)) { - $channel = \OC::$server->getAppConfig()->getValue('core', 'OC_Channel'); - } else { - /** @var $OC_Channel string */ - $channel = $OC_Channel; - } - - if (!is_null($channel)) { - $session->set('OC_Channel', $channel); - } else { - /** @var $OC_Channel string */ - $session->set('OC_Channel', $OC_Channel); - } + if (self::$versionCache !== null) { + return; } + + $timestamp = filemtime(OC::$SERVERROOT . '/version.php'); + require OC::$SERVERROOT . '/version.php'; + /** @var $timestamp int */ + self::$versionCache['OC_Version_Timestamp'] = $timestamp; + /** @var $OC_Version string */ + self::$versionCache['OC_Version'] = $OC_Version; + /** @var $OC_VersionString string */ + self::$versionCache['OC_VersionString'] = $OC_VersionString; + /** @var $OC_Build string */ + self::$versionCache['OC_Build'] = $OC_Build; + + /** @var $OC_Channel string */ + self::$versionCache['OC_Channel'] = $OC_Channel; } /** diff --git a/lib/public/Activity/IEvent.php b/lib/public/Activity/IEvent.php index 0d4966e617e..a12ba8642a1 100644 --- a/lib/public/Activity/IEvent.php +++ b/lib/public/Activity/IEvent.php @@ -41,6 +41,7 @@ interface IEvent { * * @param string $app * @return IEvent + * @throws \InvalidArgumentException if the app id is invalid * @since 8.2.0 */ public function setApp($app); @@ -50,6 +51,7 @@ interface IEvent { * * @param string $type * @return IEvent + * @throws \InvalidArgumentException if the type is invalid * @since 8.2.0 */ public function setType($type); @@ -59,6 +61,7 @@ interface IEvent { * * @param string $user * @return IEvent + * @throws \InvalidArgumentException if the affected user is invalid * @since 8.2.0 */ public function setAffectedUser($user); @@ -68,6 +71,7 @@ interface IEvent { * * @param string $author * @return IEvent + * @throws \InvalidArgumentException if the author is invalid * @since 8.2.0 */ public function setAuthor($author); @@ -77,6 +81,7 @@ interface IEvent { * * @param int $timestamp * @return IEvent + * @throws \InvalidArgumentException if the timestamp is invalid * @since 8.2.0 */ public function setTimestamp($timestamp); @@ -87,27 +92,100 @@ interface IEvent { * @param string $subject * @param array $parameters * @return IEvent + * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 8.2.0 */ public function setSubject($subject, array $parameters = []); /** + * @param string $subject + * @return $this + * @throws \InvalidArgumentException if the subject is invalid + * @since 11.0.0 + */ + public function setParsedSubject($subject); + + /** + * @return string + * @since 11.0.0 + */ + public function getParsedSubject(); + + /** + * @param string $subject + * @param array $parameters + * @return $this + * @throws \InvalidArgumentException if the subject or parameters are invalid + * @since 11.0.0 + */ + public function setRichSubject($subject, array $parameters = []); + + /** + * @return string + * @since 11.0.0 + */ + public function getRichSubject(); + + /** + * @return array[] + * @since 11.0.0 + */ + public function getRichSubjectParameters(); + + /** * Set the message of the activity * * @param string $message * @param array $parameters * @return IEvent + * @throws \InvalidArgumentException if the message or parameters are invalid * @since 8.2.0 */ public function setMessage($message, array $parameters = []); /** + * @param string $message + * @return $this + * @throws \InvalidArgumentException if the message is invalid + * @since 11.0.0 + */ + public function setParsedMessage($message); + + /** + * @return string + * @since 11.0.0 + */ + public function getParsedMessage(); + + /** + * @param string $message + * @param array $parameters + * @return $this + * @throws \InvalidArgumentException if the message or parameters are invalid + * @since 11.0.0 + */ + public function setRichMessage($message, array $parameters = []); + + /** + * @return string + * @since 11.0.0 + */ + public function getRichMessage(); + + /** + * @return array[] + * @since 11.0.0 + */ + public function getRichMessageParameters(); + + /** * Set the object of the activity * * @param string $objectType * @param int $objectId * @param string $objectName * @return IEvent + * @throws \InvalidArgumentException if the object is invalid * @since 8.2.0 */ public function setObject($objectType, $objectId, $objectName = ''); @@ -117,6 +195,7 @@ interface IEvent { * * @param string $link * @return IEvent + * @throws \InvalidArgumentException if the link is invalid * @since 8.2.0 */ public function setLink($link); @@ -198,4 +277,42 @@ interface IEvent { * @since 8.2.0 */ public function getLink(); + + /** + * @param string $icon + * @return $this + * @throws \InvalidArgumentException if the icon is invalid + * @since 11.0.0 + */ + public function setIcon($icon); + + /** + * @return string + * @since 11.0.0 + */ + public function getIcon(); + + /** + * @param IEvent $child + * @since 11.0.0 + */ + public function setChildEvent(IEvent $child); + + /** + * @return IEvent|null + * @since 11.0.0 + */ + public function getChildEvent(); + + /** + * @return bool + * @since 11.0.0 + */ + public function isValid(); + + /** + * @return bool + * @since 11.0.0 + */ + public function isValidParsed(); } diff --git a/lib/public/Activity/IExtension.php b/lib/public/Activity/IExtension.php index aaa4c869561..3f605a47e4b 100644 --- a/lib/public/Activity/IExtension.php +++ b/lib/public/Activity/IExtension.php @@ -129,6 +129,7 @@ interface IExtension { * * @return array|false * @since 8.0.0 + * @deprecated 11.0.0 - Register an IFilter instead */ public function getNavigation(); @@ -138,6 +139,7 @@ interface IExtension { * @param string $filterValue * @return boolean * @since 8.0.0 + * @deprecated 11.0.0 - Register an IFilter instead */ public function isFilterValid($filterValue); @@ -149,6 +151,7 @@ interface IExtension { * @param string $filter * @return array|false * @since 8.0.0 + * @deprecated 11.0.0 - Register an IFilter instead */ public function filterNotificationTypes($types, $filter); @@ -161,6 +164,7 @@ interface IExtension { * @param string $filter * @return array|false * @since 8.0.0 + * @deprecated 11.0.0 - Register an IFilter instead */ public function getQueryForFilter($filter); } diff --git a/lib/public/Activity/IFilter.php b/lib/public/Activity/IFilter.php new file mode 100644 index 00000000000..e5b65a7d91f --- /dev/null +++ b/lib/public/Activity/IFilter.php @@ -0,0 +1,74 @@ +<?php +/** + * @copyright Copyright (c) 2016, ownCloud, Inc. + * + * @author Joas Schilling <coding@schilljs.com> + * @author Morris Jobke <hey@morrisjobke.de> + * @author Thomas Müller <thomas.mueller@tmit.eu> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCP\Activity; + +/** + * Interface IFilter + * + * @package OCP\Activity + * @since 11.0.0 + */ +interface IFilter { + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier(); + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName(); + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority(); + + /** + * @return string Full URL to an icon, empty string when none is given + * @since 11.0.0 + */ + public function getIcon(); + + /** + * @param string[] $types + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function filterTypes(array $types); + + /** + * @return string[] An array of allowed apps from which activities should be displayed + * @since 11.0.0 + */ + public function allowedApps(); +} + diff --git a/lib/public/Activity/IManager.php b/lib/public/Activity/IManager.php index c1476e1a2ae..2fe38ddb8d8 100644 --- a/lib/public/Activity/IManager.php +++ b/lib/public/Activity/IManager.php @@ -64,7 +64,6 @@ interface IManager { * - setSubject() * * @param IEvent $event - * @return null * @since 8.2.0 */ public function publish(IEvent $event); @@ -80,7 +79,6 @@ interface IManager { * @param string $affectedUser Recipient of the activity * @param string $type Type of the notification * @param int $priority Priority of the notification - * @return null * @since 6.0.0 * @deprecated 8.2.0 Grab an IEvent from generateEvent() instead and use the publish() method */ @@ -111,6 +109,61 @@ interface IManager { public function registerExtension(\Closure $callable); /** + * @param string $filter Class must implement OCA\Activity\IFilter + * @return void + * @since 11.0.0 + */ + public function registerFilter($filter); + + /** + * @return IFilter[] + * @since 11.0.0 + */ + public function getFilters(); + + /** + * @param string $id + * @return IFilter + * @throws \InvalidArgumentException when the filter was not found + * @since 11.0.0 + */ + public function getFilterById($id); + + /** + * @param string $setting Class must implement OCA\Activity\ISetting + * @return void + * @since 11.0.0 + */ + public function registerSetting($setting); + + /** + * @return ISetting[] + * @since 11.0.0 + */ + public function getSettings(); + + /** + * @param string $provider Class must implement OCA\Activity\IProvider + * @return void + * @since 11.0.0 + */ + public function registerProvider($provider); + + /** + * @return IProvider[] + * @since 11.0.0 + */ + public function getProviders(); + + /** + * @param string $id + * @return ISetting + * @throws \InvalidArgumentException when the setting was not found + * @since 11.0.0 + */ + public function getSettingById($id); + + /** * Will return additional notification types as specified by other apps * * @param string $languageCode @@ -120,6 +173,7 @@ interface IManager { * 'methods' => [\OCP\Activity\IExtension::METHOD_*], * ] * @since 8.0.0 - 8.2.0: Added support to allow limiting notifications to certain methods + * @deprecated 11.0.0 - Use getSettings() instead */ public function getNotificationTypes($languageCode); @@ -127,6 +181,7 @@ interface IManager { * @param string $method * @return array * @since 8.0.0 + * @deprecated 11.0.0 - Use getSettings()->isDefaulEnabled<method>() instead */ public function getDefaultTypes($method); @@ -177,9 +232,31 @@ interface IManager { */ public function getGroupParameter($activity); + + /** + * Set the user we need to use + * + * @param string|null $currentUserId + * @throws \UnexpectedValueException If the user is invalid + * @since 9.0.1 + */ + public function setCurrentUserId($currentUserId); + + /** + * Get the user we need to use + * + * Either the user is logged in, or we try to get it from the token + * + * @return string + * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique + * @since 8.1.0 + */ + public function getCurrentUserId(); + /** * @return array * @since 8.0.0 + * @deprecated 11.0.0 - Use getFilters() instead */ public function getNavigation(); @@ -187,6 +264,7 @@ interface IManager { * @param string $filterValue * @return boolean * @since 8.0.0 + * @deprecated 11.0.0 - Use getFilterById() instead */ public function isFilterValid($filterValue); @@ -195,6 +273,7 @@ interface IManager { * @param string $filter * @return array * @since 8.0.0 + * @deprecated 11.0.0 - Use getFilterById()->filterTypes() instead */ public function filterNotificationTypes($types, $filter); @@ -202,27 +281,7 @@ interface IManager { * @param string $filter * @return array * @since 8.0.0 + * @deprecated 11.0.0 - Use getFilterById() instead */ public function getQueryForFilter($filter); - - - /** - * Set the user we need to use - * - * @param string|null $currentUserId - * @throws \UnexpectedValueException If the user is invalid - * @since 9.0.1 - */ - public function setCurrentUserId($currentUserId); - - /** - * Get the user we need to use - * - * Either the user is logged in, or we try to get it from the token - * - * @return string - * @throws \UnexpectedValueException If the token is invalid, does not exist or is not unique - * @since 8.1.0 - */ - public function getCurrentUserId(); } diff --git a/lib/public/Activity/IProvider.php b/lib/public/Activity/IProvider.php new file mode 100644 index 00000000000..5b78e26f4bc --- /dev/null +++ b/lib/public/Activity/IProvider.php @@ -0,0 +1,39 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity; + +/** + * Interface IProvider + * + * @package OCP\Activity + * @since 11.0.0 + */ +interface IProvider { + /** + * @param IEvent $event + * @param IEvent|null $previousEvent + * @return IEvent + * @throws \InvalidArgumentException + * @since 11.0.0 + */ + public function parse(IEvent $event, IEvent $previousEvent = null); +} diff --git a/lib/public/Activity/ISetting.php b/lib/public/Activity/ISetting.php new file mode 100644 index 00000000000..786581bcae6 --- /dev/null +++ b/lib/public/Activity/ISetting.php @@ -0,0 +1,76 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity; + +/** + * Interface ISetting + * + * @package OCP\Activity + * @since 11.0.0 + */ +interface ISetting { + + /** + * @return string Lowercase a-z and underscore only identifier + * @since 11.0.0 + */ + public function getIdentifier(); + + /** + * @return string A translated string + * @since 11.0.0 + */ + public function getName(); + + /** + * @return int whether the filter should be rather on the top or bottom of + * the admin section. The filters are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * @since 11.0.0 + */ + public function getPriority(); + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function canChangeStream(); + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledStream(); + + /** + * @return bool True when the option can be changed for the mail + * @since 11.0.0 + */ + public function canChangeMail(); + + /** + * @return bool True when the option can be changed for the stream + * @since 11.0.0 + */ + public function isDefaultEnabledMail(); +} + diff --git a/lib/public/App/AppPathNotFoundException.php b/lib/public/App/AppPathNotFoundException.php new file mode 100644 index 00000000000..071eb2f8377 --- /dev/null +++ b/lib/public/App/AppPathNotFoundException.php @@ -0,0 +1,31 @@ +<?php +/** + * @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCP\App; + +/** + * Class AppPathNotFoundException + * + * @package OCP\App + * @since 11.0.0 + */ +class AppPathNotFoundException extends \Exception {}
\ No newline at end of file diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php index 44990b7c47c..057a964ce0a 100644 --- a/lib/public/App/IAppManager.php +++ b/lib/public/App/IAppManager.php @@ -79,6 +79,16 @@ interface IAppManager { public function disableApp($appId); /** + * Get the directory for the given app. + * + * @param string $appId + * @return string + * @since 11.0.0 + * @throws AppPathNotFoundException + */ + public function getAppPath($appId); + + /** * List all apps enabled for a user * * @param \OCP\IUser $user diff --git a/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php b/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php index ae4ceef1923..90ba47a2f3f 100644 --- a/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php +++ b/lib/public/AppFramework/Http/EmptyContentSecurityPolicy.php @@ -88,7 +88,7 @@ class EmptyContentSecurityPolicy { * * @param string $nonce * @return $this - * @since 9.2.0 + * @since 11.0.0 */ public function useJsNonce($nonce) { $this->useJsNonce = $nonce; diff --git a/lib/public/AppFramework/Http/FileDisplayResponse.php b/lib/public/AppFramework/Http/FileDisplayResponse.php index 03a6fbec2dd..ab23701f893 100644 --- a/lib/public/AppFramework/Http/FileDisplayResponse.php +++ b/lib/public/AppFramework/Http/FileDisplayResponse.php @@ -28,7 +28,7 @@ use OCP\AppFramework\Http; * Class FileDisplayResponse * * @package OCP\AppFramework\Http - * @since 9.2.0 + * @since 11.0.0 */ class FileDisplayResponse extends Response implements ICallbackResponse { @@ -41,7 +41,7 @@ class FileDisplayResponse extends Response implements ICallbackResponse { * @param \OCP\Files\File|\OCP\Files\SimpleFS\ISimpleFile $file * @param int $statusCode * @param array $headers - * @since 9.2.0 + * @since 11.0.0 */ public function __construct($file, $statusCode=Http::STATUS_OK, $headers=[]) { @@ -58,7 +58,7 @@ class FileDisplayResponse extends Response implements ICallbackResponse { /** * @param IOutput $output - * @since 9.2.0 + * @since 11.0.0 */ public function callback(IOutput $output) { if ($output->getHttpResponseCode() !== Http::STATUS_NOT_MODIFIED) { diff --git a/lib/public/AppFramework/Http/IOutput.php b/lib/public/AppFramework/Http/IOutput.php index 1544c7d6375..642bcf4170f 100644 --- a/lib/public/AppFramework/Http/IOutput.php +++ b/lib/public/AppFramework/Http/IOutput.php @@ -39,7 +39,7 @@ interface IOutput { public function setOutput($out); /** - * @param string $path + * @param string|resource $path or file handle * * @return bool false if an error occurred * @since 8.1.0 diff --git a/lib/public/AppFramework/Http/StreamResponse.php b/lib/public/AppFramework/Http/StreamResponse.php index b5852fb5620..e124bb4ccbf 100644 --- a/lib/public/AppFramework/Http/StreamResponse.php +++ b/lib/public/AppFramework/Http/StreamResponse.php @@ -37,7 +37,7 @@ class StreamResponse extends Response implements ICallbackResponse { private $filePath; /** - * @param string $filePath the path to the file which should be streamed + * @param string|resource $filePath the path to the file or a file handle which should be streamed * @since 8.1.0 */ public function __construct ($filePath) { @@ -54,7 +54,7 @@ class StreamResponse extends Response implements ICallbackResponse { public function callback (IOutput $output) { // handle caching if ($output->getHttpResponseCode() !== Http::STATUS_NOT_MODIFIED) { - if (!file_exists($this->filePath)) { + if (!(file_exists($this->filePath) || is_resource($this->filePath))) { $output->setHttpResponseCode(Http::STATUS_NOT_FOUND); } elseif ($output->setReadfile($this->filePath) === false) { $output->setHttpResponseCode(Http::STATUS_BAD_REQUEST); diff --git a/lib/public/AppFramework/OCSController.php b/lib/public/AppFramework/OCSController.php index 9b3b12e2b94..700d9ea1a22 100644 --- a/lib/public/AppFramework/OCSController.php +++ b/lib/public/AppFramework/OCSController.php @@ -76,7 +76,7 @@ abstract class OCSController extends ApiController { /** * @param int $version - * @since 9.2.0 + * @since 11.0.0 * @internal */ public function setOCSVersion($version) { diff --git a/lib/public/Comments/IComment.php b/lib/public/Comments/IComment.php index 8210d4c8c7e..f93bed13ea0 100644 --- a/lib/public/Comments/IComment.php +++ b/lib/public/Comments/IComment.php @@ -136,7 +136,7 @@ interface IComment { * returns an array containing mentions that are included in the comment * * @return array each mention provides a 'type' and an 'id', see example below - * @since 9.2.0 + * @since 11.0.0 * * The return array looks like: * [ diff --git a/lib/public/Comments/ICommentsEventHandler.php b/lib/public/Comments/ICommentsEventHandler.php index 33524199012..79b0d0d883c 100644 --- a/lib/public/Comments/ICommentsEventHandler.php +++ b/lib/public/Comments/ICommentsEventHandler.php @@ -27,13 +27,13 @@ namespace OCP\Comments; * Interface ICommentsEventHandler * * @package OCP\Comments - * @since 9.2.0 + * @since 11.0.0 */ interface ICommentsEventHandler { /** * @param CommentsEvent $event - * @since 9.2.0 + * @since 11.0.0 */ public function handle(CommentsEvent $event); } diff --git a/lib/public/Comments/ICommentsManager.php b/lib/public/Comments/ICommentsManager.php index 6a32cfd803d..b43d5e8800b 100644 --- a/lib/public/Comments/ICommentsManager.php +++ b/lib/public/Comments/ICommentsManager.php @@ -242,7 +242,7 @@ interface ICommentsManager { * to consumers of the comments infrastructure * * @param \Closure $closure - * @since 9.2.0 + * @since 11.0.0 */ public function registerEventHandler(\Closure $closure); @@ -252,7 +252,7 @@ interface ICommentsManager { * @param string $type * @param \Closure $closure * @throws \OutOfBoundsException - * @since 9.2.0 + * @since 11.0.0 * * Only one resolver shall be registered per type. Otherwise a * \OutOfBoundsException has to thrown. @@ -266,7 +266,7 @@ interface ICommentsManager { * @param string $id * @return string * @throws \OutOfBoundsException - * @since 9.2.0 + * @since 11.0.0 * * If a provided type was not registered, an \OutOfBoundsException shall * be thrown. It is upon the resolver discretion what to return of the diff --git a/lib/public/Diagnostics/IQuery.php b/lib/public/Diagnostics/IQuery.php index 0bd1a6d9685..7f26bd7f1b8 100644 --- a/lib/public/Diagnostics/IQuery.php +++ b/lib/public/Diagnostics/IQuery.php @@ -50,13 +50,13 @@ interface IQuery { /** * @return float - * @since 9.2.0 + * @since 11.0.0 */ public function getStartTime(); /** * @return array - * @since 9.2.0 + * @since 11.0.0 */ public function getStacktrace(); } diff --git a/lib/public/Files/Config/ICachedMountInfo.php b/lib/public/Files/Config/ICachedMountInfo.php index f5c5bb87ead..2df79a7d642 100644 --- a/lib/public/Files/Config/ICachedMountInfo.php +++ b/lib/public/Files/Config/ICachedMountInfo.php @@ -73,7 +73,7 @@ interface ICachedMountInfo { * Get the internal path (within the storage) of the root of the mount * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getRootInternalPath(); } diff --git a/lib/public/Files/IAppData.php b/lib/public/Files/IAppData.php index 92e54fee366..bf612996c53 100644 --- a/lib/public/Files/IAppData.php +++ b/lib/public/Files/IAppData.php @@ -28,7 +28,7 @@ use OCP\Files\SimpleFS\ISimpleRoot; * Interface IAppData * * @package OCP\Files - * @since 9.2.0 + * @since 11.0.0 * @internal This interface is experimental and might change for NC12 */ interface IAppData extends ISimpleRoot { diff --git a/lib/public/Files/SimpleFS/ISimpleFile.php b/lib/public/Files/SimpleFS/ISimpleFile.php index efd682e7855..660580ae464 100644 --- a/lib/public/Files/SimpleFS/ISimpleFile.php +++ b/lib/public/Files/SimpleFS/ISimpleFile.php @@ -28,7 +28,7 @@ use OCP\Files\NotPermittedException; * Interface ISimpleFile * * @package OCP\Files\SimpleFS - * @since 9.2.0 + * @since 11.0.0 * @internal This interface is experimental and might change for NC12 */ interface ISimpleFile { @@ -37,7 +37,7 @@ interface ISimpleFile { * Get the name * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getName(); @@ -45,7 +45,7 @@ interface ISimpleFile { * Get the size in bytes * * @return int - * @since 9.2.0 + * @since 11.0.0 */ public function getSize(); @@ -53,7 +53,7 @@ interface ISimpleFile { * Get the ETag * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getETag(); @@ -61,7 +61,7 @@ interface ISimpleFile { * Get the last modification time * * @return int - * @since 9.2.0 + * @since 11.0.0 */ public function getMTime(); @@ -69,7 +69,7 @@ interface ISimpleFile { * Get the content * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getContent(); @@ -78,7 +78,7 @@ interface ISimpleFile { * * @param string $data * @throws NotPermittedException - * @since 9.2.0 + * @since 11.0.0 */ public function putContent($data); @@ -86,7 +86,7 @@ interface ISimpleFile { * Delete the file * * @throws NotPermittedException - * @since 9.2.0 + * @since 11.0.0 */ public function delete(); @@ -94,7 +94,7 @@ interface ISimpleFile { * Get the MimeType * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getMimeType(); } diff --git a/lib/public/Files/SimpleFS/ISimpleFolder.php b/lib/public/Files/SimpleFS/ISimpleFolder.php index 406bb631159..66f80816216 100644 --- a/lib/public/Files/SimpleFS/ISimpleFolder.php +++ b/lib/public/Files/SimpleFS/ISimpleFolder.php @@ -29,7 +29,7 @@ use OCP\Files\NotPermittedException; * Interface ISimpleFolder * * @package OCP\Files\SimpleFS - * @since 9.2.0 + * @since 11.0.0 * @internal This interface is experimental and might change for NC12 */ interface ISimpleFolder { @@ -37,7 +37,7 @@ interface ISimpleFolder { * Get all the files in a folder * * @return ISimpleFile[] - * @since 9.2.0 + * @since 11.0.0 */ public function getDirectoryListing(); @@ -46,7 +46,7 @@ interface ISimpleFolder { * * @param string $name * @return bool - * @since 9.2.0 + * @since 11.0.0 */ public function fileExists($name); @@ -56,7 +56,7 @@ interface ISimpleFolder { * @param string $name * @return ISimpleFile * @throws NotFoundException - * @since 9.2.0 + * @since 11.0.0 */ public function getFile($name); @@ -66,7 +66,7 @@ interface ISimpleFolder { * @param string $name * @return ISimpleFile * @throws NotPermittedException - * @since 9.2.0 + * @since 11.0.0 */ public function newFile($name); @@ -74,7 +74,7 @@ interface ISimpleFolder { * Remove the folder and all the files in it * * @throws NotPermittedException - * @since 9.2.0 + * @since 11.0.0 */ public function delete(); @@ -82,7 +82,7 @@ interface ISimpleFolder { * Get the folder name * * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getName(); } diff --git a/lib/public/Files/SimpleFS/ISimpleRoot.php b/lib/public/Files/SimpleFS/ISimpleRoot.php index c2f9d4ff05d..3bfea656965 100644 --- a/lib/public/Files/SimpleFS/ISimpleRoot.php +++ b/lib/public/Files/SimpleFS/ISimpleRoot.php @@ -29,7 +29,7 @@ use OCP\Files\NotPermittedException; * Interface ISimpleRoot * * @package OCP\Files\SimpleFS - * @since 9.2.0 + * @since 11.0.0 * @internal This interface is experimental and might change for NC12 */ interface ISimpleRoot { @@ -40,7 +40,7 @@ interface ISimpleRoot { * @return ISimpleFolder * @throws NotFoundException * @throws \RuntimeException - * @since 9.2.0 + * @since 11.0.0 */ public function getFolder($name); @@ -50,7 +50,7 @@ interface ISimpleRoot { * @return ISimpleFolder[] * @throws NotFoundException * @throws \RuntimeException - * @since 9.2.0 + * @since 11.0.0 */ public function getDirectoryListing(); @@ -61,7 +61,7 @@ interface ISimpleRoot { * @return ISimpleFolder * @throws NotPermittedException * @throws \RuntimeException - * @since 9.2.0 + * @since 11.0.0 */ public function newFolder($name); } diff --git a/lib/public/IDBConnection.php b/lib/public/IDBConnection.php index 31706342228..efd65d55f7e 100644 --- a/lib/public/IDBConnection.php +++ b/lib/public/IDBConnection.php @@ -256,7 +256,7 @@ interface IDBConnection { * Check whether or not the current database support 4byte wide unicode * * @return bool - * @since 9.2.0 + * @since 11.0.0 */ public function supports4ByteText(); } diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php index 90f7a56b66c..a1a03fee3e1 100644 --- a/lib/public/IPreview.php +++ b/lib/public/IPreview.php @@ -104,7 +104,7 @@ interface IPreview { * @param string $mimeType To force a given mimetype for the file (files_versions needs this) * @return ISimpleFile * @throws NotFoundException - * @since 9.2.0 + * @since 11.0.0 */ public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null); diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 5220a0c65c7..1f8c23dbedf 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -148,13 +148,13 @@ interface IUserManager { * returns how many users have logged in once * * @return int - * @since 9.2.0 + * @since 11.0.0 */ public function countSeenUsers(); /** * @param \Closure $callback - * @since 9.2.0 + * @since 11.0.0 */ public function callForSeenUsers(\Closure $callback); diff --git a/lib/public/LDAP/IDeletionFlagSupport.php b/lib/public/LDAP/IDeletionFlagSupport.php index 5f7d3909195..26b90a3493d 100644 --- a/lib/public/LDAP/IDeletionFlagSupport.php +++ b/lib/public/LDAP/IDeletionFlagSupport.php @@ -26,20 +26,20 @@ namespace OCP\LDAP; * Interface IDeletionFlagSupport * * @package OCP\LDAP - * @since 9.2.0 + * @since 11.0.0 */ interface IDeletionFlagSupport { /** * Flag record for deletion. * @param string $uid user id - * @since 9.2.0 + * @since 11.0.0 */ public function flagRecord($uid); /** * Unflag record for deletion. * @param string $uid user id - * @since 9.2.0 + * @since 11.0.0 */ public function unflagRecord($uid); } diff --git a/lib/public/LDAP/ILDAPProvider.php b/lib/public/LDAP/ILDAPProvider.php index 473afb13885..3c07dfcbe8e 100644 --- a/lib/public/LDAP/ILDAPProvider.php +++ b/lib/public/LDAP/ILDAPProvider.php @@ -26,14 +26,14 @@ namespace OCP\LDAP; * Interface ILDAPProvider * * @package OCP\LDAP - * @since 9.2.0 + * @since 11.0.0 */ interface ILDAPProvider { /** * Translate a user id to LDAP DN. * @param string $uid user id * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getUserDN($uid); @@ -42,7 +42,7 @@ interface ILDAPProvider { * @param string $dn LDAP DN * @return string with the internal user name * @throws \Exception if translation was unsuccessful - * @since 9.2.0 + * @since 11.0.0 */ public function getUserName($dn); @@ -50,7 +50,7 @@ interface ILDAPProvider { * Convert a stored DN so it can be used as base parameter for LDAP queries. * @param string $dn the DN * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function DNasBaseParameter($dn); @@ -58,7 +58,7 @@ interface ILDAPProvider { * Sanitize a DN received from the LDAP server. * @param array $dn the DN in question * @return array the sanitized DN - * @since 9.2.0 + * @since 11.0.0 */ public function sanitizeDN($dn); @@ -66,7 +66,7 @@ interface ILDAPProvider { * Return a new LDAP connection resource for the specified user. * @param string $uid user id * @return resource of the LDAP connection - * @since 9.2.0 + * @since 11.0.0 */ public function getLDAPConnection($uid); @@ -75,7 +75,7 @@ interface ILDAPProvider { * @param string $uid user id * @return string the base for users * @throws \Exception if user id was not found in LDAP - * @since 9.2.0 + * @since 11.0.0 */ public function getLDAPBaseUsers($uid); @@ -84,7 +84,7 @@ interface ILDAPProvider { * @param string $uid user id * @return string the base for groups * @throws \Exception if user id was not found in LDAP - * @since 9.2.0 + * @since 11.0.0 */ public function getLDAPBaseGroups($uid); @@ -92,14 +92,14 @@ interface ILDAPProvider { * Check whether a LDAP DN exists * @param string $dn LDAP DN * @return bool whether the DN exists - * @since 9.2.0 + * @since 11.0.0 */ public function dnExists($dn); /** * Clear the cache if a cache is used, otherwise do nothing. * @param string $uid user id - * @since 9.2.0 + * @since 11.0.0 */ public function clearCache($uid); } diff --git a/lib/public/LDAP/ILDAPProviderFactory.php b/lib/public/LDAP/ILDAPProviderFactory.php index 99e7b8d27ea..74f84bff503 100644 --- a/lib/public/LDAP/ILDAPProviderFactory.php +++ b/lib/public/LDAP/ILDAPProviderFactory.php @@ -31,7 +31,7 @@ use OCP\IServerContainer; * instance. * * @package OCP\LDAP - * @since 9.2.0 + * @since 11.0.0 */ interface ILDAPProviderFactory { @@ -39,7 +39,7 @@ interface ILDAPProviderFactory { * Constructor for the LDAP provider factory * * @param IServerContainer $serverContainer server container - * @since 9.2.0 + * @since 11.0.0 */ public function __construct(IServerContainer $serverContainer); @@ -47,7 +47,7 @@ interface ILDAPProviderFactory { * creates and returns an instance of the ILDAPProvider * * @return ILDAPProvider - * @since 9.2.0 + * @since 11.0.0 */ public function getLDAPProvider(); } diff --git a/lib/public/Lockdown/ILockdownManager.php b/lib/public/Lockdown/ILockdownManager.php new file mode 100644 index 00000000000..d4d05b37ff8 --- /dev/null +++ b/lib/public/Lockdown/ILockdownManager.php @@ -0,0 +1,50 @@ +<?php + +/** + * @copyright Copyright (c) 2016, Robin Appelman <robin@icewind.nl> + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCP\Lockdown; + +use OC\Authentication\Token\IToken; + +/** + * @since 9.2 + */ +interface ILockdownManager { + /** + * Enable the lockdown restrictions + * + * @since 9.2 + */ + public function enable(); + + /** + * Set the active token to get the restrictions from and enable the lockdown + * + * @param IToken $token + * @since 9.2 + */ + public function setToken(IToken $token); + + /** + * Check whether or not filesystem access is allowed + * + * @return bool + * @since 9.2 + */ + public function canAccessFilesystem(); +} diff --git a/lib/public/Notification/INotification.php b/lib/public/Notification/INotification.php index 55109a5ee2e..8d3f15c2380 100644 --- a/lib/public/Notification/INotification.php +++ b/lib/public/Notification/INotification.php @@ -132,19 +132,19 @@ interface INotification { * @param array $parameters * @return $this * @throws \InvalidArgumentException if the subject or parameters are invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setRichSubject($subject, array $parameters = []); /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getRichSubject(); /** * @return array[] - * @since 9.2.0 + * @since 11.0.0 */ public function getRichSubjectParameters(); @@ -188,19 +188,19 @@ interface INotification { * @param array $parameters * @return $this * @throws \InvalidArgumentException if the message or parameters are invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setRichMessage($message, array $parameters = []); /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getRichMessage(); /** * @return array[] - * @since 9.2.0 + * @since 11.0.0 */ public function getRichMessageParameters(); @@ -222,13 +222,13 @@ interface INotification { * @param string $icon * @return $this * @throws \InvalidArgumentException if the icon is invalid - * @since 9.2.0 + * @since 11.0.0 */ public function setIcon($icon); /** * @return string - * @since 9.2.0 + * @since 11.0.0 */ public function getIcon(); diff --git a/lib/public/RichObjectStrings/Definitions.php b/lib/public/RichObjectStrings/Definitions.php index d3e6b15cf99..2b35f9ceed1 100644 --- a/lib/public/RichObjectStrings/Definitions.php +++ b/lib/public/RichObjectStrings/Definitions.php @@ -26,12 +26,12 @@ namespace OCP\RichObjectStrings; * Class Definitions * * @package OCP\RichObjectStrings - * @since 9.2.0 + * @since 11.0.0 */ class Definitions { /** * @var array - * @since 9.2.0 + * @since 11.0.0 */ public $definitions = [ 'addressbook' => [ @@ -284,7 +284,7 @@ class Definitions { * @param string $type * @return array * @throws InvalidObjectExeption - * @since 9.2.0 + * @since 11.0.0 */ public function getDefinition($type) { if (isset($this->definitions[$type])) { diff --git a/lib/public/RichObjectStrings/IValidator.php b/lib/public/RichObjectStrings/IValidator.php index bba098bdfc1..8d9b86cfba3 100644 --- a/lib/public/RichObjectStrings/IValidator.php +++ b/lib/public/RichObjectStrings/IValidator.php @@ -25,7 +25,7 @@ namespace OCP\RichObjectStrings; * Class Validator * * @package OCP\RichObjectStrings - * @since 9.2.0 + * @since 11.0.0 */ interface IValidator { @@ -33,7 +33,7 @@ interface IValidator { * @param string $subject * @param array[] $parameters * @throws InvalidObjectExeption - * @since 9.2.0 + * @since 11.0.0 */ public function validate($subject, array $parameters); } diff --git a/lib/public/RichObjectStrings/InvalidObjectExeption.php b/lib/public/RichObjectStrings/InvalidObjectExeption.php index 8bf597ebe90..7d6ea6bc976 100644 --- a/lib/public/RichObjectStrings/InvalidObjectExeption.php +++ b/lib/public/RichObjectStrings/InvalidObjectExeption.php @@ -25,7 +25,7 @@ namespace OCP\RichObjectStrings; * Class InvalidObjectExeption * * @package OCP\RichObjectStrings - * @since 9.2.0 + * @since 11.0.0 */ class InvalidObjectExeption extends \InvalidArgumentException { } diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php index 137dc309280..a15020bbd69 100644 --- a/lib/public/Share/IManager.php +++ b/lib/public/Share/IManager.php @@ -94,8 +94,8 @@ interface IManager { * @param string $userId * @param Folder $node * @param bool $reshares - * @return IShare[] - * @since 9.2.0 + * @return IShare[][] [$fileId => IShare[], ...] + * @since 11.0.0 */ public function getSharesInFolder($userId, Folder $node, $reshares = false); @@ -290,7 +290,7 @@ interface IManager { * Check if a given share provider exists * @param int $shareType * @return bool - * @since 9.2.0 + * @since 11.0.0 */ public function shareProviderExists($shareType); diff --git a/lib/public/Share/IProviderFactory.php b/lib/public/Share/IProviderFactory.php index 928298a7860..7227fdea1f1 100644 --- a/lib/public/Share/IProviderFactory.php +++ b/lib/public/Share/IProviderFactory.php @@ -58,7 +58,7 @@ interface IProviderFactory { /** * @return IShareProvider[] - * @since 9.2.0 + * @since 11.0.0 */ public function getAllProviders(); } diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php index 206b0e286a2..5b552b51c3c 100644 --- a/lib/public/Share/IShare.php +++ b/lib/public/Share/IShare.php @@ -22,6 +22,7 @@ namespace OCP\Share; +use OCP\Files\Cache\ICacheEntry; use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\Node; @@ -324,4 +325,20 @@ interface IShare { * @since 9.0.0 */ public function getMailSend(); + + /** + * Set the cache entry for the shared node + * + * @param ICacheEntry $entry + * @since 11.0.0 + */ + public function setNodeCacheEntry(ICacheEntry $entry); + + /** + * Get the cache entry for the shared node + * + * @return null|ICacheEntry + * @since 11.0.0 + */ + public function getNodeCacheEntry(); } diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php index 7d134583317..6257c97eb77 100644 --- a/lib/public/Share/IShareProvider.php +++ b/lib/public/Share/IShareProvider.php @@ -99,7 +99,7 @@ interface IShareProvider { * @param Folder $node * @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator * @return \OCP\Share\IShare[] - * @since 9.2.0 + * @since 11.0.0 */ public function getSharesInFolder($userId, Folder $node, $reshares); diff --git a/lib/public/Util.php b/lib/public/Util.php index 08661fd88ca..8a7c8997613 100644 --- a/lib/public/Util.php +++ b/lib/public/Util.php @@ -83,7 +83,6 @@ class Util { */ public static function setChannel($channel) { //Flush timestamp to reload version.php - \OC::$server->getSession()->set('OC_Version_Timestamp', 0); \OC::$server->getAppConfig()->setValue('core', 'OC_Channel', $channel); \OC::$server->getConfig()->setSystemValue('updater.release.channel', $channel); } diff --git a/ocs/routes.php b/ocs/routes.php index 3085cd9db65..932c4053013 100644 --- a/ocs/routes.php +++ b/ocs/routes.php @@ -29,14 +29,6 @@ use OCP\API; -// Person -API::register( - 'post', - '/person/check', - array('OC_OCS_Person', 'check'), - 'core', - API::GUEST_AUTH - ); // Privatedata API::register( 'get', diff --git a/settings/Controller/AppSettingsController.php b/settings/Controller/AppSettingsController.php index 8164dd1fcfa..b668c5cfb38 100644 --- a/settings/Controller/AppSettingsController.php +++ b/settings/Controller/AppSettingsController.php @@ -169,10 +169,10 @@ class AppSettingsController extends Controller { $nextCloudVersion = $versionParser->getVersion($app['releases'][0]['rawPlatformVersionSpec']); $nextCloudVersionDependencies = []; if($nextCloudVersion->getMinimumVersion() !== '') { - $nextCloudVersionDependencies['owncloud']['@attributes']['min-version'] = $nextCloudVersion->getMinimumVersion(); + $nextCloudVersionDependencies['nextcloud']['@attributes']['min-version'] = $nextCloudVersion->getMinimumVersion(); } if($nextCloudVersion->getMaximumVersion() !== '') { - $nextCloudVersionDependencies['owncloud']['@attributes']['max-version'] = $nextCloudVersion->getMaximumVersion(); + $nextCloudVersionDependencies['nextcloud']['@attributes']['max-version'] = $nextCloudVersion->getMaximumVersion(); } $phpVersion = $versionParser->getVersion($app['releases'][0]['rawPhpVersionSpec']); $existsLocally = (\OC_App::getAppPath($app['id']) !== false) ? true : false; @@ -331,8 +331,8 @@ class AppSettingsController extends Controller { $app['canInstall'] = empty($missing); $app['missingDependencies'] = $missing; - $app['missingMinOwnCloudVersion'] = !isset($app['dependencies']['owncloud']['@attributes']['min-version']); - $app['missingMaxOwnCloudVersion'] = !isset($app['dependencies']['owncloud']['@attributes']['max-version']); + $app['missingMinOwnCloudVersion'] = !isset($app['dependencies']['nextcloud']['@attributes']['min-version']); + $app['missingMaxOwnCloudVersion'] = !isset($app['dependencies']['nextcloud']['@attributes']['max-version']); return $app; }, $apps); diff --git a/settings/Controller/AuthSettingsController.php b/settings/Controller/AuthSettingsController.php index 58994f0d59c..57192e119a9 100644 --- a/settings/Controller/AuthSettingsController.php +++ b/settings/Controller/AuthSettingsController.php @@ -111,7 +111,9 @@ class AuthSettingsController extends Controller { /** * @NoAdminRequired * @NoSubadminRequired + * @PasswordConfirmationRequired * + * @param string $name * @return JSONResponse */ public function create($name) { @@ -135,12 +137,14 @@ class AuthSettingsController extends Controller { $token = $this->generateRandomDeviceToken(); $deviceToken = $this->tokenProvider->generateToken($token, $this->uid, $loginName, $password, $name, IToken::PERMANENT_TOKEN); + $tokenData = $deviceToken->jsonSerialize(); + $tokenData['canDelete'] = true; - return [ + return new JSONResponse([ 'token' => $token, 'loginName' => $loginName, - 'deviceToken' => $deviceToken - ]; + 'deviceToken' => $tokenData, + ]); } private function getServiceNotAvailableResponse() { @@ -180,4 +184,19 @@ class AuthSettingsController extends Controller { return []; } + /** + * @NoAdminRequired + * @NoSubadminRequired + * + * @param int $id + * @param array $scope + */ + public function update($id, array $scope) { + $token = $this->tokenProvider->getTokenById($id); + $token->setScope([ + 'filesystem' => $scope['filesystem'] + ]); + $this->tokenProvider->updateToken($token); + return []; + } } diff --git a/settings/Controller/ChangePasswordController.php b/settings/Controller/ChangePasswordController.php index e43d0d8f343..832cdbefdbe 100644 --- a/settings/Controller/ChangePasswordController.php +++ b/settings/Controller/ChangePasswordController.php @@ -131,6 +131,7 @@ class ChangePasswordController extends Controller { /** * @NoAdminRequired + * @PasswordConfirmationRequired * * @param string $username * @param string $password diff --git a/settings/Controller/GroupsController.php b/settings/Controller/GroupsController.php index feed45b118e..8985a76ec95 100644 --- a/settings/Controller/GroupsController.php +++ b/settings/Controller/GroupsController.php @@ -95,6 +95,7 @@ class GroupsController extends Controller { } /** + * @PasswordConfirmationRequired * @param string $id * @return DataResponse */ @@ -128,6 +129,7 @@ class GroupsController extends Controller { } /** + * @PasswordConfirmationRequired * @param string $id * @return DataResponse */ diff --git a/settings/Controller/MailSettingsController.php b/settings/Controller/MailSettingsController.php index 84423aa8e29..108ac3f393a 100644 --- a/settings/Controller/MailSettingsController.php +++ b/settings/Controller/MailSettingsController.php @@ -73,6 +73,9 @@ class MailSettingsController extends Controller { /** * Sets the email settings + * + * @PasswordConfirmationRequired + * * @param string $mail_domain * @param string $mail_from_address * @param string $mail_smtpmode @@ -116,6 +119,9 @@ class MailSettingsController extends Controller { /** * Store the credentials used for SMTP in the config + * + * @PasswordConfirmationRequired + * * @param string $mail_smtpname * @param string $mail_smtppassword * @return array diff --git a/settings/Controller/UsersController.php b/settings/Controller/UsersController.php index fde29de3598..89831a66aba 100644 --- a/settings/Controller/UsersController.php +++ b/settings/Controller/UsersController.php @@ -301,6 +301,7 @@ class UsersController extends Controller { /** * @NoAdminRequired + * @PasswordConfirmationRequired * * @param string $username * @param string $password @@ -433,6 +434,7 @@ class UsersController extends Controller { /** * @NoAdminRequired + * @PasswordConfirmationRequired * * @param string $id * @return DataResponse @@ -495,6 +497,7 @@ class UsersController extends Controller { * * @NoAdminRequired * @NoSubadminRequired + * @PasswordConfirmationRequired * * @param string $id * @param string $mailAddress @@ -615,6 +618,7 @@ class UsersController extends Controller { * * @NoAdminRequired * @NoSubadminRequired + * @PasswordConfirmationRequired * * @param string $username * @param string $displayName diff --git a/settings/ajax/setquota.php b/settings/ajax/setquota.php index eee1de407b9..0906102ec20 100644 --- a/settings/ajax/setquota.php +++ b/settings/ajax/setquota.php @@ -32,6 +32,13 @@ OC_JSON::checkSubAdminUser(); OCP\JSON::callCheck(); +$lastConfirm = (int) \OC::$server->getSession()->get('last-password-confirm'); +if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay + $l = \OC::$server->getL10N('core'); + OC_JSON::error(array( 'data' => array( 'message' => $l->t('Password confirmation is required')))); + exit(); +} + $username = isset($_POST["username"]) ? (string)$_POST["username"] : ''; $isUserAccessible = false; diff --git a/settings/ajax/togglegroups.php b/settings/ajax/togglegroups.php index ff79861b811..b9958bef0c9 100644 --- a/settings/ajax/togglegroups.php +++ b/settings/ajax/togglegroups.php @@ -28,6 +28,13 @@ OC_JSON::checkSubAdminUser(); OCP\JSON::callCheck(); +$lastConfirm = (int) \OC::$server->getSession()->get('last-password-confirm'); +if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay + $l = \OC::$server->getL10N('core'); + OC_JSON::error(array( 'data' => array( 'message' => $l->t('Password confirmation is required')))); + exit(); +} + $success = true; $username = (string)$_POST['username']; $group = (string)$_POST['group']; diff --git a/settings/ajax/togglesubadmins.php b/settings/ajax/togglesubadmins.php index 390e5c09ef3..5658a382410 100644 --- a/settings/ajax/togglesubadmins.php +++ b/settings/ajax/togglesubadmins.php @@ -24,6 +24,13 @@ OC_JSON::checkAdminUser(); OCP\JSON::callCheck(); +$lastConfirm = (int) \OC::$server->getSession()->get('last-password-confirm'); +if ($lastConfirm < (time() - 30 * 60 + 15)) { // allow 15 seconds delay + $l = \OC::$server->getL10N('core'); + OC_JSON::error(array( 'data' => array( 'message' => $l->t('Password confirmation is required')))); + exit(); +} + $username = (string)$_POST['username']; $group = (string)$_POST['group']; diff --git a/settings/css/settings.css b/settings/css/settings.css index 7d139a632d0..9008ba5a985 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -149,6 +149,13 @@ table.nostyle td { padding: 0.2em 0; } padding: 10px 10px 10px 0; } +#sessions .token-list td.more, +#apppasswords .token-list td.more { + overflow: visible; + position: relative; + width: 16px; +} + #sessions .token-list td, #apppasswords .token-list td { border-top: 1px solid #DDD; @@ -156,18 +163,60 @@ table.nostyle td { padding: 0.2em 0; } max-width: 200px; white-space: nowrap; overflow: hidden; + vertical-align: top; + 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-delete, -#apppasswords .token-list td a.icon-delete { +#sessions .token-list td > a.icon, +#apppasswords .token-list td > a.icon { + opacity: 0; + transition: opacity 0.5s; +} + +#sessions .token-list a.icon, +#apppasswords .token-list a.icon { + margin-top: 4px; display: block; +} + +#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{ opacity: 0.6; } +#sessions .token-list td div.configure, +#apppasswords .token-list td div.configure { + display: none; +} + +#sessions .token-list tr.active div.configure, +#apppasswords .token-list tr.active div.configure { + display: block; + position: absolute; + top: 45px; + right: -5px; + padding: 10px; +} + +#sessions .token-list tr.active div.configure > *, +#apppasswords .token-list tr.active div.configure > *{ + margin-top: 5px; + margin-bottom: 5px; + display: inline-block; +} + +#sessions .token-list tr.active a.icon-delete, +#apppasswords .token-list tr.active a.icon-delete { + background-position: left; + padding-left: 20px; +} + #new-app-login-name, #new-app-password { width: 186px; @@ -193,7 +242,7 @@ table.nostyle td { padding: 0.2em 0; } } .social-button { - padding-left: 0; + padding-left: 0 !important; margin-left: -10px } .social-button img { diff --git a/settings/js/admin.js b/settings/js/admin.js index 7c2b507280f..094b12b2bab 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -172,21 +172,48 @@ $(document).ready(function(){ } }); - $('#mail_general_settings_form').change(function(){ + var changeEmailSettings = function() { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(changeEmailSettings); + return; + } + OC.msg.startSaving('#mail_settings_msg'); - var post = $( "#mail_general_settings_form" ).serialize(); - $.post(OC.generateUrl('/settings/admin/mailsettings'), post, function(data){ - OC.msg.finishedSaving('#mail_settings_msg', data); + $.ajax({ + url: OC.generateUrl('/settings/admin/mailsettings'), + type: 'POST', + data: $('#mail_general_settings_form').serialize(), + success: function(data){ + OC.msg.finishedSaving('#mail_settings_msg', data); + }, + error: function(data){ + OC.msg.finishedError('#mail_settings_msg', data.responseJSON.message); + } }); - }); + }; + + var toggleEmailCredentials = function() { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(toggleEmailCredentials); + return; + } - $('#mail_credentials_settings_submit').click(function(){ OC.msg.startSaving('#mail_settings_msg'); - var post = $( "#mail_credentials_settings" ).serialize(); - $.post(OC.generateUrl('/settings/admin/mailsettings/credentials'), post, function(data){ - OC.msg.finishedSaving('#mail_settings_msg', data); + $.ajax({ + url: OC.generateUrl('/settings/admin/mailsettings/credentials'), + type: 'POST', + data: $('#mail_credentials_settings').serialize(), + success: function(data){ + OC.msg.finishedSaving('#mail_settings_msg', data); + }, + error: function(data){ + OC.msg.finishedError('#mail_settings_msg', data.responseJSON.message); + } }); - }); + }; + + $('#mail_general_settings_form').change(changeEmailSettings); + $('#mail_credentials_settings_submit').click(toggleEmailCredentials); $('#sendtestemail').click(function(event){ event.preventDefault(); diff --git a/settings/js/apps.js b/settings/js/apps.js index 654756af531..451becc67a0 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -189,6 +189,8 @@ OC.Settings.Apps = OC.Settings.Apps || { } }); app.author = authors.join(', '); + } else if (typeof app.author !== 'string') { + app.author = app.author['@value']; } var html = template(app); @@ -539,8 +541,8 @@ OC.Settings.Apps = OC.Settings.Apps || { // Author Name apps = apps.concat(_.filter(OC.Settings.Apps.State.apps, function (app) { + var authors = []; if (_.isArray(app.author)) { - var authors = []; _.each(app.author, function (author) { if (typeof author === 'string') { authors.push(author); @@ -555,6 +557,15 @@ OC.Settings.Apps = OC.Settings.Apps || { } }); return OC.Settings.Apps._search(authors.join(' '), query); + } else if (typeof app.author !== 'string') { + authors.push(app.author['@value']); + if (!_.isUndefined(app.author['@attributes']['homepage'])) { + authors.push(app.author['@attributes']['homepage']); + } + if (!_.isUndefined(app.author['@attributes']['mail'])) { + authors.push(app.author['@attributes']['mail']); + } + return OC.Settings.Apps._search(authors.join(' '), query); } return OC.Settings.Apps._search(app.author, query); })); diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js index 6eb04b63f20..24593a04f53 100644 --- a/settings/js/authtoken_view.js +++ b/settings/js/authtoken_view.js @@ -27,13 +27,22 @@ var TEMPLATE_TOKEN = '<tr data-id="{{id}}">' - + '<td class="has-tooltip" title="{{title}}"><span class="token-name">{{name}}</span></td>' + + '<td class="has-tooltip" title="{{title}}">' + + '<span class="token-name">{{name}}</span>' + + '</td>' + '<td><span class="last-activity has-tooltip" title="{{lastActivityTime}}">{{lastActivity}}</span></td>' + + '<td class="more">' + + '{{#if showMore}}<a class="icon icon-more"/>{{/if}}' + + '<div class="popovermenu bubble open menu configure">' + + '{{#if canScope}}' + + '<input class="filesystem checkbox" type="checkbox" id="{{id}}_filesystem" {{#if scope.filesystem}}checked{{/if}}/>' + + '<label for="{{id}}_filesystem">' + t('core', 'Allow filesystem access') + '</label><br/>' + + '{{/if}}' + '{{#if canDelete}}' - + '<td><a class="icon-delete has-tooltip" title="' + t('core', 'Disconnect') + '"></a></td>' - + '{{else}}' - + '<td></td>' + + '<a class="icon icon-delete has-tooltip" title="' + t('core', 'Disconnect') + '">' + t('core', 'Revoke') +'</a>' + '{{/if}}' + + '</div>' + + '</td>' + '<tr>'; var SubView = OC.Backbone.View.extend({ @@ -70,7 +79,7 @@ var list = this.$('.token-list'); var tokens = this.collection.filter(function (token) { - return parseInt(token.get('type'), 10) === _this.type; + return token.get('type') === _this.type; }); list.html(''); @@ -78,7 +87,7 @@ this._toggleHeader(tokens.length > 0); tokens.forEach(function (token) { - var viewData = this._formatViewData(token.toJSON()); + var viewData = this._formatViewData(token); var html = _this.template(viewData); var $html = $(html); $html.find('.has-tooltip').tooltip({container: 'body'}); @@ -94,10 +103,13 @@ this.$('.hidden-when-empty').toggleClass('hidden', !show); }, - _formatViewData: function (viewData) { + _formatViewData: function (token) { + var viewData = token.toJSON(); var ts = viewData.lastActivity * 1000; viewData.lastActivity = OC.Util.relativeModifiedDate(ts); viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL'); + viewData.canScope = token.get('type') === 1; + viewData.showMore = viewData.canScope || viewData.canDelete; // preserve title for cases where we format it further viewData.title = viewData.name; @@ -106,7 +118,7 @@ var matches = viewData.name.match(/Mozilla\/5\.0 \((\w+)\) (?:mirall|csyncoC)\/(\d+\.\d+\.\d+)/); var userAgentMap = { - ie: /(?:MSIE|Trident) (\d+)/, + ie: /(?:MSIE|Trident|Trident\/7.0; rv)[ :](\d+)/, // Microsoft Edge User Agent from https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx edge: /^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Chrome\/[0-9.]+ (?:Mobile Safari|Safari)\/[0-9.]+ Edge\/[0-9.]+$/, // Firefox User Agent from https://developer.mozilla.org/en-US/docs/Web/HTTP/Gecko_user_agent_string_reference @@ -204,6 +216,8 @@ var $el = $(el); $el.on('click', 'a.icon-delete', _.bind(_this._onDeleteToken, _this)); + $el.on('click', '.icon-more', _.bind(_this._onConfigureToken, _this)); + $el.on('change', 'input.filesystem', _.bind(_this._onSetTokenScope, _this)); }); this._form = $('#app-password-form'); @@ -219,14 +233,21 @@ this._hideAppPasswordBtn = $('#app-password-hide'); this._hideAppPasswordBtn.click(_.bind(this._hideToken, this)); + this._result.find('.clipboardButton').tooltip({placement: 'bottom', title: t('core', 'Copy'), trigger: 'hover'}); + // Clipboard! var clipboard = new Clipboard('.clipboardButton'); clipboard.on('success', function(e) { var $input = $(e.trigger); - $input.tooltip({placement: 'bottom', trigger: 'manual', title: t('core', 'Copied!')}); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copied!')) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function() { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); clipboard.on('error', function (e) { @@ -240,14 +261,15 @@ actionMsg = t('core', 'Press Ctrl-C to copy.'); } - $input.tooltip({ - placement: 'bottom', - trigger: 'manual', - title: actionMsg - }); - $input.tooltip('show'); + $input.tooltip('hide') + .attr('data-original-title', actionMsg) + .tooltip('fixTitle') + .tooltip({placement: 'bottom', trigger: 'manual'}) + .tooltip('show'); _.delay(function () { - $input.tooltip('hide'); + $input.tooltip('hide') + .attr('data-original-title', t('core', 'Copy')) + .tooltip('fixTitle'); }, 3000); }); }, @@ -277,6 +299,11 @@ }, _addAppPassword: function () { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this._addAppPassword, this)); + return; + } + var _this = this; this._toggleAddingToken(true); @@ -325,6 +352,13 @@ this._addAppPasswordBtn.toggleClass('icon-loading-small', state); }, + _onConfigureToken: function (event) { + var $target = $(event.target); + var $row = $target.closest('tr'); + $row.toggleClass('active'); + var id = $row.data('id'); + }, + _onDeleteToken: function (event) { var $target = $(event.target); var $row = $target.closest('tr'); @@ -353,6 +387,24 @@ }); }, + _onSetTokenScope: function (event) { + var $target = $(event.target); + var $row = $target.closest('tr'); + var id = $row.data('id'); + + var token = this.collection.get(id); + if (_.isUndefined(token)) { + // Ignore event + return; + } + + var scope = token.get('scope'); + scope.filesystem = $target.is(":checked"); + + token.set('scope', scope); + token.save(); + }, + _toggleFormResult: function (showForm) { if (showForm) { this._result.slideUp(); diff --git a/settings/js/personal.js b/settings/js/personal.js index aef67f719c0..c2cb437bd13 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -65,7 +65,7 @@ function changeEmailAddress () { // for failure the first parameter is the result object OC.msg.finishedSaving('#lostpassword .msg', result); }).fail(function(result){ - OC.msg.finishedSaving('#lostpassword .msg', result.responseJSON); + OC.msg.finishedError('#lostpassword .msg', result.responseJSON.message); }); } diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js index 8f4d95432a8..cfe01c17530 100644 --- a/settings/js/users/groups.js +++ b/settings/js/users/groups.js @@ -128,6 +128,11 @@ GroupList = { }, createGroup: function (groupname) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.createGroup, this, groupname)); + return; + } + $.post( OC.generateUrl('/settings/users/groups'), { @@ -278,10 +283,16 @@ GroupList = { GroupList.show); //when to mark user for delete - $userGroupList.on('click', '.delete', function () { + var deleteAction = function () { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(deleteAction, this)); + return; + } + // Call function for handling delete/undo GroupDeleteHandler.mark(GroupList.getElementGID(this)); - }); + }; + $userGroupList.on('click', '.delete', deleteAction); //delete a marked user when leaving the page $(window).on('beforeunload', function () { diff --git a/settings/js/users/users.js b/settings/js/users/users.js index 3a357c0e9c4..7e70d98f091 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -353,6 +353,14 @@ var UserList = { $userListBody.on('click', '.delete', function () { // Call function for handling delete/undo var uid = UserList.getUID(this); + + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(function() { + UserDeleteHandler.mark(uid); + }); + return; + } + UserDeleteHandler.mark(uid); }); @@ -405,6 +413,11 @@ var UserList = { }, applyGroupSelect: function (element, user, checked) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.applySubadminSelect, this, element, user, checked)); + return; + } + var $element = $(element); var checkHandler = null; @@ -467,6 +480,11 @@ var UserList = { }, applySubadminSelect: function (element, user, checked) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this.applySubadminSelect, this, element, user, checked)); + return; + } + var $element = $(element); var checkHandler = function (group) { if (group === 'admin') { @@ -478,7 +496,10 @@ var UserList = { username: user, group: group }, - function () { + function (response) { + if (response.data.message) { + OC.Notification.show(response.data.message); + } } ); }; @@ -518,7 +539,7 @@ var UserList = { OC.Notification.showTemporary(t('core', 'Invalid quota value "{val}"', {val: quota})); return; } - UserList._updateQuota(uid, quota, function(returnedQuota){ + UserList._updateQuota(uid, quota, function(returnedQuota) { if (quota !== returnedQuota) { $select.find(':selected').text(returnedQuota); } @@ -532,12 +553,21 @@ var UserList = { * @param {Function} ready callback after save */ _updateQuota: function(uid, quota, ready) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(_.bind(this._updateQuota, this, uid, quota, ready)); + return; + } + $.post( OC.filePath('settings', 'ajax', 'setquota.php'), {username: uid, quota: quota}, function (result) { - if (ready) { - ready(result.data.quota); + if (result.status === 'error') { + OC.Notification.showTemporary(result.data.message); + } else { + if (ready) { + ready(result.data.quota); + } } } ); @@ -635,6 +665,28 @@ $(document).ready(function () { // TODO: move other init calls inside of initialize UserList.initialize($('#userlist')); + var _submitPasswordChange = function(uid, password, recoveryPasswordVal, blurFunction) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(function() { + _submitPasswordChange(uid, password, recoveryPasswordVal, blurFunction); + }); + return; + } + + $.post( + OC.generateUrl('/settings/users/changepassword'), + {username: uid, password: password, recoveryPassword: recoveryPasswordVal}, + function (result) { + blurFunction(); + if (result.status === 'success') { + OC.Notification.showTemporary(t('admin', 'Password successfully changed')); + } else { + OC.Notification.showTemporary(t('admin', result.data.message)); + } + } + ).fail(blurFunction); + }; + $userListBody.on('click', '.password', function (event) { event.stopPropagation(); @@ -643,6 +695,12 @@ $(document).ready(function () { var uid = UserList.getUID($td); var $input = $('<input type="password">'); var isRestoreDisabled = UserList.getRestoreDisabled($td) === true; + var blurFunction = function () { + $(this).replaceWith($('<span>●●●●●●●</span>')); + $td.find('img').show(); + // remove highlight class from users without recovery ability + $tr.removeClass('row-warning'); + }; if(isRestoreDisabled) { $tr.addClass('row-warning'); // add tipsy if the password change could cause data loss - no recovery enabled @@ -657,34 +715,51 @@ $(document).ready(function () { if (event.keyCode === 13) { if ($(this).val().length > 0) { var recoveryPasswordVal = $('input:password[id="recoveryPassword"]').val(); - $.post( - OC.generateUrl('/settings/users/changepassword'), - {username: uid, password: $(this).val(), recoveryPassword: recoveryPasswordVal}, - function (result) { - if (result.status === 'success') { - OC.Notification.showTemporary(t('admin', 'Password successfully changed')); - } else { - OC.Notification.showTemporary(t('admin', result.data.message)); - } - } - ); - $input.blur(); + $input.off('blur'); + _submitPasswordChange(uid, $(this).val(), recoveryPasswordVal, blurFunction); } else { $input.blur(); } } }) - .blur(function () { - $(this).replaceWith($('<span>●●●●●●●</span>')); - $td.find('img').show(); - // remove highlight class from users without recovery ability - $tr.removeClass('row-warning'); - }); + .blur(blurFunction); }); $('input:password[id="recoveryPassword"]').keyup(function() { OC.Notification.hide(); }); + var _submitDisplayNameChange = function($tr, uid, displayName, blurFunction) { + var $div = $tr.find('div.avatardiv'); + if ($div.length) { + $div.imageplaceholder(uid, displayName); + } + + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(function() { + _submitDisplayNameChange($tr, uid, displayName, blurFunction); + }); + return; + } + + $.ajax({ + type: 'POST', + url: OC.generateUrl('/settings/users/{id}/displayName', {id: uid}), + data: { + username: uid, + displayName: displayName + } + }).success(function (result) { + if (result && result.status==='success' && $div.length){ + $div.avatar(result.data.username, 32); + } + $tr.data('displayname', displayName); + blurFunction(); + }).fail(function (result) { + OC.Notification.showTemporary(result.responseJSON.message); + $tr.find('.displayName input').blur(blurFunction); + }); + }; + $userListBody.on('click', '.displayName', function (event) { event.stopPropagation(); var $td = $(this).closest('td'); @@ -692,6 +767,11 @@ $(document).ready(function () { var uid = UserList.getUID($td); var displayName = escapeHTML(UserList.getDisplayName($td)); var $input = $('<input type="text" value="' + displayName + '">'); + var blurFunction = function() { + var displayName = $tr.data('displayname'); + $input.replaceWith('<span>' + escapeHTML(displayName) + '</span>'); + $td.find('img').show(); + }; $td.find('img').hide(); $td.children('span').replaceWith($input); $input @@ -699,34 +779,53 @@ $(document).ready(function () { .keypress(function (event) { if (event.keyCode === 13) { if ($(this).val().length > 0) { - var $div = $tr.find('div.avatardiv'); - if ($div.length) { - $div.imageplaceholder(uid, displayName); - } - $.post( - OC.generateUrl('/settings/users/{id}/displayName', {id: uid}), - {username: uid, displayName: $(this).val()}, - function (result) { - if (result && result.status==='success' && $div.length){ - $div.avatar(result.data.username, 32); - } - } - ); - var displayName = $input.val(); - $tr.data('displayname', displayName); - $input.blur(); + $input.off('blur'); + _submitDisplayNameChange($tr, uid, $(this).val(), blurFunction); } else { $input.blur(); } } }) - .blur(function () { - var displayName = $tr.data('displayname'); - $input.replaceWith('<span>' + escapeHTML(displayName) + '</span>'); - $td.find('img').show(); - }); + .blur(blurFunction); }); + var _submitEmailChange = function($tr, $td, $input, uid, mailAddress, blurFunction) { + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(function() { + _submitEmailChange($tr, $td, $input, uid, mailAddress, blurFunction); + }); + return; + } + + $.ajax({ + type: 'PUT', + url: OC.generateUrl('/settings/users/{id}/mailAddress', {id: uid}), + data: { + mailAddress: mailAddress + } + }).success(function () { + // set data attribute to new value + // will in blur() be used to show the text instead of the input field + $tr.data('mailAddress', mailAddress); + $td.find('.loading-small').css('display', ''); + $input.removeAttr('disabled') + .triggerHandler('blur'); // needed instead of $input.blur() for Firefox + blurFunction(); + }).fail(function (result) { + if (!_.isUndefined(result.responseJSON.data)) { + OC.Notification.showTemporary(result.responseJSON.data.message); + } else if (!_.isUndefined(result.responseJSON.message)) { + OC.Notification.showTemporary(result.responseJSON.message); + } else { + OC.Notification.showTemporary(t('settings', 'Could not change the users email')); + } + $td.find('.loading-small').css('display', ''); + $input.removeAttr('disabled') + .css('padding-right', '6px'); + $input.blur(blurFunction); + }); + }; + $userListBody.on('click', '.mailAddress', function (event) { event.stopPropagation(); var $td = $(this).closest('td'); @@ -734,6 +833,15 @@ $(document).ready(function () { var uid = UserList.getUID($td); var mailAddress = escapeHTML(UserList.getMailAddress($td)); var $input = $('<input type="text">').val(mailAddress); + var blurFunction = function() { + if($td.find('.loading-small').css('display') === 'inline-block') { + // in Chrome the blur event is fired too early by the browser - even if the request is still running + return; + } + var $span = $('<span>').text($tr.data('mailAddress')); + $input.replaceWith($span); + $td.find('img').show(); + }; $td.children('span').replaceWith($input); $td.find('img').hide(); $input @@ -742,40 +850,14 @@ $(document).ready(function () { if (event.keyCode === 13) { // enter key - var mailAddress = $input.val(); $td.find('.loading-small').css('display', 'inline-block'); $input.css('padding-right', '26px'); $input.attr('disabled', 'disabled'); - $.ajax({ - type: 'PUT', - url: OC.generateUrl('/settings/users/{id}/mailAddress', {id: uid}), - data: { - mailAddress: $(this).val() - } - }).success(function () { - // set data attribute to new value - // will in blur() be used to show the text instead of the input field - $tr.data('mailAddress', mailAddress); - $td.find('.loading-small').css('display', ''); - $input.removeAttr('disabled') - .triggerHandler('blur'); // needed instead of $input.blur() for Firefox - }).fail(function (result) { - OC.Notification.showTemporary(result.responseJSON.data.message); - $td.find('.loading-small').css('display', ''); - $input.removeAttr('disabled') - .css('padding-right', '6px'); - }); + $input.off('blur'); + _submitEmailChange($tr, $td, $input, uid, $(this).val(), blurFunction); } }) - .blur(function () { - if($td.find('.loading-small').css('display') === 'inline-block') { - // in Chrome the blur event is fired too early by the browser - even if the request is still running - return; - } - var $span = $('<span>').text($tr.data('mailAddress')); - $input.replaceWith($span); - $td.find('img').show(); - }); + .blur(blurFunction); }); $('#newuser .groupsListContainer').on('click', function (event) { @@ -796,8 +878,15 @@ $(document).ready(function () { }); UserList._updateGroupListLabel($('#newuser .groups'), []); - $('#newuser').submit(function (event) { + var _submitNewUserForm = function (event) { event.preventDefault(); + if (OC.PasswordConfirmation.requiresPasswordConfirmation()) { + OC.PasswordConfirmation.requirePasswordConfirmation(function() { + _submitNewUserForm(event); + }); + return; + } + var username = $('#newusername').val(); var password = $('#newuserpassword').val(); var email = $('#newemail').val(); @@ -866,7 +955,8 @@ $(document).ready(function () { $('#newuser').get(0).reset(); }); }); - }); + }; + $('#newuser').submit(_submitNewUserForm); if ($('#CheckboxStorageLocation').is(':checked')) { $("#userlist .storageLocation").show(); @@ -874,11 +964,17 @@ $(document).ready(function () { // Option to display/hide the "Storage location" column $('#CheckboxStorageLocation').click(function() { if ($('#CheckboxStorageLocation').is(':checked')) { - $("#userlist .storageLocation").show(); - OCP.AppConfig.setValue('core', 'umgmt_show_storage_location', 'true'); + OCP.AppConfig.setValue('core', 'umgmt_show_storage_location', 'true', { + success: function () { + $("#userlist .storageLocation").show(); + } + }); } else { - $("#userlist .storageLocation").hide(); - OCP.AppConfig.setValue('core', 'umgmt_show_storage_location', 'false'); + OCP.AppConfig.setValue('core', 'umgmt_show_storage_location', 'false', { + success: function () { + $("#userlist .storageLocation").hide(); + } + }); } }); diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 4405e194dd0..099f1c24334 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -75,7 +75,9 @@ OC.L10N.register( "Approved" : "Potvrzeno", "Experimental" : "Experimentální", "No apps found for {query}" : "Nebyly nalezeny žádné aplikace pro {query}", + "Allow filesystem access" : "Povolit přístup k souborovému systému", "Disconnect" : "Odpojit", + "Revoke" : "Odvolat", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -87,6 +89,7 @@ OC.L10N.register( "Android Client" : "Android klient", "Sync client - {os}" : "Sync klient - {os}", "This session" : "Toto sezení", + "Copy" : "Zkopírovat", "Copied!" : "Zkopírováno!", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", @@ -284,7 +287,7 @@ OC.L10N.register( "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", "iOS app" : "iOS aplikace", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Chcete-li projekt podpořit\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">připojte se k vývoji</a>\n\t\tnebo\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">šiřte informace dál</a>!", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Pokud chcete podpořit projekt {contributeopen}připojte se k jeho vývoji{linkclose} nebo {contributeopen}šiřte osvětu{linkclose}!", "Show First Run Wizard again" : "Znovu zobrazit průvodce prvním spuštěním", "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví a mobilní klienti aktuálně přihlášeni k vašemu účtu.", "Device" : "Přístroj", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 70a3c8d7dab..ed7def27560 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -73,7 +73,9 @@ "Approved" : "Potvrzeno", "Experimental" : "Experimentální", "No apps found for {query}" : "Nebyly nalezeny žádné aplikace pro {query}", + "Allow filesystem access" : "Povolit přístup k souborovému systému", "Disconnect" : "Odpojit", + "Revoke" : "Odvolat", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -85,6 +87,7 @@ "Android Client" : "Android klient", "Sync client - {os}" : "Sync klient - {os}", "This session" : "Toto sezení", + "Copy" : "Zkopírovat", "Copied!" : "Zkopírováno!", "Not supported!" : "Nepodporováno!", "Press ⌘-C to copy." : "Zmáčknout ⌘-C pro kopírování.", @@ -282,7 +285,7 @@ "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", "iOS app" : "iOS aplikace", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Chcete-li projekt podpořit\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">připojte se k vývoji</a>\n\t\tnebo\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">šiřte informace dál</a>!", + "If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!" : "Pokud chcete podpořit projekt {contributeopen}připojte se k jeho vývoji{linkclose} nebo {contributeopen}šiřte osvětu{linkclose}!", "Show First Run Wizard again" : "Znovu zobrazit průvodce prvním spuštěním", "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví a mobilní klienti aktuálně přihlášeni k vašemu účtu.", "Device" : "Přístroj", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 030f1fdb629..f632bbc3fd6 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -284,7 +284,6 @@ OC.L10N.register( "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn du das Projekt unterstützen möchtest\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">hilf uns bei der Weiterentwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">empfehle es weiter</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Deinem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", @@ -297,7 +296,7 @@ OC.L10N.register( "For security reasons this password will only be shown once." : "Aus Sicherheitsgründen wird das Passwort nur einmal angezeigt.", "Username" : "Benutzername", "Done" : "Erledigt", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index d087e7eb4d6..95c0e7a87d2 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -282,7 +282,6 @@ "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn du das Projekt unterstützen möchtest\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">hilf uns bei der Weiterentwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">empfehle es weiter</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Deinem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", @@ -295,7 +294,7 @@ "For security reasons this password will only be shown once." : "Aus Sicherheitsgründen wird das Passwort nur einmal angezeigt.", "Username" : "Benutzername", "Done" : "Erledigt", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index d7b4c0f9915..2f3ae6cf1f2 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -55,7 +55,7 @@ OC.L10N.register( "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", "Update to %s" : "Aktualisierung auf %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Sie haben %n Aktualisierungen verfügbar"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Es sind %n App-Aktualisierungen für Sie verfügbar"], "Please wait...." : "Bitte warten…", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", @@ -284,7 +284,6 @@ OC.L10N.register( "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">helfen Sie bei der Weiterentwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">empfehlen Sie es weiter</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Ihrem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", @@ -297,7 +296,7 @@ OC.L10N.register( "For security reasons this password will only be shown once." : "Aus Sicherheitsgründen wird das Passwort nur einmal angezeigt.", "Username" : "Benutzername", "Done" : "Erledigt", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", "Follow us on Google Plus!" : "Folgen Sie uns zu Google Plus!", "Like our facebook page!" : "Liken Sie uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonnieren Sie unseren Twitter-Kanal!", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 65bce573338..17da0f5a26d 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -53,7 +53,7 @@ "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.", "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.", "Update to %s" : "Aktualisierung auf %s", - "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Sie haben %n Aktualisierungen verfügbar"], + "_You have %n app update pending_::_You have %n app updates pending_" : ["Sie haben %n Aktualisierung verfügbar","Es sind %n App-Aktualisierungen für Sie verfügbar"], "Please wait...." : "Bitte warten…", "Error while disabling app" : "Beim Deaktivieren der App ist ein Fehler aufgetreten", "Disable" : "Deaktivieren", @@ -282,7 +282,6 @@ "Desktop client" : "Desktop-Client", "Android app" : "Android-App", "iOS app" : "iOS-App", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Wenn Sie das Projekt unterstützen möchten\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">helfen Sie bei der Weiterentwicklung</a>\n⇥⇥oder\n⇥⇥<a href=\"https://nextcloud.com/contribute\"\n⇥⇥⇥target=\"_blank\" rel=\"noreferrer\">empfehlen Sie es weiter</a>!", "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Ihrem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", @@ -295,7 +294,7 @@ "For security reasons this password will only be shown once." : "Aus Sicherheitsgründen wird das Passwort nur einmal angezeigt.", "Username" : "Benutzername", "Done" : "Erledigt", - "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", "Follow us on Google Plus!" : "Folgen Sie uns zu Google Plus!", "Like our facebook page!" : "Liken Sie uns auf unserer Facebook-Seite!", "Subscribe to our twitter channel!" : "Abonnieren Sie unseren Twitter-Kanal!", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 9020dd45a38..a4da07a7c1b 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -129,6 +129,8 @@ OC.L10N.register( "Login" : "Iniciar sesión", "Plain" : "Plano", "NT LAN Manager" : "Gestor de NT LAN", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correo electrónico", "Open documentation" : "Abrir Documentación", "This is used for sending out notifications." : "Esto se usa para enviar notificaciones.", @@ -296,6 +298,7 @@ OC.L10N.register( "Create" : "Crear", "Admin Recovery Password" : "Recuperación de la contraseña de administración", "Enter the recovery password in order to recover the users files during password change" : "Introduzca la contraseña de recuperación a fin de recuperar los archivos de los usuarios durante el cambio de contraseña.", + "Group name" : "Nombre del grupo", "Everyone" : "Todos", "Admins" : "Administradores", "Default quota" : "Cuota predeterminada", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 4702ff617b3..62356143655 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -127,6 +127,8 @@ "Login" : "Iniciar sesión", "Plain" : "Plano", "NT LAN Manager" : "Gestor de NT LAN", + "SSL/TLS" : "SSL/TLS", + "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correo electrónico", "Open documentation" : "Abrir Documentación", "This is used for sending out notifications." : "Esto se usa para enviar notificaciones.", @@ -294,6 +296,7 @@ "Create" : "Crear", "Admin Recovery Password" : "Recuperación de la contraseña de administración", "Enter the recovery password in order to recover the users files during password change" : "Introduzca la contraseña de recuperación a fin de recuperar los archivos de los usuarios durante el cambio de contraseña.", + "Group name" : "Nombre del grupo", "Everyone" : "Todos", "Admins" : "Administradores", "Default quota" : "Cuota predeterminada", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index f10ea7b5c73..6bcf3493d6d 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -198,6 +198,8 @@ OC.L10N.register( "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", + "The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Version" : "Version", "Sharing" : "Partage", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", @@ -217,6 +219,8 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)", "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.", "Tips & tricks" : "Trucs et astuces", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.", + "This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.", "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>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>.", "How to do backups" : "Comment faire des sauvegardes", "Advanced monitoring" : "Surveillance avancée", @@ -252,6 +256,7 @@ OC.L10N.register( "Administrator documentation" : "Documentation administrateur", "Online documentation" : "Documentation en ligne", "Forum" : "Forum", + "Getting help" : "Obtenir de l'aide", "Commercial support" : "Support commercial", "You are using <strong>%s</strong> of <strong>%s</strong>" : "Vous utilisez <strong>%s</strong> sur <strong>%s<strong>", "Profile picture" : "Photo de profil", @@ -279,7 +284,6 @@ OC.L10N.register( "Desktop client" : "Client de bureau", "Android app" : "Application Android", "iOS app" : "Application iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Si vous voulez supporter le projet\n<a href=\"https://nextcloud.com/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">rejoindre le développement</a>\nou\n<a href=\"https://nextcloud.com/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">promouvoir</a> !", "Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion", "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", "Device" : "Périphérique", @@ -307,6 +311,7 @@ OC.L10N.register( "Create" : "Créer", "Admin Recovery Password" : "Mot de passe Administrateur de récupération", "Enter the recovery password in order to recover the users files during password change" : "Entrez le mot de passe de récupération pour récupérer les fichiers utilisateurs pendant le changement de mot de passe", + "Group name" : "Nom de groupe", "Everyone" : "Tout le monde", "Admins" : "Administrateurs", "Default quota" : "Quota par défaut", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 7d57a03d4a3..53fb86e8bee 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -196,6 +196,8 @@ "Execute one task with each page loaded" : "Exécute une tâche à chaque chargement de page", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", + "The cron.php needs to be executed by the system user \"%s\"." : "Le cron.php doit être exécuté par l'utilisateur système \"%s\".", + "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Pour l'executer, vous devez avoir l'extension PHP posix. Regarder la {linkstart}documentation PHP{linkend} pour plus de détails.", "Version" : "Version", "Sharing" : "Partage", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", @@ -215,6 +217,8 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Afficher les conditions d'utilisation sur la page publique de téléversement. (Visible seulement quand la liste des fichiers est masquée.)", "This text will be shown on the public link upload page when the file list is hidden." : "Ce texte sera visible sur la page publique de téléversement quand la liste des fichiers est masquée.", "Tips & tricks" : "Trucs et astuces", + "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite est actuellement utilisé comme système de gestion de base de données. Pour des installations plus volumineuses, nous vous recommandons de migrer vers un autre système de gestion de base de données.", + "This is particularly recommended when using the desktop client for file synchronisation." : "C'est particulièrement recommandé lorsque l'on utilise un client bureau pour la synchronisation des fichiers.", "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>." : "Pour migrer vers un autre type de base de données, utilisez la ligne de commande : 'occ db:convert-type' ou consultez la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>.", "How to do backups" : "Comment faire des sauvegardes", "Advanced monitoring" : "Surveillance avancée", @@ -250,6 +254,7 @@ "Administrator documentation" : "Documentation administrateur", "Online documentation" : "Documentation en ligne", "Forum" : "Forum", + "Getting help" : "Obtenir de l'aide", "Commercial support" : "Support commercial", "You are using <strong>%s</strong> of <strong>%s</strong>" : "Vous utilisez <strong>%s</strong> sur <strong>%s<strong>", "Profile picture" : "Photo de profil", @@ -277,7 +282,6 @@ "Desktop client" : "Client de bureau", "Android app" : "Application Android", "iOS app" : "Application iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Si vous voulez supporter le projet\n<a href=\"https://nextcloud.com/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">rejoindre le développement</a>\nou\n<a href=\"https://nextcloud.com/contribute\"\ntarget=\"_blank\" rel=\"noreferrer\">promouvoir</a> !", "Show First Run Wizard again" : "Revoir la fenêtre d'accueil affichée lors de votre première connexion", "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", "Device" : "Périphérique", @@ -305,6 +309,7 @@ "Create" : "Créer", "Admin Recovery Password" : "Mot de passe Administrateur de récupération", "Enter the recovery password in order to recover the users files during password change" : "Entrez le mot de passe de récupération pour récupérer les fichiers utilisateurs pendant le changement de mot de passe", + "Group name" : "Nom de groupe", "Everyone" : "Tout le monde", "Admins" : "Administrateurs", "Default quota" : "Quota par défaut", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 0efe84d8c46..9d5a660881a 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -284,7 +284,6 @@ OC.L10N.register( "Desktop client" : "Asztali kliens", "Android app" : "Android alkalmazás", "iOS app" : "IOS alkalmazás", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ha támogatni szeretnéd a projektet \n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">csatlakozz a fejlesztéshez</a>\n\t\tvagy\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">hírdesd</a>!", "Show First Run Wizard again" : "Jelenítsd meg újra az Első indíráskori varázslót!", "Web, desktop and mobile clients currently logged in to your account." : "A fiókodba jelenleg bejelentkezett web, asztali és mobil kliensek.", "Device" : "Eszköz", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index eb4ff7863a5..801716207a8 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -282,7 +282,6 @@ "Desktop client" : "Asztali kliens", "Android app" : "Android alkalmazás", "iOS app" : "IOS alkalmazás", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ha támogatni szeretnéd a projektet \n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">csatlakozz a fejlesztéshez</a>\n\t\tvagy\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">hírdesd</a>!", "Show First Run Wizard again" : "Jelenítsd meg újra az Első indíráskori varázslót!", "Web, desktop and mobile clients currently logged in to your account." : "A fiókodba jelenleg bejelentkezett web, asztali és mobil kliensek.", "Device" : "Eszköz", diff --git a/settings/l10n/is.js b/settings/l10n/is.js index a85fc71dac5..b05025b8687 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -270,7 +270,6 @@ OC.L10N.register( "Desktop client" : "Skjáborðsforrit", "Android app" : "Android-forrit", "iOS app" : "iOS-forrit", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ef þú vilt styðja við verkefnið\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">taktu þátt í þróuninni</a>\n\t\teða\n\t\t<a href=\"https://nextcloud.com/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">láttu orð út ganga</a>!", "Show First Run Wizard again" : "Birta Fyrsta-skiptis-leiðarvísinn aftur", "Web, desktop and mobile clients currently logged in to your account." : "Veftól, tölvur og símar sem núna eru skráð inn á aðganginn þinn.", "Device" : "Tæki", diff --git a/settings/l10n/is.json b/settings/l10n/is.json index 0bfa735b96f..633ca851507 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -268,7 +268,6 @@ "Desktop client" : "Skjáborðsforrit", "Android app" : "Android-forrit", "iOS app" : "iOS-forrit", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ef þú vilt styðja við verkefnið\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">taktu þátt í þróuninni</a>\n\t\teða\n\t\t<a href=\"https://nextcloud.com/promote\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">láttu orð út ganga</a>!", "Show First Run Wizard again" : "Birta Fyrsta-skiptis-leiðarvísinn aftur", "Web, desktop and mobile clients currently logged in to your account." : "Veftól, tölvur og símar sem núna eru skráð inn á aðganginn þinn.", "Device" : "Tæki", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 811255a8565..c3207d84e4e 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -284,7 +284,6 @@ OC.L10N.register( "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", "iOS app" : "Applicazione iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se desideri supportare il progetto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">contribuisci allo sviluppo</a>\n\t\to\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">diffondi il verbo</a>!", "Show First Run Wizard again" : "Mostra nuovamente la procedura di primo avvio", "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index b94ca58298f..daa9560ccce 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -282,7 +282,6 @@ "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", "iOS app" : "Applicazione iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se desideri supportare il progetto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">contribuisci allo sviluppo</a>\n\t\to\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">diffondi il verbo</a>!", "Show First Run Wizard again" : "Mostra nuovamente la procedura di primo avvio", "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index a7e09072a93..ef298c80449 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -280,7 +280,6 @@ OC.L10N.register( "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", "iOS app" : "iOS-app", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Hvis du vil støtte prosjektet \n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">delta i utviklingen</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spre ordet</a>!", "Show First Run Wizard again" : "Vis \"Førstegangs veiviser\" på nytt", "Web, desktop and mobile clients currently logged in to your account." : "Følgende nett, skrivebord og mobile klienter er for øyeblikket logget på din konto.", "Device" : "Enhet", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 81cced8c08d..98f0ae6d1c2 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -278,7 +278,6 @@ "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", "iOS app" : "iOS-app", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Hvis du vil støtte prosjektet \n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">delta i utviklingen</a>\n\t\t<or></or>\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spre ordet</a>!", "Show First Run Wizard again" : "Vis \"Førstegangs veiviser\" på nytt", "Web, desktop and mobile clients currently logged in to your account." : "Følgende nett, skrivebord og mobile klienter er for øyeblikket logget på din konto.", "Device" : "Enhet", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 719cd823c25..5df12eaa96b 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -76,6 +76,7 @@ OC.L10N.register( "Experimental" : "Experimenteel", "No apps found for {query}" : "Geen apps gevonden voor {query}", "Disconnect" : "Verbreek verbinding", + "Revoke" : "Intrekken", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -87,6 +88,7 @@ OC.L10N.register( "Android Client" : "Android Client", "Sync client - {os}" : "Sync client - {os}", "This session" : "Deze sessie", + "Copy" : "Kopiëren", "Copied!" : "Gekopieerd!", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", @@ -283,7 +285,6 @@ OC.L10N.register( "Desktop client" : "Desktop client", "Android app" : "Android app", "iOS app" : "iOS app", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ondersteun het project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">ontwikkel het mee</a>\n\t\tof\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">verkondig het woord</a>!", "Show First Run Wizard again" : "Toon de Eerste start Wizard opnieuw", "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 820c6669f23..b6a532e97ee 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -74,6 +74,7 @@ "Experimental" : "Experimenteel", "No apps found for {query}" : "Geen apps gevonden voor {query}", "Disconnect" : "Verbreek verbinding", + "Revoke" : "Intrekken", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", @@ -85,6 +86,7 @@ "Android Client" : "Android Client", "Sync client - {os}" : "Sync client - {os}", "This session" : "Deze sessie", + "Copy" : "Kopiëren", "Copied!" : "Gekopieerd!", "Not supported!" : "Niet ondersteund!", "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", @@ -281,7 +283,6 @@ "Desktop client" : "Desktop client", "Android app" : "Android app", "iOS app" : "iOS app", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Ondersteun het project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">ontwikkel het mee</a>\n\t\tof\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">verkondig het woord</a>!", "Show First Run Wizard again" : "Toon de Eerste start Wizard opnieuw", "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 301d5760366..1951a0330bb 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -276,7 +276,6 @@ OC.L10N.register( "Desktop client" : "Cliente Desktop", "Android app" : "App Android", "iOS app" : "App iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se quiser dar suporte ao projeto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">junte-se ao desenvolvimento</a>\n\t\tou\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">espalhe pelo mundo</a>!", "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 estão conectados à sua conta.", "Device" : "Dispositivo", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 2df3966fb9f..6f3176721ba 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -274,7 +274,6 @@ "Desktop client" : "Cliente Desktop", "Android app" : "App Android", "iOS app" : "App iOS", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Se quiser dar suporte ao projeto\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">junte-se ao desenvolvimento</a>\n\t\tou\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">espalhe pelo mundo</a>!", "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 estão conectados à sua conta.", "Device" : "Dispositivo", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 54925be8cb8..1b44f4a6dbf 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -277,7 +277,6 @@ OC.L10N.register( "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если вы хотите поддержать проект,\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединяйтесь к разработке</a>\n\t\tили\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", "Show First Run Wizard again" : "Показать помощник настройки снова", "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index aa729b30141..632431894a7 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -275,7 +275,6 @@ "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", "iOS app" : "iOS приложение", - "If you want to support the project\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">join development</a>\n\t\tor\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">spread the word</a>!" : "Если вы хотите поддержать проект,\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">присоединяйтесь к разработке</a>\n\t\tили\n\t\t<a href=\"https://nextcloud.com/contribute\"\n\t\t\ttarget=\"_blank\" rel=\"noreferrer\">расскажите о нас</a>!", "Show First Run Wizard again" : "Показать помощник настройки снова", "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", diff --git a/settings/templates/admin/server.development.notice.php b/settings/templates/admin/server.development.notice.php new file mode 100644 index 00000000000..f58258fc0ae --- /dev/null +++ b/settings/templates/admin/server.development.notice.php @@ -0,0 +1,3 @@ +<div class="section"> + <p><?php include(__DIR__ . '/../settings.development.notice.php'); ?></p> +</div> diff --git a/settings/templates/admin/server.php b/settings/templates/admin/server.php index 430ca6ac8e2..d87fa81729f 100644 --- a/settings/templates/admin/server.php +++ b/settings/templates/admin/server.php @@ -224,5 +224,4 @@ <!-- should be the last part, so Updater can follow if enabled (it has no heading therefore). --> <h2><?php p($l->t('Version'));?></h2> <p><a href="<?php print_unescaped($theme->getBaseUrl()); ?>" rel="noreferrer" target="_blank"><?php p($theme->getTitle()); ?></a> <?php p(OC_Util::getHumanVersion()) ?></p> - <p><?php include(__DIR__ . '/../settings.development.notice.php'); ?></p> </div> diff --git a/settings/templates/apps.php b/settings/templates/apps.php index 36064f0981c..3753fd67a0c 100644 --- a/settings/templates/apps.php +++ b/settings/templates/apps.php @@ -147,11 +147,6 @@ script( <ul id="apps-categories"> </ul> - <div id="app-settings"> - <div id="app-settings-header"> - <button class="settings-button" data-apps-slide-toggle="#app-settings-content"></button> - </div> - </div> </div> <div id="app-content"> <svg height="0"> diff --git a/settings/templates/personal.php b/settings/templates/personal.php index ea1c7ba6459..8f34d7b87b8 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -65,7 +65,7 @@ if($_['displayNameChangeSupported']) { <h2> <label for="displayName"><?php echo $l->t('Full name');?></label> </h2> - <input type="text" id="displayName" name="displayName" + <input type="text" id="displayName" name="displayName" class="password-confirm-required" value="<?php p($_['displayName'])?>" autocomplete="on" autocapitalize="off" autocorrect="off" /> <span class="msg"></span> @@ -91,6 +91,7 @@ if($_['displayNameChangeSupported']) { </h2> <input type="email" name="email" id="email" value="<?php p($_['email']); ?>" placeholder="<?php p($l->t('Your email address'));?>" + class="password-confirm-required" autocomplete="on" autocapitalize="off" autocorrect="off" /> <span class="msg"></span><br /> <em><?php p($l->t('For password recovery and notifications'));?></em> @@ -182,12 +183,16 @@ if($_['passwordChangeSupported']) { </a> <p> - <?php print_unescaped($l->t('If you want to support the project - <a href="https://nextcloud.com/contribute" - target="_blank" rel="noreferrer">join development</a> - or - <a href="https://nextcloud.com/contribute" - target="_blank" rel="noreferrer">spread the word</a>!'));?> + <?php print_unescaped(str_replace( + [ + '{contributeopen}', + '{linkclose}', + ], + [ + '<a href="https://nextcloud.com/contribute" target="_blank" rel="noreferrer">', + '</a>', + ], + $l->t('If you want to support the project {contributeopen}join development{linkclose} or {contributeopen}spread the word{linkclose}!'))); ?> </p> <?php if(OC_APP::isEnabled('firstrunwizard')) {?> diff --git a/settings/tests/js/appsSpec.js b/settings/tests/js/appsSpec.js index d2ca1fb5c8b..aa785a6768e 100644 --- a/settings/tests/js/appsSpec.js +++ b/settings/tests/js/appsSpec.js @@ -185,26 +185,32 @@ describe('OC.Settings.Apps tests', function() { { id: 'foo', name: 'Foo app', - level: 0 + level: 0, + author: 'foo' }, { id: 'alpha', name: 'Alpha app', - level: 300 + level: 300, + author: ['alpha', 'beta'] }, { id: 'nolevel', - name: 'No level' + name: 'No level', + author: 'bar' }, { id: 'zork', name: 'Some famous adventure game', - level: 200 + level: 200, + author: 'baz' + }, { id: 'delta', name: 'Mathematical symbol', - level: 200 + level: 200, + author: 'foobar' } ] }) @@ -217,26 +223,31 @@ describe('OC.Settings.Apps tests', function() { 'foo': { id: 'foo', name: 'Foo app', - level: 0 + level: 0, + author: 'foo' }, 'alpha': { id: 'alpha', name: 'Alpha app', - level: 300 + level: 300, + author: ['alpha', 'beta'] }, 'nolevel': { id: 'nolevel', - name: 'No level' + name: 'No level', + author: 'bar' }, 'zork': { id: 'zork', name: 'Some famous adventure game', - level: 200 + level: 200, + author: 'baz', }, 'delta': { id: 'delta', name: 'Mathematical symbol', - level: 200 + level: 200, + author: 'foobar' } }); }); diff --git a/tests/Core/Controller/OCSControllerTest.php b/tests/Core/Controller/OCSControllerTest.php new file mode 100644 index 00000000000..38356483c95 --- /dev/null +++ b/tests/Core/Controller/OCSControllerTest.php @@ -0,0 +1,209 @@ +<?php +/** + * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OC\Core\Controller; + +use OC\CapabilitiesManager; +use OC\Security\Bruteforce\Throttler; +use OCP\AppFramework\Http\DataResponse; +use OCP\IRequest; +use OCP\IUser; +use OCP\IUserManager; +use OCP\IUserSession; +use Test\TestCase; + +class OCSControllerTest extends TestCase { + + /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ + private $request; + + /** @var CapabilitiesManager|\PHPUnit_Framework_MockObject_MockObject */ + private $capabilitiesManager; + + /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ + private $userSession; + + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + private $userManager; + + /** @var Throttler|\PHPUnit_Framework_MockObject_MockObject */ + private $throttler; + + /** @var OCSController */ + private $controller; + + public function setUp() { + parent::setUp(); + + $this->request = $this->createMock(IRequest::class); + $this->capabilitiesManager = $this->createMock(CapabilitiesManager::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->userManager = $this->createMock(IUserManager::class); + $this->throttler = $this->createMock(Throttler::class); + + $this->controller = new OCSController( + 'core', + $this->request, + $this->capabilitiesManager, + $this->userSession, + $this->userManager, + $this->throttler + ); + } + + public function testGetConfig() { + $this->request->method('getServerHost') + ->willReturn('awesomehost.io'); + + $data = [ + 'version' => '1.7', + 'website' => 'Nextcloud', + 'host' => 'awesomehost.io', + 'contact' => '', + 'ssl' => 'false', + ]; + + $expected = new DataResponse($data); + $this->assertEquals($expected, $this->controller->getConfig()); + + return new DataResponse($data); + } + + public function testGetCapabilities() { + list($major, $minor, $micro) = \OCP\Util::getVersion(); + + $result = []; + $result['version'] = array( + 'major' => $major, + 'minor' => $minor, + 'micro' => $micro, + 'string' => \OC_Util::getVersionString(), + 'edition' => '', + ); + + $capabilities = [ + 'foo' => 'bar', + 'a' => [ + 'b' => true, + 'c' => 11, + ] + ]; + $this->capabilitiesManager->method('getCapabilities') + ->willReturn($capabilities); + + $result['capabilities'] = $capabilities; + + $expected = new DataResponse($result); + $this->assertEquals($expected, $this->controller->getCapabilities()); + } + + public function testGetCurrentUser() { + $user = $this->createMock(IUser::class); + $user->method('getUID')->willReturn('uid'); + $user->method('getDisplayName')->willReturn('displayName'); + $user->method('getEMailAddress')->willReturn('e@mail.com'); + + + $this->userSession->method('getUser') + ->willReturn($user); + + $expected = new DataResponse([ + 'id' => 'uid', + 'display-name' => 'displayName', + 'email' => 'e@mail.com', + ]); + $this->assertEquals($expected, $this->controller->getCurrentUser()); + } + + public function testPersonCheckValid() { + $this->request->method('getRemoteAddress') + ->willReturn('1.2.3.4'); + + $this->throttler->expects($this->once()) + ->method('sleepDelay') + ->with('1.2.3.4'); + + $this->throttler->expects($this->never()) + ->method('registerAttempt'); + + $this->userManager->method('checkPassword') + ->with( + $this->equalTo('user'), + $this->equalTo('pass') + )->willReturn($this->createMock(IUser::class)); + + $expected = new DataResponse([ + 'person' => [ + 'personid' => 'user' + ] + ]); + + $this->assertEquals($expected, $this->controller->personCheck('user', 'pass')); + } + + public function testPersonInvalid() { + $this->request->method('getRemoteAddress') + ->willReturn('1.2.3.4'); + + $this->throttler->expects($this->once()) + ->method('sleepDelay') + ->with('1.2.3.4'); + + $this->throttler->expects($this->once()) + ->method('registerAttempt') + ->with( + $this->equalTo('login'), + $this->equalTo('1.2.3.4') + ); + + $this->userManager->method('checkPassword') + ->with( + $this->equalTo('user'), + $this->equalTo('wrongpass') + )->willReturn(false); + + $expected = new DataResponse(null, 102); + + $this->assertEquals($expected, $this->controller->personCheck('user', 'wrongpass')); + } + + public function testPersonNoLogin() { + $this->request->method('getRemoteAddress') + ->willReturn('1.2.3.4'); + + $this->throttler->expects($this->never()) + ->method('sleepDelay'); + + $this->throttler->expects($this->never()) + ->method('registerAttempt'); + + $this->userManager->method('checkPassword') + ->with( + $this->equalTo('user'), + $this->equalTo('wrongpass') + )->willReturn(false); + + $expected = new DataResponse(null, 101); + + $this->assertEquals($expected, $this->controller->personCheck('', '')); + } +} diff --git a/tests/Settings/Controller/AuthSettingsControllerTest.php b/tests/Settings/Controller/AuthSettingsControllerTest.php index 9cb49e4eb3f..7f4277acd73 100644 --- a/tests/Settings/Controller/AuthSettingsControllerTest.php +++ b/tests/Settings/Controller/AuthSettingsControllerTest.php @@ -42,6 +42,7 @@ class AuthSettingsControllerTest extends TestCase { /** @var AuthSettingsController */ private $controller; private $request; + /** @var IProvider|\PHPUnit_Framework_MockObject_MockObject */ private $tokenProvider; private $userManager; private $session; @@ -94,17 +95,19 @@ class AuthSettingsControllerTest extends TestCase { [ 'id' => 100, 'name' => null, - 'lastActivity' => null, - 'type' => null, + 'lastActivity' => 0, + 'type' => 0, 'canDelete' => false, 'current' => true, + 'scope' => ['filesystem' => true] ], [ 'id' => 200, 'name' => null, - 'lastActivity' => null, - 'type' => null, + 'lastActivity' => 0, + 'type' => 0, 'canDelete' => true, + 'scope' => ['filesystem' => true] ] ], $this->controller->index()); } @@ -141,12 +144,18 @@ class AuthSettingsControllerTest extends TestCase { ->with($newToken, $this->uid, 'User13', $password, $name, IToken::PERMANENT_TOKEN) ->will($this->returnValue($deviceToken)); + $deviceToken->expects($this->once()) + ->method('jsonSerialize') + ->will($this->returnValue(['dummy' => 'dummy', 'canDelete' => true])); + $expected = [ 'token' => $newToken, - 'deviceToken' => $deviceToken, + 'deviceToken' => ['dummy' => 'dummy', 'canDelete' => true], 'loginName' => 'User13', ]; - $this->assertEquals($expected, $this->controller->create($name)); + $response = $this->controller->create($name); + $this->assertInstanceOf(JSONResponse::class, $response); + $this->assertEquals($expected, $response->getData()); } public function testCreateSessionNotAvailable() { @@ -194,4 +203,25 @@ class AuthSettingsControllerTest extends TestCase { $this->assertEquals([], $this->controller->destroy($id)); } + public function testUpdateToken() { + $token = $this->createMock(DefaultToken::class); + + $this->tokenProvider->expects($this->once()) + ->method('getTokenById') + ->with($this->equalTo(42)) + ->willReturn($token); + + $token->expects($this->once()) + ->method('setScope') + ->with($this->equalTo([ + 'filesystem' => true + ])); + + $this->tokenProvider->expects($this->once()) + ->method('updateToken') + ->with($this->equalTo($token)); + + $this->assertSame([], $this->controller->update(42, ['filesystem' => true])); + } + } diff --git a/tests/data/app/expected-info.json b/tests/data/app/expected-info.json index fb596f296da..646f22bea85 100644 --- a/tests/data/app/expected-info.json +++ b/tests/data/app/expected-info.json @@ -77,5 +77,10 @@ }, "background-jobs": [], "two-factor-providers": [], - "commands": [] + "commands": [], + "activity": { + "filters": [], + "settings": [], + "providers": [] + } } diff --git a/tests/data/testapp.0.8.tar.gz b/tests/data/testapp.0.8.tar.gz Binary files differnew file mode 100644 index 00000000000..ec283b5773f --- /dev/null +++ b/tests/data/testapp.0.8.tar.gz diff --git a/tests/lib/Activity/ManagerTest.php b/tests/lib/Activity/ManagerTest.php index cf855dd2813..13932f389f8 100644 --- a/tests/lib/Activity/ManagerTest.php +++ b/tests/lib/Activity/ManagerTest.php @@ -10,6 +10,10 @@ namespace Test\Activity; +use OCP\IConfig; +use OCP\IRequest; +use OCP\IUserSession; +use OCP\RichObjectStrings\IValidator; use Test\TestCase; class ManagerTest extends TestCase { @@ -17,32 +21,28 @@ class ManagerTest extends TestCase { /** @var \OC\Activity\Manager */ private $activityManager; - /** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ protected $request; - - /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ protected $session; - - /** @var \OCP\IConfig|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ protected $config; + /** @var IValidator|\PHPUnit_Framework_MockObject_MockObject */ + protected $validator; protected function setUp() { parent::setUp(); - $this->request = $this->getMockBuilder('OCP\IRequest') - ->disableOriginalConstructor() - ->getMock(); - $this->session = $this->getMockBuilder('OCP\IUserSession') - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder('OCP\IConfig') - ->disableOriginalConstructor() - ->getMock(); + $this->request = $this->createMock(IRequest::class); + $this->session = $this->createMock(IUserSession::class); + $this->config = $this->createMock(IConfig::class); + $this->validator = $this->createMock(IValidator::class); $this->activityManager = new \OC\Activity\Manager( $this->request, $this->session, - $this->config + $this->config, + $this->validator ); $this->assertSame([], $this->invokePrivate($this->activityManager, 'getConsumers')); @@ -264,32 +264,26 @@ class ManagerTest extends TestCase { /** * @expectedException \BadMethodCallException - * @expectedExceptionMessage App not set - * @expectedExceptionCode 10 */ public function testPublishExceptionNoApp() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $this->activityManager->publish($event); } /** * @expectedException \BadMethodCallException - * @expectedExceptionMessage Type not set - * @expectedExceptionCode 11 */ public function testPublishExceptionNoType() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test'); $this->activityManager->publish($event); } /** * @expectedException \BadMethodCallException - * @expectedExceptionMessage Affected user not set - * @expectedExceptionCode 12 */ public function testPublishExceptionNoAffectedUser() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test') ->setType('test_type'); $this->activityManager->publish($event); @@ -297,11 +291,9 @@ class ManagerTest extends TestCase { /** * @expectedException \BadMethodCallException - * @expectedExceptionMessage Subject not set - * @expectedExceptionCode 13 */ public function testPublishExceptionNoSubject() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test') ->setType('test_type') ->setAffectedUser('test_affected'); @@ -310,16 +302,17 @@ class ManagerTest extends TestCase { public function dataPublish() { return [ - [null], - ['test_author'], + [null, ''], + ['test_author', 'test_author'], ]; } /** * @dataProvider dataPublish - * @param string $author + * @param string|null $author + * @param string $expected */ - public function testPublish($author) { + public function testPublish($author, $expected) { if ($author !== null) { $authorObject = $this->getMockBuilder('OCP\IUser') ->disableOriginalConstructor() @@ -332,11 +325,12 @@ class ManagerTest extends TestCase { ->willReturn($authorObject); } - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test') ->setType('test_type') ->setSubject('test_subject', []) - ->setAffectedUser('test_affected'); + ->setAffectedUser('test_affected') + ->setObject('file', 123); $consumer = $this->getMockBuilder('OCP\Activity\IConsumer') ->disableOriginalConstructor() @@ -344,10 +338,10 @@ class ManagerTest extends TestCase { $consumer->expects($this->once()) ->method('receive') ->with($event) - ->willReturnCallback(function(\OCP\Activity\IEvent $event) use ($author) { + ->willReturnCallback(function(\OCP\Activity\IEvent $event) use ($expected) { $this->assertLessThanOrEqual(time() + 2, $event->getTimestamp(), 'Timestamp not set correctly'); $this->assertGreaterThanOrEqual(time() - 2, $event->getTimestamp(), 'Timestamp not set correctly'); - $this->assertSame($author, $event->getAuthor(), 'Author name not set correctly'); + $this->assertSame($expected, $event->getAuthor(), 'Author name not set correctly'); }); $this->activityManager->registerConsumer(function () use ($consumer) { return $consumer; @@ -357,7 +351,7 @@ class ManagerTest extends TestCase { } public function testPublishAllManually() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test_app') ->setType('test_type') ->setAffectedUser('test_affected') @@ -397,7 +391,7 @@ class ManagerTest extends TestCase { } public function testDeprecatedPublishActivity() { - $event = new \OC\Activity\Event(); + $event = $this->activityManager->generateEvent(); $event->setApp('test_app') ->setType('test_type') ->setAffectedUser('test_affected') @@ -428,7 +422,7 @@ class ManagerTest extends TestCase { // The following values can not be used via publishActivity() $this->assertLessThanOrEqual(time() + 2, $event->getTimestamp(), 'Timestamp not set correctly'); $this->assertGreaterThanOrEqual(time() - 2, $event->getTimestamp(), 'Timestamp not set correctly'); - $this->assertSame(null, $event->getAuthor(), 'Author not set correctly'); + $this->assertSame('', $event->getAuthor(), 'Author not set correctly'); $this->assertSame('', $event->getObjectType(), 'Object type should not be set'); $this->assertSame(0, $event->getObjectId(), 'Object ID should not be set'); }); diff --git a/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php b/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php index 3b0418a7eba..fb2617cbfe8 100644 --- a/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php +++ b/tests/lib/App/AppStore/Fetcher/AppFetcherTest.php @@ -27,7 +27,7 @@ class AppFetcherTest extends FetcherBase { public function setUp() { parent::setUp(); $this->fileName = 'apps.json'; - $this->endpoint = 'https://apps.nextcloud.com/api/v1/platform/9.2.0/apps.json'; + $this->endpoint = 'https://apps.nextcloud.com/api/v1/platform/11.0.0/apps.json'; $this->fetcher = new AppFetcher( $this->appData, diff --git a/tests/lib/App/DependencyAnalyzerTest.php b/tests/lib/App/DependencyAnalyzerTest.php index fd44954eaf4..65b45a002d4 100644 --- a/tests/lib/App/DependencyAnalyzerTest.php +++ b/tests/lib/App/DependencyAnalyzerTest.php @@ -295,7 +295,7 @@ class DependencyAnalyzerTest extends TestCase { ], [ [ - 'Server version 11 or higher is required.', + 'Server version 9.2 or higher is required.', ], [ 'nextcloud' => [ @@ -307,6 +307,18 @@ class DependencyAnalyzerTest extends TestCase { ], [ [ + 'Server version 11 or higher is required.', + ], + [ + 'nextcloud' => [ + '@attributes' => [ + 'min-version' => '11', + ], + ], + ], + ], + [ + [ 'Server version 8.0.1 or lower is required.', ], [ @@ -388,7 +400,7 @@ class DependencyAnalyzerTest extends TestCase { ], [ [ - 'Server version 11 or higher is required.', + 'Server version 9.2 or higher is required.', ], [ 'owncloud' => [ diff --git a/tests/lib/App/ManagerTest.php b/tests/lib/App/ManagerTest.php index e04f7c82375..3dbcb8a5609 100644 --- a/tests/lib/App/ManagerTest.php +++ b/tests/lib/App/ManagerTest.php @@ -11,6 +11,7 @@ namespace Test\App; use OC\Group\Group; use OC\User\User; +use OCP\App\AppPathNotFoundException; use Test\TestCase; /** @@ -260,6 +261,15 @@ class ManagerTest extends TestCase { $this->assertFalse($this->manager->isEnabledForUser('test', $user)); } + public function testGetAppPath() { + $this->assertEquals(\OC::$SERVERROOT . '/apps/files', $this->manager->getAppPath('files')); + } + + public function testGetAppPathFail() { + $this->expectException(AppPathNotFoundException::class); + $this->manager->getAppPath('testnotexisting'); + } + public function testIsEnabledForUserEnabledForGroup() { $user = $this->newUser('user1'); $this->groupManager->expects($this->once()) diff --git a/tests/lib/AppFramework/Http/OutputTest.php b/tests/lib/AppFramework/Http/OutputTest.php new file mode 100644 index 00000000000..5fe35d24bde --- /dev/null +++ b/tests/lib/AppFramework/Http/OutputTest.php @@ -0,0 +1,31 @@ +<?php +/** + * Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\AppFramework\Http; + +use OC\AppFramework\Http\Output; + +class OutputTest extends \Test\TestCase { + public function testSetOutput() { + $this->expectOutputString('foo'); + $output = new Output(''); + $output->setOutput('foo'); + } + + public function testSetReadfile() { + $this->expectOutputString(file_get_contents(__FILE__)); + $output = new Output(''); + $output->setReadfile(__FILE__); + } + + public function testSetReadfileStream() { + $this->expectOutputString(file_get_contents(__FILE__)); + $output = new Output(''); + $output->setReadfile(fopen(__FILE__, 'r')); + } +} diff --git a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php index 1fdcf485c28..480bff5f59f 100644 --- a/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php +++ b/tests/lib/AppFramework/Middleware/Security/SecurityMiddlewareTest.php @@ -49,6 +49,7 @@ use OCP\IConfig; use OCP\ILogger; use OCP\INavigationManager; use OCP\IRequest; +use OCP\ISession; use OCP\IURLGenerator; use OCP\Security\ISecureRandom; @@ -63,6 +64,8 @@ class SecurityMiddlewareTest extends \Test\TestCase { private $secException; /** @var SecurityException */ private $secAjaxException; + /** @var ISession|\PHPUnit_Framework_MockObject_MockObject */ + private $session; /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ private $request; /** @var ControllerMethodReflector */ @@ -88,6 +91,7 @@ class SecurityMiddlewareTest extends \Test\TestCase { $this->logger = $this->createMock(ILogger::class); $this->navigationManager = $this->createMock(INavigationManager::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->session = $this->createMock(ISession::class); $this->request = $this->createMock(IRequest::class); $this->contentSecurityPolicyManager = $this->createMock(ContentSecurityPolicyManager::class); $this->csrfTokenManager = $this->createMock(CsrfTokenManager::class); @@ -109,6 +113,7 @@ class SecurityMiddlewareTest extends \Test\TestCase { $this->navigationManager, $this->urlGenerator, $this->logger, + $this->session, 'files', $isLoggedIn, $isAdminUser, diff --git a/tests/lib/Authentication/Token/DefaultTokenMapperTest.php b/tests/lib/Authentication/Token/DefaultTokenMapperTest.php index 418a4d14f62..8fe0762daad 100644 --- a/tests/lib/Authentication/Token/DefaultTokenMapperTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenMapperTest.php @@ -27,6 +27,7 @@ use OC\Authentication\Token\DefaultToken; use OC\Authentication\Token\DefaultTokenMapper; use OC\Authentication\Token\IToken; use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\IDBConnection; use OCP\IUser; use Test\TestCase; @@ -40,6 +41,8 @@ class DefaultTokenMapperTest extends TestCase { /** @var DefaultTokenMapper */ private $mapper; + + /** @var IDBConnection */ private $dbConnection; private $time; @@ -122,7 +125,6 @@ class DefaultTokenMapperTest extends TestCase { } public function testGetToken() { - $token = '1504445f1524fc801035448a95681a9378ba2e83930c814546c56e5d6ebde221198792fd900c88ed5ead0555780dad1ebce3370d7e154941cd5de87eb419899b'; $token = new DefaultToken(); $token->setUid('user2'); $token->setLoginName('User2'); @@ -151,6 +153,42 @@ class DefaultTokenMapperTest extends TestCase { $this->mapper->getToken($token); } + public function testGetTokenById() { + $token = new DefaultToken(); + $token->setUid('user2'); + $token->setLoginName('User2'); + $token->setPassword('971a337057853344700bbeccf836519f|UwOQwyb34sJHtqPV|036d4890f8c21d17bbc7b88072d8ef049a5c832a38e97f3e3d5f9186e896c2593aee16883f617322fa242728d0236ff32d163caeb4bd45e14ca002c57a88665f'); + $token->setName('Firefox on Android'); + $token->setToken('1504445f1524fc801035448a95681a9378ba2e83930c814546c56e5d6ebde221198792fd900c88ed5ead0555780dad1ebce3370d7e154941cd5de87eb419899b'); + $token->setType(IToken::TEMPORARY_TOKEN); + $token->setRemember(IToken::DO_NOT_REMEMBER); + $token->setLastActivity($this->time - 60 * 60 * 24 * 3); + $token->setLastCheck($this->time - 10); + + $dbToken = $this->mapper->getToken($token->getToken()); + $token->setId($dbToken->getId()); // We don't know the ID + $token->resetUpdatedFields(); + + $dbToken = $this->mapper->getTokenById($token->getId()); + $this->assertEquals($token, $dbToken); + } + + /** + * @expectedException \OCP\AppFramework\Db\DoesNotExistException + */ + public function testGetTokenByIdNotFound() { + $this->mapper->getTokenById(-1); + } + + /** + * @expectedException \OCP\AppFramework\Db\DoesNotExistException + */ + public function testGetInvalidTokenById() { + $id = 42; + + $this->mapper->getToken($id); + } + public function testGetTokenByUser() { $user = $this->createMock(IUser::class); $user->expects($this->once()) diff --git a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php index 5e4d4f94366..8d92ee405a1 100644 --- a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php @@ -22,9 +22,11 @@ namespace Test\Authentication\Token; +use OC\Authentication\Exceptions\InvalidTokenException; use OC\Authentication\Token\DefaultToken; use OC\Authentication\Token\DefaultTokenProvider; use OC\Authentication\Token\IToken; +use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\Mapper; use OCP\AppFramework\Utility\ITimeFactory; use OCP\IConfig; @@ -376,4 +378,25 @@ class DefaultTokenProviderTest extends TestCase { $this->tokenProvider->renewSessionToken('oldId', 'newId'); } + public function testGetTokenById() { + $token = $this->createMock(DefaultToken::class); + + $this->mapper->expects($this->once()) + ->method('getTokenById') + ->with($this->equalTo(42)) + ->willReturn($token); + + $this->assertSame($token, $this->tokenProvider->getTokenById(42)); + } + + public function testGetInvalidTokenById() { + $this->expectException(InvalidTokenException::class); + + $this->mapper->expects($this->once()) + ->method('getTokenById') + ->with($this->equalTo(42)) + ->willThrowException(new DoesNotExistException('nope')); + + $this->tokenProvider->getTokenById(42); + } } diff --git a/tests/lib/Authentication/Token/DefaultTokenTest.php b/tests/lib/Authentication/Token/DefaultTokenTest.php new file mode 100644 index 00000000000..f00c32ccaf5 --- /dev/null +++ b/tests/lib/Authentication/Token/DefaultTokenTest.php @@ -0,0 +1,49 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Authentication\Token; + +use OC\Authentication\Token\DefaultToken; +use Test\TestCase; + +class DefaultTokenTest extends TestCase { + public function testSetScopeAsArray() { + $scope = ['filesystem' => false]; + $token = new DefaultToken(); + $token->setScope($scope); + $this->assertEquals(json_encode($scope), $token->getScope()); + $this->assertEquals($scope, $token->getScopeAsArray()); + } + + public function testSetScopeAsString() { + $scope = ['filesystem' => false]; + $token = new DefaultToken(); + $token->setScope(json_encode($scope)); + $this->assertEquals(json_encode($scope), $token->getScope()); + $this->assertEquals($scope, $token->getScopeAsArray()); + } + + public function testDefaultScope() { + $scope = ['filesystem' => true]; + $token = new DefaultToken(); + $this->assertEquals($scope, $token->getScopeAsArray()); + } +} diff --git a/tests/lib/Files/Cache/UpdaterLegacyTest.php b/tests/lib/Files/Cache/UpdaterLegacyTest.php index 7d247968ca9..707ed70af23 100644 --- a/tests/lib/Files/Cache/UpdaterLegacyTest.php +++ b/tests/lib/Files/Cache/UpdaterLegacyTest.php @@ -128,24 +128,26 @@ class UpdaterLegacyTest extends \Test\TestCase { Filesystem::file_put_contents('folder/substorage/foo.txt', 'asd'); $this->assertTrue($cache2->inCache('foo.txt')); $cachedData = $cache2->get('foo.txt'); + $oldEtag = $substorageCachedData['etag']; $this->assertEquals(3, $cachedData['size']); $mtime = $cachedData['mtime']; $cachedData = $cache2->get(''); $this->assertInternalType('string', $substorageCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); $cachedData = $view->getFileInfo('folder'); $this->assertInternalType('string', $folderCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); } public function testDelete() { $textSize = strlen("dummy file data\n"); $imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png'); $rootCachedData = $this->cache->get(''); + $oldEtag = $rootCachedData['etag']; $this->assertEquals(3 * $textSize + $imageSize, $rootCachedData['size']); $this->assertTrue($this->cache->inCache('foo.txt')); @@ -155,7 +157,7 @@ class UpdaterLegacyTest extends \Test\TestCase { $this->assertEquals(2 * $textSize + $imageSize, $cachedData['size']); $this->assertInternalType('string', $rootCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $cachedData['mtime']); $rootCachedData = $cachedData; @@ -164,14 +166,15 @@ class UpdaterLegacyTest extends \Test\TestCase { $cachedData = $this->cache->get(''); $this->assertInternalType('string', $rootCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); $rootCachedData = $cachedData; + $oldEtag = $rootCachedData['etag']; Filesystem::rmdir('bar_folder'); $this->assertFalse($this->cache->inCache('bar_folder')); $cachedData = $this->cache->get(''); $this->assertInternalType('string', $rootCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $cachedData['mtime']); } @@ -184,19 +187,20 @@ class UpdaterLegacyTest extends \Test\TestCase { $this->assertTrue($cache2->inCache('foo.txt')); $folderCachedData = $view->getFileInfo('folder'); $substorageCachedData = $cache2->get(''); + $oldEtag = $folderCachedData['etag']; Filesystem::unlink('folder/substorage/foo.txt'); $this->assertFalse($cache2->inCache('foo.txt')); $cachedData = $cache2->get(''); $this->assertInternalType('string', $substorageCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($substorageCachedData, $cachedData['etag']); $this->assertGreaterThanOrEqual($substorageCachedData['mtime'], $cachedData['mtime']); $cachedData = $view->getFileInfo('folder'); $this->assertInternalType('string', $folderCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); $this->assertGreaterThanOrEqual($folderCachedData['mtime'], $cachedData['mtime']); } @@ -238,6 +242,7 @@ class UpdaterLegacyTest extends \Test\TestCase { $view = new View('/' . self::$user . '/files'); $this->assertTrue($cache2->inCache('foo.txt')); $folderCachedData = $view->getFileInfo('folder'); + $oldEtag = $folderCachedData['etag']; $substorageCachedData = $cache2->get(''); $fooCachedData = $cache2->get('foo.txt'); Filesystem::rename('folder/substorage/foo.txt', 'folder/substorage/bar.txt'); @@ -250,14 +255,14 @@ class UpdaterLegacyTest extends \Test\TestCase { $cachedData = $cache2->get(''); $this->assertInternalType('string', $substorageCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); // rename can cause mtime change - invalid assert // $this->assertEquals($mtime, $cachedData['mtime']); $cachedData = $view->getFileInfo('folder'); $this->assertInternalType('string', $folderCachedData['etag']); $this->assertInternalType('string', $cachedData['etag']); - $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); + $this->assertNotSame($oldEtag, $cachedData['etag']); // rename can cause mtime change - invalid assert // $this->assertEquals($mtime, $cachedData['mtime']); } diff --git a/tests/lib/Files/FileInfoTest.php b/tests/lib/Files/FileInfoTest.php new file mode 100644 index 00000000000..ee7a10ccec4 --- /dev/null +++ b/tests/lib/Files/FileInfoTest.php @@ -0,0 +1,46 @@ +<?php +/** + * Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Files; + +use OC\AllConfig; +use OC\Files\FileInfo; +use OC\Files\Storage\Home; +use OC\Files\Storage\Temporary; +use OC\User\User; +use OCP\IConfig; +use Test\TestCase; +use Test\Traits\UserTrait; + +class FileInfoTest extends TestCase { + use UserTrait; + + private $config; + + public function setUp() { + parent::setUp(); + $this->createUser('foo', 'foo'); + $this->config = $this->getMockBuilder(IConfig::class)->getMock(); + } + + public function testIsMountedHomeStorage() { + $fileInfo = new FileInfo( + '', + new Home(['user' => new User('foo', $this->userBackend, null, $this->config)]), + '', [], null); + $this->assertFalse($fileInfo->isMounted()); + } + + public function testIsMountedNonHomeStorage() { + $fileInfo = new FileInfo( + '', + new Temporary(), + '', [], null); + $this->assertTrue($fileInfo->isMounted()); + } +} diff --git a/tests/lib/Files/ObjectStore/LocalTest.php b/tests/lib/Files/ObjectStore/LocalTest.php new file mode 100644 index 00000000000..99aa23e065d --- /dev/null +++ b/tests/lib/Files/ObjectStore/LocalTest.php @@ -0,0 +1,36 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Files\ObjectStore; + +use OC\Files\ObjectStore\StorageObjectStore; +use OC\Files\Storage\Temporary; + +class LocalTest extends ObjectStoreTest { + /** + * @return \OCP\Files\ObjectStore\IObjectStore + */ + protected function getInstance() { + $storage = new Temporary(); + return new StorageObjectStore($storage); + } + +} diff --git a/tests/lib/Files/ObjectStore/ObjectStoreStorageTest.php b/tests/lib/Files/ObjectStore/ObjectStoreStorageTest.php new file mode 100644 index 00000000000..c9d6c1bd922 --- /dev/null +++ b/tests/lib/Files/ObjectStore/ObjectStoreStorageTest.php @@ -0,0 +1,169 @@ +<?php +/** + * @author Jörn Friedrich Dreyer + * @copyright (c) 2014 Jörn Friedrich Dreyer <jfd@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Files\ObjectStore; + +use OC\Files\ObjectStore\ObjectStoreStorage; +use OC\Files\ObjectStore\StorageObjectStore; +use OC\Files\Storage\Temporary; +use OCP\Files\ObjectStore\IObjectStore; +use Test\Files\Storage\Storage; + +/** + * @group DB + */ +class ObjectStoreStorageTest extends Storage { + + /** + * @var IObjectStore + */ + private $objectStorage; + + protected function setUp() { + parent::setUp(); + + $baseStorage = new Temporary(); + $this->objectStorage = new StorageObjectStore($baseStorage); + $config['objectstore'] = $this->objectStorage; + $this->instance = new ObjectStoreStorage($config); + } + + protected function tearDown() { + if (is_null($this->instance)) { + return; + } + $this->instance->getCache()->clear(); + + parent::tearDown(); + } + + public function testStat() { + + $textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt'; + $ctimeStart = time(); + $this->instance->file_put_contents('/lorem.txt', file_get_contents($textFile)); + $this->assertTrue($this->instance->isReadable('/lorem.txt')); + $ctimeEnd = time(); + $mTime = $this->instance->filemtime('/lorem.txt'); + + // check that ($ctimeStart - 5) <= $mTime <= ($ctimeEnd + 1) + $this->assertGreaterThanOrEqual(($ctimeStart - 5), $mTime); + $this->assertLessThanOrEqual(($ctimeEnd + 1), $mTime); + $this->assertEquals(filesize($textFile), $this->instance->filesize('/lorem.txt')); + + $stat = $this->instance->stat('/lorem.txt'); + //only size and mtime are required in the result + $this->assertEquals($stat['size'], $this->instance->filesize('/lorem.txt')); + $this->assertEquals($stat['mtime'], $mTime); + + if ($this->instance->touch('/lorem.txt', 100) !== false) { + $mTime = $this->instance->filemtime('/lorem.txt'); + $this->assertEquals($mTime, 100); + } + } + + public function testCheckUpdate() { + $this->markTestSkipped('Detecting external changes is not supported on object storages'); + } + + /** + * @dataProvider copyAndMoveProvider + */ + public function testMove($source, $target) { + $this->initSourceAndTarget($source); + $sourceId = $this->instance->getCache()->getId(ltrim('/',$source)); + $this->assertNotEquals(-1, $sourceId); + + $this->instance->rename($source, $target); + + $this->assertTrue($this->instance->file_exists($target), $target.' was not created'); + $this->assertFalse($this->instance->file_exists($source), $source.' still exists'); + $this->assertSameAsLorem($target); + + $targetId = $this->instance->getCache()->getId(ltrim('/',$target)); + $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); + } + + public function testRenameDirectory() { + $this->instance->mkdir('source'); + $this->instance->file_put_contents('source/test1.txt', 'foo'); + $this->instance->file_put_contents('source/test2.txt', 'qwerty'); + $this->instance->mkdir('source/subfolder'); + $this->instance->file_put_contents('source/subfolder/test.txt', 'bar'); + $sourceId = $this->instance->getCache()->getId('source'); + $this->assertNotEquals(-1, $sourceId); + $this->instance->rename('source', 'target'); + + $this->assertFalse($this->instance->file_exists('source')); + $this->assertFalse($this->instance->file_exists('source/test1.txt')); + $this->assertFalse($this->instance->file_exists('source/test2.txt')); + $this->assertFalse($this->instance->file_exists('source/subfolder')); + $this->assertFalse($this->instance->file_exists('source/subfolder/test.txt')); + + $this->assertTrue($this->instance->file_exists('target')); + $this->assertTrue($this->instance->file_exists('target/test1.txt')); + $this->assertTrue($this->instance->file_exists('target/test2.txt')); + $this->assertTrue($this->instance->file_exists('target/subfolder')); + $this->assertTrue($this->instance->file_exists('target/subfolder/test.txt')); + + $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); + $this->assertEquals('qwerty', $this->instance->file_get_contents('target/test2.txt')); + $this->assertEquals('bar', $this->instance->file_get_contents('target/subfolder/test.txt')); + $targetId = $this->instance->getCache()->getId('target'); + $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); + } + + public function testRenameOverWriteDirectory() { + $this->instance->mkdir('source'); + $this->instance->file_put_contents('source/test1.txt', 'foo'); + $sourceId = $this->instance->getCache()->getId('source'); + $this->assertNotEquals(-1, $sourceId); + + $this->instance->mkdir('target'); + $this->instance->file_put_contents('target/test1.txt', 'bar'); + $this->instance->file_put_contents('target/test2.txt', 'bar'); + + $this->instance->rename('source', 'target'); + + $this->assertFalse($this->instance->file_exists('source')); + $this->assertFalse($this->instance->file_exists('source/test1.txt')); + $this->assertFalse($this->instance->file_exists('target/test2.txt')); + $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); + $targetId = $this->instance->getCache()->getId('target'); + $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); + } + + public function testRenameOverWriteDirectoryOverFile() { + $this->instance->mkdir('source'); + $this->instance->file_put_contents('source/test1.txt', 'foo'); + $sourceId = $this->instance->getCache()->getId('source'); + $this->assertNotEquals(-1, $sourceId); + + $this->instance->file_put_contents('target', 'bar'); + + $this->instance->rename('source', 'target'); + + $this->assertFalse($this->instance->file_exists('source')); + $this->assertFalse($this->instance->file_exists('source/test1.txt')); + $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); + $targetId = $this->instance->getCache()->getId('target'); + $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); + } +} diff --git a/tests/lib/Files/ObjectStore/ObjectStoreTest.php b/tests/lib/Files/ObjectStore/ObjectStoreTest.php new file mode 100644 index 00000000000..2116306053e --- /dev/null +++ b/tests/lib/Files/ObjectStore/ObjectStoreTest.php @@ -0,0 +1,97 @@ +<?php + +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Files\ObjectStore; + +use Test\TestCase; + +abstract class ObjectStoreTest extends TestCase { + + /** + * @return \OCP\Files\ObjectStore\IObjectStore + */ + abstract protected function getInstance(); + + private function stringToStream($data) { + $stream = fopen('php://temp', 'w+'); + fwrite($stream, $data); + rewind($stream); + return $stream; + } + + public function testWriteRead() { + $stream = $this->stringToStream('foobar'); + + $instance = $this->getInstance(); + + $instance->writeObject('1', $stream); + + $result = $instance->readObject('1'); + $instance->deleteObject('1'); + + $this->assertEquals('foobar', stream_get_contents($result)); + + } + + public function testDelete() { + $stream = $this->stringToStream('foobar'); + + $instance = $this->getInstance(); + + $instance->writeObject('2', $stream); + + $instance->deleteObject('2'); + + try { + // to to read to verify that the object no longer exists + $instance->readObject('2'); + $this->fail(); + } catch (\Exception $e) { + // dummy assert to keep phpunit happy + $this->assertEquals(1, 1); + } + } + + public function testReadNonExisting() { + $instance = $this->getInstance(); + + try { + $instance->readObject('non-existing'); + $this->fail(); + } catch (\Exception $e) { + // dummy assert to keep phpunit happy + $this->assertEquals(1, 1); + } + } + + public function testDeleteNonExisting() { + $instance = $this->getInstance(); + + try { + $instance->deleteObject('non-existing'); + $this->fail(); + } catch (\Exception $e) { + // dummy assert to keep phpunit happy + $this->assertEquals(1, 1); + } + } +} diff --git a/tests/lib/Files/ObjectStore/S3Test.php b/tests/lib/Files/ObjectStore/S3Test.php new file mode 100644 index 00000000000..10afb9a7aa8 --- /dev/null +++ b/tests/lib/Files/ObjectStore/S3Test.php @@ -0,0 +1,38 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Files\ObjectStore; + +use OC\Files\ObjectStore\S3; + +class S3Test extends ObjectStoreTest { + /** + * @return \OCP\Files\ObjectStore\IObjectStore + */ + protected function getInstance() { + $config = \OC::$server->getConfig()->getSystemValue('objectstore'); + if (!is_array($config) || $config['class'] !== 'OC\\Files\\ObjectStore\\S3') { + $this->markTestSkipped('objectstore not configured for s3'); + } + + return new S3($config['arguments']); + } +} diff --git a/tests/lib/Files/ObjectStore/SwiftTest.php b/tests/lib/Files/ObjectStore/SwiftTest.php index 9f69e040f87..f2aeace769c 100644 --- a/tests/lib/Files/ObjectStore/SwiftTest.php +++ b/tests/lib/Files/ObjectStore/SwiftTest.php @@ -1,198 +1,38 @@ <?php /** - * @author Jörn Friedrich Dreyer - * @copyright (c) 2014 Jörn Friedrich Dreyer <jfd@owncloud.com> + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. + * @license GNU AGPL version 3 or any later version * - * This library is distributed in the hope that it will be useful, + * 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. + * GNU Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ namespace Test\Files\ObjectStore; -use OC\Files\ObjectStore\ObjectStoreStorage; use OC\Files\ObjectStore\Swift; -/** - * Class SwiftTest - * - * @group DB - * - * @package Test\Files\Cache\ObjectStore - */ -class SwiftTest extends \Test\Files\Storage\Storage { - +class SwiftTest extends ObjectStoreTest { /** - * @var Swift + * @return \OCP\Files\ObjectStore\IObjectStore */ - private $objectStorage; - - protected function setUp() { - parent::setUp(); - - if (!getenv('RUN_OBJECTSTORE_TESTS')) { - $this->markTestSkipped('objectstore tests are unreliable in some environments'); - } - - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // create users - $users = array('test'); - foreach($users as $userName) { - $user = \OC::$server->getUserManager()->get($userName); - if ($user !== null) { $user->delete(); } - \OC::$server->getUserManager()->createUser($userName, $userName); - } - - // main test user - \OC_Util::tearDownFS(); - \OC_User::setUserId(''); - \OC\Files\Filesystem::tearDown(); - \OC_User::setUserId('test'); - + protected function getInstance() { $config = \OC::$server->getConfig()->getSystemValue('objectstore'); - $this->objectStorage = new Swift($config['arguments']); - $config['objectstore'] = $this->objectStorage; - $this->instance = new ObjectStoreStorage($config); - } - - protected function tearDown() { - if (is_null($this->instance)) { - return; - } - $this->objectStorage->deleteContainer(true); - $this->instance->getCache()->clear(); - - $users = array('test'); - foreach($users as $userName) { - $user = \OC::$server->getUserManager()->get($userName); - if ($user !== null) { $user->delete(); } - } - parent::tearDown(); - } - - public function testStat() { - - $textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt'; - $ctimeStart = time(); - $this->instance->file_put_contents('/lorem.txt', file_get_contents($textFile)); - $this->assertTrue($this->instance->isReadable('/lorem.txt')); - $ctimeEnd = time(); - $mTime = $this->instance->filemtime('/lorem.txt'); - - // check that ($ctimeStart - 5) <= $mTime <= ($ctimeEnd + 1) - $this->assertGreaterThanOrEqual(($ctimeStart - 5), $mTime); - $this->assertLessThanOrEqual(($ctimeEnd + 1), $mTime); - $this->assertEquals(filesize($textFile), $this->instance->filesize('/lorem.txt')); - - $stat = $this->instance->stat('/lorem.txt'); - //only size and mtime are required in the result - $this->assertEquals($stat['size'], $this->instance->filesize('/lorem.txt')); - $this->assertEquals($stat['mtime'], $mTime); - - if ($this->instance->touch('/lorem.txt', 100) !== false) { - $mTime = $this->instance->filemtime('/lorem.txt'); - $this->assertEquals($mTime, 100); + if (!is_array($config) || $config['class'] !== 'OC\\Files\\ObjectStore\\Swift') { + $this->markTestSkipped('objectstore not configured for swift'); } - } - - public function testCheckUpdate() { - $this->markTestSkipped('Detecting external changes is not supported on object storages'); - } - - /** - * @dataProvider copyAndMoveProvider - */ - public function testMove($source, $target) { - $this->initSourceAndTarget($source); - $sourceId = $this->instance->getCache()->getId(ltrim('/',$source)); - $this->assertNotEquals(-1, $sourceId); - - $this->instance->rename($source, $target); - - $this->assertTrue($this->instance->file_exists($target), $target.' was not created'); - $this->assertFalse($this->instance->file_exists($source), $source.' still exists'); - $this->assertSameAsLorem($target); - - $targetId = $this->instance->getCache()->getId(ltrim('/',$target)); - $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); - } - - public function testRenameDirectory() { - $this->instance->mkdir('source'); - $this->instance->file_put_contents('source/test1.txt', 'foo'); - $this->instance->file_put_contents('source/test2.txt', 'qwerty'); - $this->instance->mkdir('source/subfolder'); - $this->instance->file_put_contents('source/subfolder/test.txt', 'bar'); - $sourceId = $this->instance->getCache()->getId('source'); - $this->assertNotEquals(-1, $sourceId); - $this->instance->rename('source', 'target'); - - $this->assertFalse($this->instance->file_exists('source')); - $this->assertFalse($this->instance->file_exists('source/test1.txt')); - $this->assertFalse($this->instance->file_exists('source/test2.txt')); - $this->assertFalse($this->instance->file_exists('source/subfolder')); - $this->assertFalse($this->instance->file_exists('source/subfolder/test.txt')); - - $this->assertTrue($this->instance->file_exists('target')); - $this->assertTrue($this->instance->file_exists('target/test1.txt')); - $this->assertTrue($this->instance->file_exists('target/test2.txt')); - $this->assertTrue($this->instance->file_exists('target/subfolder')); - $this->assertTrue($this->instance->file_exists('target/subfolder/test.txt')); - - $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); - $this->assertEquals('qwerty', $this->instance->file_get_contents('target/test2.txt')); - $this->assertEquals('bar', $this->instance->file_get_contents('target/subfolder/test.txt')); - $targetId = $this->instance->getCache()->getId('target'); - $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); - } - - public function testRenameOverWriteDirectory() { - $this->instance->mkdir('source'); - $this->instance->file_put_contents('source/test1.txt', 'foo'); - $sourceId = $this->instance->getCache()->getId('source'); - $this->assertNotEquals(-1, $sourceId); - - $this->instance->mkdir('target'); - $this->instance->file_put_contents('target/test1.txt', 'bar'); - $this->instance->file_put_contents('target/test2.txt', 'bar'); - - $this->instance->rename('source', 'target'); - - $this->assertFalse($this->instance->file_exists('source')); - $this->assertFalse($this->instance->file_exists('source/test1.txt')); - $this->assertFalse($this->instance->file_exists('target/test2.txt')); - $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); - $targetId = $this->instance->getCache()->getId('target'); - $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); - } - - public function testRenameOverWriteDirectoryOverFile() { - $this->instance->mkdir('source'); - $this->instance->file_put_contents('source/test1.txt', 'foo'); - $sourceId = $this->instance->getCache()->getId('source'); - $this->assertNotEquals(-1, $sourceId); - - $this->instance->file_put_contents('target', 'bar'); - - $this->instance->rename('source', 'target'); - $this->assertFalse($this->instance->file_exists('source')); - $this->assertFalse($this->instance->file_exists('source/test1.txt')); - $this->assertEquals('foo', $this->instance->file_get_contents('target/test1.txt')); - $targetId = $this->instance->getCache()->getId('target'); - $this->assertSame($sourceId, $targetId, 'fileid must be stable on move or shares will break'); + return new Swift($config['arguments']); } } diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php index b0233116ed5..4c264472385 100644 --- a/tests/lib/Files/ViewTest.php +++ b/tests/lib/Files/ViewTest.php @@ -842,10 +842,12 @@ class ViewTest extends \Test\TestCase { 'storage_mtime' => $past )); + $oldEtag = $oldFolderInfo->getEtag(); + $view->getFileInfo('/test/sub/storage/test.txt'); $newFolderInfo = $view->getFileInfo('/test'); - $this->assertNotEquals($newFolderInfo->getEtag(), $oldFolderInfo->getEtag()); + $this->assertNotEquals($newFolderInfo->getEtag(), $oldEtag); } /** diff --git a/tests/lib/InstallerTest.php b/tests/lib/InstallerTest.php index 1212d3d7559..dadaffe1879 100644 --- a/tests/lib/InstallerTest.php +++ b/tests/lib/InstallerTest.php @@ -547,7 +547,7 @@ MPLX6f5V9tCJtlH6ztmEcDROfvuVc0U3rEhqx2hphoyo+MZrPFpdcJL8KkIdMKbY ], ]; $this->appFetcher - ->expects($this->once()) + ->expects($this->at(0)) ->method('get') ->willReturn($appArray); $realTmpFile = \OC::$server->getTempManager()->getTemporaryFile('.tar.gz'); @@ -568,7 +568,7 @@ MPLX6f5V9tCJtlH6ztmEcDROfvuVc0U3rEhqx2hphoyo+MZrPFpdcJL8KkIdMKbY ->method('get') ->with('https://example.com', ['save_to' => $realTmpFile]); $this->clientService - ->expects($this->once()) + ->expects($this->at(0)) ->method('newClient') ->willReturn($client); @@ -577,4 +577,91 @@ MPLX6f5V9tCJtlH6ztmEcDROfvuVc0U3rEhqx2hphoyo+MZrPFpdcJL8KkIdMKbY $this->assertTrue(file_exists(__DIR__ . '/../../apps/testapp/appinfo/info.xml')); $this->assertEquals('0.9', \OC_App::getAppVersionByPath(__DIR__ . '/../../apps/testapp/')); } + + /** + * @expectedException \Exception + * @expectedExceptionMessage App for id testapp has version 0.9 and tried to update to lower version 0.8 + */ + public function testDownloadAppWithDowngrade() { + $appArray = [ + [ + 'id' => 'testapp', + 'certificate' => '-----BEGIN CERTIFICATE----- +MIIEAjCCAuoCAhAbMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD +VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI +MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB +dXRob3JpdHkwHhcNMTYxMDMxMTgxNTI2WhcNMjcwMjA2MTgxNTI2WjASMRAwDgYD +VQQDEwd0ZXN0YXBwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqa0x +FcVa0YcO/ABqSNdbf7Bzp2PBBJzVM9gI4/HzzBKU/NY9/RibBBpNjAIWEFAbTI4j +ilFSoxHDQ8HrboFOeKCrOIdp9ATQ8SnYVNIQ12Ym3LA/XxcG0gG0H7DeS9C0uACe +svN8fwD1wnKnLLU9GBzO77jwYkneed85wwKG4waHd3965gxQWq0N5gnYS0TTn7Yr +l1veRiw+ryefXvfWI0cN1WBZJ/4XAkwVlpG1HP60AunIpcwn9bfG4XCka+7x26E4 +6Hw0Ot7D7j0yzVzimJDPB2h2buEtPVd6m+oNPueVvKGta+p6cEEaHlFVh2Pa9DI+ +me3nb6aXE2kABWXav3BmK18A5Rg4ZY4VFYvmHmxkOhT/ulGZRqy6TccL/optqs52 +KQ6P0e5dfmhLeoCvJObD+ZYKv+kJCRFtX1Hve/R4IHG6XSFKUfrRjyor9b6TX2L/ +l2vV0mFjmy4g3l05vWHg1Edtq7M29S/xNA3/hF29NjBq6NoMbLGcBtFced1iK07Z +yHLjXRZRfURP671Svqqg8pjxuDqkJ2vIj/Vpod4kF2jeiZYXcfmNKhEhxpkccSe0 +dI6p76Ne7XSUpf8yCPiSnWZLadqKZdEulcB4SlrZO2+/pycgqrqihofDrvDeWeeg +gQyvbZZKl4ylRNj6IRKnosKLVXNqMHQxLmxLHeUCAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEALkKQwa40HfuP4Q6ShwBFJbXLyodIAXCT014kBVjReDKNl5oHtMXRjPxj +nj9doKu+3bLNuLCv9uU3H5+t/GFogReV3Av3z/fCqJ6wHv/KX+lacj31dWXZGD8G +z+RYibrxKkPN0V6q1mSvkg3hJOOE+/4FPIdc8PNlgratv3WS4dT8QwGSUavHW2Kx +89nIdnwtLEFpgML/bTG0dm8BH57xER8LCYixW1VmpV6A4IsoKVsnB7KUCRTK3iUJ +Zh8Xg8UMNrOtXc1Wx1Wmjaa4ZE9dY6/KkU2ny2UWyDHKU/9VE8QQ4HN93gxU4+H7 +cUg0V1uAxqUvKytKkMfcyPWsz/AINA== +-----END CERTIFICATE-----', + 'releases' => [ + [ + 'download' => 'https://example.com', + 'signature' => 'KMSao4cKdMIYxeT8Bm4lrmSeIQnk7YzJZh+Vz+4LVSBwF+OMmcujryQuWLXmbPfg +4hGI9zS025469VNjUoCprn01H8NBq3O1cXz+ewG1oxYWMMQFZDkOtUQ+XZ27b91t +y0l45H6C8j0sTeSrUb/LCjrdm+buUygkhC2RZxCI6tLi4rYWj0MiqDz98XkbB3te +pW3ZND6mG6Jxn1fnd35paqZ/+URMftoLQ4K+6vJoBVGnug9nk1RpGLouICI0zCrz +YPTsBHo0s2mPvQQ/ASacWYmSe5R6r5JCzNeGMpViGCqCYPbwuebgqK079s2zvSF9 +mSLAm2Tk6gCM29N8Vdfr6ppCvIbuNzlLU/dGdYHAILgxEsm/odZjt1Fhs4lOo3A5 +9ToaNl5+qOEkggwfE/QqceHAY2soW9V5d9izhTCDgXmxpPpPXkwPPTz04ZUpi1Yc +OdZZOswbEcc2jUC5T7a7Tnp0uBOkdqat6jB4oMGwU1ldYLCGRyy546cPPTXJw5kH +9WfeKJ/mavrSLVa7QqZ4RCcMigmijT1kdqbaEh05IZNrzs6VDcS2EIrbDX8SGXUk +uDDkPXZEXqNDEjyONfDXVRLiqDa52Gg+I4vW/l/4ZOFgAWdZkqPPuZFaqzZpsJXm +JXhrdaWDZ8fzpUjugrtC3qslsqL0dzgU37anS3HwrT8=', + ], + [ + 'download' => 'https://nextcloud.com', + ], + ], + ], + ]; + $this->appFetcher + ->expects($this->at(1)) + ->method('get') + ->willReturn($appArray); + $realTmpFile = \OC::$server->getTempManager()->getTemporaryFile('.tar.gz'); + copy(__DIR__ . '/../data/testapp.0.8.tar.gz', $realTmpFile); + $this->tempManager + ->expects($this->at(2)) + ->method('getTemporaryFile') + ->with('.tar.gz') + ->willReturn($realTmpFile); + $realTmpFolder = \OC::$server->getTempManager()->getTemporaryFolder(); + $this->tempManager + ->expects($this->at(3)) + ->method('getTemporaryFolder') + ->willReturn($realTmpFolder); + $client = $this->createMock(IClient::class); + $client + ->expects($this->once()) + ->method('get') + ->with('https://example.com', ['save_to' => $realTmpFile]); + $this->clientService + ->expects($this->at(1)) + ->method('newClient') + ->willReturn($client); + $this->testDownloadAppSuccessful(); + $this->assertTrue(file_exists(__DIR__ . '/../../apps/testapp/appinfo/info.xml')); + $this->assertEquals('0.9', \OC_App::getAppVersionByPath(__DIR__ . '/../../apps/testapp/')); + + $this->installer->downloadApp('testapp'); + $this->assertTrue(file_exists(__DIR__ . '/../../apps/testapp/appinfo/info.xml')); + $this->assertEquals('0.8', \OC_App::getAppVersionByPath(__DIR__ . '/../../apps/testapp/')); + } } diff --git a/tests/lib/Lockdown/Filesystem/NoFSTest.php b/tests/lib/Lockdown/Filesystem/NoFSTest.php new file mode 100644 index 00000000000..a0900ad769d --- /dev/null +++ b/tests/lib/Lockdown/Filesystem/NoFSTest.php @@ -0,0 +1,63 @@ +<?php +/** + * @copyright 2016, Robin Appelman <robin@icewind.nl> + * + * @author Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Lockdown\Filesystem; + +use OC\Authentication\Token\DefaultToken; +use OC\Files\Filesystem; +use OC\Lockdown\Filesystem\NullStorage; +use Test\Traits\UserTrait; + +/** + * @group DB + */ +class NoFSTest extends \Test\TestCase { + use UserTrait; + + public function tearDown() { + $token = new DefaultToken(); + $token->setScope([ + 'filesystem' => true + ]); + \OC::$server->getLockdownManager()->setToken($token); + return parent::tearDown(); + } + + public function setUp() { + parent::setUp(); + $token = new DefaultToken(); + $token->setScope([ + 'filesystem' => false + ]); + + \OC::$server->getLockdownManager()->setToken($token); + $this->createUser('foo', 'var'); + } + + public function testSetupFS() { + \OC_Util::tearDownFS(); + \OC_Util::setupFS('foo'); + + $this->assertInstanceOf(NullStorage::class, Filesystem::getStorage('/foo/files')); + } +} diff --git a/tests/lib/Lockdown/Filesystem/NullCacheTest.php b/tests/lib/Lockdown/Filesystem/NullCacheTest.php new file mode 100644 index 00000000000..3a4e3f3a402 --- /dev/null +++ b/tests/lib/Lockdown/Filesystem/NullCacheTest.php @@ -0,0 +1,157 @@ +<?php +/** + * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Lockdown\Filesystem; + +use OC\ForbiddenException; +use OC\Lockdown\Filesystem\NullCache; +use OCP\Constants; +use OCP\Files\Cache\ICache; +use OCP\Files\FileInfo; + +class NulLCacheTest extends \Test\TestCase { + + /** @var NullCache */ + private $cache; + + public function setUp() { + parent::setUp(); + + $this->cache = new NullCache(); + } + + public function testGetNumericStorageId() { + $this->assertSame(-1, $this->cache->getNumericStorageId()); + } + + public function testGetEmpty() { + $this->assertNull($this->cache->get('foo')); + } + + public function testGet() { + $data = $this->cache->get(''); + + $this->assertEquals(-1, $data['fileid']); + $this->assertEquals(-1, $data['parent']); + $this->assertEquals('', $data['name']); + $this->assertEquals('', $data['path']); + $this->assertEquals('0', $data['size']); + $this->assertEquals('', $data['etag']); + $this->assertEquals(FileInfo::MIMETYPE_FOLDER, $data['mimetype']); + $this->assertEquals('httpd', $data['mimepart']); + $this->assertEquals(Constants::PERMISSION_READ, $data['permissions']); + } + + public function testGetFolderContents() { + $this->assertSame([], $this->cache->getFolderContents('foo')); + } + + public function testGetFolderContentsById() { + $this->assertSame([], $this->cache->getFolderContentsById(42)); + } + + public function testPut() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->put('foo', ['size' => 100]); + } + + public function testInsert() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->insert('foo', ['size' => 100]); + } + + public function testUpdate() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->update('foo', ['size' => 100]); + } + + public function testGetId() { + $this->assertSame(-1, $this->cache->getId('foo')); + } + + public function testGetParentId() { + $this->assertSame(-1, $this->cache->getParentId('foo')); + } + + public function testInCache() { + $this->assertTrue($this->cache->inCache('')); + $this->assertFalse($this->cache->inCache('foo')); + } + + public function testRemove() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->remove('foo'); + } + + public function testMove() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->move('foo', 'bar'); + } + + public function testMoveFromCache() { + $sourceCache = $this->createMock(ICache::class); + + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->cache->moveFromCache($sourceCache, 'foo', 'bar'); + } + + public function testGetStatus() { + $this->assertSame(ICache::COMPLETE, $this->cache->getStatus('foo')); + } + + public function testSearch() { + $this->assertSame([], $this->cache->search('foo')); + } + + public function testSearchByMime() { + $this->assertSame([], $this->cache->searchByMime('foo')); + } + + public function testSearchByTag() { + $this->assertSame([], $this->cache->searchByTag('foo', 'user')); + } + + public function testGetIncomplete() { + $this->assertSame([], $this->cache->getIncomplete()); + } + + public function testGetPathById() { + $this->assertSame('', $this->cache->getPathById(42)); + } + + public function testNormalize() { + $this->assertSame('foo/ bar /', $this->cache->normalize('foo/ bar /')); + } +} diff --git a/tests/lib/Lockdown/Filesystem/NullStorageTest.php b/tests/lib/Lockdown/Filesystem/NullStorageTest.php new file mode 100644 index 00000000000..dc99eb4c03a --- /dev/null +++ b/tests/lib/Lockdown/Filesystem/NullStorageTest.php @@ -0,0 +1,245 @@ +<?php +/** + * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Lockdown\Filesystem; + +use Icewind\Streams\IteratorDirectory; +use OC\ForbiddenException; +use OC\Lockdown\Filesystem\NullCache; +use OC\Lockdown\Filesystem\NullStorage; +use OCP\Files\Storage; +use Test\TestCase; + +class NullStorageTest extends TestCase { + + /** @var NullStorage */ + private $storage; + + public function setUp() { + parent::setUp(); + + $this->storage = new NullStorage([]); + } + + public function testGetId() { + $this->assertSame('null', $this->storage->getId()); + } + + public function testMkdir() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->mkdir('foo'); + } + + public function testRmdir() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->rmdir('foo'); + } + + public function testOpendir() { + $this->assertInstanceOf(IteratorDirectory::class, $this->storage->opendir('foo')); + } + + public function testIs_dir() { + $this->assertTrue($this->storage->is_dir('')); + $this->assertFalse($this->storage->is_dir('foo')); + } + + public function testIs_file() { + $this->assertFalse($this->storage->is_file('foo')); + } + + public function testStat() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->stat('foo'); + } + + public function testFiletype() { + $this->assertSame('dir', $this->storage->filetype('')); + $this->assertFalse($this->storage->filetype('foo')); + } + + public function testFilesize() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->filesize('foo'); + } + + public function testIsCreatable() { + $this->assertFalse($this->storage->isCreatable('foo')); + } + + public function testIsReadable() { + $this->assertTrue($this->storage->isReadable('')); + $this->assertFalse($this->storage->isReadable('foo')); + } + + public function testIsUpdatable() { + $this->assertFalse($this->storage->isUpdatable('foo')); + } + + public function testIsDeletable() { + $this->assertFalse($this->storage->isDeletable('foo')); + } + + public function testIsSharable() { + $this->assertFalse($this->storage->isSharable('foo')); + } + + public function testGetPermissions() { + $this->assertNull($this->storage->getPermissions('foo')); + } + + public function testFile_exists() { + $this->assertTrue($this->storage->file_exists('')); + $this->assertFalse($this->storage->file_exists('foo')); + } + + public function testFilemtime() { + $this->assertFalse($this->storage->filemtime('foo')); + } + + public function testFile_get_contents() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->file_get_contents('foo'); + } + + public function testFile_put_contents() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->file_put_contents('foo', 'bar'); + } + + public function testUnlink() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->unlink('foo'); + } + + public function testRename() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->rename('foo', 'bar'); + } + + public function testCopy() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->copy('foo', 'bar'); + } + + public function testFopen() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->fopen('foo', 'R'); + } + + public function testGetMimeType() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->getMimeType('foo'); + } + + public function testHash() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->hash('md5', 'foo', true); + } + + public function testFree_space() { + $this->assertSame(0, $this->storage->free_space('foo')); + } + + public function testTouch() { + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->touch('foo'); + } + + public function testGetLocalFile() { + $this->assertFalse($this->storage->getLocalFile('foo')); + } + + public function testHasUpdated() { + $this->assertFalse($this->storage->hasUpdated('foo', 42)); + } + + public function testGetETag() { + $this->assertSame('', $this->storage->getETag('foo')); + } + + public function testIsLocal() { + $this->assertFalse($this->storage->isLocal()); + } + + public function testGetDirectDownload() { + $this->assertFalse($this->storage->getDirectDownload('foo')); + } + + public function testCopyFromStorage() { + $sourceStorage = $this->createMock(Storage::class); + + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->copyFromStorage($sourceStorage, 'foo', 'bar'); + } + + public function testMoveFromStorage() { + $sourceStorage = $this->createMock(Storage::class); + + $this->expectException(ForbiddenException::class); + $this->expectExceptionMessage('This request is not allowed to access the filesystem'); + + $this->storage->moveFromStorage($sourceStorage, 'foo', 'bar'); + } + + public function testTest() { + $this->assertTrue($this->storage->test()); + return true; + } + + public function testGetOwner() { + $this->assertNull($this->storage->getOwner('foo')); + } + + public function testGetCache() { + $this->assertInstanceOf(NullCache::class, $this->storage->getCache('foo')); + } +} diff --git a/tests/lib/Lockdown/LockdownManagerTest.php b/tests/lib/Lockdown/LockdownManagerTest.php new file mode 100644 index 00000000000..4cbd9d71a5c --- /dev/null +++ b/tests/lib/Lockdown/LockdownManagerTest.php @@ -0,0 +1,49 @@ +<?php +/** + * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test\Lockdown; + +use OC\Authentication\Token\DefaultToken; +use OC\Lockdown\LockdownManager; +use Test\TestCase; + +class LockdownManagerTest extends TestCase { + public function testCanAccessFilesystemDisabled() { + $manager = new LockdownManager(); + $this->assertTrue($manager->canAccessFilesystem()); + } + + public function testCanAccessFilesystemAllowed() { + $token = new DefaultToken(); + $token->setScope(['filesystem' => true]); + $manager = new LockdownManager(); + $manager->setToken($token); + $this->assertTrue($manager->canAccessFilesystem()); + } + + public function testCanAccessFilesystemNotAllowed() { + $token = new DefaultToken(); + $token->setScope(['filesystem' => false]); + $manager = new LockdownManager(); + $manager->setToken($token); + $this->assertFalse($manager->canAccessFilesystem()); + } +} diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php index c1fe9c382fa..f115c11938a 100644 --- a/tests/lib/TestCase.php +++ b/tests/lib/TestCase.php @@ -24,7 +24,6 @@ namespace Test; use DOMDocument; use DOMNode; -use OC\Cache\CappedMemoryCache; use OC\Command\QueueBus; use OC\Files\Filesystem; use OC\Template\Base; @@ -34,7 +33,7 @@ use OCP\IDBConnection; use OCP\IL10N; use OCP\Security\ISecureRandom; -abstract class TestCase extends \PHPUnit_Framework_TestCase { +abstract class TestCase extends TestCasePhpUnitCompatibility { /** @var \OC\Command\QueueBus */ private $commandBus; @@ -153,7 +152,7 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { } } - protected function onNotSuccessfulTest($e) { + protected function realOnNotSuccessfulTest() { $this->restoreAllServices(); // restore database connection @@ -162,8 +161,6 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { return self::$realDatabase; }); } - - parent::onNotSuccessfulTest($e); } protected function tearDown() { @@ -377,6 +374,10 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { self::logout(); \OC\Files\Filesystem::tearDown(); \OC_User::setUserId($user); + $userObject = \OC::$server->getUserManager()->get($user); + if (!is_null($userObject)) { + $userObject->updateLastLoginTimestamp(); + } \OC_Util::setupFS($user); if (\OC_User::userExists($user)) { \OC::$server->getUserFolder($user); diff --git a/tests/lib/TestCasePhpUnit4.php b/tests/lib/TestCasePhpUnit4.php new file mode 100644 index 00000000000..f49cf7d40f3 --- /dev/null +++ b/tests/lib/TestCasePhpUnit4.php @@ -0,0 +1,37 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test; + +/** + * FIXME Remove this once phpunit 5 is the lowest supported version, by reverting: + * https://github.com/nextcloud/server/pull/2137 + */ +abstract class TestCasePhpUnit4 extends \PHPUnit_Framework_TestCase { + + abstract protected function realOnNotSuccessfulTest(); + + protected function onNotSuccessfulTest(\Exception $e) { + $this->realOnNotSuccessfulTest(); + + parent::onNotSuccessfulTest($e); + } +} diff --git a/tests/lib/TestCasePhpUnit5.php b/tests/lib/TestCasePhpUnit5.php new file mode 100644 index 00000000000..5def70e57fa --- /dev/null +++ b/tests/lib/TestCasePhpUnit5.php @@ -0,0 +1,37 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test; + +/** + * FIXME Remove this once phpunit 5 is the lowest supported version, by reverting: + * https://github.com/nextcloud/server/pull/2137 + */ +abstract class TestCasePhpUnit5 extends \PHPUnit_Framework_TestCase { + + abstract protected function realOnNotSuccessfulTest(); + + protected function onNotSuccessfulTest($e) { + $this->realOnNotSuccessfulTest(); + + parent::onNotSuccessfulTest($e); + } +} diff --git a/tests/lib/TestCasePhpUnitCompatibility.php b/tests/lib/TestCasePhpUnitCompatibility.php new file mode 100644 index 00000000000..cb243d1ce6f --- /dev/null +++ b/tests/lib/TestCasePhpUnitCompatibility.php @@ -0,0 +1,32 @@ +<?php +/** + * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Test; + +/** + * FIXME Remove this once phpunit 5 is the lowest supported version, by reverting: + * https://github.com/nextcloud/server/pull/2137 + */ +if (version_compare(\PHPUnit_Runner_Version::id(), '5.0.0', '>=')) { + abstract class TestCasePhpUnitCompatibility extends TestCasePhpUnit5 {} +} else { + abstract class TestCasePhpUnitCompatibility extends TestCasePhpUnit4 {} +} diff --git a/tests/objectstore/start-swift-ceph.sh b/tests/objectstore/start-swift-ceph.sh index bbf483c2897..98c0e8b78b2 100755 --- a/tests/objectstore/start-swift-ceph.sh +++ b/tests/objectstore/start-swift-ceph.sh @@ -85,6 +85,7 @@ cat > $thisFolder/swift.config.php <<DELIM 'username' => '$user', 'password' => '$pass', 'container' => 'owncloud-autotest$EXECUTOR_NUMBER', + 'objectPrefix' => 'autotest$EXECUTOR_NUMBER:oid:urn:', 'autocreate' => true, 'region' => '$region', 'url' => 'http://$host:$port/v2.0', diff --git a/version.php b/version.php index e6de2e2bde0..d556386a848 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(9, 2, 0, 5); +$OC_Version = array(11, 0, 0, 1); // The human readable string $OC_VersionString = '11.0 alpha'; |