diff options
Diffstat (limited to 'apps')
175 files changed, 2597 insertions, 658 deletions
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index 04344e83fde..8dea6684742 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -48,7 +48,7 @@ $principalBackend = new Principal( 'principals/' ); $db = \OC::$server->getDatabaseConnection(); -$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager()); +$cardDavBackend = new CardDavBackend($db, $principalBackend, \OC::$server->getUserManager(), \OC::$server->getEventDispatcher()); $debugging = \OC::$server->getConfig()->getSystemValue('debug', false); @@ -81,7 +81,7 @@ if ($debugging) { $server->addPlugin(new \Sabre\DAV\Sync\Plugin()); $server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin()); -$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(\OC::$server->getLogger())); +$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(new \OCA\DAV\CardDAV\PhotoCache(\OC::$server->getAppDataDir('dav-photocache')))); $server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger())); // And off we go! diff --git a/apps/dav/l10n/pt_BR.js b/apps/dav/l10n/pt_BR.js index 731bc73c782..bafe878a8d7 100644 --- a/apps/dav/l10n/pt_BR.js +++ b/apps/dav/l10n/pt_BR.js @@ -4,7 +4,7 @@ OC.L10N.register( "Calendar" : "Calendário", "Todos" : "Tarefas", "{actor} created calendar {calendar}" : "{actor} criou o calendário {calendar}", - "You created calendar {calendar}" : "Voce criou o calendário {calendar}", + "You created calendar {calendar}" : "Você criou o calendário {calendar}", "{actor} deleted calendar {calendar}" : "{actor} excluiu o calendário {calendar}", "You deleted calendar {calendar}" : "Você excluiu o calendário {calendar}", "{actor} updated calendar {calendar}" : "{actor} atualizou o calendário {calendar}", diff --git a/apps/dav/l10n/pt_BR.json b/apps/dav/l10n/pt_BR.json index 75efd572620..d434ef77752 100644 --- a/apps/dav/l10n/pt_BR.json +++ b/apps/dav/l10n/pt_BR.json @@ -2,7 +2,7 @@ "Calendar" : "Calendário", "Todos" : "Tarefas", "{actor} created calendar {calendar}" : "{actor} criou o calendário {calendar}", - "You created calendar {calendar}" : "Voce criou o calendário {calendar}", + "You created calendar {calendar}" : "Você criou o calendário {calendar}", "{actor} deleted calendar {calendar}" : "{actor} excluiu o calendário {calendar}", "You deleted calendar {calendar}" : "Você excluiu o calendário {calendar}", "{actor} updated calendar {calendar}" : "{actor} atualizou o calendário {calendar}", diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index b4f16f3cadf..5d89324d4a9 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -24,11 +24,13 @@ */ namespace OCA\DAV\AppInfo; +use OC\AppFramework\Utility\SimpleContainer; use OCA\DAV\CalDAV\Activity\Backend; use OCA\DAV\CalDAV\Activity\Provider\Event; use OCA\DAV\CalDAV\BirthdayService; use OCA\DAV\Capabilities; use OCA\DAV\CardDAV\ContactsManager; +use OCA\DAV\CardDAV\PhotoCache; use OCA\DAV\CardDAV\SyncService; use OCA\DAV\HookManager; use \OCP\AppFramework\App; @@ -44,10 +46,19 @@ class Application extends App { public function __construct() { parent::__construct('dav'); + $container = $this->getContainer(); + $server = $container->getServer(); + + $container->registerService(PhotoCache::class, function(SimpleContainer $s) use ($server) { + return new PhotoCache( + $server->getAppDataDir('dav-photocache') + ); + }); + /* * Register capabilities */ - $this->getContainer()->registerCapability(Capabilities::class); + $container->registerCapability(Capabilities::class); } /** @@ -101,6 +112,19 @@ class Application extends App { } }); + $clearPhotoCache = function($event) { + if ($event instanceof GenericEvent) { + /** @var PhotoCache $p */ + $p = $this->getContainer()->query(PhotoCache::class); + $p->delete( + $event->getArgument('addressBookId'), + $event->getArgument('cardUri') + ); + } + }; + $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $clearPhotoCache); + $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $clearPhotoCache); + $dispatcher->addListener('OC\AccountManager::userUpdated', function(GenericEvent $event) { $user = $event->getSubject(); $syncService = $this->getContainer()->query(SyncService::class); diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 5deb648fa7f..983220c6ba0 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -93,7 +93,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { public function __construct(IDBConnection $db, Principal $principalBackend, IUserManager $userManager, - EventDispatcherInterface $dispatcher = null) { + EventDispatcherInterface $dispatcher) { $this->db = $db; $this->principalBackend = $principalBackend; $this->userManager = $userManager; @@ -612,13 +612,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 1); $this->updateProperties($addressBookId, $cardUri, $cardData); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::createCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri, - 'cardData' => $cardData])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::createCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri, + 'cardData' => $cardData])); return '"' . $etag . '"'; } @@ -664,13 +662,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 2); $this->updateProperties($addressBookId, $cardUri, $cardData); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::updateCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri, - 'cardData' => $cardData])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::updateCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri, + 'cardData' => $cardData])); return '"' . $etag . '"'; } @@ -696,12 +692,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { $this->addChange($addressBookId, $cardUri, 3); - if (!is_null($this->dispatcher)) { - $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', - new GenericEvent(null, [ - 'addressBookId' => $addressBookId, - 'cardUri' => $cardUri])); - } + $this->dispatcher->dispatch('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', + new GenericEvent(null, [ + 'addressBookId' => $addressBookId, + 'cardUri' => $cardUri])); if ($ret === 1) { if ($cardId !== null) { diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php index e48410d26d6..747c879ecd4 100644 --- a/apps/dav/lib/CardDAV/ImageExportPlugin.php +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -22,25 +22,28 @@ namespace OCA\DAV\CardDAV; +use OCP\Files\NotFoundException; use OCP\ILogger; use Sabre\CardDAV\Card; use Sabre\DAV\Server; use Sabre\DAV\ServerPlugin; use Sabre\HTTP\RequestInterface; use Sabre\HTTP\ResponseInterface; -use Sabre\VObject\Parameter; -use Sabre\VObject\Property\Binary; -use Sabre\VObject\Reader; class ImageExportPlugin extends ServerPlugin { /** @var Server */ protected $server; - /** @var ILogger */ - private $logger; + /** @var PhotoCache */ + private $cache; - public function __construct(ILogger $logger) { - $this->logger = $logger; + /** + * ImageExportPlugin constructor. + * + * @param PhotoCache $cache + */ + public function __construct(PhotoCache $cache) { + $this->cache = $cache; } /** @@ -49,8 +52,7 @@ class ImageExportPlugin extends ServerPlugin { * @param Server $server * @return void */ - function initialize(Server $server) { - + public function initialize(Server $server) { $this->server = $server; $this->server->on('method:GET', [$this, 'httpGet'], 90); } @@ -60,9 +62,9 @@ class ImageExportPlugin extends ServerPlugin { * * @param RequestInterface $request * @param ResponseInterface $response - * @return bool|void + * @return bool */ - function httpGet(RequestInterface $request, ResponseInterface $response) { + public function httpGet(RequestInterface $request, ResponseInterface $response) { $queryParams = $request->getQueryParameters(); // TODO: in addition to photo we should also add logo some point in time @@ -70,6 +72,8 @@ class ImageExportPlugin extends ServerPlugin { return true; } + $size = isset($queryParams['size']) ? (int)$queryParams['size'] : -1; + $path = $request->getPath(); $node = $this->server->tree->getNodeForPath($path); @@ -85,85 +89,28 @@ class ImageExportPlugin extends ServerPlugin { $aclPlugin->checkPrivileges($path, '{DAV:}read'); } - if ($result = $this->getPhoto($node)) { - $response->setHeader('Content-Type', $result['Content-Type']); + // Fetch addressbook + $addressbookpath = explode('/', $path); + array_pop($addressbookpath); + $addressbookpath = implode('/', $addressbookpath); + /** @var AddressBook $addressbook */ + $addressbook = $this->server->tree->getNodeForPath($addressbookpath); + + $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate'); + $response->setHeader('Etag', $node->getETag() ); + $response->setHeader('Pragma', 'public'); + + try { + $file = $this->cache->get($addressbook->getResourceId(), $node->getName(), $size, $node); + $response->setHeader('Content-Type', $file->getMimeType()); $response->setHeader('Content-Disposition', 'attachment'); $response->setStatus(200); - $response->setBody($result['body']); - - // Returning false to break the event chain - return false; + $response->setBody($file->getContent()); + } catch (NotFoundException $e) { + $response->setStatus(404); } - return true; - } - function getPhoto(Card $node) { - // TODO: this is kind of expensive - load carddav data from database and parse it - // we might want to build up a cache one day - try { - $vObject = $this->readCard($node->get()); - if (!$vObject->PHOTO) { - return false; - } - - $photo = $vObject->PHOTO; - $type = $this->getType($photo); - - $val = $photo->getValue(); - if ($photo->getValueType() === 'URI') { - $parsed = \Sabre\URI\parse($val); - //only allow data:// - if ($parsed['scheme'] !== 'data') { - return false; - } - if (substr_count($parsed['path'], ';') === 1) { - list($type,) = explode(';', $parsed['path']); - } - $val = file_get_contents($val); - } - - $allowedContentTypes = [ - 'image/png', - 'image/jpeg', - 'image/gif', - ]; - - if(!in_array($type, $allowedContentTypes, true)) { - $type = 'application/octet-stream'; - } - - return [ - 'Content-Type' => $type, - 'body' => $val - ]; - } catch(\Exception $ex) { - $this->logger->logException($ex); - } return false; } - - private function readCard($cardData) { - return Reader::read($cardData); - } - - /** - * @param Binary $photo - * @return Parameter - */ - private function getType($photo) { - $params = $photo->parameters(); - if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) { - /** @var Parameter $typeParam */ - $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE']; - $type = $typeParam->getValue(); - - if (strpos($type, 'image/') === 0) { - return $type; - } else { - return 'image/' . strtolower($type); - } - } - return ''; - } } diff --git a/apps/dav/lib/CardDAV/PhotoCache.php b/apps/dav/lib/CardDAV/PhotoCache.php new file mode 100644 index 00000000000..c9625914263 --- /dev/null +++ b/apps/dav/lib/CardDAV/PhotoCache.php @@ -0,0 +1,246 @@ +<?php + +namespace OCA\DAV\CardDAV; + +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; +use OCP\Files\SimpleFS\ISimpleFile; +use OCP\Files\SimpleFS\ISimpleFolder; +use Sabre\CardDAV\Card; +use Sabre\VObject\Property\Binary; +use Sabre\VObject\Reader; + +class PhotoCache { + + /** @var IAppData $appData */ + protected $appData; + + /** + * PhotoCache constructor. + * + * @param IAppData $appData + */ + public function __construct(IAppData $appData) { + $this->appData = $appData; + } + + /** + * @param int $addressBookId + * @param string $cardUri + * @param int $size + * @param Card $card + * + * @return ISimpleFile + * @throws NotFoundException + */ + public function get($addressBookId, $cardUri, $size, Card $card) { + $folder = $this->getFolder($addressBookId, $cardUri); + + if ($this->isEmpty($folder)) { + $this->init($folder, $card); + } + + if (!$this->hasPhoto($folder)) { + throw new NotFoundException(); + } + + if ($size !== -1) { + $size = 2 ** ceil(log($size) / log(2)); + } + + return $this->getFile($folder, $size); + } + + /** + * @param ISimpleFolder $folder + * @return bool + */ + private function isEmpty(ISimpleFolder $folder) { + return $folder->getDirectoryListing() === []; + } + + /** + * @param ISimpleFolder $folder + * @param Card $card + */ + private function init(ISimpleFolder $folder, Card $card) { + $data = $this->getPhoto($card); + + if ($data === false) { + $folder->newFile('nophoto'); + } else { + switch ($data['Content-Type']) { + case 'image/png': + $ext = 'png'; + break; + case 'image/jpeg': + $ext = 'jpg'; + break; + case 'image/gif': + $ext = 'gif'; + break; + } + $file = $folder->newFile('photo.' . $ext); + $file->putContent($data['body']); + } + } + + private function hasPhoto(ISimpleFolder $folder) { + return !$folder->fileExists('nophoto'); + } + + private function getFile(ISimpleFolder $folder, $size) { + $ext = $this->getExtension($folder); + + if ($size === -1) { + $path = 'photo.' . $ext; + } else { + $path = 'photo.' . $size . '.' . $ext; + } + + try { + $file = $folder->getFile($path); + } catch (NotFoundException $e) { + if ($size <= 0) { + throw new NotFoundException; + } + + $photo = new \OC_Image(); + /** @var ISimpleFile $file */ + $file = $folder->getFile('photo.' . $ext); + $photo->loadFromData($file->getContent()); + + $ratio = $photo->width() / $photo->height(); + if ($ratio < 1) { + $ratio = 1/$ratio; + } + $size = (int)($size * $ratio); + + if ($size !== -1) { + $photo->resize($size); + } + try { + $file = $folder->newFile($path); + $file->putContent($photo->data()); + } catch (NotPermittedException $e) { + + } + } + + return $file; + } + + + /** + * @param int $addressBookId + * @param string $cardUri + * @return ISimpleFolder + */ + private function getFolder($addressBookId, $cardUri) { + $hash = md5($addressBookId . ' ' . $cardUri); + try { + return $this->appData->getFolder($hash); + } catch (NotFoundException $e) { + return $this->appData->newFolder($hash); + } + } + + /** + * Get the extension of the avatar. If there is no avatar throw Exception + * + * @param ISimpleFolder $folder + * @return string + * @throws NotFoundException + */ + private function getExtension(ISimpleFolder $folder) { + if ($folder->fileExists('photo.jpg')) { + return 'jpg'; + } elseif ($folder->fileExists('photo.png')) { + return 'png'; + } elseif ($folder->fileExists('photo.gif')) { + return 'gif'; + } + throw new NotFoundException; + } + + private function getPhoto(Card $node) { + try { + $vObject = $this->readCard($node->get()); + if (!$vObject->PHOTO) { + return false; + } + + $photo = $vObject->PHOTO; + $type = $this->getType($photo); + + $val = $photo->getValue(); + if ($photo->getValueType() === 'URI') { + $parsed = \Sabre\URI\parse($val); + //only allow data:// + if ($parsed['scheme'] !== 'data') { + return false; + } + if (substr_count($parsed['path'], ';') === 1) { + list($type,) = explode(';', $parsed['path']); + } + $val = file_get_contents($val); + } + + $allowedContentTypes = [ + 'image/png', + 'image/jpeg', + 'image/gif', + ]; + + if(!in_array($type, $allowedContentTypes, true)) { + $type = 'application/octet-stream'; + } + + return [ + 'Content-Type' => $type, + 'body' => $val + ]; + } catch(\Exception $ex) { + + } + return false; + } + + /** + * @param string $cardData + * @return \Sabre\VObject\Document + */ + private function readCard($cardData) { + return Reader::read($cardData); + } + + /** + * @param Binary $photo + * @return string + */ + private function getType(Binary $photo) { + $params = $photo->parameters(); + if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) { + /** @var Parameter $typeParam */ + $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE']; + $type = $typeParam->getValue(); + + if (strpos($type, 'image/') === 0) { + return $type; + } else { + return 'image/' . strtolower($type); + } + } + return ''; + } + + /** + * @param int $addressBookId + * @param string $cardUri + */ + public function delete($addressBookId, $cardUri) { + $folder = $this->getFolder($addressBookId, $cardUri); + $folder->delete(); + } +} diff --git a/apps/dav/lib/Connector/PublicAuth.php b/apps/dav/lib/Connector/PublicAuth.php index 94fa370a873..5fca8d5c020 100644 --- a/apps/dav/lib/Connector/PublicAuth.php +++ b/apps/dav/lib/Connector/PublicAuth.php @@ -96,7 +96,7 @@ class PublicAuth extends AbstractBasic { // check if the share is password protected if ($share->getPassword() !== null) { - if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK || $share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) { if ($this->shareManager->checkPassword($share, $password)) { return true; } else if ($this->session->exists('public_link_authenticated') diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index 435f47ee561..cb5a2ab8123 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -30,9 +30,11 @@ */ namespace OCA\DAV\Connector\Sabre; +use OC\Files\View; use OCA\DAV\Connector\Sabre\Exception\Forbidden; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCP\Files\FileInfo; use OCP\Files\ForbiddenException; use OCP\Files\InvalidPathException; use OCP\Files\StorageNotAvailableException; @@ -76,7 +78,7 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node * @param ObjectTree|null $tree * @param \OCP\Share\IManager $shareManager */ - public function __construct($view, $info, $tree = null, $shareManager = null) { + public function __construct(View $view, FileInfo $info, $tree = null, $shareManager = null) { parent::__construct($view, $info, $shareManager); $this->tree = $tree; } diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 4c426dd1052..30eeaaacf63 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -343,6 +343,9 @@ class FilesPlugin extends ServerPlugin { $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) { return $node->getSize(); }); + $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) { + return $node->getFileInfo()->getMountPoint()->getMountType(); + }); } if ($node instanceof \OCA\DAV\Connector\Sabre\Node) { @@ -383,10 +386,6 @@ class FilesPlugin extends ServerPlugin { return $node->getSize(); }); } - - $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) { - return $node->getFileInfo()->getMountPoint()->getMountType(); - }); } /** diff --git a/apps/dav/lib/Connector/Sabre/Node.php b/apps/dav/lib/Connector/Sabre/Node.php index 3e2204cf661..06933f53e76 100644 --- a/apps/dav/lib/Connector/Sabre/Node.php +++ b/apps/dav/lib/Connector/Sabre/Node.php @@ -34,7 +34,9 @@ namespace OCA\DAV\Connector\Sabre; use OC\Files\Mount\MoveableMount; +use OC\Files\View; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; +use OCP\Files\FileInfo; use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IManager; @@ -77,7 +79,7 @@ abstract class Node implements \Sabre\DAV\INode { * @param \OCP\Files\FileInfo $info * @param IManager $shareManager */ - public function __construct($view, $info, IManager $shareManager = null) { + public function __construct(View $view, FileInfo $info, IManager $shareManager = null) { $this->fileView = $view; $this->path = $this->fileView->getRelativePath($info->getPath()); $this->info = $info; diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 5b0715b0dad..df5b0ea05b6 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -30,6 +30,7 @@ namespace OCA\DAV; use OCA\DAV\CalDAV\Schedule\IMipPlugin; use OCA\DAV\CardDAV\ImageExportPlugin; +use OCA\DAV\CardDAV\PhotoCache; use OCA\DAV\Comments\CommentsPlugin; use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; @@ -137,7 +138,7 @@ class Server { // addressbook plugins $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); $this->server->addPlugin(new VCFExportPlugin()); - $this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger())); + $this->server->addPlugin(new ImageExportPlugin(new PhotoCache(\OC::$server->getAppDataDir('dav-photocache')))); // system tags plugins $this->server->addPlugin(new SystemTagPlugin( diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index c108432d65b..f3a271a2db2 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -34,9 +34,12 @@ use OCA\DAV\Connector\Sabre\Principal; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\IL10N; +use OCP\IUserManager; use Sabre\DAV\PropPatch; use Sabre\VObject\Component\VCard; use Sabre\VObject\Property\Text; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; use Test\TestCase; /** @@ -54,9 +57,12 @@ class CardDavBackendTest extends TestCase { /** @var Principal | \PHPUnit_Framework_MockObject_MockObject */ private $principal; - /** @var \OCP\IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ private $userManager; + /** @var EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $dispatcher; + /** @var IDBConnection */ private $db; @@ -73,9 +79,7 @@ class CardDavBackendTest extends TestCase { public function setUp() { parent::setUp(); - $this->userManager = $this->getMockBuilder('OCP\IUserManager') - ->disableOriginalConstructor() - ->getMock(); + $this->userManager = $this->createMock(IUserManager::class); $this->principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal') ->disableOriginalConstructor() ->setMethods(['getPrincipalByPath', 'getGroupMembership']) @@ -88,11 +92,11 @@ class CardDavBackendTest extends TestCase { $this->principal->method('getGroupMembership') ->withAnyParameters() ->willReturn([self::UNIT_TEST_GROUP]); + $this->dispatcher = $this->createMock(EventDispatcherInterface::class); $this->db = \OC::$server->getDatabaseConnection(); - $this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, null); - + $this->backend = new CardDavBackend($this->db, $this->principal, $this->userManager, $this->dispatcher); // start every test with a empty cards_properties and cards table $query = $this->db->getQueryBuilder(); $query->delete('cards_properties')->execute(); @@ -172,7 +176,7 @@ class CardDavBackendTest extends TestCase { /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backend */ $backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties', 'purgeProperties'])->getMock(); // create a new address book @@ -185,6 +189,16 @@ class CardDavBackendTest extends TestCase { // updateProperties is expected twice, once for createCard and once for updateCard $backend->expects($this->at(0))->method('updateProperties')->with($bookId, $uri, ''); $backend->expects($this->at(1))->method('updateProperties')->with($bookId, $uri, '***'); + + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::createCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri && + $e->getArgument('cardData') === ''; + })); + // create a card $backend->createCard($bookId, $uri, ''); @@ -203,11 +217,28 @@ class CardDavBackendTest extends TestCase { $this->assertArrayHasKey('size', $card); $this->assertEquals('', $card['carddata']); + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri && + $e->getArgument('cardData') === '***'; + })); + // update the card $backend->updateCard($bookId, $uri, '***'); $card = $backend->getCard($bookId, $uri); $this->assertEquals('***', $card['carddata']); + // Expect event + $this->dispatcher->expects($this->at(0)) + ->method('dispatch') + ->with('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', $this->callback(function(GenericEvent $e) use ($bookId, $uri) { + return $e->getArgument('addressBookId') === $bookId && + $e->getArgument('cardUri') === $uri; + })); + // delete the card $backend->expects($this->once())->method('purgeProperties')->with($bookId, $card['id']); $backend->deleteCard($bookId, $uri); @@ -218,7 +249,7 @@ class CardDavBackendTest extends TestCase { public function testMultiCard() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties'])->getMock(); // create a new address book @@ -264,7 +295,7 @@ class CardDavBackendTest extends TestCase { public function testDeleteWithoutCard() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods([ 'getCardId', 'addChange', @@ -304,7 +335,7 @@ class CardDavBackendTest extends TestCase { public function testSyncSupport() { $this->backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['updateProperties'])->getMock(); // create a new address book @@ -363,7 +394,7 @@ class CardDavBackendTest extends TestCase { $cardId = 2; $backend = $this->getMockBuilder(CardDavBackend::class) - ->setConstructorArgs([$this->db, $this->principal, $this->userManager, null]) + ->setConstructorArgs([$this->db, $this->principal, $this->userManager, $this->dispatcher]) ->setMethods(['getCardId'])->getMock(); $backend->expects($this->any())->method('getCardId')->willReturn($cardId); diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php index fc4be1433fe..e773e41ba5e 100644 --- a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php +++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php @@ -25,9 +25,13 @@ namespace OCA\DAV\Tests\unit\CardDAV; +use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\ImageExportPlugin; -use OCP\ILogger; +use OCA\DAV\CardDAV\PhotoCache; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFile; use Sabre\CardDAV\Card; +use Sabre\DAV\Node; use Sabre\DAV\Server; use Sabre\DAV\Tree; use Sabre\HTTP\RequestInterface; @@ -36,32 +40,32 @@ use Test\TestCase; class ImageExportPluginTest extends TestCase { - /** @var ResponseInterface | \PHPUnit_Framework_MockObject_MockObject */ + /** @var ResponseInterface|\PHPUnit_Framework_MockObject_MockObject */ private $response; - /** @var RequestInterface | \PHPUnit_Framework_MockObject_MockObject */ + /** @var RequestInterface|\PHPUnit_Framework_MockObject_MockObject */ private $request; - /** @var ImageExportPlugin | \PHPUnit_Framework_MockObject_MockObject */ + /** @var ImageExportPlugin|\PHPUnit_Framework_MockObject_MockObject */ private $plugin; /** @var Server */ private $server; - /** @var Tree | \PHPUnit_Framework_MockObject_MockObject */ + /** @var Tree|\PHPUnit_Framework_MockObject_MockObject */ private $tree; - /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */ - private $logger; + /** @var PhotoCache|\PHPUnit_Framework_MockObject_MockObject */ + private $cache; function setUp() { parent::setUp(); - $this->request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')->getMock(); - $this->response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')->getMock(); - $this->server = $this->getMockBuilder('Sabre\DAV\Server')->getMock(); - $this->tree = $this->getMockBuilder('Sabre\DAV\Tree')->disableOriginalConstructor()->getMock(); + $this->request = $this->createMock(RequestInterface::class); + $this->response = $this->createMock(ResponseInterface::class); + $this->server = $this->createMock(Server::class); + $this->tree = $this->createMock(Tree::class); $this->server->tree = $this->tree; - $this->logger = $this->getMockBuilder('\OCP\ILogger')->getMock(); + $this->cache = $this->createMock(PhotoCache::class); - $this->plugin = $this->getMockBuilder('OCA\DAV\CardDAV\ImageExportPlugin') + $this->plugin = $this->getMockBuilder(ImageExportPlugin::class) ->setMethods(['getPhoto']) - ->setConstructorArgs([$this->logger]) + ->setConstructorArgs([$this->cache]) ->getMock(); $this->plugin->initialize($this->server); } @@ -84,112 +88,115 @@ class ImageExportPluginTest extends TestCase { ]; } - public function testNotACard() { - $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); - $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); - $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn(null); - $result = $this->plugin->httpGet($this->request, $this->response); - $this->assertTrue($result); - } - - /** - * @dataProvider providesCardWithOrWithoutPhoto - * @param bool $expected - * @param array $getPhotoResult - */ - public function testCardWithOrWithoutPhoto($expected, $getPhotoResult) { - $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); - $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); + public function testNoCard() { + $this->request->method('getQueryParameters') + ->willReturn([ + 'photo' + ]); + $this->request->method('getPath') + ->willReturn('user/book/card'); - $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); - $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn($card); - - $this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult); - - if (!$expected) { - $this->response - ->expects($this->at(0)) - ->method('setHeader') - ->with('Content-Type', $getPhotoResult['Content-Type']); - $this->response - ->expects($this->at(1)) - ->method('setHeader') - ->with('Content-Disposition', 'attachment'); - $this->response - ->expects($this->once()) - ->method('setStatus'); - $this->response - ->expects($this->once()) - ->method('setBody'); - } + $node = $this->createMock(Node::class); + $this->tree->method('getNodeForPath') + ->with('user/book/card') + ->willReturn($node); $result = $this->plugin->httpGet($this->request, $this->response); - $this->assertEquals($expected, $result); + $this->assertTrue($result); } - public function providesCardWithOrWithoutPhoto() { + public function dataTestCard() { return [ - [true, null], - [false, ['Content-Type' => 'image/jpeg', 'body' => '1234']], + [null, false], + [null, true], + [32, false], + [32, true], ]; } /** - * @dataProvider providesPhotoData - * @param $expected - * @param $cardData + * @dataProvider dataTestCard + * + * @param $size + * @param bool $photo */ - public function testGetPhoto($expected, $cardData) { - /** @var Card | \PHPUnit_Framework_MockObject_MockObject $card */ - $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); - $card->expects($this->once())->method('get')->willReturn($cardData); + public function testCard($size, $photo) { + $query = ['photo' => null]; + if ($size !== null) { + $query['size'] = $size; + } - $this->plugin = new ImageExportPlugin($this->logger); - $this->plugin->initialize($this->server); + $this->request->method('getQueryParameters') + ->willReturn($query); + $this->request->method('getPath') + ->willReturn('user/book/card'); + + $card = $this->createMock(Card::class); + $card->method('getETag') + ->willReturn('"myEtag"'); + $card->method('getName') + ->willReturn('card'); + $book = $this->createMock(AddressBook::class); + $book->method('getResourceId') + ->willReturn(1); + + $this->tree->method('getNodeForPath') + ->willReturnCallback(function($path) use ($card, $book) { + if ($path === 'user/book/card') { + return $card; + } else if ($path === 'user/book') { + return $book; + } + $this->fail(); + }); + + $this->response->expects($this->at(0)) + ->method('setHeader') + ->with('Cache-Control', 'private, max-age=3600, must-revalidate'); + $this->response->expects($this->at(1)) + ->method('setHeader') + ->with('Etag', '"myEtag"'); + $this->response->expects($this->at(2)) + ->method('setHeader') + ->with('Pragma', 'public'); + + $size = $size === null ? -1 : $size; + + if ($photo) { + $file = $this->createMock(ISimpleFile::class); + $file->method('getMimeType') + ->willReturn('imgtype'); + $file->method('getContent') + ->willReturn('imgdata'); + + $this->cache->method('get') + ->with(1, 'card', $size, $card) + ->willReturn($file); + + $this->response->expects($this->at(3)) + ->method('setHeader') + ->with('Content-Type', 'imgtype'); + $this->response->expects($this->at(4)) + ->method('setHeader') + ->with('Content-Disposition', 'attachment'); - $result = $this->plugin->getPhoto($card); - $this->assertEquals($expected, $result); - } + $this->response->expects($this->once()) + ->method('setStatus') + ->with(200); + $this->response->expects($this->once()) + ->method('setBody') + ->with('imgdata'); + + } else { + $this->cache->method('get') + ->with(1, 'card', $size, $card) + ->willThrowException(new NotFoundException()); + $this->response->expects($this->once()) + ->method('setStatus') + ->with(404); + } - public function providesPhotoData() { - return [ - 'empty vcard' => [ - false, - '' - ], - 'vcard without PHOTO' => [ - false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n" - ], - 'vcard 3 with PHOTO' => [ - [ - 'Content-Type' => 'image/jpeg', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n" - ], - 'vcard 3 with PHOTO URL' => [ - false, - "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO' => [ - [ - 'Content-Type' => 'image/jpeg', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO URL' => [ - false, - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n" - ], - 'vcard 4 with PHOTO AND INVALID MIMEtYPE' => [ - [ - 'Content-Type' => 'application/octet-stream', - 'body' => '12345' - ], - "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/svg;base64,MTIzNDU=\r\nEND:VCARD\r\n" - ], - ]; + $result = $this->plugin->httpGet($this->request, $this->response); + $this->assertFalse($result); } } diff --git a/apps/dav/tests/unit/Connector/PublicAuthTest.php b/apps/dav/tests/unit/Connector/PublicAuthTest.php index 47e1a5be7b8..41cfc0f8ceb 100644 --- a/apps/dav/tests/unit/Connector/PublicAuthTest.php +++ b/apps/dav/tests/unit/Connector/PublicAuthTest.php @@ -33,7 +33,7 @@ use OCP\Share\IManager; * Class PublicAuthTest * * @group DB - * + * * @package OCA\DAV\Tests\unit\Connector */ class PublicAuthTest extends \Test\TestCase { @@ -163,6 +163,28 @@ class PublicAuthTest extends \Test\TestCase { $this->assertTrue($result); } + public function testSharePasswordMailValidPassword() { + $share = $this->getMockBuilder('OCP\Share\IShare') + ->disableOriginalConstructor() + ->getMock(); + $share->method('getPassword')->willReturn('password'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_EMAIL); + + $this->shareManager->expects($this->once()) + ->method('getShareByToken') + ->willReturn($share); + + $this->shareManager->expects($this->once()) + ->method('checkPassword')->with( + $this->equalTo($share), + $this->equalTo('password') + )->willReturn(true); + + $result = $this->invokePrivate($this->auth, 'validateUserPass', ['username', 'password']); + + $this->assertTrue($result); + } + public function testSharePasswordLinkValidSession() { $share = $this->getMockBuilder('OCP\Share\IShare') ->disableOriginalConstructor() @@ -214,4 +236,32 @@ class PublicAuthTest extends \Test\TestCase { $this->assertFalse($result); } + + + public function testSharePasswordMailInvalidSession() { + $share = $this->getMockBuilder('OCP\Share\IShare') + ->disableOriginalConstructor() + ->getMock(); + $share->method('getPassword')->willReturn('password'); + $share->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_EMAIL); + $share->method('getId')->willReturn('42'); + + $this->shareManager->expects($this->once()) + ->method('getShareByToken') + ->willReturn($share); + + $this->shareManager->method('checkPassword') + ->with( + $this->equalTo($share), + $this->equalTo('password') + )->willReturn(false); + + $this->session->method('exists')->with('public_link_authenticated')->willReturn(true); + $this->session->method('get')->with('public_link_authenticated')->willReturn('43'); + + $result = $this->invokePrivate($this->auth, 'validateUserPass', ['username', 'password']); + + $this->assertFalse($result); + } + } diff --git a/apps/encryption/l10n/pt_BR.js b/apps/encryption/l10n/pt_BR.js index e0954a6bc1f..4d768482881 100644 --- a/apps/encryption/l10n/pt_BR.js +++ b/apps/encryption/l10n/pt_BR.js @@ -29,11 +29,11 @@ OC.L10N.register( "Missing Signature" : "Assinatura faltante", "one-time password for server-side-encryption" : "senha de uso único para criptografia do lado do servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser descriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", "Cheers!" : "Saudações!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encrypt the home storage" : "Criptografar a pasta de armazenamento home", diff --git a/apps/encryption/l10n/pt_BR.json b/apps/encryption/l10n/pt_BR.json index 85982d7769d..9cebb7d437e 100644 --- a/apps/encryption/l10n/pt_BR.json +++ b/apps/encryption/l10n/pt_BR.json @@ -27,11 +27,11 @@ "Missing Signature" : "Assinatura faltante", "one-time password for server-side-encryption" : "senha de uso único para criptografia do lado do servidor", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser descriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", - "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", "Cheers!" : "Saudações!", - "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", + "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encrypt the home storage" : "Criptografar a pasta de armazenamento home", diff --git a/apps/federatedfilesharing/l10n/cs.js b/apps/federatedfilesharing/l10n/cs.js index 0990c907905..580b8ffac6f 100644 --- a/apps/federatedfilesharing/l10n/cs.js +++ b/apps/federatedfilesharing/l10n/cs.js @@ -39,11 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #Nextcloud sdruženého cloud ID", "Federated Cloud Sharing" : "Propojené cloudové sdílení", "Open documentation" : "Otevřít dokumentaci", + "Adjust how people can share between servers." : "Upravte, jak mohou lidé mezi servery sdílet.", "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery", "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů", + "Search global and public address book for users and let local users publish their data" : "Hledat uživatele v globálním a veřejném adresáři a dovolit místním uživatelům publikovat jejich údaje", "Allow users to publish their data to a global and public address book" : "Povolit uživatelům publikování jejich dat do globálního a sdíleného adresáře", "Federated Cloud" : "Sdružený cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Můžete sdílet s kýmkoliv, kdo používá Nextcloud, ownCloud, nebo Pydio! Jen zadejte jejich sdružené cloud ID do dialogu pro sdílení. Vypadá jako person@cloud.example.com", "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:", + "Share it so your friends can share files with you:" : "Nasdílejte to, aby mohli vaši přátelé sdílet soubory s vámi:", "Add to your website" : "Přidat na svou webovou stránku", "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud", "HTML Code:" : "HTML kód:", diff --git a/apps/federatedfilesharing/l10n/cs.json b/apps/federatedfilesharing/l10n/cs.json index a9fdf3405f3..00085eb0d23 100644 --- a/apps/federatedfilesharing/l10n/cs.json +++ b/apps/federatedfilesharing/l10n/cs.json @@ -37,11 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #Nextcloud sdruženého cloud ID", "Federated Cloud Sharing" : "Propojené cloudové sdílení", "Open documentation" : "Otevřít dokumentaci", + "Adjust how people can share between servers." : "Upravte, jak mohou lidé mezi servery sdílet.", "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery", "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů", + "Search global and public address book for users and let local users publish their data" : "Hledat uživatele v globálním a veřejném adresáři a dovolit místním uživatelům publikovat jejich údaje", "Allow users to publish their data to a global and public address book" : "Povolit uživatelům publikování jejich dat do globálního a sdíleného adresáře", "Federated Cloud" : "Sdružený cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Můžete sdílet s kýmkoliv, kdo používá Nextcloud, ownCloud, nebo Pydio! Jen zadejte jejich sdružené cloud ID do dialogu pro sdílení. Vypadá jako person@cloud.example.com", "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:", + "Share it so your friends can share files with you:" : "Nasdílejte to, aby mohli vaši přátelé sdílet soubory s vámi:", "Add to your website" : "Přidat na svou webovou stránku", "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud", "HTML Code:" : "HTML kód:", diff --git a/apps/federatedfilesharing/l10n/de.js b/apps/federatedfilesharing/l10n/de.js index 37a9fcb3a47..a7defc5c4a9 100644 --- a/apps/federatedfilesharing/l10n/de.js +++ b/apps/federatedfilesharing/l10n/de.js @@ -43,7 +43,7 @@ OC.L10N.register( "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", - "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", + "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuch zu veröffentlichen", "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Gebe einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", diff --git a/apps/federatedfilesharing/l10n/de.json b/apps/federatedfilesharing/l10n/de.json index 62fb5fc88b6..28d6c932133 100644 --- a/apps/federatedfilesharing/l10n/de.json +++ b/apps/federatedfilesharing/l10n/de.json @@ -41,7 +41,7 @@ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", - "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", + "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuch zu veröffentlichen", "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Gebe einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", diff --git a/apps/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js index 42606db4ee7..8a6da901c51 100644 --- a/apps/federatedfilesharing/l10n/de_DE.js +++ b/apps/federatedfilesharing/l10n/de_DE.js @@ -43,7 +43,7 @@ OC.L10N.register( "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", - "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", + "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuch zu veröffentlichen", "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Geben Sie einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:", diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json index 47763ecd172..58d62ee030d 100644 --- a/apps/federatedfilesharing/l10n/de_DE.json +++ b/apps/federatedfilesharing/l10n/de_DE.json @@ -41,7 +41,7 @@ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", - "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", + "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuch zu veröffentlichen", "Federated Cloud" : "Federated Cloud", "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Geben Sie einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:", diff --git a/apps/federatedfilesharing/l10n/es.js b/apps/federatedfilesharing/l10n/es.js index 1cd41e22914..fae8b6380fa 100644 --- a/apps/federatedfilesharing/l10n/es.js +++ b/apps/federatedfilesharing/l10n/es.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #Nextcloud", "Federated Cloud Sharing" : "Compartido en Cloud Federado", "Open documentation" : "Documentación abierta", + "Adjust how people can share between servers." : "Ajusta cómo la gente puede compartir entre servidores.", "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores", "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores", "Search global and public address book for users and let local users publish their data" : "Buscar libreta de direcciones global y pública para usuarios y permitir a los usuarios locales publicar su información", "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar su información en la libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puedes compartir con cualquiera que use Nextcloud, ownCloud o Pydio! Simplemente, pon su ID de nube federada en el diálogo de compartir. Es algo como person@cloud.example.com", "Your Federated Cloud ID:" : "Su ID Nube Federada:", + "Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:", "Add to your website" : "Añadir a su sitio web", "Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", diff --git a/apps/federatedfilesharing/l10n/es.json b/apps/federatedfilesharing/l10n/es.json index 36a6206e890..b81409477b5 100644 --- a/apps/federatedfilesharing/l10n/es.json +++ b/apps/federatedfilesharing/l10n/es.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #Nextcloud", "Federated Cloud Sharing" : "Compartido en Cloud Federado", "Open documentation" : "Documentación abierta", + "Adjust how people can share between servers." : "Ajusta cómo la gente puede compartir entre servidores.", "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores", "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores", "Search global and public address book for users and let local users publish their data" : "Buscar libreta de direcciones global y pública para usuarios y permitir a los usuarios locales publicar su información", "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar su información en la libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puedes compartir con cualquiera que use Nextcloud, ownCloud o Pydio! Simplemente, pon su ID de nube federada en el diálogo de compartir. Es algo como person@cloud.example.com", "Your Federated Cloud ID:" : "Su ID Nube Federada:", + "Share it so your friends can share files with you:" : "Compártelo para que tus amigos puedan compartir archivos contigo:", "Add to your website" : "Añadir a su sitio web", "Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js index cb8fd825905..a82c1d28753 100644 --- a/apps/federatedfilesharing/l10n/fr.js +++ b/apps/federatedfilesharing/l10n/fr.js @@ -45,6 +45,7 @@ OC.L10N.register( "Search global and public address book for users and let local users publish their data" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs et laisser les utilisateurs publier leurs données", "Allow users to publish their data to a global and public address book" : "Autoriser les utilisateurs à publier leurs données dans un carnet d'adresse global et public", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec n'importe qui qui utilise Nextcloud, ownCloud ou Pydio ! Renseignez simplement leur Federated Cloud ID dans la boîte de dialogue de partage. Cela ressemble à person@cloud.example.com", "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :", "Add to your website" : "Ajouter à votre site web", "Share with me via Nextcloud" : "Partagez avec moi via Nextcloud", diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json index f556159c96d..d21d4dc6196 100644 --- a/apps/federatedfilesharing/l10n/fr.json +++ b/apps/federatedfilesharing/l10n/fr.json @@ -43,6 +43,7 @@ "Search global and public address book for users and let local users publish their data" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs et laisser les utilisateurs publier leurs données", "Allow users to publish their data to a global and public address book" : "Autoriser les utilisateurs à publier leurs données dans un carnet d'adresse global et public", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec n'importe qui qui utilise Nextcloud, ownCloud ou Pydio ! Renseignez simplement leur Federated Cloud ID dans la boîte de dialogue de partage. Cela ressemble à person@cloud.example.com", "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :", "Add to your website" : "Ajouter à votre site web", "Share with me via Nextcloud" : "Partagez avec moi via Nextcloud", diff --git a/apps/federatedfilesharing/l10n/nb.js b/apps/federatedfilesharing/l10n/nb.js index f9b8907b49b..20edbf22fb3 100644 --- a/apps/federatedfilesharing/l10n/nb.js +++ b/apps/federatedfilesharing/l10n/nb.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky", "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "Open documentation" : "Åpne dokumentasjonen", + "Adjust how people can share between servers." : "Juster hvordan folk kan dele mellom tjenere.", "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne tjeneren sender delinger til andre tjenere", "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne tjeneren mottar delinger fra andre tjenere", "Search global and public address book for users and let local users publish their data" : "Søk i verdensomspennende og offentlig adressebok for brukere og la lokale brukere offentliggjøre deres data", "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker Nextcloud, ownCloud eller Pydio! Bare putt deres federerte sky-ID i delingsdialogvinduet. Det ser ut som person.sky.eksempel.no", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", + "Share it so your friends can share files with you:" : "Del den slik at venner kan dele filer med deg:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", diff --git a/apps/federatedfilesharing/l10n/nb.json b/apps/federatedfilesharing/l10n/nb.json index 4da7e25bfe7..711905c7d19 100644 --- a/apps/federatedfilesharing/l10n/nb.json +++ b/apps/federatedfilesharing/l10n/nb.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky", "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "Open documentation" : "Åpne dokumentasjonen", + "Adjust how people can share between servers." : "Juster hvordan folk kan dele mellom tjenere.", "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne tjeneren sender delinger til andre tjenere", "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne tjeneren mottar delinger fra andre tjenere", "Search global and public address book for users and let local users publish their data" : "Søk i verdensomspennende og offentlig adressebok for brukere og la lokale brukere offentliggjøre deres data", "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker Nextcloud, ownCloud eller Pydio! Bare putt deres federerte sky-ID i delingsdialogvinduet. Det ser ut som person.sky.eksempel.no", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", + "Share it so your friends can share files with you:" : "Del den slik at venner kan dele filer med deg:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js index 019ffba9121..634c72f1895 100644 --- a/apps/federatedfilesharing/l10n/pl.js +++ b/apps/federatedfilesharing/l10n/pl.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Podziel się ze mną przez mój ID #Nextcloud Stowarzyszonej Chmury", "Federated Cloud Sharing" : "Dzielenie się ze Stowarzyszoną Chmurą", "Open documentation" : "Otwórz dokumentację", + "Adjust how people can share between servers." : "Dostosuj ustawienia współdzielenia między serwerami.", "Allow users on this server to send shares to other servers" : "Zezwalaj użytkownikom na tym serwerze wysłać udostępnienia do innych serwerów", "Allow users on this server to receive shares from other servers" : "Zezwalaj użytkownikom na tym serwerze do otrzymania udostępnień z innych serwerów", "Search global and public address book for users and let local users publish their data" : "Szukaj użytkowników w globalnej i publicznej książce adresowej i pozwól lokalnym użytkownikom na publikowanie swoich danych", "Allow users to publish their data to a global and public address book" : "Pozwól użytkownikom na publikację ich danych do globalnej i publicznej książki adresowej", "Federated Cloud" : "Stowarzyszona Chmura", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz współdzielić z każdym kto używa Nextclouda, ownClouda lub Pydio. Wystarczy, że wpiszesz ich ID chmury stowarzyszonej w pole współdzielenia. Wygląda jak osoba@przyklad.chmury.com", "Your Federated Cloud ID:" : "Twoje ID Stowarzyszonej Chmury:", + "Share it so your friends can share files with you:" : "Współdziel to, aby twoi przyjaciele mogli współdzielić pliki z tobą:", "Add to your website" : "Dodaj do swojej strony", "Share with me via Nextcloud" : "Podziel się ze mną poprzez Nextcloud", "HTML Code:" : "Kod HTML:", diff --git a/apps/federatedfilesharing/l10n/pl.json b/apps/federatedfilesharing/l10n/pl.json index af30ede91c5..6178a539f09 100644 --- a/apps/federatedfilesharing/l10n/pl.json +++ b/apps/federatedfilesharing/l10n/pl.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Podziel się ze mną przez mój ID #Nextcloud Stowarzyszonej Chmury", "Federated Cloud Sharing" : "Dzielenie się ze Stowarzyszoną Chmurą", "Open documentation" : "Otwórz dokumentację", + "Adjust how people can share between servers." : "Dostosuj ustawienia współdzielenia między serwerami.", "Allow users on this server to send shares to other servers" : "Zezwalaj użytkownikom na tym serwerze wysłać udostępnienia do innych serwerów", "Allow users on this server to receive shares from other servers" : "Zezwalaj użytkownikom na tym serwerze do otrzymania udostępnień z innych serwerów", "Search global and public address book for users and let local users publish their data" : "Szukaj użytkowników w globalnej i publicznej książce adresowej i pozwól lokalnym użytkownikom na publikowanie swoich danych", "Allow users to publish their data to a global and public address book" : "Pozwól użytkownikom na publikację ich danych do globalnej i publicznej książki adresowej", "Federated Cloud" : "Stowarzyszona Chmura", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Możesz współdzielić z każdym kto używa Nextclouda, ownClouda lub Pydio. Wystarczy, że wpiszesz ich ID chmury stowarzyszonej w pole współdzielenia. Wygląda jak osoba@przyklad.chmury.com", "Your Federated Cloud ID:" : "Twoje ID Stowarzyszonej Chmury:", + "Share it so your friends can share files with you:" : "Współdziel to, aby twoi przyjaciele mogli współdzielić pliki z tobą:", "Add to your website" : "Dodaj do swojej strony", "Share with me via Nextcloud" : "Podziel się ze mną poprzez Nextcloud", "HTML Code:" : "Kod HTML:", diff --git a/apps/federatedfilesharing/l10n/pt_BR.js b/apps/federatedfilesharing/l10n/pt_BR.js index 13d1b1641e3..eb83f18e8a8 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.js +++ b/apps/federatedfilesharing/l10n/pt_BR.js @@ -29,10 +29,10 @@ OC.L10N.register( "File is already shared with %s" : "O arquivo já é compartilhado com %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartilhamento %s falhou, não foi possível encontrar %s. Talvez o servidor esteja inacessível ou esteja sendo utilizado um certificado de auto-assinatura", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", - "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Voce recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", - "You received \"%3$s\" as a remote share from %1$s" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s", - "You received {share} as a remote share from {user}" : "Voce recebeu {share} como um compartilhamento remoto de {user}", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Você recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s", + "You received {share} as a remote share from {user}" : "Você recebeu {share} como um compartilhamento remoto de {user}", "Accept" : "Aceitar", "Decline" : "Rejeitar", "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud, veja %s", diff --git a/apps/federatedfilesharing/l10n/pt_BR.json b/apps/federatedfilesharing/l10n/pt_BR.json index 108c8f4fb25..f9e43729086 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.json +++ b/apps/federatedfilesharing/l10n/pt_BR.json @@ -27,10 +27,10 @@ "File is already shared with %s" : "O arquivo já é compartilhado com %s", "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Compartilhamento %s falhou, não foi possível encontrar %s. Talvez o servidor esteja inacessível ou esteja sendo utilizado um certificado de auto-assinatura", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", - "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Voce recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", - "You received \"%3$s\" as a remote share from %1$s" : "Voce recebeu \"%3$s\" como um compartilhamento remoto de %1$s", - "You received {share} as a remote share from {user}" : "Voce recebeu {share} como um compartilhamento remoto de {user}", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s ( em nome de %2$s )", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Você recebeu {share} como um compartilhamento remoto do {user} (em nome de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Você recebeu \"%3$s\" como um compartilhamento remoto de %1$s", + "You received {share} as a remote share from {user}" : "Você recebeu {share} como um compartilhamento remoto de {user}", "Accept" : "Aceitar", "Decline" : "Rejeitar", "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud, veja %s", diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js index 4931870f4b1..961a085525a 100644 --- a/apps/federatedfilesharing/l10n/ru.js +++ b/apps/federatedfilesharing/l10n/ru.js @@ -39,12 +39,15 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ", "Federated Cloud Sharing" : "Федерация облачных хранилищ", "Open documentation" : "Открыть документацию", + "Adjust how people can share between servers." : "Настройте общий доступ между серверами.", "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", "Search global and public address book for users and let local users publish their data" : "Поиск пользователей в глобальной и общедоступной адресной книге и резрешение публикации своих данных локальным пользователям ", "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можно поделиться с любым пользователем Nextcloud, ownCloud или Pydio! Просто введите его идентификатор федеративного облачного хранилища в диалоге предоставления общего доступа. Идектификатор указывается в виде «person@cloud.example.com».", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", + "Share it so your friends can share files with you:" : "Сообщите его друзьям, что бы они могли поделиться с вами файлами:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", diff --git a/apps/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json index bfdf89b87f9..750703137ca 100644 --- a/apps/federatedfilesharing/l10n/ru.json +++ b/apps/federatedfilesharing/l10n/ru.json @@ -37,12 +37,15 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ", "Federated Cloud Sharing" : "Федерация облачных хранилищ", "Open documentation" : "Открыть документацию", + "Adjust how people can share between servers." : "Настройте общий доступ между серверами.", "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов", "Search global and public address book for users and let local users publish their data" : "Поиск пользователей в глобальной и общедоступной адресной книге и резрешение публикации своих данных локальным пользователям ", "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можно поделиться с любым пользователем Nextcloud, ownCloud или Pydio! Просто введите его идентификатор федеративного облачного хранилища в диалоге предоставления общего доступа. Идектификатор указывается в виде «person@cloud.example.com».", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", + "Share it so your friends can share files with you:" : "Сообщите его друзьям, что бы они могли поделиться с вами файлами:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 75d9d0ebdfc..1c5758ca50b 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1060,7 +1060,7 @@ OC.Uploader.prototype = _.extend({ // dropping a folder in firefox doesn't cause a drop event // this is simulated by simply invoke disabling all classes // once no dragover event isn't noticed anymore - if ($.browser['mozilla']) { + if (/Firefox/i.test(navigator.userAgent)) { disableClassOnFirefox(); } $('#emptycontent .icon-folder').addClass('icon-filetype-folder-drag-accept'); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index db85caf65fa..187ede8c0bd 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -92,6 +92,12 @@ initialized: false, /** + * Wheater the file list was already shown once + * @type boolean + */ + shown: false, + + /** * Number of files per page * * @return {int} page size @@ -557,7 +563,10 @@ * Event handler when leaving previously hidden state */ _onShow: function(e) { - this.reload(); + if (this.shown) { + this.reload(); + } + this.shown = true; }, /** diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 723302f015a..cb5b7b95c33 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -121,6 +121,7 @@ OC.L10N.register( "Select all" : "Seleccionar todo", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", + "No favorites yet" : "Aún 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", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index b66b7f96e45..718a74b08a8 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -119,6 +119,7 @@ "Select all" : "Seleccionar todo", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que está intentando subir sobrepasan el tamaño máximo permitido en este servidor.", + "No favorites yet" : "Aún 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", diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 718f1fba0f9..2b241a5e4bf 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -52,7 +52,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", - "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n escondidos"], + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"], "New" : "Nuevo", diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 9245d75fdd4..b68e2e3f096 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -50,7 +50,7 @@ "_%n folder_::_%n folders_" : ["%n carpeta","%n carpetas"], "_%n file_::_%n files_" : ["%n archivo","%n archivos"], "{dirs} and {files}" : "{dirs} y {files}", - "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n escondidos"], + "_including %n hidden_::_including %n hidden_" : ["incluyendo %n escondido","incluyendo %n ocultos"], "You don’t have permission to upload or create files here" : "Usted no cuenta con los permisos para cargar o crear archivos aquí", "_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Cargando %n archivos"], "New" : "Nuevo", diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js index a4bda4f3149..924a755a491 100644 --- a/apps/files/l10n/hu.js +++ b/apps/files/l10n/hu.js @@ -121,6 +121,7 @@ OC.L10N.register( "Select all" : "Összes kijelölése", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő fájlok mérete meghaladja a szerveren megengedett maximális méretet.", + "No favorites yet" : "Még nincsenek kedvencek", "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", "Shared with you" : "Megosztva veled", "Shared with others" : "Megosztva másokkal", diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json index f92d2df8c6a..6d76536ce47 100644 --- a/apps/files/l10n/hu.json +++ b/apps/files/l10n/hu.json @@ -119,6 +119,7 @@ "Select all" : "Összes kijelölése", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő fájlok mérete meghaladja a szerveren megengedett maximális méretet.", + "No favorites yet" : "Még nincsenek kedvencek", "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", "Shared with you" : "Megosztva veled", "Shared with others" : "Megosztva másokkal", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 4a5a57eccd1..aea171dbf8b 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -69,6 +69,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", + "Copy direct link (only works for users who have access to this file/folder)" : "Copia link diretto (funziona solo per utenti che hanno accesso a questo file / cartella)", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", @@ -120,6 +121,7 @@ OC.L10N.register( "Select all" : "Seleziona tutto", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", + "No favorites yet" : "Nessun preferito ancora", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Shared with you" : "Condivisi con te", "Shared with others" : "Condivisi con altri", diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 1ee5b76efdf..b328763425d 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -67,6 +67,7 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", + "Copy direct link (only works for users who have access to this file/folder)" : "Copia link diretto (funziona solo per utenti che hanno accesso a questo file / cartella)", "Folder" : "Cartella", "New folder" : "Nuova cartella", "Upload" : "Carica", @@ -118,6 +119,7 @@ "Select all" : "Seleziona tutto", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", + "No favorites yet" : "Nessun preferito ancora", "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", "Shared with you" : "Condivisi con te", "Shared with others" : "Condivisi con altri", diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 35b77bfb4c1..893912f7ef8 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -121,6 +121,7 @@ OC.L10N.register( "Select all" : "すべて選択", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", + "No favorites yet" : "まだお気に入りはありません", "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", "Shared with you" : "他ユーザーがあなたと共有中", "Shared with others" : "他ユーザーと共有中", diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index df598add1ac..8dafe735c23 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -119,6 +119,7 @@ "Select all" : "すべて選択", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", + "No favorites yet" : "まだお気に入りはありません", "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", "Shared with you" : "他ユーザーがあなたと共有中", "Shared with others" : "他ユーザーと共有中", diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 8369e962968..ca86b8ff624 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -1,7 +1,7 @@ OC.L10N.register( "files", { - "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없습니다", + "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음", "Storage invalid" : "저장소가 잘못됨", "Unknown error" : "알 수 없는 오류", "All files" : "모든 파일", @@ -14,10 +14,11 @@ OC.L10N.register( "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}만큼 비었습니다", - "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"가 존재하지 않습니다", + "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다", "Not enough free space" : "빈 공간이 부족합니다", "Uploading..." : "업로드 중...", "..." : "...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})", "Actions" : "작업", "Download" : "다운로드", "Rename" : "이름 바꾸기", @@ -26,6 +27,7 @@ OC.L10N.register( "Delete" : "삭제", "Disconnect storage" : "저장소 연결 해제", "Unshare" : "공유 해제", + "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음", "Files" : "파일", "Details" : "자세한 정보", "Select" : "선택", @@ -37,12 +39,13 @@ OC.L10N.register( "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." : "\"{dir}\" 폴더 내에 \"{targetName}\" 파일이 이미 있습니다. 다른 이름을 사용하십시오.", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "폴더 \"{dir}\" 내에 파일 \"{targetName}\"이(가) 이미 있습니다. 다른 이름을 사용하십시오.", "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}\"을(를) 삭제할 수 없습니다.", + "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음", "Name" : "이름", "Size" : "크기", "Modified" : "수정됨", @@ -55,16 +58,18 @@ OC.L10N.register( "New" : "새로 만들기", "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.", "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.", + "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님", "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!", "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"], - "View in folder" : "폴더보기", + "View in folder" : "폴더에서 보기", "Path" : "경로", - "_%n byte_::_%n bytes_" : ["%n바이트"], - "Favorited" : "책갈피에 추가됨", + "_%n byte_::_%n bytes_" : ["%n 바이트"], + "Favorited" : "즐겨찾기에 추가됨", "Favorite" : "즐겨찾기", + "Copy direct link (only works for users who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)", "Folder" : "폴더", "New folder" : "새 폴더", "Upload" : "업로드", @@ -73,25 +78,26 @@ OC.L10N.register( "Removed from favorites" : "즐겨찾기에서 삭제됨", "You added {file} to your favorites" : "내가 {file}을(를) 즐겨찾기에 추가함", "You removed {file} from your favorites" : "내가 {file}을(를) 즐겨찾기에서 삭제함", - "Created by {user}" : "{user} 님이 만듬", + "File changes" : "파일 변경", + "Created by {user}" : "{user} 님이 만듦", "Changed by {user}" : "{user} 님이 변경함", "Deleted by {user}" : "{user} 님이 삭제함", "Restored by {user}" : "{user} 님이 복원함", "Renamed by {user}" : "{user} 님이 이름을 변경함", "Moved by {user}" : "{user} 님이 이동함", - "You created {file}" : "내가 {file}을(를) 만듬", - "{user} created {file}" : "{user} 님이 {file}을(를) 만듬", - "{file} was created in a public folder" : "공유 폴더에 {file} 이(가) 생성됨", - "You changed {file}" : "내가 {file} 을(를) 변경함", - "{user} changed {file}" : "{user} 님이 {file} 을(를) 변경함", - "You deleted {file}" : "내가 {file} 을(를) 삭제함", - "{user} deleted {file}" : "{user} 님이 {file} 을(를) 삭제함", - "You restored {file}" : "내가 {file} 을(를) 복원함", - "{user} restored {file}" : "{user} 님이 {file} 을(를) 복원함", - "You renamed {oldfile} to {newfile}" : "내가 {oldfile} 을(를) {newfile} 로 이름을 바꿈", - "{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile} 을(를) {newfile} 로 이름을 바꿈", - "You moved {oldfile} to {newfile}" : "내가 {oldfile} 을(를) {newfile} 로 이동함", - "{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile} 을(를) {newfile} 로 이동함", + "You created {file}" : "{file}을(를) 만듦", + "{user} created {file}" : "{user} 님이 {file}을(를) 만듦", + "{file} was created in a public folder" : "공유 폴더에 {file}이(가) 생성됨", + "You changed {file}" : "{file}을(를) 변경함", + "{user} changed {file}" : "{user} 님이 {file}을(를) 변경함", + "You deleted {file}" : "{file}을(를) 삭제함", + "{user} deleted {file}" : "{user} 님이 {file}을(를) 삭제함", + "You restored {file}" : "내가 {file}을(를) 복원함", + "{user} restored {file}" : "{user} 님이 {file}을(를) 복원함", + "You renamed {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이름을 바꿈", + "{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이름을 바꿈", + "You moved {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이동함", + "{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이동함", "A file has been added to or removed from your <strong>favorites</strong>" : "파일이 <strong>즐겨찾기</strong>에서 추가 또는 삭제됨", "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>", @@ -106,7 +112,7 @@ OC.L10N.register( "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM을 사용 중이면 변경 사항이 적용되는 데 최대 5분 정도 걸릴 수 있습니다.", "Missing permissions to edit from here." : "여기에서 편집할 권한이 없습니다.", "Settings" : "설정", - "Show hidden files" : "숨겨진 파일보기", + "Show hidden files" : "숨김 파일 보이기", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "이 주소를 사용하여 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">WebDAV를 통해 파일에 접근할 수 있습니다</a>", "No files in here" : "여기에 파일 없음", @@ -115,7 +121,8 @@ OC.L10N.register( "Select all" : "모두 선택", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", - "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", + "No favorites yet" : "즐겨찾는 항목 없음", + "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다", "Shared with you" : "나와 공유됨", "Shared with others" : "다른 사람과 공유됨", "Shared by link" : "링크로 공유됨", @@ -123,13 +130,16 @@ OC.L10N.register( "Deleted files" : "삭제된 파일", "Text file" : "텍스트 파일", "New text file.txt" : "새 텍스트 파일.txt", - "{hours}:{minutes}h" : "{hours}:{minutes} 시간", - "{minutes}:{seconds}m" : "{minutes}:{seconds} 분", + "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds}시간 남음"], + "{hours}:{minutes}h" : "{hours}:{minutes}시간", + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds}분 남음"], + "{minutes}:{seconds}m" : "{minutes}:{seconds}분", + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds}초 남음"], "{seconds}s" : "{seconds}초", - "Any moment now..." : "조금 남음", + "Any moment now..." : "조금 남음...", "Soon..." : "곧...", "File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", "Copy local link" : "로컬 링크 복사", - "No favorites" : "책갈피 없음" + "No favorites" : "즐겨찾는 항목 없음" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index af6ca958063..45c24ecee1b 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -1,5 +1,5 @@ { "translations": { - "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없습니다", + "Storage is temporarily not available" : "저장소를 일시적으로 사용할 수 없음", "Storage invalid" : "저장소가 잘못됨", "Unknown error" : "알 수 없는 오류", "All files" : "모든 파일", @@ -12,10 +12,11 @@ "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}만큼 비었습니다", - "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"가 존재하지 않습니다", + "Target folder \"{dir}\" does not exist any more" : "대상 폴더 \"{dir}\"이(가) 더 이상 존재하지 않습니다", "Not enough free space" : "빈 공간이 부족합니다", "Uploading..." : "업로드 중...", "..." : "...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})", "Actions" : "작업", "Download" : "다운로드", "Rename" : "이름 바꾸기", @@ -24,6 +25,7 @@ "Delete" : "삭제", "Disconnect storage" : "저장소 연결 해제", "Unshare" : "공유 해제", + "Could not load info for file \"{file}\"" : "파일 \"{file}\"의 정보를 가져올 수 없음", "Files" : "파일", "Details" : "자세한 정보", "Select" : "선택", @@ -35,12 +37,13 @@ "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." : "\"{dir}\" 폴더 내에 \"{targetName}\" 파일이 이미 있습니다. 다른 이름을 사용하십시오.", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "폴더 \"{dir}\" 내에 파일 \"{targetName}\"이(가) 이미 있습니다. 다른 이름을 사용하십시오.", "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}\"을(를) 삭제할 수 없습니다.", + "No search results in other folders for {tag}{filter}{endtag}" : "다른 폴더에 {tag}{filter}{endtag} 검색 결과가 없음", "Name" : "이름", "Size" : "크기", "Modified" : "수정됨", @@ -53,16 +56,18 @@ "New" : "새로 만들기", "\"{name}\" is an invalid file name." : "\"{name}\"은(는) 잘못된 파일 이름입니다.", "File name cannot be empty." : "파일 이름이 비어 있을 수 없습니다.", + "\"{name}\" is not an allowed filetype" : "\"{name}\"은 허용된 파일 형식이 아님", "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner}의 저장소가 가득 찼습니다. 파일을 더 이상 업데이트하거나 동기화할 수 없습니다!", "Your storage is full, files can not be updated or synced anymore!" : "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner}의 저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "저장 공간이 거의 가득 찼습니다({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["'{filter}'와(과) 일치"], - "View in folder" : "폴더보기", + "View in folder" : "폴더에서 보기", "Path" : "경로", - "_%n byte_::_%n bytes_" : ["%n바이트"], - "Favorited" : "책갈피에 추가됨", + "_%n byte_::_%n bytes_" : ["%n 바이트"], + "Favorited" : "즐겨찾기에 추가됨", "Favorite" : "즐겨찾기", + "Copy direct link (only works for users who have access to this file/folder)" : "직접 링크 복사(이 파일/폴더에 접근 권한이 있는 사람만)", "Folder" : "폴더", "New folder" : "새 폴더", "Upload" : "업로드", @@ -71,25 +76,26 @@ "Removed from favorites" : "즐겨찾기에서 삭제됨", "You added {file} to your favorites" : "내가 {file}을(를) 즐겨찾기에 추가함", "You removed {file} from your favorites" : "내가 {file}을(를) 즐겨찾기에서 삭제함", - "Created by {user}" : "{user} 님이 만듬", + "File changes" : "파일 변경", + "Created by {user}" : "{user} 님이 만듦", "Changed by {user}" : "{user} 님이 변경함", "Deleted by {user}" : "{user} 님이 삭제함", "Restored by {user}" : "{user} 님이 복원함", "Renamed by {user}" : "{user} 님이 이름을 변경함", "Moved by {user}" : "{user} 님이 이동함", - "You created {file}" : "내가 {file}을(를) 만듬", - "{user} created {file}" : "{user} 님이 {file}을(를) 만듬", - "{file} was created in a public folder" : "공유 폴더에 {file} 이(가) 생성됨", - "You changed {file}" : "내가 {file} 을(를) 변경함", - "{user} changed {file}" : "{user} 님이 {file} 을(를) 변경함", - "You deleted {file}" : "내가 {file} 을(를) 삭제함", - "{user} deleted {file}" : "{user} 님이 {file} 을(를) 삭제함", - "You restored {file}" : "내가 {file} 을(를) 복원함", - "{user} restored {file}" : "{user} 님이 {file} 을(를) 복원함", - "You renamed {oldfile} to {newfile}" : "내가 {oldfile} 을(를) {newfile} 로 이름을 바꿈", - "{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile} 을(를) {newfile} 로 이름을 바꿈", - "You moved {oldfile} to {newfile}" : "내가 {oldfile} 을(를) {newfile} 로 이동함", - "{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile} 을(를) {newfile} 로 이동함", + "You created {file}" : "{file}을(를) 만듦", + "{user} created {file}" : "{user} 님이 {file}을(를) 만듦", + "{file} was created in a public folder" : "공유 폴더에 {file}이(가) 생성됨", + "You changed {file}" : "{file}을(를) 변경함", + "{user} changed {file}" : "{user} 님이 {file}을(를) 변경함", + "You deleted {file}" : "{file}을(를) 삭제함", + "{user} deleted {file}" : "{user} 님이 {file}을(를) 삭제함", + "You restored {file}" : "내가 {file}을(를) 복원함", + "{user} restored {file}" : "{user} 님이 {file}을(를) 복원함", + "You renamed {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이름을 바꿈", + "{user} renamed {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이름을 바꿈", + "You moved {oldfile} to {newfile}" : "{oldfile}을(를) {newfile}(으)로 이동함", + "{user} moved {oldfile} to {newfile}" : "{user} 님이 {oldfile}을(를) {newfile}(으)로 이동함", "A file has been added to or removed from your <strong>favorites</strong>" : "파일이 <strong>즐겨찾기</strong>에서 추가 또는 삭제됨", "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>", @@ -104,7 +110,7 @@ "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM을 사용 중이면 변경 사항이 적용되는 데 최대 5분 정도 걸릴 수 있습니다.", "Missing permissions to edit from here." : "여기에서 편집할 권한이 없습니다.", "Settings" : "설정", - "Show hidden files" : "숨겨진 파일보기", + "Show hidden files" : "숨김 파일 보이기", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "이 주소를 사용하여 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">WebDAV를 통해 파일에 접근할 수 있습니다</a>", "No files in here" : "여기에 파일 없음", @@ -113,7 +119,8 @@ "Select all" : "모두 선택", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", - "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", + "No favorites yet" : "즐겨찾는 항목 없음", + "Files and folders you mark as favorite will show up here" : "즐겨찾기에 추가한 파일과 폴더가 여기에 나타납니다", "Shared with you" : "나와 공유됨", "Shared with others" : "다른 사람과 공유됨", "Shared by link" : "링크로 공유됨", @@ -121,13 +128,16 @@ "Deleted files" : "삭제된 파일", "Text file" : "텍스트 파일", "New text file.txt" : "새 텍스트 파일.txt", - "{hours}:{minutes}h" : "{hours}:{minutes} 시간", - "{minutes}:{seconds}m" : "{minutes}:{seconds} 분", + "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds}시간 남음"], + "{hours}:{minutes}h" : "{hours}:{minutes}시간", + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds}분 남음"], + "{minutes}:{seconds}m" : "{minutes}:{seconds}분", + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds}초 남음"], "{seconds}s" : "{seconds}초", - "Any moment now..." : "조금 남음", + "Any moment now..." : "조금 남음...", "Soon..." : "곧...", "File upload is in progress. Leaving the page now will cancel the upload." : "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.", "Copy local link" : "로컬 링크 복사", - "No favorites" : "책갈피 없음" + "No favorites" : "즐겨찾는 항목 없음" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 0008e239b4f..9efb56cec1e 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -12,7 +12,7 @@ OC.L10N.register( "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", "Upload cancelled." : "Envio cancelado.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais", "Not enough free space" : "Espaço livre insuficiente", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 0a288976a10..f185237235c 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -10,7 +10,7 @@ "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "Não foi possível criar a pasta \"{dir}\"", "Upload cancelled." : "Envio cancelado.", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não é possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Não foi possível fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", "Target folder \"{dir}\" does not exist any more" : "Pasta de destino \"{dir}\" não existe mais", "Not enough free space" : "Espaço livre insuficiente", diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index 934aa054fb6..6b403e7fa85 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -1509,6 +1509,12 @@ describe('OCA.Files.FileList tests', function() { }); it('reloads the list when leaving hidden state', function() { var reloadStub = sinon.stub(fileList, 'reload'); + + // First show should not trigger + $('#app-content-files').trigger(new $.Event('show')); + expect(reloadStub.calledOnce).toEqual(false); + + // Second show should! $('#app-content-files').trigger(new $.Event('show')); expect(reloadStub.calledOnce).toEqual(true); reloadStub.restore(); diff --git a/apps/files_external/js/app.js b/apps/files_external/js/app.js index d3ce2010ecd..859a820f14c 100644 --- a/apps/files_external/js/app.js +++ b/apps/files_external/js/app.js @@ -35,7 +35,7 @@ OCA.External.App = { ); this._extendFileList(this.fileList); - this.fileList.appName = t('files_external', 'External storage'); + this.fileList.appName = t('files_external', 'External storages'); return this.fileList; }, @@ -111,4 +111,3 @@ $(document).ready(function() { } /* End Status Manager */ }); - diff --git a/apps/files_external/js/mountsfilelist.js b/apps/files_external/js/mountsfilelist.js index 35aef751fef..3beee6f73b2 100644 --- a/apps/files_external/js/mountsfilelist.js +++ b/apps/files_external/js/mountsfilelist.js @@ -28,7 +28,7 @@ FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, /** @lends OCA.External.FileList.prototype */ { - appName: 'External storage', + appName: 'External storages', /** * @private diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 91a0abcf988..97e0c9248a7 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -39,6 +39,7 @@ OC.L10N.register( "Credentials saved" : "Credenciales guardados", "Credentials saving failed" : "Guardado de credenciales fallido", "Credentials required" : "Credenciales requeridos", + "Storage with ID \"%d\" not found" : "No se ha encontrado el almacenamiento con ID \"%d\"", "Invalid backend or authentication mechanism class" : "Sistema o mecanismo de autentificación inválido", "Invalid mount point" : "Punto de montaje no válido", "Objectstore forbidden" : "Objeto de almacenaje prohibido", @@ -49,6 +50,7 @@ OC.L10N.register( "Unsatisfied authentication mechanism parameters" : "Los parámetros del mecanismo de autentificación no son válidos", "Insufficient data: %s" : "Datos insuficientes: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "El almacenamiento con ID \"%d\" no se puede editar por el usuario", "Access key" : "Clave de acceso", "Secret key" : "Clave secreta", "Builtin" : "Incorporado", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index ce2532a02cc..67024b59979 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -37,6 +37,7 @@ "Credentials saved" : "Credenciales guardados", "Credentials saving failed" : "Guardado de credenciales fallido", "Credentials required" : "Credenciales requeridos", + "Storage with ID \"%d\" not found" : "No se ha encontrado el almacenamiento con ID \"%d\"", "Invalid backend or authentication mechanism class" : "Sistema o mecanismo de autentificación inválido", "Invalid mount point" : "Punto de montaje no válido", "Objectstore forbidden" : "Objeto de almacenaje prohibido", @@ -47,6 +48,7 @@ "Unsatisfied authentication mechanism parameters" : "Los parámetros del mecanismo de autentificación no son válidos", "Insufficient data: %s" : "Datos insuficientes: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "El almacenamiento con ID \"%d\" no se puede editar por el usuario", "Access key" : "Clave de acceso", "Secret key" : "Clave secreta", "Builtin" : "Incorporado", diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js index c25448eda80..e16eaae639e 100644 --- a/apps/files_external/l10n/es_MX.js +++ b/apps/files_external/l10n/es_MX.js @@ -112,7 +112,7 @@ OC.L10N.register( "Storage type" : "Tipo de almacenamiento", "Scope" : "Alcance", "Enable encryption" : "Habilitar encripción", - "Enable previews" : "Habilitar previsualizaciones", + "Enable previews" : "Habilitar vistas previas", "Enable sharing" : "Habilitar compartir", "Check for changes" : "Verificar si hay cambios", "Never" : "Nunca", diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json index 9f3a451349e..0d82a5723ce 100644 --- a/apps/files_external/l10n/es_MX.json +++ b/apps/files_external/l10n/es_MX.json @@ -110,7 +110,7 @@ "Storage type" : "Tipo de almacenamiento", "Scope" : "Alcance", "Enable encryption" : "Habilitar encripción", - "Enable previews" : "Habilitar previsualizaciones", + "Enable previews" : "Habilitar vistas previas", "Enable sharing" : "Habilitar compartir", "Check for changes" : "Verificar si hay cambios", "Never" : "Nunca", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index 0223d60fc64..60c40e2723a 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -39,6 +39,7 @@ OC.L10N.register( "Credentials saved" : "資格情報を保存しました", "Credentials saving failed" : "資格情報の保存に失敗しました", "Credentials required" : "資格情報が必要です", + "Storage with ID \"%d\" not found" : "ID \"%d\" のストレージが見つかりません", "Invalid backend or authentication mechanism class" : "バックエンドまたは認証システムクラスが無効", "Invalid mount point" : "無効なマウントポイント", "Objectstore forbidden" : "オブジェクトストアが禁じられています", @@ -49,6 +50,7 @@ OC.L10N.register( "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "ID \"%d\" のストレージはユーザーが編集できません", "Access key" : "アクセスキー", "Secret key" : "シークレットキー", "Builtin" : "ビルトイン", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index b80c3f3fddc..7b5d9857508 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -37,6 +37,7 @@ "Credentials saved" : "資格情報を保存しました", "Credentials saving failed" : "資格情報の保存に失敗しました", "Credentials required" : "資格情報が必要です", + "Storage with ID \"%d\" not found" : "ID \"%d\" のストレージが見つかりません", "Invalid backend or authentication mechanism class" : "バックエンドまたは認証システムクラスが無効", "Invalid mount point" : "無効なマウントポイント", "Objectstore forbidden" : "オブジェクトストアが禁じられています", @@ -47,6 +48,7 @@ "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "ID \"%d\" のストレージはユーザーが編集できません", "Access key" : "アクセスキー", "Secret key" : "シークレットキー", "Builtin" : "ビルトイン", diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js index ac0a4dda076..87e8e454aeb 100644 --- a/apps/files_external/l10n/ko.js +++ b/apps/files_external/l10n/ko.js @@ -9,7 +9,7 @@ OC.L10N.register( "External storages" : "외부 저장소", "External storage" : "외부 저장소", "Dropbox App Configuration" : "Dropbox 앱 설정", - "Google Drive App Configuration" : "구글 드라이브 앱 설정", + "Google Drive App Configuration" : "Google 드라이브 앱 설정", "Personal" : "개인", "System" : "시스템", "Grant access" : "접근 권한 부여", @@ -17,13 +17,16 @@ OC.L10N.register( "Error configuring OAuth2" : "OAuth2 설정 오류", "Generate keys" : "키 생성", "Error generating key pair" : "키 쌍을 생성하는 중 오류 발생", - "All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오", + "All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오.", "(group)" : "(그룹)", + "Compatibility with Mac NFD encoding (slow)" : "Mac NFD 인코딩 호환성 사용(느림)", "Admin defined" : "관리자 지정", "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" : "외부 마운트 오류", @@ -36,6 +39,7 @@ OC.L10N.register( "Credentials saved" : "인증 정보 저장됨", "Credentials saving failed" : "인증 정보를 저장할 수 없음", "Credentials required" : "인증 정보 필요함", + "Storage with ID \"%d\" not found" : "ID \"%d\"인 공유를 찾을 수 없음", "Invalid backend or authentication mechanism class" : "백엔드나 인증 방식 클래스가 잘못됨", "Invalid mount point" : "잘못된 마운트 지점", "Objectstore forbidden" : "Objectstore에 접근 금지됨", @@ -46,6 +50,7 @@ OC.L10N.register( "Unsatisfied authentication mechanism parameters" : "인증 방식 인자가 부족함", "Insufficient data: %s" : "충분하지 않은 데이터: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "저장소 ID \"%d\"을(를) 사용자가 편집할 수 없음", "Access key" : "접근 키", "Secret key" : "비밀 키", "Builtin" : "내장", @@ -98,6 +103,9 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack 객체 저장소", "Service name" : "서비스 이름", "Request timeout (seconds)" : "요청 시간 제한(초)", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP의 cURL 지원이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP의 FTP 지원이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"이(가) 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "No external storage configured" : "외부 저장소가 설정되지 않았음", "You can add external storages in the personal settings" : "개인 설정에서 외부 저장소를 추가할 수 있습니다", "Name" : "이름", diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json index 6b09b8076f6..c2922cf02b1 100644 --- a/apps/files_external/l10n/ko.json +++ b/apps/files_external/l10n/ko.json @@ -7,7 +7,7 @@ "External storages" : "외부 저장소", "External storage" : "외부 저장소", "Dropbox App Configuration" : "Dropbox 앱 설정", - "Google Drive App Configuration" : "구글 드라이브 앱 설정", + "Google Drive App Configuration" : "Google 드라이브 앱 설정", "Personal" : "개인", "System" : "시스템", "Grant access" : "접근 권한 부여", @@ -15,13 +15,16 @@ "Error configuring OAuth2" : "OAuth2 설정 오류", "Generate keys" : "키 생성", "Error generating key pair" : "키 쌍을 생성하는 중 오류 발생", - "All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오", + "All users. Type to select user or group." : "모든 사용자입니다. 사용자나 그룹을 선택하려면 입력하십시오.", "(group)" : "(그룹)", + "Compatibility with Mac NFD encoding (slow)" : "Mac NFD 인코딩 호환성 사용(느림)", "Admin defined" : "관리자 지정", "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" : "외부 마운트 오류", @@ -34,6 +37,7 @@ "Credentials saved" : "인증 정보 저장됨", "Credentials saving failed" : "인증 정보를 저장할 수 없음", "Credentials required" : "인증 정보 필요함", + "Storage with ID \"%d\" not found" : "ID \"%d\"인 공유를 찾을 수 없음", "Invalid backend or authentication mechanism class" : "백엔드나 인증 방식 클래스가 잘못됨", "Invalid mount point" : "잘못된 마운트 지점", "Objectstore forbidden" : "Objectstore에 접근 금지됨", @@ -44,6 +48,7 @@ "Unsatisfied authentication mechanism parameters" : "인증 방식 인자가 부족함", "Insufficient data: %s" : "충분하지 않은 데이터: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "저장소 ID \"%d\"을(를) 사용자가 편집할 수 없음", "Access key" : "접근 키", "Secret key" : "비밀 키", "Builtin" : "내장", @@ -96,6 +101,9 @@ "OpenStack Object Storage" : "OpenStack 객체 저장소", "Service name" : "서비스 이름", "Request timeout (seconds)" : "요청 시간 제한(초)", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP의 cURL 지원이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP의 FTP 지원이 비활성화되어 있거나 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"이(가) 설치되어 있지 않습니다. %s을(를) 마운트할 수 없습니다. 시스템 관리자에게 설치를 요청하십시오.", "No external storage configured" : "외부 저장소가 설정되지 않았음", "You can add external storages in the personal settings" : "개인 설정에서 외부 저장소를 추가할 수 있습니다", "Name" : "이름", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 3f3cc25b6c2..34e488e865d 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -40,13 +40,13 @@ OC.L10N.register( "Credentials saving failed" : "A gravação das credenciais falhou", "Credentials required" : "Credenciais são requeridas", "Storage with ID \"%d\" not found" : "A armazenagem com a ID \"%d\" não foi encontrada", - "Invalid backend or authentication mechanism class" : "Backend ou classe de mecanismo de autenticação inválido", + "Invalid backend or authentication mechanism class" : "Plataforma de serviço ou classe de mecanismo de autenticação inválido", "Invalid mount point" : "Ponto de montagem inválido", "Objectstore forbidden" : "Proibido armazenamento de objetos", - "Invalid storage backend \"%s\"" : "Backend de armazenamento \"%s\" inválido", - "Not permitted to use backend \"%s\"" : "Não é permitido o uso de backend \"%s\"", + "Invalid storage backend \"%s\"" : "Plataforma de serviço de armazenamento \"%s\" inválido", + "Not permitted to use backend \"%s\"" : "Não é permitido o uso da plataforma de serviço \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido usar o mecanismo de autenticação \"%s\"", - "Unsatisfied backend parameters" : "Parâmetros de backend não atendidos", + "Unsatisfied backend parameters" : "Parâmetros da plataforma de serviço não atendidos", "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -103,9 +103,9 @@ OC.L10N.register( "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 0475feb5d7b..7b8b9f7f14c 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -38,13 +38,13 @@ "Credentials saving failed" : "A gravação das credenciais falhou", "Credentials required" : "Credenciais são requeridas", "Storage with ID \"%d\" not found" : "A armazenagem com a ID \"%d\" não foi encontrada", - "Invalid backend or authentication mechanism class" : "Backend ou classe de mecanismo de autenticação inválido", + "Invalid backend or authentication mechanism class" : "Plataforma de serviço ou classe de mecanismo de autenticação inválido", "Invalid mount point" : "Ponto de montagem inválido", "Objectstore forbidden" : "Proibido armazenamento de objetos", - "Invalid storage backend \"%s\"" : "Backend de armazenamento \"%s\" inválido", - "Not permitted to use backend \"%s\"" : "Não é permitido o uso de backend \"%s\"", + "Invalid storage backend \"%s\"" : "Plataforma de serviço de armazenamento \"%s\" inválido", + "Not permitted to use backend \"%s\"" : "Não é permitido o uso da plataforma de serviço \"%s\"", "Not permitted to use authentication mechanism \"%s\"" : "Não é permitido usar o mecanismo de autenticação \"%s\"", - "Unsatisfied backend parameters" : "Parâmetros de backend não atendidos", + "Unsatisfied backend parameters" : "Parâmetros da plataforma de serviço não atendidos", "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", "Insufficient data: %s" : "Dados insuficientes: %s", "%s" : "%s", @@ -101,9 +101,9 @@ "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", + "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", + "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não foi possível. Por favor, solicite a instalação ao administrador do sistema.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index cc4cd641ce5..7afdb746a98 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -31,6 +31,7 @@ namespace OCA\Files_External\Lib\Storage; +use Icewind\SMB\Exception\AlreadyExistsException; use Icewind\SMB\Exception\ConnectException; use Icewind\SMB\Exception\Exception; use Icewind\SMB\Exception\ForbiddenException; @@ -90,6 +91,7 @@ class SMB extends Common implements INotifyStorage { throw new \Exception('Invalid configuration'); } $this->statCache = new CappedMemoryCache(); + parent::__construct($params); } /** @@ -162,10 +164,42 @@ class SMB extends Common implements INotifyStorage { * @return array */ protected function formatInfo($info) { - return array( + $result = [ 'size' => $info->getSize(), - 'mtime' => $info->getMTime() - ); + 'mtime' => $info->getMTime(), + ]; + if ($info->isDirectory()) { + $result['type'] = 'dir'; + } else { + $result['type'] = 'file'; + } + return $result; + } + + /** + * Rename the files. If the source or the target is the root, the rename won't happen. + * + * @param string $source the old name of the path + * @param string $target the new name of the path + * @return bool true if the rename is successful, false otherwise + */ + public function rename($source, $target) { + if ($this->isRootDir($source) || $this->isRootDir($target)) { + return false; + } + + $absoluteSource = $this->buildPath($source); + $absoluteTarget = $this->buildPath($target); + try { + $result = $this->share->rename($absoluteSource, $absoluteTarget); + } catch (AlreadyExistsException $e) { + $this->remove($target); + $result = $this->share->rename($absoluteSource, $absoluteTarget); + } catch (\Exception $e) { + return false; + } + unset($this->statCache[$absoluteSource], $this->statCache[$absoluteTarget]); + return $result; } /** @@ -220,6 +254,10 @@ class SMB extends Common implements INotifyStorage { * @return bool */ public function unlink($path) { + if ($this->isRootDir($path)) { + return false; + } + try { if ($this->is_dir($path)) { return $this->rmdir($path); @@ -239,26 +277,6 @@ class SMB extends Common implements INotifyStorage { } /** - * @param string $path1 the old name - * @param string $path2 the new name - * @return bool - */ - public function rename($path1, $path2) { - try { - $this->remove($path2); - $path1 = $this->buildPath($path1); - $path2 = $this->buildPath($path2); - return $this->share->rename($path1, $path2); - } catch (NotFoundException $e) { - return false; - } catch (ForbiddenException $e) { - return false; - } catch (ConnectException $e) { - throw new StorageNotAvailableException($e->getMessage(), $e->getCode(), $e); - } - } - - /** * check if a file or folder has been updated since $time * * @param string $path @@ -266,7 +284,7 @@ class SMB extends Common implements INotifyStorage { * @return bool */ public function hasUpdated($path, $time) { - if (!$path and $this->root == '/') { + if (!$path and $this->root === '/') { // mtime doesn't work for shares, but giving the nature of the backend, // doing a full update is still just fast enough return true; @@ -343,6 +361,10 @@ class SMB extends Common implements INotifyStorage { } public function rmdir($path) { + if ($this->isRootDir($path)) { + return false; + } + try { $this->statCache = array(); $content = $this->share->dir($this->buildPath($path)); diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index bbd79994e39..e463a0d3c37 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -88,7 +88,7 @@ ?> <form data-can-create="<?php echo $canCreateMounts?'true':'false' ?>" id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>"> - <h2 data-anchor-name="external-storage"><?php p($l->t('External storage')); ?></h2> + <h2 data-anchor-name="external-storage"><?php p($l->t('External storages')); ?></h2> <?php if (isset($_['dependencies']) and ($_['dependencies']<>'') and $canCreateMounts) print_unescaped(''.$_['dependencies'].''); ?> <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'> <thead> diff --git a/apps/files_external/tests/Storage/SmbTest.php b/apps/files_external/tests/Storage/SmbTest.php index 45c01a0c59e..037c4cd4d39 100644 --- a/apps/files_external/tests/Storage/SmbTest.php +++ b/apps/files_external/tests/Storage/SmbTest.php @@ -132,4 +132,23 @@ class SmbTest extends \Test\Files\Storage\Storage { $this->assertEquals(new Change(IChange::ADDED, 'newfile.txt'), $result); } + + public function testRenameRoot() { + // root can't be renamed + $this->assertFalse($this->instance->rename('', 'foo1')); + + $this->instance->mkdir('foo2'); + $this->assertFalse($this->instance->rename('foo2', '')); + $this->instance->rmdir('foo2'); + } + + public function testUnlinkRoot() { + // root can't be deleted + $this->assertFalse($this->instance->unlink('')); + } + + public function testRmdirRoot() { + // root can't be deleted + $this->assertFalse($this->instance->rmdir('')); + } } diff --git a/apps/files_sharing/js/files_drop.js b/apps/files_sharing/js/files_drop.js index ddfcfcd3d8b..f1fc71c6ce2 100644 --- a/apps/files_sharing/js/files_drop.js +++ b/apps/files_sharing/js/files_drop.js @@ -72,34 +72,43 @@ return true; }, + setFileIcon: function (fileName,fileIcon) { + $('#public-upload ul li[data-name="' + fileName + '"]').html(fileIcon); + $('[data-toggle="tooltip"]').tooltip(); + }, + initialize: function () { $(document).bind('drop dragover', function (e) { // Prevent the default browser drop action: e.preventDefault(); }); var output = this.template(); + var fileName = undefined; $('#public-upload').fileupload({ type: 'PUT', dropZone: $('#public-upload'), sequentialUploads: true, add: function(e, data) { Drop.addFileToUpload(e, data); + fileName = escapeHTML(data.files[0].name); //we return true to keep trying to upload next file even //if addFileToUpload did not like the privious one return true; }, done: function(e, data) { // Created - if (data.jqXHR.status === 201) { - var mimeTypeUrl = OC.MimeType.getIconUrl(data.files[0].type); - $('#public-upload ul li[data-name="' + escapeHTML(data.files[0].name) + '"]').html('<img src="' + escapeHTML(mimeTypeUrl) + '"/> ' + escapeHTML(data.files[0].name)); - $('[data-toggle="tooltip"]').tooltip(); - } else { - var name = data.files[0].name; - OC.Notification.showTemporary(OC.L10N.translate('files_sharing', 'Could not upload "{filename}"', {filename: name})); - $('#public-upload ul li[data-name="' + escapeHTML(name) + '"]').html(output({isUploading: false, name: escapeHTML(name)})); - $('[data-toggle="tooltip"]').tooltip(); - } + var mimeTypeUrl = OC.MimeType.getIconUrl(data.files[0].type); + var fileIcon = '<img src="' + escapeHTML(mimeTypeUrl) + '"/> ' + fileName; + Drop.setFileIcon(fileName,fileIcon); + }, + fail: function(e, data, errorThrown) { + OC.Notification.showTemporary(OC.L10N.translate( + 'files_sharing', + 'Could not upload "{filename}"', + {filename: fileName} + )); + var fileIcon = output({isUploading: false, name: fileName}); + Drop.setFileIcon(fileName,fileIcon); }, progressall: function (e, data) { var progress = parseInt(data.loaded / data.total * 100, 10); diff --git a/apps/files_sharing/l10n/ko.js b/apps/files_sharing/l10n/ko.js index 5b5d00b98a4..1b342560312 100644 --- a/apps/files_sharing/l10n/ko.js +++ b/apps/files_sharing/l10n/ko.js @@ -1,13 +1,6 @@ OC.L10N.register( "files_sharing", { - "Server to server sharing is not enabled on this server" : "이 서버에서 서버간 공유를 사용할 수 없음", - "The mountpoint name contains invalid characters." : "마운트 지점 이름에 잘못된 글자가 포함되어 있습니다.", - "Not allowed to create a federated share with the same user server" : "같은 사용자 서버 내에서 연합 공유를 만들 수 없음", - "Invalid or untrusted SSL certificate" : "잘못되었거나 신뢰할 수 없는 SSL 인증서", - "Could not authenticate to remote share, password might be wrong" : "원격 공유에서 인증할 수 없습니다. 암호가 맞지 않을 수 있습니다.", - "Storage not valid" : "저장소가 잘못됨", - "Couldn't add remote share" : "원격 공유를 추가할 수 없음", "Shared with you" : "나와 공유됨", "Shared with others" : "다른 사람과 공유됨", "Shared by link" : "링크로 공유됨", @@ -17,72 +10,105 @@ OC.L10N.register( "Files and folders you share will show up here" : "내가 공유하는 파일과 폴더가 여기에 나타납니다", "No shared links" : "공유된 링크 없음", "Files and folders you share by link will show up here" : "내가 링크로 공유하는 파일과 폴더가 여기에 나타납니다", - "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}의 원격 공유 {name}을(를) 추가하시겠습니까?", - "Remote share" : "원격 공유", - "Remote share password" : "원격 공유 암호", - "Cancel" : "취소", - "Add remote share" : "원격 공유 추가", "You can upload into this folder" : "이 폴더에 업로드할 수 있습니다", + "No compatible server found at {remote}" : "{remote}에서 호환 서버를 찾을 수 없음", + "Invalid server URL" : "잘못된 서버 URL", + "Failed to add the public link to your Nextcloud" : "Nextcloud에 공개 링크를 추가할 수 없음", + "Share" : "공유", + "No expiration date set" : "만료 날짜가 설정되지 않음", "Shared by" : "공유한 사용자:", "Sharing" : "공유", - "A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>", - "A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함", - "A public shared file or folder was <strong>downloaded</strong>" : "공개 공유된 파일이나 폴더가 <strong>다운로드됨</strong>", - "You received a new remote share %2$s from %1$s" : "%1$s에서 새 원격 공유 %2$s을(를) 받았습니다", - "You received a new remote share from %s" : "%s에서 원격 공유 요청을 받았습니다", - "%1$s accepted remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 수락함", - "%1$s declined remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 거절함", - "%1$s unshared %2$s from you" : "%1$s 님이 %2$s의 공유를 중단함", - "Public shared folder %1$s was downloaded" : "공개 공유 폴더 %1$s이(가) 다운로드됨", - "Public shared file %1$s was downloaded" : "공개 공유 파일 %1$s이(가) 다운로드됨", - "You shared %1$s with %2$s" : "내가 %2$s 님과 %1$s을(를) 공유함", - "%2$s shared %1$s with %3$s" : "%2$s 님이 %1$s을(를) %3$s 님과 공유함", - "You removed the share of %2$s for %1$s" : "%1$s을(를) 위한 %2$s 그룹의 공유를 삭제함", - "%2$s removed the share of %3$s for %1$s" : "%2$s 님이 %1$s을(를) 위한 %3$s 그룹의 공유를 삭제함", - "You shared %1$s with group %2$s" : "내가 %2$s 그룹과 %1$s을(를) 공유함", - "%2$s shared %1$s with group %3$s" : "%2$s 님이 %1$s을(를) %3$s 그룹과 공유함", - "You removed the share of group %2$s for %1$s" : "%1$s 님을 위한 %2$s 그룹 공유를 삭제함", - "%2$s removed the share of group %3$s for %1$s" : "%2$s 님이 %1$s에 대한 %3$s 그룹의 공유를 삭제함", - "%2$s shared %1$s via link" : "%2$s 님이 %1$s을(를) 링크로 공유함", - "You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함", - "You removed the public link for %1$s" : "%1$s의 공개 링크를 삭제함", - "%2$s removed the public link for %1$s" : "%2$s 님이 %1$s의 공개 링크를 삭제함", - "Your public link for %1$s expired" : "%1$s의 공개 링크가 만료됨", - "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 공유를 삭제함", + "File shares" : "파일 공유", "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 님의 공유를 삭제함", - "%2$s removed share for %3$s" : "%2$s 님이 %3$s 님의 공유를 삭제함", - "Shared with group %2$s" : "%2$s 그룹과 공유함", - "Shared with group %3$s by %2$s" : "%2$s 님이 %3$s 그룹과 공유함", - "Removed share of group %2$s" : "%2$s 그룹의 공유를 삭제함", - "%2$s removed share of group %3$s" : "%2$s 님이 그룹 %3$s의 공유를 삭제함", - "Shared via link by %2$s" : "%2$s 님이 링크로 공유함", - "Shared via public link" : "공개 링크로 공유함", + "Downloaded by {email}" : "{email} 님이 다운로드함", + "{file} downloaded via public link" : "공개 링크로 {file} 다운로드함", + "{email} downloaded {file}" : "{email} 님이 {file}을(를) 다운로드함", + "Shared with group {group}" : "그룹 {group}와(과) 공유함", + "Removed share for group {group}" : "그룹 {group}의 공유를 삭제함", + "{actor} shared with group {group}" : "{actor} 님이 그룹 {group}와(과) 공유함", + "{actor} removed share for group {group}" : "{actor} 님이 그룹 {group}의 공유를 삭제함", + "You shared {file} with group {group}" : "파일 {file}을(를) 그룹 {group}와(과) 공유함", + "You removed group {group} from {file}" : "그룹 {group}을(를) {file}에서 삭제함", + "{actor} shared {file} with group {group}" : "{actor} 님이 {file}을(를) 그룹 {group}와(과) 공유함", + "{actor} removed group {group} from {file}" : "{actor} 님이 그룹 {group}을(를) {file}에서 삭제함", + "Shared as public link" : "공개 링크로 공유함", "Removed public link" : "공개 링크 삭제함", - "%2$s removed public link" : "%2$s 님이 공개 링크 삭제함", "Public link expired" : "공개 링크 만료됨", - "Public link of %2$s expired" : "%2$s 님의 공개 링크 만료됨", - "Shared by %2$s" : "%2$s 님이 공유함", - "Shares" : "공유", + "{actor} shared as public link" : "{actor} 님이 공개 링크로 공유함", + "{actor} removed public link" : "{actor} 님이 공개 링크를 삭제함", + "Public link of {actor} expired" : "{actor} 님의 공개 링크가 만료됨", + "You shared {file} as public link" : "{file}을(를) 공개 링크로 공유함", + "You removed public link for {file}" : "{file}의 공개 링크를 삭제함", + "Public link expired for {file}" : "{file}의 공개 링크가 만료됨", + "{actor} shared {file} as public link" : "{actor} 님이 {file}을(를) 공개 링크로 공유함", + "{actor} removed public link for {file}" : "{actor} 님이 {file}의 공개 링크를 삭제함", + "Public link of {actor} for {file} expired" : "{actor} 님의 {file} 공개 링크가 만료됨", + "{user} accepted the remote share" : "{user} 님이 원격 공유를 수락함", + "{user} declined the remote share" : "{user} 님이 원격 공유를 거절함", + "You received a new remote share {file} from {user}" : "{user} 님으로부터 원격 공유된 {file}을(를) 받음", + "{user} accepted the remote share of {file}" : "{user} 님이 {file}의 원격 공유를 수락함", + "{user} declined the remote share of {file}" : "{user} 님이 {file}의 원격 공유를 거절함", + "{user} unshared {file} from you" : "{user} 님이 {file} 공유를 해제함", + "Shared with {user}" : "{user} 님과 공유됨", + "Removed share for {user}" : "{user} 님의 공유 삭제함", + "{actor} shared with {user}" : "{actor} 님이 {user} 님과 공유함", + "{actor} removed share for {user}" : "{actor} 님이 {user} 님의 공유 삭제함", + "Shared by {actor}" : "{actor} 님이 공유함", + "{actor} removed share" : "{actor} 님이 공유 삭제함", + "You shared {file} with {user}" : "{file}을(를) {user} 님과 공유함", + "You removed {user} from {file}" : "{user} 님을 {file}에서 삭제함", + "{actor} shared {file} with {user}" : "{actor} 님이 {file}을(를) {user} 님과 공유함", + "{actor} removed {user} from {file}" : "{actor} 님이 {user} 님을 {file}에서 삭제함", + "{actor} shared {file} with you" : "{actor} 님이 {file}을 공유함", + "{actor} removed you from {file}" : "{actor} 님이 여러분을 {file}에서 삭제함", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "이메일이나 공개 공유로 공유한 파일이 <strong>다운로드됨</strong>", + "A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함", + "A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>", + "Wrong share ID, share doesn't exist" : "잘못된 공유 ID, 공유가 존재하지 않음", + "could not delete share" : "공유를 삭제할 수 없음", + "Could not delete share" : "공유를 삭제할 수 없음", + "Please specify a file or folder path" : "파일이나 폴더 경로를 지정하십시오", + "Wrong path, file/folder doesn't exist" : "잘못된 경로, 파일/폴더가 존재하지 않음", + "Could not create share" : "공유를 만들 수 없음", + "invalid permissions" : "잘못된 권한", + "Please specify a valid user" : "유효한 사용자를 지정하십시오", + "Group sharing is disabled by the administrator" : "그룹 공유는 관리자에 의해 비활성화되어 있음", + "Please specify a valid group" : "유효한 그룹을 지정하십시오", + "Public link sharing is disabled by the administrator" : "공개 링크 공유는 관리자에 의해 비활성화되어 있음", + "Public upload disabled by the administrator" : "공개 업로드는 관리자에 의해 비활성화되어 있음", + "Public upload is only possible for publicly shared folders" : "공개 공유 폴더에만 공개 업로드를 사용할 수 있음", + "Invalid date, date format must be YYYY-MM-DD" : "잘못된 날짜, YYYY-MM-DD 형식이어야 합니다.", + "Sharing %s failed because the back end does not allow shares from type %s" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %s 형식의 공유를 지원하지 않습니다", + "You cannot share to a Circle if the app is not enabled" : "서클 앱이 활성화되어 있지 않으면 서클로 공유할 수 없음", + "Please specify a valid circle" : "올바른 서클을 지정하십시오", + "Unknown share type" : "알 수 없는 공유 유형", + "Not a directory" : "디렉터리가 아님", + "Could not lock path" : "경로를 잠글 수 없음", + "Wrong or no update parameter given" : "업데이트 인자가 잘못되었거나 지정되지 않았음", + "Can't change permissions for public share links" : "공개 공유 링크의 권한을 변경할 수 없음", + "Cannot increase permissions" : "권한을 늘릴 수 없음", + "%s is publicly shared" : "%s이(가) 공개 공유됨", + "Share API is disabled" : "공유 API가 비활성화됨", "This share is password-protected" : "이 공유는 암호로 보호되어 있습니다", "The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.", "Password" : "암호", "No entries found in this folder" : "이 폴더에 항목 없음", "Name" : "이름", "Share time" : "공유 시간", + "Expiration date" : "만료 날짜", "Sorry, this link doesn’t seem to work anymore." : "죄송합니다. 이 링크는 더 이상 작동하지 않습니다.", "Reasons might be:" : "이유는 다음과 같을 수 있습니다:", "the item was removed" : "항목이 삭제됨", "the link expired" : "링크가 만료됨", "sharing is disabled" : "공유가 비활성화됨", "For more info, please ask the person who sent this link." : "자세한 정보는 링크를 보낸 사람에게 문의하십시오.", - "Add to your ownCloud" : "내 ownCloud에 추가하기", + "Add to your Nextcloud" : "내 Nextcloud에 추가", "Download" : "다운로드", "Download %s" : "%s 다운로드", - "Direct link" : "직접 링크" + "Direct link" : "직접 링크", + "Upload files to %s" : "%s에 파일 업로드", + "Select or drop files" : "파일을 선택하거나 끌어다 놓기", + "Uploading files…" : "파일 업로드 중…", + "Uploaded files:" : "업로드한 파일:" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/ko.json b/apps/files_sharing/l10n/ko.json index 7804a5f49c4..2120e6a8023 100644 --- a/apps/files_sharing/l10n/ko.json +++ b/apps/files_sharing/l10n/ko.json @@ -1,11 +1,4 @@ { "translations": { - "Server to server sharing is not enabled on this server" : "이 서버에서 서버간 공유를 사용할 수 없음", - "The mountpoint name contains invalid characters." : "마운트 지점 이름에 잘못된 글자가 포함되어 있습니다.", - "Not allowed to create a federated share with the same user server" : "같은 사용자 서버 내에서 연합 공유를 만들 수 없음", - "Invalid or untrusted SSL certificate" : "잘못되었거나 신뢰할 수 없는 SSL 인증서", - "Could not authenticate to remote share, password might be wrong" : "원격 공유에서 인증할 수 없습니다. 암호가 맞지 않을 수 있습니다.", - "Storage not valid" : "저장소가 잘못됨", - "Couldn't add remote share" : "원격 공유를 추가할 수 없음", "Shared with you" : "나와 공유됨", "Shared with others" : "다른 사람과 공유됨", "Shared by link" : "링크로 공유됨", @@ -15,72 +8,105 @@ "Files and folders you share will show up here" : "내가 공유하는 파일과 폴더가 여기에 나타납니다", "No shared links" : "공유된 링크 없음", "Files and folders you share by link will show up here" : "내가 링크로 공유하는 파일과 폴더가 여기에 나타납니다", - "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}의 원격 공유 {name}을(를) 추가하시겠습니까?", - "Remote share" : "원격 공유", - "Remote share password" : "원격 공유 암호", - "Cancel" : "취소", - "Add remote share" : "원격 공유 추가", "You can upload into this folder" : "이 폴더에 업로드할 수 있습니다", + "No compatible server found at {remote}" : "{remote}에서 호환 서버를 찾을 수 없음", + "Invalid server URL" : "잘못된 서버 URL", + "Failed to add the public link to your Nextcloud" : "Nextcloud에 공개 링크를 추가할 수 없음", + "Share" : "공유", + "No expiration date set" : "만료 날짜가 설정되지 않음", "Shared by" : "공유한 사용자:", "Sharing" : "공유", - "A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>", - "A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함", - "A public shared file or folder was <strong>downloaded</strong>" : "공개 공유된 파일이나 폴더가 <strong>다운로드됨</strong>", - "You received a new remote share %2$s from %1$s" : "%1$s에서 새 원격 공유 %2$s을(를) 받았습니다", - "You received a new remote share from %s" : "%s에서 원격 공유 요청을 받았습니다", - "%1$s accepted remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 수락함", - "%1$s declined remote share %2$s" : "%1$s 님이 원격 공유 %2$s을(를) 거절함", - "%1$s unshared %2$s from you" : "%1$s 님이 %2$s의 공유를 중단함", - "Public shared folder %1$s was downloaded" : "공개 공유 폴더 %1$s이(가) 다운로드됨", - "Public shared file %1$s was downloaded" : "공개 공유 파일 %1$s이(가) 다운로드됨", - "You shared %1$s with %2$s" : "내가 %2$s 님과 %1$s을(를) 공유함", - "%2$s shared %1$s with %3$s" : "%2$s 님이 %1$s을(를) %3$s 님과 공유함", - "You removed the share of %2$s for %1$s" : "%1$s을(를) 위한 %2$s 그룹의 공유를 삭제함", - "%2$s removed the share of %3$s for %1$s" : "%2$s 님이 %1$s을(를) 위한 %3$s 그룹의 공유를 삭제함", - "You shared %1$s with group %2$s" : "내가 %2$s 그룹과 %1$s을(를) 공유함", - "%2$s shared %1$s with group %3$s" : "%2$s 님이 %1$s을(를) %3$s 그룹과 공유함", - "You removed the share of group %2$s for %1$s" : "%1$s 님을 위한 %2$s 그룹 공유를 삭제함", - "%2$s removed the share of group %3$s for %1$s" : "%2$s 님이 %1$s에 대한 %3$s 그룹의 공유를 삭제함", - "%2$s shared %1$s via link" : "%2$s 님이 %1$s을(를) 링크로 공유함", - "You shared %1$s via link" : "내가 %1$s을(를) 링크로 공유함", - "You removed the public link for %1$s" : "%1$s의 공개 링크를 삭제함", - "%2$s removed the public link for %1$s" : "%2$s 님이 %1$s의 공개 링크를 삭제함", - "Your public link for %1$s expired" : "%1$s의 공개 링크가 만료됨", - "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 공유를 삭제함", + "File shares" : "파일 공유", "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 님의 공유를 삭제함", - "%2$s removed share for %3$s" : "%2$s 님이 %3$s 님의 공유를 삭제함", - "Shared with group %2$s" : "%2$s 그룹과 공유함", - "Shared with group %3$s by %2$s" : "%2$s 님이 %3$s 그룹과 공유함", - "Removed share of group %2$s" : "%2$s 그룹의 공유를 삭제함", - "%2$s removed share of group %3$s" : "%2$s 님이 그룹 %3$s의 공유를 삭제함", - "Shared via link by %2$s" : "%2$s 님이 링크로 공유함", - "Shared via public link" : "공개 링크로 공유함", + "Downloaded by {email}" : "{email} 님이 다운로드함", + "{file} downloaded via public link" : "공개 링크로 {file} 다운로드함", + "{email} downloaded {file}" : "{email} 님이 {file}을(를) 다운로드함", + "Shared with group {group}" : "그룹 {group}와(과) 공유함", + "Removed share for group {group}" : "그룹 {group}의 공유를 삭제함", + "{actor} shared with group {group}" : "{actor} 님이 그룹 {group}와(과) 공유함", + "{actor} removed share for group {group}" : "{actor} 님이 그룹 {group}의 공유를 삭제함", + "You shared {file} with group {group}" : "파일 {file}을(를) 그룹 {group}와(과) 공유함", + "You removed group {group} from {file}" : "그룹 {group}을(를) {file}에서 삭제함", + "{actor} shared {file} with group {group}" : "{actor} 님이 {file}을(를) 그룹 {group}와(과) 공유함", + "{actor} removed group {group} from {file}" : "{actor} 님이 그룹 {group}을(를) {file}에서 삭제함", + "Shared as public link" : "공개 링크로 공유함", "Removed public link" : "공개 링크 삭제함", - "%2$s removed public link" : "%2$s 님이 공개 링크 삭제함", "Public link expired" : "공개 링크 만료됨", - "Public link of %2$s expired" : "%2$s 님의 공개 링크 만료됨", - "Shared by %2$s" : "%2$s 님이 공유함", - "Shares" : "공유", + "{actor} shared as public link" : "{actor} 님이 공개 링크로 공유함", + "{actor} removed public link" : "{actor} 님이 공개 링크를 삭제함", + "Public link of {actor} expired" : "{actor} 님의 공개 링크가 만료됨", + "You shared {file} as public link" : "{file}을(를) 공개 링크로 공유함", + "You removed public link for {file}" : "{file}의 공개 링크를 삭제함", + "Public link expired for {file}" : "{file}의 공개 링크가 만료됨", + "{actor} shared {file} as public link" : "{actor} 님이 {file}을(를) 공개 링크로 공유함", + "{actor} removed public link for {file}" : "{actor} 님이 {file}의 공개 링크를 삭제함", + "Public link of {actor} for {file} expired" : "{actor} 님의 {file} 공개 링크가 만료됨", + "{user} accepted the remote share" : "{user} 님이 원격 공유를 수락함", + "{user} declined the remote share" : "{user} 님이 원격 공유를 거절함", + "You received a new remote share {file} from {user}" : "{user} 님으로부터 원격 공유된 {file}을(를) 받음", + "{user} accepted the remote share of {file}" : "{user} 님이 {file}의 원격 공유를 수락함", + "{user} declined the remote share of {file}" : "{user} 님이 {file}의 원격 공유를 거절함", + "{user} unshared {file} from you" : "{user} 님이 {file} 공유를 해제함", + "Shared with {user}" : "{user} 님과 공유됨", + "Removed share for {user}" : "{user} 님의 공유 삭제함", + "{actor} shared with {user}" : "{actor} 님이 {user} 님과 공유함", + "{actor} removed share for {user}" : "{actor} 님이 {user} 님의 공유 삭제함", + "Shared by {actor}" : "{actor} 님이 공유함", + "{actor} removed share" : "{actor} 님이 공유 삭제함", + "You shared {file} with {user}" : "{file}을(를) {user} 님과 공유함", + "You removed {user} from {file}" : "{user} 님을 {file}에서 삭제함", + "{actor} shared {file} with {user}" : "{actor} 님이 {file}을(를) {user} 님과 공유함", + "{actor} removed {user} from {file}" : "{actor} 님이 {user} 님을 {file}에서 삭제함", + "{actor} shared {file} with you" : "{actor} 님이 {file}을 공유함", + "{actor} removed you from {file}" : "{actor} 님이 여러분을 {file}에서 삭제함", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "이메일이나 공개 공유로 공유한 파일이 <strong>다운로드됨</strong>", + "A file or folder was shared from <strong>another server</strong>" : "<strong>다른 서버</strong>에서 파일이나 폴더를 공유함", + "A file or folder has been <strong>shared</strong>" : "파일이나 폴더가 <strong>공유됨</strong>", + "Wrong share ID, share doesn't exist" : "잘못된 공유 ID, 공유가 존재하지 않음", + "could not delete share" : "공유를 삭제할 수 없음", + "Could not delete share" : "공유를 삭제할 수 없음", + "Please specify a file or folder path" : "파일이나 폴더 경로를 지정하십시오", + "Wrong path, file/folder doesn't exist" : "잘못된 경로, 파일/폴더가 존재하지 않음", + "Could not create share" : "공유를 만들 수 없음", + "invalid permissions" : "잘못된 권한", + "Please specify a valid user" : "유효한 사용자를 지정하십시오", + "Group sharing is disabled by the administrator" : "그룹 공유는 관리자에 의해 비활성화되어 있음", + "Please specify a valid group" : "유효한 그룹을 지정하십시오", + "Public link sharing is disabled by the administrator" : "공개 링크 공유는 관리자에 의해 비활성화되어 있음", + "Public upload disabled by the administrator" : "공개 업로드는 관리자에 의해 비활성화되어 있음", + "Public upload is only possible for publicly shared folders" : "공개 공유 폴더에만 공개 업로드를 사용할 수 있음", + "Invalid date, date format must be YYYY-MM-DD" : "잘못된 날짜, YYYY-MM-DD 형식이어야 합니다.", + "Sharing %s failed because the back end does not allow shares from type %s" : "%s을(를) 공유할 수 없습니다. 백엔드에서 %s 형식의 공유를 지원하지 않습니다", + "You cannot share to a Circle if the app is not enabled" : "서클 앱이 활성화되어 있지 않으면 서클로 공유할 수 없음", + "Please specify a valid circle" : "올바른 서클을 지정하십시오", + "Unknown share type" : "알 수 없는 공유 유형", + "Not a directory" : "디렉터리가 아님", + "Could not lock path" : "경로를 잠글 수 없음", + "Wrong or no update parameter given" : "업데이트 인자가 잘못되었거나 지정되지 않았음", + "Can't change permissions for public share links" : "공개 공유 링크의 권한을 변경할 수 없음", + "Cannot increase permissions" : "권한을 늘릴 수 없음", + "%s is publicly shared" : "%s이(가) 공개 공유됨", + "Share API is disabled" : "공유 API가 비활성화됨", "This share is password-protected" : "이 공유는 암호로 보호되어 있습니다", "The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.", "Password" : "암호", "No entries found in this folder" : "이 폴더에 항목 없음", "Name" : "이름", "Share time" : "공유 시간", + "Expiration date" : "만료 날짜", "Sorry, this link doesn’t seem to work anymore." : "죄송합니다. 이 링크는 더 이상 작동하지 않습니다.", "Reasons might be:" : "이유는 다음과 같을 수 있습니다:", "the item was removed" : "항목이 삭제됨", "the link expired" : "링크가 만료됨", "sharing is disabled" : "공유가 비활성화됨", "For more info, please ask the person who sent this link." : "자세한 정보는 링크를 보낸 사람에게 문의하십시오.", - "Add to your ownCloud" : "내 ownCloud에 추가하기", + "Add to your Nextcloud" : "내 Nextcloud에 추가", "Download" : "다운로드", "Download %s" : "%s 다운로드", - "Direct link" : "직접 링크" + "Direct link" : "직접 링크", + "Upload files to %s" : "%s에 파일 업로드", + "Select or drop files" : "파일을 선택하거나 끌어다 놓기", + "Uploading files…" : "파일 업로드 중…", + "Uploaded files:" : "업로드한 파일:" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js index c562b175b25..d81fb64acbb 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -45,7 +45,7 @@ OC.L10N.register( "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} expirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", - "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", + "You received a new remote share {file} from {user}" : "Você recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", @@ -56,12 +56,12 @@ OC.L10N.register( "Shared by {actor}" : "Compartilhado por {actor}", "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Você compartilhou {arquivo} com {user}", - "You removed {user} from {file}" : "Voce excluiu {user} de {file}", + "You removed {user} from {file}" : "Você excluiu {user} de {file}", "{actor} shared {file} with {user}" : "{actor} compartilhou {file} com {user}", "{actor} removed {user} from {file}" : "{actor} excluiu {user} de {file}", "{actor} shared {file} with you" : "{actor} compartilhou {file} com você", "{actor} removed you from {file}" : "{actor} excluiu você de {file}", - "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por e-mail ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", @@ -78,15 +78,15 @@ OC.L10N.register( "Public upload disabled by the administrator" : "O envio público foi desativado pelo administrador", "Public upload is only possible for publicly shared folders" : "O envio público só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser YYYY-MM-DD", - "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o serviço não permite ações de tipo %s", "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habilitado", "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", "Wrong or no update parameter given" : "O parâmetro da atualização fornecido está errado ou não existe", - "Can't change permissions for public share links" : "Não é possível alterar as permissões para links de compartilhamento público", - "Cannot increase permissions" : "Não é possível aumentar as permissões", + "Can't change permissions for public share links" : "Não foi possível alterar as permissões para links de compartilhamento público", + "Cannot increase permissions" : "Não foi possível aumentar as permissões", "%s is publicly shared" : "%s está compartilhado publicamente", "Share API is disabled" : "O compartilhamento de API está desabilitado.", "This share is password-protected" : "Este compartilhamento é protegido por senha", diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index 3d3d0ab784b..5fad4a144f8 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -43,7 +43,7 @@ "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} expirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", - "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", + "You received a new remote share {file} from {user}" : "Você recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", @@ -54,12 +54,12 @@ "Shared by {actor}" : "Compartilhado por {actor}", "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Você compartilhou {arquivo} com {user}", - "You removed {user} from {file}" : "Voce excluiu {user} de {file}", + "You removed {user} from {file}" : "Você excluiu {user} de {file}", "{actor} shared {file} with {user}" : "{actor} compartilhou {file} com {user}", "{actor} removed {user} from {file}" : "{actor} excluiu {user} de {file}", "{actor} shared {file} with you" : "{actor} compartilhou {file} com você", "{actor} removed you from {file}" : "{actor} excluiu você de {file}", - "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por e-mail ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", @@ -76,15 +76,15 @@ "Public upload disabled by the administrator" : "O envio público foi desativado pelo administrador", "Public upload is only possible for publicly shared folders" : "O envio público só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser YYYY-MM-DD", - "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o serviço não permite ações de tipo %s", "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habilitado", "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", "Wrong or no update parameter given" : "O parâmetro da atualização fornecido está errado ou não existe", - "Can't change permissions for public share links" : "Não é possível alterar as permissões para links de compartilhamento público", - "Cannot increase permissions" : "Não é possível aumentar as permissões", + "Can't change permissions for public share links" : "Não foi possível alterar as permissões para links de compartilhamento público", + "Cannot increase permissions" : "Não foi possível aumentar as permissões", "%s is publicly shared" : "%s está compartilhado publicamente", "Share API is disabled" : "O compartilhamento de API está desabilitado.", "This share is password-protected" : "Este compartilhamento é protegido por senha", diff --git a/apps/files_sharing/lib/Controller/PublicPreviewController.php b/apps/files_sharing/lib/Controller/PublicPreviewController.php index b91b84c9c34..49e48993f5c 100644 --- a/apps/files_sharing/lib/Controller/PublicPreviewController.php +++ b/apps/files_sharing/lib/Controller/PublicPreviewController.php @@ -97,6 +97,8 @@ class PublicPreviewController extends Controller { return new FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]); } catch (NotFoundException $e) { return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (\InvalidArgumentException $e) { + return new DataResponse([], Http::STATUS_BAD_REQUEST); } } } diff --git a/apps/files_trashbin/lib/Controller/PreviewController.php b/apps/files_trashbin/lib/Controller/PreviewController.php index c73b1c17c16..ae3a106d627 100644 --- a/apps/files_trashbin/lib/Controller/PreviewController.php +++ b/apps/files_trashbin/lib/Controller/PreviewController.php @@ -114,6 +114,8 @@ class PreviewController extends Controller { return new Http\FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]); } catch (NotFoundException $e) { return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (\InvalidArgumentException $e) { + return new DataResponse([], Http::STATUS_BAD_REQUEST); } } } diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php index 8d961f47ee6..7a7c024fb52 100644 --- a/apps/files_versions/lib/Controller/PreviewController.php +++ b/apps/files_versions/lib/Controller/PreviewController.php @@ -94,6 +94,8 @@ class PreviewController extends Controller { return new FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]); } catch (NotFoundException $e) { return new DataResponse([], Http::STATUS_NOT_FOUND); + } catch (\InvalidArgumentException $e) { + return new DataResponse([], Http::STATUS_BAD_REQUEST); } } } diff --git a/apps/sharebymail/l10n/cs.js b/apps/sharebymail/l10n/cs.js index c24f35e3384..1b34e31d3df 100644 --- a/apps/sharebymail/l10n/cs.js +++ b/apps/sharebymail/l10n/cs.js @@ -5,16 +5,42 @@ OC.L10N.register( "Shared with {email}" : "Sdíleno s {email}", "Shared with %1$s by %2$s" : "%2$s sdílí s %1$s", "Shared with {email} by {actor}" : "{actor} sdílí s {email}", + "Password for mail share sent to %1$s" : "Heslo e-mailového sdílení odesláno na %1$s", + "Password for mail share sent to {email}" : "Heslo e-mailového sdílení odesláno na {email}", + "Password for mail share sent to you" : "Heslo e-mailového sdílení vám bylo zasláno", "You shared %1$s with %2$s by mail" : "Sdílel(a) jste %1$s e-mailem s %2$s", "You shared {file} with {email} by mail" : "E-mailem jste s {email} sdíleli {file}", "%3$s shared %1$s with %2$s by mail" : "%3$s s %2$s sdílel e-mailem %1$s", "{actor} shared {file} with {email} by mail" : "{actor} sdílel(a) {file} e-mailem s {email}", + "Password to access %1$s was sent to %2s" : "Heslo pro přístupu k %1$s bylo zasláno na %2s", + "Password to access {file} was sent to {email}" : "Heslo pro přístup k {file} bylo zasláno na {email}", + "Password to access %1$s was sent to you" : "Heslo pro přístup k %1$s vám bylo zasláno", + "Password to access {file} was sent to you" : "Heslo pro přístupu k {file} vám bylo zasláno", "Sharing %s failed, this item is already shared with %s" : "Sdílení %s selhalo, tato položka je již s %s sdílena", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nemůžeme vám zaslat automaticky vygenerované heslo. Nastavte si v osobním nastavení platnou e-mailovou adresu a zkuste to znovu.", "Failed to send share by E-mail" : "Odeslání sdílení E-mailem se nezdařilo", "%s shared »%s« with you" : "%s s vámi sdílel(a) »%s»", "%s shared »%s« with you on behalf of %s" : "%s s vámi sdílel »%s» místo %s", - "Failed to create the E-mail" : "Vytváření E-mailu se nezdařilo", + "%s shared »%s« with you." : "%s s vámi nasdílel(a) »%s«.", + "%s shared »%s« with you on behalf of %s." : "%s s vámi nasdílel(a) »%s» zastupující %s.", + "Click the button below to open it." : "Pro otevření kliknětena tlačítko níže.", + "Open »%s«" : "Otevřít »%s«", + "%s via %s" : "%s přes %s", + "Password to access »%s« shared to you by %s" : "Heslo pro přístup k »%s« (vám nasdílel(a) %s)", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s s vámi sdílel(a) %s.", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s s vámi sdílel(a) »%s«. Již jste měli dostat e-mail s přístupovými údaji.", + "Password to access »%s«" : "Heslo pro přístup k »%s«", + "It is protected with the following password: %s" : "Je chráněn následujícím heslem: %s", + "Password to access »%s« shared with %s" : "Heslo pro přístup k »%s« sdíleno s %s", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Právě jste s »%s» nasdílel(a) %s. Sdílení bylo již příjemci zasláno. Kvůli bezpečnostní politice nastavené administrátorem %s musí být každé sdílení chráněno heslem a toto heslo nemůže být příjemci zasláno přímo. Kvůli tomu ho budete muset manuálně přeposlat.", + "This is the password: %s" : "Toto je heslo: %s", + "You can choose a different password at any time in the share dialog." : "V dialogu sdílení můžete kdykoliv vybrat jiné heslo.", "Could not find share" : "Nelze nalézt sdílení", + "Share by mail" : "Sdílet e-mailem", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Dovoluje uživatelům odeslat personalizovaný odkaz na soubor nebo složku po zadání e-mailové adresy.", + "Send password by mail" : "Odeslat heslo e-mailem", + "Enforce password protection" : "Vynutit ochranu hesla", + "Failed to create the E-mail" : "Vytváření E-mailu se nezdařilo", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Ahoj,\n\n%s s vámi sdílel(a) »%s» na místo %s\n\n%s", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Ahoj,\n\n\n%s s vámi sdílel »%s».\n\n%s", "Cheers!" : "Mějte se!", diff --git a/apps/sharebymail/l10n/cs.json b/apps/sharebymail/l10n/cs.json index 07a016c80d3..7ffeca9d571 100644 --- a/apps/sharebymail/l10n/cs.json +++ b/apps/sharebymail/l10n/cs.json @@ -3,16 +3,42 @@ "Shared with {email}" : "Sdíleno s {email}", "Shared with %1$s by %2$s" : "%2$s sdílí s %1$s", "Shared with {email} by {actor}" : "{actor} sdílí s {email}", + "Password for mail share sent to %1$s" : "Heslo e-mailového sdílení odesláno na %1$s", + "Password for mail share sent to {email}" : "Heslo e-mailového sdílení odesláno na {email}", + "Password for mail share sent to you" : "Heslo e-mailového sdílení vám bylo zasláno", "You shared %1$s with %2$s by mail" : "Sdílel(a) jste %1$s e-mailem s %2$s", "You shared {file} with {email} by mail" : "E-mailem jste s {email} sdíleli {file}", "%3$s shared %1$s with %2$s by mail" : "%3$s s %2$s sdílel e-mailem %1$s", "{actor} shared {file} with {email} by mail" : "{actor} sdílel(a) {file} e-mailem s {email}", + "Password to access %1$s was sent to %2s" : "Heslo pro přístupu k %1$s bylo zasláno na %2s", + "Password to access {file} was sent to {email}" : "Heslo pro přístup k {file} bylo zasláno na {email}", + "Password to access %1$s was sent to you" : "Heslo pro přístup k %1$s vám bylo zasláno", + "Password to access {file} was sent to you" : "Heslo pro přístupu k {file} vám bylo zasláno", "Sharing %s failed, this item is already shared with %s" : "Sdílení %s selhalo, tato položka je již s %s sdílena", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nemůžeme vám zaslat automaticky vygenerované heslo. Nastavte si v osobním nastavení platnou e-mailovou adresu a zkuste to znovu.", "Failed to send share by E-mail" : "Odeslání sdílení E-mailem se nezdařilo", "%s shared »%s« with you" : "%s s vámi sdílel(a) »%s»", "%s shared »%s« with you on behalf of %s" : "%s s vámi sdílel »%s» místo %s", - "Failed to create the E-mail" : "Vytváření E-mailu se nezdařilo", + "%s shared »%s« with you." : "%s s vámi nasdílel(a) »%s«.", + "%s shared »%s« with you on behalf of %s." : "%s s vámi nasdílel(a) »%s» zastupující %s.", + "Click the button below to open it." : "Pro otevření kliknětena tlačítko níže.", + "Open »%s«" : "Otevřít »%s«", + "%s via %s" : "%s přes %s", + "Password to access »%s« shared to you by %s" : "Heslo pro přístup k »%s« (vám nasdílel(a) %s)", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s s vámi sdílel(a) %s.", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s s vámi sdílel(a) »%s«. Již jste měli dostat e-mail s přístupovými údaji.", + "Password to access »%s«" : "Heslo pro přístup k »%s«", + "It is protected with the following password: %s" : "Je chráněn následujícím heslem: %s", + "Password to access »%s« shared with %s" : "Heslo pro přístup k »%s« sdíleno s %s", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Právě jste s »%s» nasdílel(a) %s. Sdílení bylo již příjemci zasláno. Kvůli bezpečnostní politice nastavené administrátorem %s musí být každé sdílení chráněno heslem a toto heslo nemůže být příjemci zasláno přímo. Kvůli tomu ho budete muset manuálně přeposlat.", + "This is the password: %s" : "Toto je heslo: %s", + "You can choose a different password at any time in the share dialog." : "V dialogu sdílení můžete kdykoliv vybrat jiné heslo.", "Could not find share" : "Nelze nalézt sdílení", + "Share by mail" : "Sdílet e-mailem", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Dovoluje uživatelům odeslat personalizovaný odkaz na soubor nebo složku po zadání e-mailové adresy.", + "Send password by mail" : "Odeslat heslo e-mailem", + "Enforce password protection" : "Vynutit ochranu hesla", + "Failed to create the E-mail" : "Vytváření E-mailu se nezdařilo", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Ahoj,\n\n%s s vámi sdílel(a) »%s» na místo %s\n\n%s", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Ahoj,\n\n\n%s s vámi sdílel »%s».\n\n%s", "Cheers!" : "Mějte se!", diff --git a/apps/sharebymail/l10n/el.js b/apps/sharebymail/l10n/el.js index bcd7944b8ff..8d016e7b83b 100644 --- a/apps/sharebymail/l10n/el.js +++ b/apps/sharebymail/l10n/el.js @@ -5,6 +5,7 @@ OC.L10N.register( "Shared with {email}" : "Διαμοιράστηκε με {email}", "Shared with %1$s by %2$s" : "Διαμοιράστηκε με %1$s από %2$s", "Shared with {email} by {actor}" : "Διαμοιράστηκε με {email} από {actor}", + "Password for mail share sent to %1$s" : "Το συνθηματικό για το διαμοιρασμό μέσου ηλ. αλληλογραφίας έχει αποσταλλεί %1$s", "You shared %1$s with %2$s by mail" : "Διαμοιραστήκατε το %1$s με %2$s μέσω mail", "You shared {file} with {email} by mail" : "Διαμοιραστήκατε {file} με {email} μέσω mail", "%3$s shared %1$s with %2$s by mail" : "%3$s Διαμοιραστηκε %1$s με %2$s μέσω mail", diff --git a/apps/sharebymail/l10n/el.json b/apps/sharebymail/l10n/el.json index f5f4f5f88e6..7b6e88d93cc 100644 --- a/apps/sharebymail/l10n/el.json +++ b/apps/sharebymail/l10n/el.json @@ -3,6 +3,7 @@ "Shared with {email}" : "Διαμοιράστηκε με {email}", "Shared with %1$s by %2$s" : "Διαμοιράστηκε με %1$s από %2$s", "Shared with {email} by {actor}" : "Διαμοιράστηκε με {email} από {actor}", + "Password for mail share sent to %1$s" : "Το συνθηματικό για το διαμοιρασμό μέσου ηλ. αλληλογραφίας έχει αποσταλλεί %1$s", "You shared %1$s with %2$s by mail" : "Διαμοιραστήκατε το %1$s με %2$s μέσω mail", "You shared {file} with {email} by mail" : "Διαμοιραστήκατε {file} με {email} μέσω mail", "%3$s shared %1$s with %2$s by mail" : "%3$s Διαμοιραστηκε %1$s με %2$s μέσω mail", diff --git a/apps/sharebymail/l10n/es.js b/apps/sharebymail/l10n/es.js index e9ad5ec76ed..c03d4ea441a 100644 --- a/apps/sharebymail/l10n/es.js +++ b/apps/sharebymail/l10n/es.js @@ -5,11 +5,19 @@ OC.L10N.register( "Shared with {email}" : "Compartido con {email}", "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "Password for mail share sent to %1$s" : "Se ha enviado una contraseña para compartir por correo a %1$s", + "Password for mail share sent to {email}" : "Se ha enviado una contraseña para compartir por correo a {email}", + "Password for mail share sent to you" : "Se te ha enviado una contraseña para compartir por correo", "You shared %1$s with %2$s by mail" : "Has compartido %1$s con %2$s por correo", "You shared {file} with {email} by mail" : "Has compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s compartido %1$s con %2$s por correo", "{actor} shared {file} with {email} by mail" : "{actor} compartió {file} con {email} por correo electrónico", + "Password to access %1$s was sent to %2s" : "Se ha enviado a %2s una contraseña para acceder a %1$s ", + "Password to access {file} was sent to {email}" : "Se ha enviado a {email} una contraseña para acceder a {file}", + "Password to access %1$s was sent to you" : "Se te ha enviado una contraseña para acceder a %1$s", + "Password to access {file} was sent to you" : "Se te ha enviado una contraseña para acceder a {file}", "Sharing %s failed, this item is already shared with %s" : "Falló el compartir %s , este ítem ya se encontraba compartido con %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No podemos enviarte la contraseña autogenerada. Por favor, indica una dirección de correo electrónico válida en tu configuración personal y vuelve a intentarlo.", "Failed to send share by E-mail" : "Falló enviar recurso compartido por correo electrónico", "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", @@ -17,14 +25,20 @@ OC.L10N.register( "%s shared »%s« with you on behalf of %s." : "%s compartió »%s« con usted en nombre de %s.", "Click the button below to open it." : "Haga click en el botón debajo para abrirlo.", "Open »%s«" : "Abrir »%s«", + "%s via %s" : "%s por %s", "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", - "Password to access »%s«" : "Contraseña para acceder »%s«", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartió »%s« con usted. Debería haber recibido un mensaje de correo separado con un enlace para abrirlo.", + "Password to access »%s«" : "Contraseña para acceder »%s«", "It is protected with the following password: %s" : "Está protegido con la siguiente contraseña: %s", + "Password to access »%s« shared with %s" : "Se ha compartido con %s una contraseña para acceder a »%s«", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Usted acaba de compartir »%s« con %s. El recurso compartido ya fue enviado al destinatario. Debido a las reglas de seguridad definadas por el administrador de %s cada recurso compartido necesita ser protegido por una contraseña y no esta permitido que usted mande la contraseña directamente al destinatario. Por eso, usted necesita mandar la contraseña manualmente al destinatario.", + "This is the password: %s" : "Esta es la contraseña: %s", + "You can choose a different password at any time in the share dialog." : "Puedes elegir una contraseña diferente en cualquier momento en el diálogo de compartir.", "Could not find share" : "No se pudo encontrar el recurso compartido", "Share by mail" : "Enviado por correo electrónico", - "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite a los usuarios compartir un enlace personalizado a un archivo o carpeta enviándolo a una dirección de correo electrónico", "Send password by mail" : "Enviar contraseñas por email", + "Enforce password protection" : "Imponer la protección de contraseña", "Failed to create the E-mail" : "Falló crear el correo electrónico", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/es.json b/apps/sharebymail/l10n/es.json index 4e07a47d0ad..498c718e4d6 100644 --- a/apps/sharebymail/l10n/es.json +++ b/apps/sharebymail/l10n/es.json @@ -3,11 +3,19 @@ "Shared with {email}" : "Compartido con {email}", "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "Password for mail share sent to %1$s" : "Se ha enviado una contraseña para compartir por correo a %1$s", + "Password for mail share sent to {email}" : "Se ha enviado una contraseña para compartir por correo a {email}", + "Password for mail share sent to you" : "Se te ha enviado una contraseña para compartir por correo", "You shared %1$s with %2$s by mail" : "Has compartido %1$s con %2$s por correo", "You shared {file} with {email} by mail" : "Has compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s compartido %1$s con %2$s por correo", "{actor} shared {file} with {email} by mail" : "{actor} compartió {file} con {email} por correo electrónico", + "Password to access %1$s was sent to %2s" : "Se ha enviado a %2s una contraseña para acceder a %1$s ", + "Password to access {file} was sent to {email}" : "Se ha enviado a {email} una contraseña para acceder a {file}", + "Password to access %1$s was sent to you" : "Se te ha enviado una contraseña para acceder a %1$s", + "Password to access {file} was sent to you" : "Se te ha enviado una contraseña para acceder a {file}", "Sharing %s failed, this item is already shared with %s" : "Falló el compartir %s , este ítem ya se encontraba compartido con %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No podemos enviarte la contraseña autogenerada. Por favor, indica una dirección de correo electrónico válida en tu configuración personal y vuelve a intentarlo.", "Failed to send share by E-mail" : "Falló enviar recurso compartido por correo electrónico", "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", @@ -15,14 +23,20 @@ "%s shared »%s« with you on behalf of %s." : "%s compartió »%s« con usted en nombre de %s.", "Click the button below to open it." : "Haga click en el botón debajo para abrirlo.", "Open »%s«" : "Abrir »%s«", + "%s via %s" : "%s por %s", "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", - "Password to access »%s«" : "Contraseña para acceder »%s«", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartió »%s« con usted. Debería haber recibido un mensaje de correo separado con un enlace para abrirlo.", + "Password to access »%s«" : "Contraseña para acceder »%s«", "It is protected with the following password: %s" : "Está protegido con la siguiente contraseña: %s", + "Password to access »%s« shared with %s" : "Se ha compartido con %s una contraseña para acceder a »%s«", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Usted acaba de compartir »%s« con %s. El recurso compartido ya fue enviado al destinatario. Debido a las reglas de seguridad definadas por el administrador de %s cada recurso compartido necesita ser protegido por una contraseña y no esta permitido que usted mande la contraseña directamente al destinatario. Por eso, usted necesita mandar la contraseña manualmente al destinatario.", + "This is the password: %s" : "Esta es la contraseña: %s", + "You can choose a different password at any time in the share dialog." : "Puedes elegir una contraseña diferente en cualquier momento en el diálogo de compartir.", "Could not find share" : "No se pudo encontrar el recurso compartido", "Share by mail" : "Enviado por correo electrónico", - "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite a los usuarios compartir un enlace personalizado a un archivo o carpeta enviándolo a una dirección de correo electrónico", "Send password by mail" : "Enviar contraseñas por email", + "Enforce password protection" : "Imponer la protección de contraseña", "Failed to create the E-mail" : "Falló crear el correo electrónico", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/ko.js b/apps/sharebymail/l10n/ko.js new file mode 100644 index 00000000000..5ce14742f03 --- /dev/null +++ b/apps/sharebymail/l10n/ko.js @@ -0,0 +1,50 @@ +OC.L10N.register( + "sharebymail", + { + "Shared with %1$s" : "%1$s 님과 공유함", + "Shared with {email}" : "{email} 님과 공유함", + "Shared with %1$s by %2$s" : "%2$s 님이 %1$s 님과 공유함", + "Shared with {email} by {actor}" : "{actor} 님이 {email} 님과 공유함", + "Password for mail share sent to %1$s" : "이메일 공유 암호를 %1$s(으)로 보냄", + "Password for mail share sent to {email}" : "이메일 공유 암호를 {email}(으)로 보냄", + "Password for mail share sent to you" : "이메일 공유 암호를 내게 보냄", + "You shared %1$s with %2$s by mail" : "%2$s 님과 %1$s을(를) 이메일로 공유함", + "You shared {file} with {email} by mail" : "{email} 님과 {file}을(를) 이메일로 공유함", + "%3$s shared %1$s with %2$s by mail" : "%3$s 님이 %2$s 님과 %1$s을(를) 이메일로 공유함", + "{actor} shared {file} with {email} by mail" : "{actor} 님이 {email} 님과 {file}을(를) 이메일로 공유함", + "Password to access %1$s was sent to %2s" : "%1$s에 접근할 수 있는 암호를 %2$s(으)로 보냄", + "Password to access {file} was sent to {email}" : "{file}에 접근할 수 있는 암호를 {email}(으)로 보냄", + "Password to access %1$s was sent to you" : "%1$s에 접근할 수 있는 암호를 내게 보냄", + "Password to access {file} was sent to you" : "{file}에 접근할 수 있는 암호를 내게 보냄", + "Sharing %s failed, this item is already shared with %s" : "%s을(를) 공유할 수 없음, 이 항목이 이미 %s 님과 공유됨", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "자동 생성된 암호를 이메일로 보낼 수 없습니다. 개인 설정에서 올바른 이메일 주소를 입력한 다음 다시 시도하십시오.", + "Failed to send share by E-mail" : "이메일로 공유를 보낼 수 없음", + "%s shared »%s« with you" : "%s 님이 %s을(를) 공유함", + "%s shared »%s« with you on behalf of %s" : "%s 님이 %s을(를) 공유함(%s 님 대신)", + "%s shared »%s« with you." : "%s 님이 %s을(를) 공유했습니다.", + "%s shared »%s« with you on behalf of %s." : "%s 님이 %s을(를) 공유했습니다(%s 님 대신).", + "Click the button below to open it." : "아래 단추를 눌러서 열 수 있습니다.", + "Open »%s«" : "%s 열기", + "%s via %s" : "%s(%s 경유)", + "Password to access »%s« shared to you by %s" : "%s에 접근할 수 있는 암호를 %s 님이 보냄", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s 님이 %s을(를) 공유했습니다.\n접근할 수 있는 링크가 포함된 별도의 이메일을 같이 전송했습니다.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s 님이 %s을(를) 공유했습니다. 접근할 수 있는 링크가 포함된 별도의 이메일을 같이 전송했습니다.", + "Password to access »%s«" : "%s에 접근할 수 있는 암호", + "It is protected with the following password: %s" : "다음 암호로 보호되어 있습니다: %s", + "Password to access »%s« shared with %s" : "%s에 접근할 수 있는 암호를 %s 님과 공유함", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "%s을(를) %s 님과 공유했습니다. 공유 정보를 이메일로 전송했습니다. %s 관리자의 보안 정책에 의하여 각각 공유 항목은 암호로 보호되어야 하며, 해당 암호를 직접 이메일로 보낼 수 없습니다. 수신자에게 이 암호를 다른 방법으로 직접 전달하십시오.", + "This is the password: %s" : "다음은 암호입니다: %s", + "You can choose a different password at any time in the share dialog." : "공유 대화 상자에서 언제든지 다른 암호를 선택할 수 있습니다.", + "Could not find share" : "공유를 찾을 수 없음", + "Share by mail" : "이메일로 공유", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "파일이나 폴더를 공유하는 개인화된 링크를 이메일 주소를 통해서 공유합니다.", + "Send password by mail" : "이메일로 암호 보내기", + "Enforce password protection" : "암호 보호 강제", + "Failed to create the E-mail" : "이메일을 생성할 수 없음", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "안녕하세요,\n\n%s 님이 여러분과 %s을(를) 공유했습니다(%s 님 대신).\n\n%s\n\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "안녕하세요,\n\n%s 님이 여러분과 %s을(를) 공유했습니다.\n\n%s\n\n", + "Cheers!" : "감사합니다!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "안녕하세요,<br><br>%s 님이 여러분과 <a href=\"%s\">%s</a>을(를) 공유했습니다(%s 님 대신).<br><br>", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "안녕하세요,<br><br>%s 님이 여러분과 <a href=\"%s\">%s</a>을(를) 공유했습니다.<br><br>" +}, +"nplurals=1; plural=0;"); diff --git a/apps/sharebymail/l10n/ko.json b/apps/sharebymail/l10n/ko.json new file mode 100644 index 00000000000..72fd3f11722 --- /dev/null +++ b/apps/sharebymail/l10n/ko.json @@ -0,0 +1,48 @@ +{ "translations": { + "Shared with %1$s" : "%1$s 님과 공유함", + "Shared with {email}" : "{email} 님과 공유함", + "Shared with %1$s by %2$s" : "%2$s 님이 %1$s 님과 공유함", + "Shared with {email} by {actor}" : "{actor} 님이 {email} 님과 공유함", + "Password for mail share sent to %1$s" : "이메일 공유 암호를 %1$s(으)로 보냄", + "Password for mail share sent to {email}" : "이메일 공유 암호를 {email}(으)로 보냄", + "Password for mail share sent to you" : "이메일 공유 암호를 내게 보냄", + "You shared %1$s with %2$s by mail" : "%2$s 님과 %1$s을(를) 이메일로 공유함", + "You shared {file} with {email} by mail" : "{email} 님과 {file}을(를) 이메일로 공유함", + "%3$s shared %1$s with %2$s by mail" : "%3$s 님이 %2$s 님과 %1$s을(를) 이메일로 공유함", + "{actor} shared {file} with {email} by mail" : "{actor} 님이 {email} 님과 {file}을(를) 이메일로 공유함", + "Password to access %1$s was sent to %2s" : "%1$s에 접근할 수 있는 암호를 %2$s(으)로 보냄", + "Password to access {file} was sent to {email}" : "{file}에 접근할 수 있는 암호를 {email}(으)로 보냄", + "Password to access %1$s was sent to you" : "%1$s에 접근할 수 있는 암호를 내게 보냄", + "Password to access {file} was sent to you" : "{file}에 접근할 수 있는 암호를 내게 보냄", + "Sharing %s failed, this item is already shared with %s" : "%s을(를) 공유할 수 없음, 이 항목이 이미 %s 님과 공유됨", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "자동 생성된 암호를 이메일로 보낼 수 없습니다. 개인 설정에서 올바른 이메일 주소를 입력한 다음 다시 시도하십시오.", + "Failed to send share by E-mail" : "이메일로 공유를 보낼 수 없음", + "%s shared »%s« with you" : "%s 님이 %s을(를) 공유함", + "%s shared »%s« with you on behalf of %s" : "%s 님이 %s을(를) 공유함(%s 님 대신)", + "%s shared »%s« with you." : "%s 님이 %s을(를) 공유했습니다.", + "%s shared »%s« with you on behalf of %s." : "%s 님이 %s을(를) 공유했습니다(%s 님 대신).", + "Click the button below to open it." : "아래 단추를 눌러서 열 수 있습니다.", + "Open »%s«" : "%s 열기", + "%s via %s" : "%s(%s 경유)", + "Password to access »%s« shared to you by %s" : "%s에 접근할 수 있는 암호를 %s 님이 보냄", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s 님이 %s을(를) 공유했습니다.\n접근할 수 있는 링크가 포함된 별도의 이메일을 같이 전송했습니다.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s 님이 %s을(를) 공유했습니다. 접근할 수 있는 링크가 포함된 별도의 이메일을 같이 전송했습니다.", + "Password to access »%s«" : "%s에 접근할 수 있는 암호", + "It is protected with the following password: %s" : "다음 암호로 보호되어 있습니다: %s", + "Password to access »%s« shared with %s" : "%s에 접근할 수 있는 암호를 %s 님과 공유함", + "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "%s을(를) %s 님과 공유했습니다. 공유 정보를 이메일로 전송했습니다. %s 관리자의 보안 정책에 의하여 각각 공유 항목은 암호로 보호되어야 하며, 해당 암호를 직접 이메일로 보낼 수 없습니다. 수신자에게 이 암호를 다른 방법으로 직접 전달하십시오.", + "This is the password: %s" : "다음은 암호입니다: %s", + "You can choose a different password at any time in the share dialog." : "공유 대화 상자에서 언제든지 다른 암호를 선택할 수 있습니다.", + "Could not find share" : "공유를 찾을 수 없음", + "Share by mail" : "이메일로 공유", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "파일이나 폴더를 공유하는 개인화된 링크를 이메일 주소를 통해서 공유합니다.", + "Send password by mail" : "이메일로 암호 보내기", + "Enforce password protection" : "암호 보호 강제", + "Failed to create the E-mail" : "이메일을 생성할 수 없음", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "안녕하세요,\n\n%s 님이 여러분과 %s을(를) 공유했습니다(%s 님 대신).\n\n%s\n\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "안녕하세요,\n\n%s 님이 여러분과 %s을(를) 공유했습니다.\n\n%s\n\n", + "Cheers!" : "감사합니다!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "안녕하세요,<br><br>%s 님이 여러분과 <a href=\"%s\">%s</a>을(를) 공유했습니다(%s 님 대신).<br><br>", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "안녕하세요,<br><br>%s 님이 여러분과 <a href=\"%s\">%s</a>을(를) 공유했습니다.<br><br>" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/sharebymail/l10n/nl.js b/apps/sharebymail/l10n/nl.js index e62d1877980..97fb2e2b806 100644 --- a/apps/sharebymail/l10n/nl.js +++ b/apps/sharebymail/l10n/nl.js @@ -37,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Je kunt in de Delen-dialoog altijd een ander wachtwoord kiezen.", "Could not find share" : "Kon gedeeld niet vinden", "Share by mail" : "Gedeeld via een E-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Staat gebruikers toe om een gepersonaliseerde link of map te delen door een e-mailadres in te voegen.", "Send password by mail" : "Wachtwoord per E-mail verzenden", "Enforce password protection" : "Afdwingenwachtwoordbeveiliging", "Failed to create the E-mail" : "Opmaken van de e-mail is mislukt", diff --git a/apps/sharebymail/l10n/nl.json b/apps/sharebymail/l10n/nl.json index 429f57e4597..d6c8dffc795 100644 --- a/apps/sharebymail/l10n/nl.json +++ b/apps/sharebymail/l10n/nl.json @@ -35,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Je kunt in de Delen-dialoog altijd een ander wachtwoord kiezen.", "Could not find share" : "Kon gedeeld niet vinden", "Share by mail" : "Gedeeld via een E-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Staat gebruikers toe om een gepersonaliseerde link of map te delen door een e-mailadres in te voegen.", "Send password by mail" : "Wachtwoord per E-mail verzenden", "Enforce password protection" : "Afdwingenwachtwoordbeveiliging", "Failed to create the E-mail" : "Opmaken van de e-mail is mislukt", diff --git a/apps/sharebymail/l10n/pl.js b/apps/sharebymail/l10n/pl.js index a5a7d29c1ac..fc3059c5bd5 100644 --- a/apps/sharebymail/l10n/pl.js +++ b/apps/sharebymail/l10n/pl.js @@ -5,11 +5,19 @@ OC.L10N.register( "Shared with {email}" : "Współdzielone z {email}", "Shared with %1$s by %2$s" : "Współdzielone z %1$s przez %2$s", "Shared with {email} by {actor}" : "Współdzielone z {email} przez {actor}", + "Password for mail share sent to %1$s" : "Hasło do współdzielenia przez mail zostało wysłane do %1$s", + "Password for mail share sent to {email}" : "Hasło do współdzielenia przez mail zostało wysłane do {email}", + "Password for mail share sent to you" : "Hasło do współdzielenia przez mail zostało wysłane do Ciebie", "You shared %1$s with %2$s by mail" : "Współdzielisz %1$s z %2$s przez e-maila", "You shared {file} with {email} by mail" : "Współdzielisz {file} z {email} przez e-maila", "%3$s shared %1$s with %2$s by mail" : "%3$s współdzieli %1$s z %2$s przez e-maila", "{actor} shared {file} with {email} by mail" : "{actor} współdzieli {file} z {email} przez e-maila", + "Password to access %1$s was sent to %2s" : "Hasło dostepu do %1$s zostało wysłane do %2s", + "Password to access {file} was sent to {email}" : "Hasło dostępu do {file} zostało wysłane do {email}", + "Password to access %1$s was sent to you" : "Hasło dostępu do %1$s zostało wysłane do ciebie", + "Password to access {file} was sent to you" : "Hasło dostępu do {file} zostało wysłane do ciebie", "Sharing %s failed, this item is already shared with %s" : "Współdzielenie %s nie udało się, ten obiekt już jest współdzielony z %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nie można wysłać automatycznie wygenerowanego hasła. Proszę ustawić prawidłowy adres e-mail w ustawieniach osobistych i spróbować ponownie.", "Failed to send share by E-mail" : "Nie udało się wysłać współdzielenia przez e-maila", "%s shared »%s« with you" : "%s współdzieli »%s« z tobą", "%s shared »%s« with you on behalf of %s" : "%s współdzieli »%s« z tobą w imieniu %s", @@ -17,14 +25,20 @@ OC.L10N.register( "%s shared »%s« with you on behalf of %s." : "%s współdzieli »%s« z tobą w imieniu %s.", "Click the button below to open it." : "Kliknij przycisk poniżej, żeby to otworzyć.", "Open »%s«" : "Otwórz »%s«", + "%s via %s" : "%s przez %s", "Password to access »%s« shared to you by %s" : "Hasło dostępu do »%s« jest udostępnione tobie przez %s", - "Password to access »%s«" : "Hasło do dostępu »%s«", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s współdzieli z Tobą »%s«.\nPowinieneś już otrzymać osobny e-mail zawierający link dostępowy.\n", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s współdzieli »%s« z tobą. Powinieneś już otrzymać osobnego e-maila z linkiem do dostępu.", + "Password to access »%s«" : "Hasło do dostępu »%s«", "It is protected with the following password: %s" : "To jest chronione z nstępującym hasłem: %s", + "Password to access »%s« shared with %s" : "Hasło dostępu do »%s« zostało udostępnione %s", + "This is the password: %s" : "To jest hasło: %s", + "You can choose a different password at any time in the share dialog." : "Możesz zmienić hasło w okienku współdzielenia w dowolnym momencie.", "Could not find share" : "Nie można odnaleźć współdzielonego obiektu", "Share by mail" : "Współdzielone e-mailem", - "Send a personalized link to a file or folder by mail." : "Wyślij spersonalizowany link do pliku lub folderu e-mailem.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Umożliwia współdzielenie spersonalizowanego linku do pliku lub folderu, umieszczając go w wiadomości e-mail.", "Send password by mail" : "Wyślij hasło e-mailem", + "Enforce password protection" : "Wymuś zabezpieczenie hasłem", "Failed to create the E-mail" : "Nie udało się utworzyć e-maila", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hej,\n\n%s współdzieli »%s« z tobą w imieniu %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hej,\n\n%s współdzieli »%s« z tobą.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/pl.json b/apps/sharebymail/l10n/pl.json index 43768f6413c..9d96dfa1117 100644 --- a/apps/sharebymail/l10n/pl.json +++ b/apps/sharebymail/l10n/pl.json @@ -3,11 +3,19 @@ "Shared with {email}" : "Współdzielone z {email}", "Shared with %1$s by %2$s" : "Współdzielone z %1$s przez %2$s", "Shared with {email} by {actor}" : "Współdzielone z {email} przez {actor}", + "Password for mail share sent to %1$s" : "Hasło do współdzielenia przez mail zostało wysłane do %1$s", + "Password for mail share sent to {email}" : "Hasło do współdzielenia przez mail zostało wysłane do {email}", + "Password for mail share sent to you" : "Hasło do współdzielenia przez mail zostało wysłane do Ciebie", "You shared %1$s with %2$s by mail" : "Współdzielisz %1$s z %2$s przez e-maila", "You shared {file} with {email} by mail" : "Współdzielisz {file} z {email} przez e-maila", "%3$s shared %1$s with %2$s by mail" : "%3$s współdzieli %1$s z %2$s przez e-maila", "{actor} shared {file} with {email} by mail" : "{actor} współdzieli {file} z {email} przez e-maila", + "Password to access %1$s was sent to %2s" : "Hasło dostepu do %1$s zostało wysłane do %2s", + "Password to access {file} was sent to {email}" : "Hasło dostępu do {file} zostało wysłane do {email}", + "Password to access %1$s was sent to you" : "Hasło dostępu do %1$s zostało wysłane do ciebie", + "Password to access {file} was sent to you" : "Hasło dostępu do {file} zostało wysłane do ciebie", "Sharing %s failed, this item is already shared with %s" : "Współdzielenie %s nie udało się, ten obiekt już jest współdzielony z %s", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nie można wysłać automatycznie wygenerowanego hasła. Proszę ustawić prawidłowy adres e-mail w ustawieniach osobistych i spróbować ponownie.", "Failed to send share by E-mail" : "Nie udało się wysłać współdzielenia przez e-maila", "%s shared »%s« with you" : "%s współdzieli »%s« z tobą", "%s shared »%s« with you on behalf of %s" : "%s współdzieli »%s« z tobą w imieniu %s", @@ -15,14 +23,20 @@ "%s shared »%s« with you on behalf of %s." : "%s współdzieli »%s« z tobą w imieniu %s.", "Click the button below to open it." : "Kliknij przycisk poniżej, żeby to otworzyć.", "Open »%s«" : "Otwórz »%s«", + "%s via %s" : "%s przez %s", "Password to access »%s« shared to you by %s" : "Hasło dostępu do »%s« jest udostępnione tobie przez %s", - "Password to access »%s«" : "Hasło do dostępu »%s«", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s współdzieli z Tobą »%s«.\nPowinieneś już otrzymać osobny e-mail zawierający link dostępowy.\n", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s współdzieli »%s« z tobą. Powinieneś już otrzymać osobnego e-maila z linkiem do dostępu.", + "Password to access »%s«" : "Hasło do dostępu »%s«", "It is protected with the following password: %s" : "To jest chronione z nstępującym hasłem: %s", + "Password to access »%s« shared with %s" : "Hasło dostępu do »%s« zostało udostępnione %s", + "This is the password: %s" : "To jest hasło: %s", + "You can choose a different password at any time in the share dialog." : "Możesz zmienić hasło w okienku współdzielenia w dowolnym momencie.", "Could not find share" : "Nie można odnaleźć współdzielonego obiektu", "Share by mail" : "Współdzielone e-mailem", - "Send a personalized link to a file or folder by mail." : "Wyślij spersonalizowany link do pliku lub folderu e-mailem.", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Umożliwia współdzielenie spersonalizowanego linku do pliku lub folderu, umieszczając go w wiadomości e-mail.", "Send password by mail" : "Wyślij hasło e-mailem", + "Enforce password protection" : "Wymuś zabezpieczenie hasłem", "Failed to create the E-mail" : "Nie udało się utworzyć e-maila", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hej,\n\n%s współdzieli »%s« z tobą w imieniu %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hej,\n\n%s współdzieli »%s« z tobą.\n\n%s\n\n", diff --git a/apps/sharebymail/l10n/pt_BR.js b/apps/sharebymail/l10n/pt_BR.js index edc96e08ef2..b7cf2a33e13 100644 --- a/apps/sharebymail/l10n/pt_BR.js +++ b/apps/sharebymail/l10n/pt_BR.js @@ -8,17 +8,17 @@ OC.L10N.register( "Password for mail share sent to %1$s" : "Senha para o correio compartilhado enviado para %1$s", "Password for mail share sent to {email}" : "Senha para o correio compartilhado enviado para {email}", "Password for mail share sent to you" : "Senha para o correio compartilhado enviado para você", - "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por email", - "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", - "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", - "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por e-mail", + "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por e-mail", + "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por e-mail", + "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por e-mail", "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", - "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", - "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um e-mail válido em sua configuração e tente novamente.", + "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por e-mail", "%s shared »%s« with you" : "%s compartilhou »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhou »%s« com você em nome de %s", "%s shared »%s« with you." : "%s compartilhou »%s« com você.", @@ -27,8 +27,8 @@ OC.L10N.register( "Open »%s«" : "Abrir »%s«", "%s via %s" : "%s via %s", "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", - "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um email com um link para acessá-lo.\n", - "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um email com um link para acessá-lo.", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um e-mail com um link para acessá-lo.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um e-mail com um link para acessá-lo.", "Password to access »%s«" : "Senha para acessar »%s«", "It is protected with the following password: %s" : "Está protegido com a seguinte senha: %s", "Password to access »%s« shared with %s" : "Senha para acessar »%s« compartilhado com %s", @@ -36,11 +36,11 @@ OC.L10N.register( "This is the password: %s" : "Essa é a senha: %s", "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "Share by mail" : "Compartilhamento por email", - "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", - "Send password by mail" : "Enviar senha por email", + "Share by mail" : "Compartilhamento por e-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", + "Send password by mail" : "Enviar senha por e-mail", "Enforce password protection" : "Reforce a proteção por senha", - "Failed to create the E-mail" : "Falhou ao criar o email", + "Failed to create the E-mail" : "Falhou ao criar o e-mail", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", "Cheers!" : "Saudações!", diff --git a/apps/sharebymail/l10n/pt_BR.json b/apps/sharebymail/l10n/pt_BR.json index 014f325a457..7b225bc7b11 100644 --- a/apps/sharebymail/l10n/pt_BR.json +++ b/apps/sharebymail/l10n/pt_BR.json @@ -6,17 +6,17 @@ "Password for mail share sent to %1$s" : "Senha para o correio compartilhado enviado para %1$s", "Password for mail share sent to {email}" : "Senha para o correio compartilhado enviado para {email}", "Password for mail share sent to you" : "Senha para o correio compartilhado enviado para você", - "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por email", - "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", - "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", - "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "You shared %1$s with %2$s by mail" : "Você compartilhou %1$s com %2$s por e-mail", + "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por e-mail", + "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por e-mail", + "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por e-mail", "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", - "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", - "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", + "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um e-mail válido em sua configuração e tente novamente.", + "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por e-mail", "%s shared »%s« with you" : "%s compartilhou »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhou »%s« com você em nome de %s", "%s shared »%s« with you." : "%s compartilhou »%s« com você.", @@ -25,8 +25,8 @@ "Open »%s«" : "Abrir »%s«", "%s via %s" : "%s via %s", "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", - "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um email com um link para acessá-lo.\n", - "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um email com um link para acessá-lo.", + "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s compartilhou »%s« com você.\nVocê já deve ter recebido um e-mail com um link para acessá-lo.\n", + "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s compartilhou »%s« com você. Você já deve ter recebido um e-mail com um link para acessá-lo.", "Password to access »%s«" : "Senha para acessar »%s«", "It is protected with the following password: %s" : "Está protegido com a seguinte senha: %s", "Password to access »%s« shared with %s" : "Senha para acessar »%s« compartilhado com %s", @@ -34,11 +34,11 @@ "This is the password: %s" : "Essa é a senha: %s", "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", - "Share by mail" : "Compartilhamento por email", - "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", - "Send password by mail" : "Enviar senha por email", + "Share by mail" : "Compartilhamento por e-mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de e-mail.", + "Send password by mail" : "Enviar senha por e-mail", "Enforce password protection" : "Reforce a proteção por senha", - "Failed to create the E-mail" : "Falhou ao criar o email", + "Failed to create the E-mail" : "Falhou ao criar o e-mail", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", "Cheers!" : "Saudações!", diff --git a/apps/sharebymail/l10n/ru.js b/apps/sharebymail/l10n/ru.js index c339c8a82a8..79cd6b68781 100644 --- a/apps/sharebymail/l10n/ru.js +++ b/apps/sharebymail/l10n/ru.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Вы предоставили общий доступ к {file} для {email} по email", "%3$s shared %1$s with %2$s by mail" : "%3$s предоставил общий доступ к %1$s для %2$s по email", "{actor} shared {file} with {email} by mail" : "{actor} предоставил общий доступ к {file} для {email} по email", + "Password to access %1$s was sent to %2s" : "Пароль для доступа к %1$s отправлен %2s", + "Password to access {file} was sent to {email}" : "Пароль для доступа к {file} отправлен {email}", + "Password to access %1$s was sent to you" : "Пароль для доступа к %1$s отправлен вам", + "Password to access {file} was sent to you" : "Пароль для доступа к {file} отправлен вам", "Sharing %s failed, this item is already shared with %s" : "Не удалось поделиться %s, к этому элементу уже предоставлен общий доступ для %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Не удаётся отправить вам автоматически созданный пароль. Укажите верный адрес email в своих личных настройках и попробуйте снова.", "Failed to send share by E-mail" : "Не удалось поделиться по e-mail", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой паорль в диалоге «Общий доступ».", "Could not find share" : "Не удалось найти общий ресурс", "Share by mail" : "Поделиться по почте", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Позволяет пользователям делиться персонализированной ссылкой на файл или каталог, введя адрес электронной почты.", "Send password by mail" : "Отправить пароль почтой", "Enforce password protection" : "Требовать защиту паролем", "Failed to create the E-mail" : "Не удалось создать e-mail", diff --git a/apps/sharebymail/l10n/ru.json b/apps/sharebymail/l10n/ru.json index 7e49354ab96..b541e33f98c 100644 --- a/apps/sharebymail/l10n/ru.json +++ b/apps/sharebymail/l10n/ru.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Вы предоставили общий доступ к {file} для {email} по email", "%3$s shared %1$s with %2$s by mail" : "%3$s предоставил общий доступ к %1$s для %2$s по email", "{actor} shared {file} with {email} by mail" : "{actor} предоставил общий доступ к {file} для {email} по email", + "Password to access %1$s was sent to %2s" : "Пароль для доступа к %1$s отправлен %2s", + "Password to access {file} was sent to {email}" : "Пароль для доступа к {file} отправлен {email}", + "Password to access %1$s was sent to you" : "Пароль для доступа к %1$s отправлен вам", + "Password to access {file} was sent to you" : "Пароль для доступа к {file} отправлен вам", "Sharing %s failed, this item is already shared with %s" : "Не удалось поделиться %s, к этому элементу уже предоставлен общий доступ для %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Не удаётся отправить вам автоматически созданный пароль. Укажите верный адрес email в своих личных настройках и попробуйте снова.", "Failed to send share by E-mail" : "Не удалось поделиться по e-mail", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой паорль в диалоге «Общий доступ».", "Could not find share" : "Не удалось найти общий ресурс", "Share by mail" : "Поделиться по почте", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Позволяет пользователям делиться персонализированной ссылкой на файл или каталог, введя адрес электронной почты.", "Send password by mail" : "Отправить пароль почтой", "Enforce password protection" : "Требовать защиту паролем", "Failed to create the E-mail" : "Не удалось создать e-mail", diff --git a/apps/systemtags/l10n/cs.js b/apps/systemtags/l10n/cs.js index d0f50c593dc..4789010525a 100644 --- a/apps/systemtags/l10n/cs.js +++ b/apps/systemtags/l10n/cs.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (neviditelný)", "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny", "Collaborative tags" : "Značky pro spolupráci", + "Create and edit collaborative tags. These tags affect all users." : "Vytvářejte a upravujte značky pro spolupráci. Tyto značky ovlivní všechny uživatele.", + "Select tag …" : "Vyberte značku …", "Name" : "Název", "Delete" : "Smazat", "Public" : "Veřejné", diff --git a/apps/systemtags/l10n/cs.json b/apps/systemtags/l10n/cs.json index 4f602fd9b7a..dbf7f5be2dd 100644 --- a/apps/systemtags/l10n/cs.json +++ b/apps/systemtags/l10n/cs.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (neviditelný)", "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové tagy</strong> souboru byly upraveny", "Collaborative tags" : "Značky pro spolupráci", + "Create and edit collaborative tags. These tags affect all users." : "Vytvářejte a upravujte značky pro spolupráci. Tyto značky ovlivní všechny uživatele.", + "Select tag …" : "Vyberte značku …", "Name" : "Název", "Delete" : "Smazat", "Public" : "Veřejné", diff --git a/apps/systemtags/l10n/es.js b/apps/systemtags/l10n/es.js index b4527b90ee3..d380ab58271 100644 --- a/apps/systemtags/l10n/es.js +++ b/apps/systemtags/l10n/es.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "Se han modificado las <strong>etiquetas de sistema</strong> de un archivo", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crea y edita etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios.", + "Select tag …" : "Selecciona etiqueta...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/es.json b/apps/systemtags/l10n/es.json index 486e73ab5c5..51bb3668f6f 100644 --- a/apps/systemtags/l10n/es.json +++ b/apps/systemtags/l10n/es.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "Se han modificado las <strong>etiquetas de sistema</strong> de un archivo", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crea y edita etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios.", + "Select tag …" : "Selecciona etiqueta...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/fr.js b/apps/systemtags/l10n/fr.js index b43d0518749..56335c2abf8 100644 --- a/apps/systemtags/l10n/fr.js +++ b/apps/systemtags/l10n/fr.js @@ -42,6 +42,7 @@ OC.L10N.register( "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", "Collaborative tags" : "Étiquettes collaboratives ", + "Create and edit collaborative tags. These tags affect all users." : "Créer et modifier des étiquettes collaboratives. Ces étiquettes vont affecter tous les utilisateurs.", "Select tag …" : "Sélectionner une étiquette…", "Name" : "Nom", "Delete" : "Supprimer", diff --git a/apps/systemtags/l10n/fr.json b/apps/systemtags/l10n/fr.json index f4c52009f1a..2d2396dc785 100644 --- a/apps/systemtags/l10n/fr.json +++ b/apps/systemtags/l10n/fr.json @@ -40,6 +40,7 @@ "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", "Collaborative tags" : "Étiquettes collaboratives ", + "Create and edit collaborative tags. These tags affect all users." : "Créer et modifier des étiquettes collaboratives. Ces étiquettes vont affecter tous les utilisateurs.", "Select tag …" : "Sélectionner une étiquette…", "Name" : "Nom", "Delete" : "Supprimer", diff --git a/apps/systemtags/l10n/ko.js b/apps/systemtags/l10n/ko.js index 10eb1cf229e..ad00ec504b3 100644 --- a/apps/systemtags/l10n/ko.js +++ b/apps/systemtags/l10n/ko.js @@ -2,13 +2,56 @@ OC.L10N.register( "systemtags", { "Tags" : "태그", + "Update" : "업데이트", + "Create" : "만들기", + "Select tag…" : "태그 선택…", "Tagged files" : "태그 된 파일", - "Select tags to filter by" : "필터링 할 태그 선택", - "Please select tags to filter by" : "필터링 할 태그 선택", - "No files found for the selected tags" : "선택한 태그에 대한 파일을 찾을 수 없음", + "Select tags to filter by" : "필터링할 태그 선택", + "No tags found" : "태그를 찾을 수 없음", + "Please select tags to filter by" : "필터링할 태그를 선택하십시오", + "No files found for the selected tags" : "선택한 태그가 붙은 파일을 찾을 수 없음", + "Added system tag %1$s" : "시스템 태그 %1$s을(를) 추가함", + "Added system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 추가함", + "%1$s added system tag %2$s" : "%1$s 님이 시스템 태그 %2$s을(를) 추가함", + "{actor} added system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 추가함", + "Removed system tag %1$s" : "시스템 태그 %1$s을(를) 삭제함", + "Removed system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 삭제함", + "%1$s removed system tag %2$s" : "%1$ 님이 시스템 태그 %2$s을(를) 삭제함", + "{actor} removed system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 삭제함", + "You created system tag %1$s" : "시스템 태그 %1$s을(를) 생성함", + "You created system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 생성함", + "%1$s created system tag %2$s" : "%1$s 님이 시스템 태그 %2$s을(를) 생성함", + "{actor} created system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 생성함", + "You deleted system tag %1$s" : "시스템 태그 %1$s을(를) 삭제함", + "You deleted system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 삭제함", + "%1$s deleted system tag %2$s" : "%1$ 님이 시스템 태그 %2$s을(를) 삭제함", + "{actor} deleted system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 삭제함", + "You updated system tag %2$s to %1$s" : "시스템 태그 %2$s을(를) %1$s(으)로 업데이트함", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "시스템 태그 {oldsystemtag}을(를) {newsystemtag}(으)로 업데이트함", + "%1$s updated system tag %3$s to %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s(으)로 업데이트함", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} 님이 시스템 태그 {oldsystemtag}을(를) {newsystemtag}(으)로 업데이트함", + "You added system tag %2$s to %1$s" : "시스템 태그 %2$s을(를) %1$s에 추가함", + "You added system tag {systemtag} to {file}" : "시스템 태그 {systemtag}을(를) {file}에 추가함", + "%1$s added system tag %3$s to %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s에 추가함", + "{actor} added system tag {systemtag} to {file}" : "{actor} 님이 시스템 태그 {systemtag}을(를) {file}에 추가함", + "You removed system tag %2$s from %1$s" : "시스템 태그 %2$s을(를) %1$s에서 삭제함", + "You removed system tag {systemtag} from {file}" : "시스템 태그 {systemtag}을(를) {file}에서 삭제함", + "%1$s removed system tag %3$s from %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s에서 삭제함", + "{actor} removed system tag {systemtag} from {file}" : "{actor} 님이 시스템 태그 {systemtag}을(를) {file}에서 삭제함", + "%s (restricted)" : "%s(제한됨)", + "%s (invisible)" : "%s(숨겨짐)", + "<strong>System tags</strong> for a file have been modified" : "파일의 <strong>시스템 태그</strong>가 수정됨", + "Collaborative tags" : "협업 태그", + "Create and edit collaborative tags. These tags affect all users." : "협업 태그를 만들고 수정합니다. 이 태그는 모든 사용자에게 영향을 줍니다.", + "Select tag …" : "태그 선택 …", + "Name" : "이름", + "Delete" : "삭제", + "Public" : "공개", + "Restricted" : "제한됨", + "Invisible" : "숨겨짐", + "Reset" : "재설정", "No files in here" : "여기에 파일 없음", "No entries found in this folder" : "이 폴더에 항목 없음", - "Name" : "이름", "Size" : "크기", "Modified" : "수정됨" }, diff --git a/apps/systemtags/l10n/ko.json b/apps/systemtags/l10n/ko.json index f5a9052168c..8b5b630333c 100644 --- a/apps/systemtags/l10n/ko.json +++ b/apps/systemtags/l10n/ko.json @@ -1,12 +1,55 @@ { "translations": { "Tags" : "태그", + "Update" : "업데이트", + "Create" : "만들기", + "Select tag…" : "태그 선택…", "Tagged files" : "태그 된 파일", - "Select tags to filter by" : "필터링 할 태그 선택", - "Please select tags to filter by" : "필터링 할 태그 선택", - "No files found for the selected tags" : "선택한 태그에 대한 파일을 찾을 수 없음", + "Select tags to filter by" : "필터링할 태그 선택", + "No tags found" : "태그를 찾을 수 없음", + "Please select tags to filter by" : "필터링할 태그를 선택하십시오", + "No files found for the selected tags" : "선택한 태그가 붙은 파일을 찾을 수 없음", + "Added system tag %1$s" : "시스템 태그 %1$s을(를) 추가함", + "Added system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 추가함", + "%1$s added system tag %2$s" : "%1$s 님이 시스템 태그 %2$s을(를) 추가함", + "{actor} added system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 추가함", + "Removed system tag %1$s" : "시스템 태그 %1$s을(를) 삭제함", + "Removed system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 삭제함", + "%1$s removed system tag %2$s" : "%1$ 님이 시스템 태그 %2$s을(를) 삭제함", + "{actor} removed system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 삭제함", + "You created system tag %1$s" : "시스템 태그 %1$s을(를) 생성함", + "You created system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 생성함", + "%1$s created system tag %2$s" : "%1$s 님이 시스템 태그 %2$s을(를) 생성함", + "{actor} created system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 생성함", + "You deleted system tag %1$s" : "시스템 태그 %1$s을(를) 삭제함", + "You deleted system tag {systemtag}" : "시스템 태그 {systemtag}을(를) 삭제함", + "%1$s deleted system tag %2$s" : "%1$ 님이 시스템 태그 %2$s을(를) 삭제함", + "{actor} deleted system tag {systemtag}" : "{actor} 님이 시스템 태그 {systemtag}을(를) 삭제함", + "You updated system tag %2$s to %1$s" : "시스템 태그 %2$s을(를) %1$s(으)로 업데이트함", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "시스템 태그 {oldsystemtag}을(를) {newsystemtag}(으)로 업데이트함", + "%1$s updated system tag %3$s to %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s(으)로 업데이트함", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} 님이 시스템 태그 {oldsystemtag}을(를) {newsystemtag}(으)로 업데이트함", + "You added system tag %2$s to %1$s" : "시스템 태그 %2$s을(를) %1$s에 추가함", + "You added system tag {systemtag} to {file}" : "시스템 태그 {systemtag}을(를) {file}에 추가함", + "%1$s added system tag %3$s to %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s에 추가함", + "{actor} added system tag {systemtag} to {file}" : "{actor} 님이 시스템 태그 {systemtag}을(를) {file}에 추가함", + "You removed system tag %2$s from %1$s" : "시스템 태그 %2$s을(를) %1$s에서 삭제함", + "You removed system tag {systemtag} from {file}" : "시스템 태그 {systemtag}을(를) {file}에서 삭제함", + "%1$s removed system tag %3$s from %2$s" : "%1$s 님이 시스템 태그 %3$s을(를) %2$s에서 삭제함", + "{actor} removed system tag {systemtag} from {file}" : "{actor} 님이 시스템 태그 {systemtag}을(를) {file}에서 삭제함", + "%s (restricted)" : "%s(제한됨)", + "%s (invisible)" : "%s(숨겨짐)", + "<strong>System tags</strong> for a file have been modified" : "파일의 <strong>시스템 태그</strong>가 수정됨", + "Collaborative tags" : "협업 태그", + "Create and edit collaborative tags. These tags affect all users." : "협업 태그를 만들고 수정합니다. 이 태그는 모든 사용자에게 영향을 줍니다.", + "Select tag …" : "태그 선택 …", + "Name" : "이름", + "Delete" : "삭제", + "Public" : "공개", + "Restricted" : "제한됨", + "Invisible" : "숨겨짐", + "Reset" : "재설정", "No files in here" : "여기에 파일 없음", "No entries found in this folder" : "이 폴더에 항목 없음", - "Name" : "이름", "Size" : "크기", "Modified" : "수정됨" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/systemtags/l10n/pl.js b/apps/systemtags/l10n/pl.js index 8c1ea397f8e..a53057c79b0 100644 --- a/apps/systemtags/l10n/pl.js +++ b/apps/systemtags/l10n/pl.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (niewidoczny)", "<strong>System tags</strong> for a file have been modified" : "<strong>Etykieta systemowa</strong> dla pliku została zmieniona", "Collaborative tags" : "Wspólne etykiety", + "Create and edit collaborative tags. These tags affect all users." : "Utwórz i edytuj tagi współpracy. Te tagi mają wpływ na wszystkich użytkowników.", + "Select tag …" : "Wybierz tag ...", "Name" : "Nazwa", "Delete" : "Usuń", "Public" : "Publiczne", diff --git a/apps/systemtags/l10n/pl.json b/apps/systemtags/l10n/pl.json index 57474002e69..b16312a452b 100644 --- a/apps/systemtags/l10n/pl.json +++ b/apps/systemtags/l10n/pl.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (niewidoczny)", "<strong>System tags</strong> for a file have been modified" : "<strong>Etykieta systemowa</strong> dla pliku została zmieniona", "Collaborative tags" : "Wspólne etykiety", + "Create and edit collaborative tags. These tags affect all users." : "Utwórz i edytuj tagi współpracy. Te tagi mają wpływ na wszystkich użytkowników.", + "Select tag …" : "Wybierz tag ...", "Name" : "Nazwa", "Delete" : "Usuń", "Public" : "Publiczne", diff --git a/apps/systemtags/l10n/ru.js b/apps/systemtags/l10n/ru.js index d32f7159dc0..f9dc271256d 100644 --- a/apps/systemtags/l10n/ru.js +++ b/apps/systemtags/l10n/ru.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (невидимые)", "<strong>System tags</strong> for a file have been modified" : "<strong>Системные метки</strong> файла были изменены", "Collaborative tags" : "Совместные метки", + "Create and edit collaborative tags. These tags affect all users." : "Создание и изменение меток совместной работы. Эти метки влияют на всех пользователей.", + "Select tag …" : "Выберите метку…", "Name" : "Имя", "Delete" : "Удалить", "Public" : "Открытый", diff --git a/apps/systemtags/l10n/ru.json b/apps/systemtags/l10n/ru.json index 84438433c52..47e123f28a6 100644 --- a/apps/systemtags/l10n/ru.json +++ b/apps/systemtags/l10n/ru.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (невидимые)", "<strong>System tags</strong> for a file have been modified" : "<strong>Системные метки</strong> файла были изменены", "Collaborative tags" : "Совместные метки", + "Create and edit collaborative tags. These tags affect all users." : "Создание и изменение меток совместной работы. Эти метки влияют на всех пользователей.", + "Select tag …" : "Выберите метку…", "Name" : "Имя", "Delete" : "Удалить", "Public" : "Открытый", diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css index 8cc3f0dfe14..e401d77e4b6 100644 --- a/apps/theming/css/settings-admin.css +++ b/apps/theming/css/settings-admin.css @@ -26,10 +26,20 @@ display: inline-block; visibility: hidden; } -#theming form .theme-undo { +form.uploadButton { + width: 356px; +} +#theming form .theme-undo, +#theming .theme-remove-bg { + cursor: pointer; + opacity: .3; + padding: 7px; + vertical-align: top; + display: inline-block; + float: right; position: relative; top: 4px; - left: 158px; + right: 0px; visibility: visible; } #theming input[type='text']:focus + .theme-undo, @@ -54,7 +64,8 @@ margin: 2px 0px; } -#theming .icon-upload { +#theming .icon-upload, +#theming .icon-loading-small { padding: 8px 20px; width: 20px; margin: 2px 0px; diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss index d2196362d3b..2a5a0e5cd46 100644 --- a/apps/theming/css/theming.scss +++ b/apps/theming/css/theming.scss @@ -45,12 +45,12 @@ #header .logo, #header .logo-icon { background-size: contain; - background-image: url(#{$image-logo}?v=#{$theming-cachebuster}); + background-image: url(#{$image-logo}); } #body-login, #firstrunwizard .firstrunwizard-header { - background-image: url(#{$image-login-background}?v=#{$theming-cachebuster}); + background-image: url(#{$image-login-background}); background-color: $color-primary; } @@ -64,4 +64,50 @@ input.primary { #body-login input.login { background-image: url('../../../core/img/actions/confirm.svg'); } +} + +// plain background color for login page +@if $image-login-plain == 'true' { + #body-login, #firstrunwizard .firstrunwizard-header, #theming-preview { + background-image: none !important; + background-color: $color-primary; + } + #body-login { + + a, label, p { + color: $color-primary-text !important; + } + + @if (lightness($color-primary) > 50) { + #submit { + border-color: nc-darken($color-primary, 20%); + background-color: nc-darken($color-primary, 20%); + } + #submit:hover { + border-color: nc-darken($color-primary, 10%); + background-color: nc-darken($color-primary, 10%); + } + input[type='checkbox'].checkbox--white + label:before { + border-color: nc-darken($color-primary, 40%) !important; + } + input[type='checkbox'].checkbox--white:not(:disabled):not(:checked) + label:hover:before, + input[type='checkbox'].checkbox--white:focus + label:before { + border-color: nc-darken($color-primary, 30%) !important; + } + input[type='checkbox'].checkbox--white:checked + label:before { + border-color: nc-darken($color-primary, 30%) !important; + background-image: url('../../../core/img/actions/checkbox-mark.svg'); + background-color: nc-darken($color-primary, 30%) !important; + } + } @else { + #submit { + border-color: nc-lighten($color-primary, 20%); + background-color: nc-lighten($color-primary, 20%); + } + #submit:hover { + border-color: nc-lighten($color-primary, 10%); + background-color: nc-lighten($color-primary, 10%); + } + } + } }
\ No newline at end of file diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js index 802f6e05c07..5d91892c007 100644 --- a/apps/theming/js/settings-admin.js +++ b/apps/theming/js/settings-admin.js @@ -35,6 +35,7 @@ function setThemingValue(setting, value) { OC.msg.finishedSaving('#theming_settings_msg', response); $('#theming_settings_loading').hide(); }); + } function preview(setting, value) { @@ -74,18 +75,13 @@ function preview(setting, value) { previewImageLogo.src = OC.getRootPath() + '/core/img/logo-icon.svg?v' + timestamp; } } - if (setting === 'backgroundMime') { - var previewImage = document.getElementById('theming-preview'); - if (value !== '') { - previewImage.style.backgroundImage = "url('" + OC.generateUrl('/apps/theming/loginbackground') + "?v" + timestamp + "')"; - } else { - previewImage.style.backgroundImage = "url('" + OC.getRootPath() + '/core/img/background.jpg?v' + timestamp + "')"; - } - } if (setting === 'name') { window.document.title = t('core', 'Admin') + " - " + value; } + + hideUndoButton(setting, value); + } function hideUndoButton(setting, value) { @@ -103,6 +99,14 @@ function hideUndoButton(setting, value) { } else { $('.theme-undo[data-setting=' + setting + ']').show(); } + + if(setting === 'backgroundMime' && value !== 'backgroundColor') { + $('.theme-remove-bg').show(); + } + if(setting === 'backgroundMime' && value === 'backgroundColor') { + $('.theme-remove-bg').hide(); + $('.theme-undo[data-setting=backgroundMime]').show(); + } } $(document).ready(function () { @@ -116,6 +120,7 @@ $(document).ready(function () { } hideUndoButton(setting, value); }); + var uploadParamsLogo = { pasteZone: null, dropZone: null, @@ -208,4 +213,16 @@ $(document).ready(function () { preview(setting, response.data.value); }); }); + + $('.theme-remove-bg').click(function() { + startLoading(); + $.post( + OC.generateUrl('/apps/theming/ajax/updateLogo'), {'backgroundColor' : true} + ).done(function(response) { + preview('backgroundMime', 'backgroundColor'); + }).fail(function(response) { + OC.msg.finishedSaving('#theming_settings_msg', response); + }); + }); + }); diff --git a/apps/theming/l10n/cs.js b/apps/theming/l10n/cs.js index 9d5f573e6fa..43484fa6397 100644 --- a/apps/theming/l10n/cs.js +++ b/apps/theming/l10n/cs.js @@ -13,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Nepodporovaný typ obrázku", "You are already using a custom theme" : "Již používáte vlastní motiv", "Theming" : "Motivy", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motivy umožňují jednoduché přizpůsobení vzhledu vaší instance a podporovaných klientů. Uvidí to všichni uživatelé.", "Name" : "Název", "reset to default" : "obnovit výchozí", "Web address" : "Webová adresa", diff --git a/apps/theming/l10n/cs.json b/apps/theming/l10n/cs.json index b4fc64ac37e..963be4b8184 100644 --- a/apps/theming/l10n/cs.json +++ b/apps/theming/l10n/cs.json @@ -11,6 +11,7 @@ "Unsupported image type" : "Nepodporovaný typ obrázku", "You are already using a custom theme" : "Již používáte vlastní motiv", "Theming" : "Motivy", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motivy umožňují jednoduché přizpůsobení vzhledu vaší instance a podporovaných klientů. Uvidí to všichni uživatelé.", "Name" : "Název", "reset to default" : "obnovit výchozí", "Web address" : "Webová adresa", diff --git a/apps/theming/l10n/el.js b/apps/theming/l10n/el.js index 4bfd9bf3cf7..57f45818b3c 100644 --- a/apps/theming/l10n/el.js +++ b/apps/theming/l10n/el.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Φόρτωση προεπισκόπησης ...", "Saved" : "Αποθηκεύτηκαν", "Admin" : "Διαχειριστής", "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", diff --git a/apps/theming/l10n/el.json b/apps/theming/l10n/el.json index 9169c1e4ad3..3fd78ccd8fe 100644 --- a/apps/theming/l10n/el.json +++ b/apps/theming/l10n/el.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Φόρτωση προεπισκόπησης ...", "Saved" : "Αποθηκεύτηκαν", "Admin" : "Διαχειριστής", "a safe home for all your data" : "μια ασφαλής τοποθεσία για όλα σας τα δεδομένα", diff --git a/apps/theming/l10n/en_GB.js b/apps/theming/l10n/en_GB.js new file mode 100644 index 00000000000..ed29a83eca3 --- /dev/null +++ b/apps/theming/l10n/en_GB.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "theming", + { + "Loading preview…" : "Loading preview…", + "Saved" : "Saved", + "Admin" : "Admin", + "a safe home for all your data" : "a safe home for all your data", + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "No file uploaded" : "No file uploaded", + "Unsupported image type" : "Unsupported image type", + "You are already using a custom theme" : "You are already using a custom theme", + "Theming" : "Theming", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Name" : "Name", + "reset to default" : "reset to default", + "Web address" : "Web address", + "Web address https://…" : "Web address https://…", + "Slogan" : "Slogan", + "Color" : "Colour", + "Logo" : "Logo", + "Upload new logo" : "Upload new logo", + "Login image" : "Login image", + "Upload new login background" : "Upload new login background", + "Log in image" : "Log in image" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/en_GB.json b/apps/theming/l10n/en_GB.json new file mode 100644 index 00000000000..27a4eb827bd --- /dev/null +++ b/apps/theming/l10n/en_GB.json @@ -0,0 +1,27 @@ +{ "translations": { + "Loading preview…" : "Loading preview…", + "Saved" : "Saved", + "Admin" : "Admin", + "a safe home for all your data" : "a safe home for all your data", + "The given name is too long" : "The given name is too long", + "The given web address is too long" : "The given web address is too long", + "The given slogan is too long" : "The given slogan is too long", + "The given color is invalid" : "The given colour is invalid", + "No file uploaded" : "No file uploaded", + "Unsupported image type" : "Unsupported image type", + "You are already using a custom theme" : "You are already using a custom theme", + "Theming" : "Theming", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Theming makes it possible to easily customise the look and feel of your instance and supported clients. This will be visible for all users.", + "Name" : "Name", + "reset to default" : "reset to default", + "Web address" : "Web address", + "Web address https://…" : "Web address https://…", + "Slogan" : "Slogan", + "Color" : "Colour", + "Logo" : "Logo", + "Upload new logo" : "Upload new logo", + "Login image" : "Login image", + "Upload new login background" : "Upload new login background", + "Log in image" : "Log in image" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/es.js b/apps/theming/l10n/es.js index cb1629de223..0bebcfc70bc 100644 --- a/apps/theming/l10n/es.js +++ b/apps/theming/l10n/es.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Cargando previsualización...", "Saved" : "Guardado", "Admin" : "Administración", "a safe home for all your data" : "un hogar seguro para todos tus datos", @@ -12,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Tipo de imagen no soportado", "You are already using a custom theme" : "Usted ya usa un tema personalizado", "Theming" : "Tema", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los temas hacen posible personalizar fácilmente la apariencia de tu instancia y los clientes soportados. Esto será visible para todos los usuarios.", "Name" : "Nombre", "reset to default" : "restaurar a configuración inicial", "Web address" : "Dirección web", diff --git a/apps/theming/l10n/es.json b/apps/theming/l10n/es.json index 4aa3cadcef7..4fac8e86994 100644 --- a/apps/theming/l10n/es.json +++ b/apps/theming/l10n/es.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Cargando previsualización...", "Saved" : "Guardado", "Admin" : "Administración", "a safe home for all your data" : "un hogar seguro para todos tus datos", @@ -10,6 +11,7 @@ "Unsupported image type" : "Tipo de imagen no soportado", "You are already using a custom theme" : "Usted ya usa un tema personalizado", "Theming" : "Tema", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Los temas hacen posible personalizar fácilmente la apariencia de tu instancia y los clientes soportados. Esto será visible para todos los usuarios.", "Name" : "Nombre", "reset to default" : "restaurar a configuración inicial", "Web address" : "Dirección web", diff --git a/apps/theming/l10n/es_MX.js b/apps/theming/l10n/es_MX.js index c5640d03436..95e0e1bccc8 100644 --- a/apps/theming/l10n/es_MX.js +++ b/apps/theming/l10n/es_MX.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Cargando vista previa...", "Saved" : "Guardado", "Admin" : "Administración", "a safe home for all your data" : "un lugar seguro para todos sus datos", @@ -12,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Tipo de imagen no soportado", "You are already using a custom theme" : "Usted ya se encuentra usando un tema personalizado", "Theming" : "Tematizar", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve su instancia y clientes soportados. Esto será visible para todos los usuarios. ", "Name" : "Nombre", "reset to default" : "restaurar a predeterminado", "Web address" : "Dirección web", diff --git a/apps/theming/l10n/es_MX.json b/apps/theming/l10n/es_MX.json index 12ed64f3f84..1338ac354f1 100644 --- a/apps/theming/l10n/es_MX.json +++ b/apps/theming/l10n/es_MX.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Cargando vista previa...", "Saved" : "Guardado", "Admin" : "Administración", "a safe home for all your data" : "un lugar seguro para todos sus datos", @@ -10,6 +11,7 @@ "Unsupported image type" : "Tipo de imagen no soportado", "You are already using a custom theme" : "Usted ya se encuentra usando un tema personalizado", "Theming" : "Tematizar", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "El tematizar hace posible personalizar facilmente la manera en que se ve su instancia y clientes soportados. Esto será visible para todos los usuarios. ", "Name" : "Nombre", "reset to default" : "restaurar a predeterminado", "Web address" : "Dirección web", diff --git a/apps/theming/l10n/id.js b/apps/theming/l10n/id.js new file mode 100644 index 00000000000..fa6086692d6 --- /dev/null +++ b/apps/theming/l10n/id.js @@ -0,0 +1,24 @@ +OC.L10N.register( + "theming", + { + "Loading preview…" : "Memuat pratinjau", + "Saved" : "Disimpan", + "Admin" : "Admin", + "The given name is too long" : "Pemberian nama terlalu panjang", + "The given web address is too long" : "Pemberian alamat web terlalu panjang", + "The given slogan is too long" : "Pemberian slogan terlalu panjang", + "No file uploaded" : "Tidak ada file diunggah", + "Unsupported image type" : "Tipe gambar tidak bisa diterima", + "You are already using a custom theme" : "Anda telah siap menggunakan Tema Kustom", + "Theming" : "Tema", + "Name" : "Nama", + "reset to default" : "Atur ulang ke awal", + "Web address" : "Alamat Web", + "Web address https://…" : "Alamat Web https://...", + "Slogan" : "Slogan", + "Color" : "Warna", + "Logo" : "Logo", + "Upload new logo" : "Unggah Logo baru", + "Login image" : "Gambar ketika masuk" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/id.json b/apps/theming/l10n/id.json new file mode 100644 index 00000000000..65a83d56942 --- /dev/null +++ b/apps/theming/l10n/id.json @@ -0,0 +1,22 @@ +{ "translations": { + "Loading preview…" : "Memuat pratinjau", + "Saved" : "Disimpan", + "Admin" : "Admin", + "The given name is too long" : "Pemberian nama terlalu panjang", + "The given web address is too long" : "Pemberian alamat web terlalu panjang", + "The given slogan is too long" : "Pemberian slogan terlalu panjang", + "No file uploaded" : "Tidak ada file diunggah", + "Unsupported image type" : "Tipe gambar tidak bisa diterima", + "You are already using a custom theme" : "Anda telah siap menggunakan Tema Kustom", + "Theming" : "Tema", + "Name" : "Nama", + "reset to default" : "Atur ulang ke awal", + "Web address" : "Alamat Web", + "Web address https://…" : "Alamat Web https://...", + "Slogan" : "Slogan", + "Color" : "Warna", + "Logo" : "Logo", + "Upload new logo" : "Unggah Logo baru", + "Login image" : "Gambar ketika masuk" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/ko.js b/apps/theming/l10n/ko.js new file mode 100644 index 00000000000..6c222b56373 --- /dev/null +++ b/apps/theming/l10n/ko.js @@ -0,0 +1,29 @@ +OC.L10N.register( + "theming", + { + "Loading preview…" : "미리 보기 불러오는 중…", + "Saved" : "저장됨", + "Admin" : "관리자", + "a safe home for all your data" : "내 모든 데이터 안전 저장소", + "The given name is too long" : "입력한 이름이 너무 김", + "The given web address is too long" : "입력한 웹 주소가 너무 김", + "The given slogan is too long" : "입력한 슬로건이 너무 김", + "The given color is invalid" : "입력한 색상이 잘못됨", + "No file uploaded" : "업로드한 파일 없음", + "Unsupported image type" : "지원하지 않는 사진 형식", + "You are already using a custom theme" : "이미 사용자 정의 테마 사용 중", + "Theming" : "테마", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "테마를 사용하여 내 인스턴스와 지원하는 클라이언트의 모습을 변경할 수 있습니다. 테마는 모든 사용자에게 적용됩니다.", + "Name" : "이름", + "reset to default" : "기본값으로 초기화", + "Web address" : "웹 주소", + "Web address https://…" : "웹 주소 https://…", + "Slogan" : "슬로건", + "Color" : "색", + "Logo" : "로고", + "Upload new logo" : "새 로고 업로드", + "Login image" : "로그인 그림", + "Upload new login background" : "새 로그인 배경 업로드", + "Log in image" : "로그인 그림" +}, +"nplurals=1; plural=0;"); diff --git a/apps/theming/l10n/ko.json b/apps/theming/l10n/ko.json new file mode 100644 index 00000000000..74c621d6dcc --- /dev/null +++ b/apps/theming/l10n/ko.json @@ -0,0 +1,27 @@ +{ "translations": { + "Loading preview…" : "미리 보기 불러오는 중…", + "Saved" : "저장됨", + "Admin" : "관리자", + "a safe home for all your data" : "내 모든 데이터 안전 저장소", + "The given name is too long" : "입력한 이름이 너무 김", + "The given web address is too long" : "입력한 웹 주소가 너무 김", + "The given slogan is too long" : "입력한 슬로건이 너무 김", + "The given color is invalid" : "입력한 색상이 잘못됨", + "No file uploaded" : "업로드한 파일 없음", + "Unsupported image type" : "지원하지 않는 사진 형식", + "You are already using a custom theme" : "이미 사용자 정의 테마 사용 중", + "Theming" : "테마", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "테마를 사용하여 내 인스턴스와 지원하는 클라이언트의 모습을 변경할 수 있습니다. 테마는 모든 사용자에게 적용됩니다.", + "Name" : "이름", + "reset to default" : "기본값으로 초기화", + "Web address" : "웹 주소", + "Web address https://…" : "웹 주소 https://…", + "Slogan" : "슬로건", + "Color" : "색", + "Logo" : "로고", + "Upload new logo" : "새 로고 업로드", + "Login image" : "로그인 그림", + "Upload new login background" : "새 로그인 배경 업로드", + "Log in image" : "로그인 그림" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/theming/l10n/nb.js b/apps/theming/l10n/nb.js index f91176aa79e..eb1791bc07d 100644 --- a/apps/theming/l10n/nb.js +++ b/apps/theming/l10n/nb.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Laster forshåndsvisning...", "Saved" : "Lagret", "Admin" : "Admin", "a safe home for all your data" : "et trygt hjem for alle dine data", diff --git a/apps/theming/l10n/nb.json b/apps/theming/l10n/nb.json index 2dfb84f1a15..f8b274f31fd 100644 --- a/apps/theming/l10n/nb.json +++ b/apps/theming/l10n/nb.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Laster forshåndsvisning...", "Saved" : "Lagret", "Admin" : "Admin", "a safe home for all your data" : "et trygt hjem for alle dine data", diff --git a/apps/theming/l10n/nl.js b/apps/theming/l10n/nl.js index b4646d4f993..55db4422623 100644 --- a/apps/theming/l10n/nl.js +++ b/apps/theming/l10n/nl.js @@ -13,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Afbeeldingstype wordt niet ondersteund", "You are already using a custom theme" : "Je gebruikt al een maatwerkthema", "Theming" : "Thema's", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", "Name" : "Naam", "reset to default" : "herstellen naar standaard", "Web address" : "Webadres", diff --git a/apps/theming/l10n/nl.json b/apps/theming/l10n/nl.json index 83f500d0d82..7ac43b24ea7 100644 --- a/apps/theming/l10n/nl.json +++ b/apps/theming/l10n/nl.json @@ -11,6 +11,7 @@ "Unsupported image type" : "Afbeeldingstype wordt niet ondersteund", "You are already using a custom theme" : "Je gebruikt al een maatwerkthema", "Theming" : "Thema's", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.", "Name" : "Naam", "reset to default" : "herstellen naar standaard", "Web address" : "Webadres", diff --git a/apps/theming/l10n/pl.js b/apps/theming/l10n/pl.js index 9eaa70b2120..85a6708faa9 100644 --- a/apps/theming/l10n/pl.js +++ b/apps/theming/l10n/pl.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Ładowanie podglądu...", "Saved" : "Zapisano", "Admin" : "Admin", "a safe home for all your data" : "bezpieczna schowek dla wszystkich twoich danych", @@ -12,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Nieobsługiwany typ zdjęcia", "You are already using a custom theme" : "Używasz już motywu niestandarowego", "Theming" : "Motyw", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motywy pozwalają na łatwą personalizację wyglądu Twojej instancji i wpsieranych klientów. Efekty będą widoczne dla wszystkich użytkowników.", "Name" : "Nazwa", "reset to default" : "przywróć domyślne", "Web address" : "adres internetowy", diff --git a/apps/theming/l10n/pl.json b/apps/theming/l10n/pl.json index b9b05f4a5bd..53fde26ba79 100644 --- a/apps/theming/l10n/pl.json +++ b/apps/theming/l10n/pl.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Ładowanie podglądu...", "Saved" : "Zapisano", "Admin" : "Admin", "a safe home for all your data" : "bezpieczna schowek dla wszystkich twoich danych", @@ -10,6 +11,7 @@ "Unsupported image type" : "Nieobsługiwany typ zdjęcia", "You are already using a custom theme" : "Używasz już motywu niestandarowego", "Theming" : "Motyw", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Motywy pozwalają na łatwą personalizację wyglądu Twojej instancji i wpsieranych klientów. Efekty będą widoczne dla wszystkich użytkowników.", "Name" : "Nazwa", "reset to default" : "przywróć domyślne", "Web address" : "adres internetowy", diff --git a/apps/theming/l10n/pt_BR.js b/apps/theming/l10n/pt_BR.js index 2b56768334b..32091d88542 100644 --- a/apps/theming/l10n/pt_BR.js +++ b/apps/theming/l10n/pt_BR.js @@ -6,7 +6,7 @@ OC.L10N.register( "Admin" : "Administrador", "a safe home for all your data" : "um lugar seguro para seus dados", "The given name is too long" : "O nome é muito longo", - "The given web address is too long" : "O endereço da Web fornecido é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", "The given slogan is too long" : "O slogan dado é muito longo", "The given color is invalid" : "A cor fornecida é inválida", "No file uploaded" : "Nenhum arquivo enviado", @@ -16,8 +16,8 @@ OC.L10N.register( "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível a todos os usuários.", "Name" : "Nome", "reset to default" : "restaurar ao padrão", - "Web address" : "Endereço da Web", - "Web address https://…" : "Endereço da Web https://...", + "Web address" : "Endereço web", + "Web address https://…" : "Endereço web https://...", "Slogan" : "Slogan", "Color" : "Cor", "Logo" : "Logotipo", diff --git a/apps/theming/l10n/pt_BR.json b/apps/theming/l10n/pt_BR.json index 4544daa7556..889e609f861 100644 --- a/apps/theming/l10n/pt_BR.json +++ b/apps/theming/l10n/pt_BR.json @@ -4,7 +4,7 @@ "Admin" : "Administrador", "a safe home for all your data" : "um lugar seguro para seus dados", "The given name is too long" : "O nome é muito longo", - "The given web address is too long" : "O endereço da Web fornecido é muito longo", + "The given web address is too long" : "O endereço web fornecido é muito longo", "The given slogan is too long" : "O slogan dado é muito longo", "The given color is invalid" : "A cor fornecida é inválida", "No file uploaded" : "Nenhum arquivo enviado", @@ -14,8 +14,8 @@ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Criar e alterar temas torna possível personalizar facilmente o Nextcloud e clientes suportados. Isso será visível a todos os usuários.", "Name" : "Nome", "reset to default" : "restaurar ao padrão", - "Web address" : "Endereço da Web", - "Web address https://…" : "Endereço da Web https://...", + "Web address" : "Endereço web", + "Web address https://…" : "Endereço web https://...", "Slogan" : "Slogan", "Color" : "Cor", "Logo" : "Logotipo", diff --git a/apps/theming/l10n/ru.js b/apps/theming/l10n/ru.js index 2169af679f6..c0ea6d47203 100644 --- a/apps/theming/l10n/ru.js +++ b/apps/theming/l10n/ru.js @@ -1,6 +1,7 @@ OC.L10N.register( "theming", { + "Loading preview…" : "Загружается предпросмотр…", "Saved" : "Сохранено", "Admin" : "Администратор", "a safe home for all your data" : "надежный дом для всех ваших данных", @@ -12,6 +13,7 @@ OC.L10N.register( "Unsupported image type" : "Неподдерживаемый тип изображения", "You are already using a custom theme" : "Вы уже используете настраиваемую тему", "Theming" : "Темы оформления", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темы оформление позволяют легко настроить внешний вид вашего сервера и поддерживаемых клиентов. Это будет доступно для всех пользователей.", "Name" : "Название", "reset to default" : "сброс до настроек по-умолчанию", "Web address" : "Веб адрес", diff --git a/apps/theming/l10n/ru.json b/apps/theming/l10n/ru.json index fe15a6b5670..a054b5e7c14 100644 --- a/apps/theming/l10n/ru.json +++ b/apps/theming/l10n/ru.json @@ -1,4 +1,5 @@ { "translations": { + "Loading preview…" : "Загружается предпросмотр…", "Saved" : "Сохранено", "Admin" : "Администратор", "a safe home for all your data" : "надежный дом для всех ваших данных", @@ -10,6 +11,7 @@ "Unsupported image type" : "Неподдерживаемый тип изображения", "You are already using a custom theme" : "Вы уже используете настраиваемую тему", "Theming" : "Темы оформления", + "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Темы оформление позволяют легко настроить внешний вид вашего сервера и поддерживаемых клиентов. Это будет доступно для всех пользователей.", "Name" : "Название", "reset to default" : "сброс до настроек по-умолчанию", "Web address" : "Веб адрес", diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index cffc628e9b9..225673079a3 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -40,6 +40,7 @@ use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\File; use OCP\Files\IAppData; use OCP\Files\NotFoundException; +use OCP\Files\NotPermittedException; use OCP\IConfig; use OCP\IL10N; use OCP\ILogger; @@ -184,6 +185,20 @@ class ThemingController extends Controller { * @return DataResponse */ public function updateLogo() { + $backgroundColor = $this->request->getParam('backgroundColor', false); + if($backgroundColor) { + $this->themingDefaults->set('backgroundMime', 'backgroundColor'); + return new DataResponse( + [ + 'data' => + [ + 'name' => 'backgroundColor', + 'message' => $this->l10n->t('Saved') + ], + 'status' => 'success' + ] + ); + } $newLogo = $this->request->getUploadedFile('uploadlogo'); $newBackgroundLogo = $this->request->getUploadedFile('upload-login-background'); if (empty($newLogo) && empty($newBackgroundLogo)) { @@ -265,6 +280,24 @@ class ThemingController extends Controller { $value = $this->themingDefaults->undo($setting); // reprocess server scss for preview $cssCached = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/server.scss', 'core'); + + if($setting === 'logoMime') { + try { + $file = $this->appData->getFolder('images')->getFile('logo'); + $file->delete(); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + } + } + if($setting === 'backgroundMime') { + try { + $file = $this->appData->getFolder('images')->getFile('background'); + $file->delete(); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + } + } + return new DataResponse( [ 'data' => diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 2935355f26d..0824a36ccdc 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -129,9 +129,10 @@ class ThemingDefaults extends \OC_Defaults { /** * Themed logo url * + * @param bool $useSvg Whether to point to the SVG image or a fallback * @return string */ - public function getLogo() { + public function getLogo($useSvg = true) { $logo = $this->config->getAppValue('theming', 'logoMime', false); $logoExists = true; @@ -144,7 +145,12 @@ class ThemingDefaults extends \OC_Defaults { $cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0'); if(!$logo || !$logoExists) { - return $this->urlGenerator->imagePath('core','logo.svg') . '?v=' . $cacheBusterCounter; + if($useSvg) { + $logo = $this->urlGenerator->imagePath('core', 'logo.svg'); + } else { + $logo = $this->urlGenerator->imagePath('core', 'logo.png'); + } + return $logo . '?v=' . $cacheBusterCounter; } return $this->urlGenerator->linkToRoute('theming.Theming.getLogo') . '?v=' . $cacheBusterCounter; @@ -165,11 +171,13 @@ class ThemingDefaults extends \OC_Defaults { $backgroundExists = false; } + $cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0'); + if(!$backgroundLogo || !$backgroundExists) { - return $this->urlGenerator->imagePath('core','background.jpg'); + return $this->urlGenerator->imagePath('core','background.jpg') . '?v=' . $cacheBusterCounter; } - return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground'); + return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground') . '?v=' . $cacheBusterCounter; } @@ -188,6 +196,7 @@ class ThemingDefaults extends \OC_Defaults { $variables['image-logo'] = "'".$this->urlGenerator->getAbsoluteURL($this->getLogo())."'"; $variables['image-login-background'] = "'".$this->urlGenerator->getAbsoluteURL($this->getBackground())."'"; + $variables['image-login-plain'] = 'false'; if ($this->config->getAppValue('theming', 'color', null) !== null) { if ($this->util->invertTextColor($this->getColorPrimary())) { @@ -198,6 +207,10 @@ class ThemingDefaults extends \OC_Defaults { $variables['color-primary'] = $this->getColorPrimary(); $variables['color-primary-text'] = $colorPrimaryText; } + + if ($this->config->getAppValue('theming', 'backgroundMime', null) === 'backgroundColor') { + $variables['image-login-plain'] = 'true'; + } $cache->set('getScssVariables', $variables); return $variables; } diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php index 858329eca48..858b916c932 100644 --- a/apps/theming/templates/settings-admin.php +++ b/apps/theming/templates/settings-admin.php @@ -67,7 +67,7 @@ style('theming', 'settings-admin'); </label> </div> <div> - <form class="uploadButton inlineblock" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> <input type="hidden" id="current-logoMime" name="current-logoMime" value="<?php p($_['logoMime']); ?>" /> <label for="uploadlogo"><span><?php p($l->t('Logo')) ?></span></label> <input id="uploadlogo" class="upload-logo-field" name="uploadlogo" type="file" /> @@ -76,16 +76,16 @@ style('theming', 'settings-admin'); </form> </div> <div> - <form class="uploadButton inlineblock" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> + <form class="uploadButton" method="post" action="<?php p($_['uploadLogoRoute']) ?>"> <input type="hidden" id="current-backgroundMime" name="current-backgroundMime" value="<?php p($_['backgroundMime']); ?>" /> <label for="upload-login-background"><span><?php p($l->t('Login image')) ?></span></label> <input id="upload-login-background" class="upload-logo-field" name="upload-login-background" type="file"> <label for="upload-login-background" class="button icon-upload svg" id="upload-login-background" title="<?php p($l->t("Upload new login background")) ?>"></label> <div data-setting="backgroundMime" data-toggle="tooltip" data-original-title="<?php p($l->t('reset to default')); ?>" class="theme-undo icon icon-history"></div> + <div class="theme-remove-bg icon icon-delete" data-toggle="tooltip" data-original-title="<?php p($l->t('Remove background image')); ?>"></div> </form> </div> - - <div id="theming-preview" style="background-color:<?php p($_['color']);?>; background-image:url(<?php p($_['background']); ?>);"> + <div id="theming-preview"> <img src="<?php p($_['logo']); ?>" id="theming-preview-logo" /> </div> <?php } ?> diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index 0aa9ead3742..cbdb86d0358 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -152,11 +152,16 @@ class ThemingControllerTest extends TestCase { public function testUpdateLogoNoData() { $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn(null); @@ -179,6 +184,29 @@ class ThemingControllerTest extends TestCase { $this->assertEquals($expected, $this->themingController->updateLogo()); } + public function testUpdateBackgroundColor() { + $this->request + ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(true); + $this->themingDefaults + ->expects($this->once()) + ->method('set') + ->with('backgroundMime', 'backgroundColor'); + $expected = new DataResponse( + [ + 'data' => + [ + 'name' => 'backgroundColor', + 'message' => $this->l10n->t('Saved') + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->updateLogo()); + } + public function dataUpdateImages() { return [ [false], @@ -194,6 +222,11 @@ class ThemingControllerTest extends TestCase { touch($tmpLogo); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn([ @@ -202,7 +235,7 @@ class ThemingControllerTest extends TestCase { 'name' => 'logo.svg', ]); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn(null); @@ -259,11 +292,16 @@ class ThemingControllerTest extends TestCase { file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/desktopapp.png')); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn([ @@ -322,11 +360,16 @@ class ThemingControllerTest extends TestCase { file_put_contents($tmpLogo, file_get_contents(__DIR__ . '/../../../../tests/data/data.zip')); $this->request ->expects($this->at(0)) + ->method('getParam') + ->with('backgroundColor') + ->willReturn(false); + $this->request + ->expects($this->at(1)) ->method('getUploadedFile') ->with('uploadlogo') ->willReturn(null); $this->request - ->expects($this->at(1)) + ->expects($this->at(2)) ->method('getUploadedFile') ->with('upload-login-background') ->willReturn([ @@ -385,6 +428,56 @@ class ThemingControllerTest extends TestCase { $this->assertEquals($expected, $this->themingController->undo('MySetting')); } + public function dataUndoDelete() { + return [ + [ 'backgroundMime', 'background' ], + [ 'logoMime', 'logo' ] + ]; + } + + /** @dataProvider dataUndoDelete */ + public function testUndoDelete($value, $filename) { + $this->l10n + ->expects($this->once()) + ->method('t') + ->with('Saved') + ->willReturn('Saved'); + $this->themingDefaults + ->expects($this->once()) + ->method('undo') + ->with($value) + ->willReturn($value); + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + $folder + ->expects($this->once()) + ->method('getFile') + ->with($filename) + ->willReturn($file); + $file + ->expects($this->once()) + ->method('delete'); + + $expected = new DataResponse( + [ + 'data' => + [ + 'value' => $value, + 'message' => 'Saved', + ], + 'status' => 'success' + ] + ); + $this->assertEquals($expected, $this->themingController->undo($value)); + } + + + public function testGetLogoNotExistent() { $this->appData->method('getFolder') ->with($this->equalTo('images')) diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 736eeb3afc3..a7cb7790aa6 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -384,10 +384,15 @@ class ThemingDefaultsTest extends TestCase { ->method('getFolder') ->willThrowException(new NotFoundException()); $this->config - ->expects($this->once()) + ->expects($this->at(0)) ->method('getAppValue') ->with('theming', 'backgroundMime') ->willReturn(''); + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); $this->appData ->expects($this->once()) ->method('getFolder') @@ -397,7 +402,7 @@ class ThemingDefaultsTest extends TestCase { ->method('imagePath') ->with('core', 'background.jpg') ->willReturn('core-background'); - $this->assertEquals('core-background', $this->template->getBackground()); + $this->assertEquals('core-background?v=0', $this->template->getBackground()); } public function testGetBackgroundCustom() { @@ -410,18 +415,23 @@ class ThemingDefaultsTest extends TestCase { ->method('getFolder') ->willReturn($folder); $this->config - ->expects($this->once()) + ->expects($this->at(0)) ->method('getAppValue') ->with('theming', 'backgroundMime', false) ->willReturn('image/svg+xml'); + $this->config + ->expects($this->at(1)) + ->method('getAppValue') + ->with('theming', 'cachebuster', '0') + ->willReturn('0'); $this->urlGenerator->expects($this->once()) ->method('linkToRoute') ->with('theming.Theming.getLoginBackground') ->willReturn('custom-background'); - $this->assertEquals('custom-background', $this->template->getBackground()); + $this->assertEquals('custom-background?v=0', $this->template->getBackground()); } - public function testGetLogoDefault() { + private function getLogoHelper($withName, $useSvg) { $this->appData->expects($this->once()) ->method('getFolder') ->willThrowException(new NotFoundException()); @@ -442,9 +452,17 @@ class ThemingDefaultsTest extends TestCase { ->willThrowException(new \Exception()); $this->urlGenerator->expects($this->once()) ->method('imagePath') - ->with('core', 'logo.svg') + ->with('core', $withName) ->willReturn('core-logo'); - $this->assertEquals('core-logo' . '?v=0', $this->template->getLogo()); + $this->assertEquals('core-logo?v=0', $this->template->getLogo($useSvg)); + } + + public function testGetLogoDefaultWithSvg() { + $this->getLogoHelper('logo.svg', true); + } + + public function testGetLogoDefaultWithoutSvg() { + $this->getLogoHelper('logo.png', false); } public function testGetLogoCustom() { @@ -483,9 +501,10 @@ class ThemingDefaultsTest extends TestCase { $this->config->expects($this->at(1))->method('getAppValue')->with('theming', 'logoMime', false)->willReturn('jpeg'); $this->config->expects($this->at(2))->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('0'); $this->config->expects($this->at(3))->method('getAppValue')->with('theming', 'backgroundMime', false)->willReturn('jpeg'); - $this->config->expects($this->at(4))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); - $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(4))->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('0'); + $this->config->expects($this->at(5))->method('getAppValue')->with('theming', 'color', null)->willReturn($this->defaults->getColorPrimary()); $this->config->expects($this->at(6))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); + $this->config->expects($this->at(7))->method('getAppValue')->with('theming', 'color', $this->defaults->getColorPrimary())->willReturn($this->defaults->getColorPrimary()); $this->util->expects($this->any())->method('invertTextColor')->with($this->defaults->getColorPrimary())->willReturn(false); $this->cache->expects($this->once())->method('get')->with('getScssVariables')->willReturn(null); @@ -512,9 +531,10 @@ class ThemingDefaultsTest extends TestCase { $expected = [ 'theming-cachebuster' => '\'0\'', 'image-logo' => "'absolute-custom-logo?v=0'", - 'image-login-background' => "'absolute-custom-background'", + 'image-login-background' => "'absolute-custom-background?v=0'", 'color-primary' => $this->defaults->getColorPrimary(), - 'color-primary-text' => '#ffffff' + 'color-primary-text' => '#ffffff', + 'image-login-plain' => 'false' ]; $this->assertEquals($expected, $this->template->getScssVariables()); diff --git a/apps/twofactor_backupcodes/l10n/ko.js b/apps/twofactor_backupcodes/l10n/ko.js index 53ea6f37f20..06f4c9b76e0 100644 --- a/apps/twofactor_backupcodes/l10n/ko.js +++ b/apps/twofactor_backupcodes/l10n/ko.js @@ -3,15 +3,19 @@ OC.L10N.register( { "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" : "이것은 백업 코드입니다. 이 코드는 나중에 다시 확인할 수 없으므로 저장하거나 인쇄하십시오.", + "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 백업 코드", + "Two-factor authentication" : "2단계 인증", + "You successfully logged in using two-factor authentication (%1$s)" : "2단계 인증으로 로그인함(%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "2단계 인증 시도가 실패함(%1$s)", + "You created two-factor backup codes for your account" : "내 계정의 2단계 인증 백업 코드를 생성함", "Backup code" : "백업 코드", "Use backup code" : "백업 코드 사용", - "Second-factor backup codes" : "이중 인증 백업 코드" + "Second-factor backup codes" : "2단계 인증 백업 코드" }, "nplurals=1; plural=0;"); diff --git a/apps/twofactor_backupcodes/l10n/ko.json b/apps/twofactor_backupcodes/l10n/ko.json index cce8a5ac0b8..b2817272e4d 100644 --- a/apps/twofactor_backupcodes/l10n/ko.json +++ b/apps/twofactor_backupcodes/l10n/ko.json @@ -1,15 +1,19 @@ { "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" : "이것은 백업 코드입니다. 이 코드는 나중에 다시 확인할 수 없으므로 저장하거나 인쇄하십시오.", + "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 백업 코드", + "Two-factor authentication" : "2단계 인증", + "You successfully logged in using two-factor authentication (%1$s)" : "2단계 인증으로 로그인함(%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "2단계 인증 시도가 실패함(%1$s)", + "You created two-factor backup codes for your account" : "내 계정의 2단계 인증 백업 코드를 생성함", "Backup code" : "백업 코드", "Use backup code" : "백업 코드 사용", - "Second-factor backup codes" : "이중 인증 백업 코드" + "Second-factor backup codes" : "2단계 인증 백업 코드" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php index 902f7c783d5..5c5500862e6 100644 --- a/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php +++ b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php @@ -22,6 +22,7 @@ namespace OCA\TwoFactorBackupCodes\Provider; +use OC\App\AppManager; use OCA\TwoFactorBackupCodes\Service\BackupCodeStorage; use OCP\Authentication\TwoFactorAuth\IProvider; use OCP\IL10N; @@ -30,15 +31,29 @@ use OCP\Template; class BackupCodesProvider implements IProvider { + /** @var string */ + private $appName; + /** @var BackupCodeStorage */ private $storage; /** @var IL10N */ private $l10n; - public function __construct(BackupCodeStorage $storage, IL10N $l10n) { + /** @var AppManager */ + private $appManager; + + /** + * @param string $appName + * @param BackupCodeStorage $storage + * @param IL10N $l10n + * @param AppManager $appManager + */ + public function __construct($appName, BackupCodeStorage $storage, IL10N $l10n, AppManager $appManager) { + $this->appName = $appName; $this->l10n = $l10n; $this->storage = $storage; + $this->appManager = $appManager; } /** @@ -99,4 +114,28 @@ class BackupCodesProvider implements IProvider { return $this->storage->hasBackupCodes($user); } + /** + * Determine whether backup codes should be active or not + * + * Backup codes only make sense if at least one 2FA provider is active, + * hence this method checks all enabled apps on whether they provide 2FA + * functionality or not. If there's at least one app, backup codes are + * enabled on the personal settings page. + * + * @param IUser $user + * @return boolean + */ + public function isActive(IUser $user) { + $appIds = array_filter($this->appManager->getEnabledAppsForUser($user), function($appId) { + return $appId !== $this->appName; + }); + foreach ($appIds as $appId) { + $info = $this->appManager->getAppInfo($appId); + if (isset($info['two-factor-providers']) && count($info['two-factor-providers']) > 0) { + return true; + } + } + return false; + } + } diff --git a/apps/twofactor_backupcodes/settings/personal.php b/apps/twofactor_backupcodes/settings/personal.php index 0a018c0ff28..48c84a3355e 100644 --- a/apps/twofactor_backupcodes/settings/personal.php +++ b/apps/twofactor_backupcodes/settings/personal.php @@ -1,6 +1,19 @@ <?php + +use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider; +use OCP\Template; + // @codeCoverageIgnoreStart -$tmpl = new \OCP\Template('twofactor_backupcodes', 'personal'); -return $tmpl->fetchPage(); +/* @var $provider BackupCodesProvider */ +$provider = OC::$server->query(BackupCodesProvider::class); +$user = OC::$server->getUserSession()->getUser(); + +if ($provider->isActive($user)) { + $tmpl = new Template('twofactor_backupcodes', 'personal'); + return $tmpl->fetchPage(); +} else { + return ""; +} + // @codeCoverageIgnoreEnd diff --git a/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php index 5a99cfadd41..cec5b7b2160 100644 --- a/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php +++ b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php @@ -22,32 +22,41 @@ namespace OCA\TwoFactorBackupCodes\Tests\Unit\Provider; +use OC\App\AppManager; use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider; use OCA\TwoFactorBackupCodes\Service\BackupCodeStorage; use OCP\IL10N; use OCP\IUser; use OCP\Template; +use PHPUnit_Framework_MockObject_MockObject; use Test\TestCase; class BackupCodesProviderTest extends TestCase { + /** @var string */ + private $appName; + /** @var BackupCodeStorage|PHPUnit_Framework_MockObject_MockObject */ private $storage; /** @var IL10N|PHPUnit_Framework_MockObject_MockObject */ private $l10n; + /** @var AppManager|PHPUnit_Framework_MockObject_MockObject */ + private $appManager; + /** @var BackupCodesProvider */ private $provider; protected function setUp() { parent::setUp(); - $this->storage = $this->getMockBuilder(BackupCodeStorage::class) - ->disableOriginalConstructor() - ->getMock(); - $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); - $this->provider = new BackupCodesProvider($this->storage, $this->l10n); + $this->appName = "twofactor_backupcodes"; + $this->storage = $this->createMock(BackupCodeStorage::class); + $this->l10n = $this->createMock(IL10N::class); + $this->appManager = $this->createMock(AppManager::class); + + $this->provider = new BackupCodesProvider($this->appName, $this->storage, $this->l10n, $this->appManager); } public function testGetId() { @@ -100,4 +109,46 @@ class BackupCodesProviderTest extends TestCase { $this->assertTrue($this->provider->isTwoFactorAuthEnabledForUser($user)); } + public function testIsActiveNoProviders() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $this->appManager->expects($this->once()) + ->method('getEnabledAppsForUser') + ->with($user) + ->willReturn([ + 'twofactor_backupcodes', + 'mail', + ]); + $this->appManager->expects($this->once()) + ->method('getAppInfo') + ->with('mail') + ->willReturn([ + 'two-factor-providers' => [], + ]); + + $this->assertFalse($this->provider->isActive($user)); + } + + public function testIsActiveWithProviders() { + $user = $this->getMockBuilder(IUser::class)->getMock(); + + $this->appManager->expects($this->once()) + ->method('getEnabledAppsForUser') + ->with($user) + ->willReturn([ + 'twofactor_backupcodes', + 'twofactor_u2f', + ]); + $this->appManager->expects($this->once()) + ->method('getAppInfo') + ->with('twofactor_u2f') + ->willReturn([ + 'two-factor-providers' => [ + 'OCA\TwoFactorU2F\Provider\U2FProvider', + ], + ]); + + $this->assertTrue($this->provider->isActive($user)); + } + } diff --git a/apps/updatenotification/l10n/ca.js b/apps/updatenotification/l10n/ca.js index 920f2d68321..20a1fb22fe6 100644 --- a/apps/updatenotification/l10n/ca.js +++ b/apps/updatenotification/l10n/ca.js @@ -2,16 +2,24 @@ OC.L10N.register( "updatenotification", { "Update notifications" : "Notificacions d'actualització", + "Could not start updater, please try the manual update" : "No s'ha pogut iniciar actualitzador, provi l'actualització manual", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updated channel" : "Canal actualitzat", + "Channel updated" : "Canal actualitzat", + "The update server could not be reached since %d days to check for new updates." : "El servidor d'actualització no es va poder arribar des %d dies per comprovar si hi ha noves actualitzacions.", + "Please check the Nextcloud and server log files for errors." : "Si us plau, comproveu els fitxers de log del servidor i de Nextcloud per detectar errors.", + "Update to %1$s is available." : "Actualització per %1$s està disponible.", "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", - "Updater" : "Actualitzador", + "Update for {app} to version %s is available." : "Actualització per {app} a la versió %s està disponible.", "A new version is available: %s" : "Una nova versió està disponible: %s", "Open updater" : "Obrir actualitzador", + "Download now" : "Descarrega ara", "Your version is up to date." : "La teva versió està actualitzada.", "Checked on %s" : "Comprovat en %s", "Update channel:" : "Actualitzar canal:", "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", - "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:" + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available." : "Només notificació d'actualitzacions d'apps estan disponibles.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal d'actualització seleccionat deixa obsoletes les notificacions específiques del servidor.", + "The selected update channel does not support updates of the server." : "El canal d'actualització seleccionat no admet actualitzacions del servidor." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/ca.json b/apps/updatenotification/l10n/ca.json index 600e1292de3..ec4ccf23b5e 100644 --- a/apps/updatenotification/l10n/ca.json +++ b/apps/updatenotification/l10n/ca.json @@ -1,15 +1,23 @@ { "translations": { "Update notifications" : "Notificacions d'actualització", + "Could not start updater, please try the manual update" : "No s'ha pogut iniciar actualitzador, provi l'actualització manual", "{version} is available. Get more information on how to update." : "Hi ha disponible la versió {version}. Obtingueu més informació sobre com actualitzar.", - "Updated channel" : "Canal actualitzat", + "Channel updated" : "Canal actualitzat", + "The update server could not be reached since %d days to check for new updates." : "El servidor d'actualització no es va poder arribar des %d dies per comprovar si hi ha noves actualitzacions.", + "Please check the Nextcloud and server log files for errors." : "Si us plau, comproveu els fitxers de log del servidor i de Nextcloud per detectar errors.", + "Update to %1$s is available." : "Actualització per %1$s està disponible.", "Update for %1$s to version %2$s is available." : "L'actualització per %1$s a la versió %2$s està disponible.", - "Updater" : "Actualitzador", + "Update for {app} to version %s is available." : "Actualització per {app} a la versió %s està disponible.", "A new version is available: %s" : "Una nova versió està disponible: %s", "Open updater" : "Obrir actualitzador", + "Download now" : "Descarrega ara", "Your version is up to date." : "La teva versió està actualitzada.", "Checked on %s" : "Comprovat en %s", "Update channel:" : "Actualitzar canal:", "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Sempre podràs actualitzar a una versió més recent / canal experimental. Però mai es pot fer un \"downgrade\" a un canal més estable.", - "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:" + "Notify members of the following groups about available updates:" : "Notificar als membres dels següents grups sobre les actualitzacions disponibles:", + "Only notification for app updates are available." : "Només notificació d'actualitzacions d'apps estan disponibles.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal d'actualització seleccionat deixa obsoletes les notificacions específiques del servidor.", + "The selected update channel does not support updates of the server." : "El canal d'actualització seleccionat no admet actualitzacions del servidor." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/updatenotification/l10n/en_GB.js b/apps/updatenotification/l10n/en_GB.js index b26672b438e..cd32df87ae2 100644 --- a/apps/updatenotification/l10n/en_GB.js +++ b/apps/updatenotification/l10n/en_GB.js @@ -2,10 +2,17 @@ OC.L10N.register( "updatenotification", { "Update notifications" : "Update notifications", + "Could not start updater, please try the manual update" : "Could not start updater, please try the manual update", "{version} is available. Get more information on how to update." : "{version} is available. Get more information on how to update.", - "Nextcloud core" : "Nextcloud core", + "Channel updated" : "Channel updated", + "The update server could not be reached since %d days to check for new updates." : "The update server could not be reached since %d days to check for new updates.", + "Please check the Nextcloud and server log files for errors." : "Please check the Nextcloud and server log files for errors.", + "Update to %1$s is available." : "Update to %1$s is available.", "Update for %1$s to version %2$s is available." : "Update for %1$s to version %2$s is available.", + "Update for {app} to version %s is available." : "Update for {app} to version %s is available.", "A new version is available: %s" : "A new version is available: %s", + "Open updater" : "Open updater", + "Download now" : "Download now", "Your version is up to date." : "Your version is up to date.", "Checked on %s" : "Checked on %s", "Update channel:" : "Update channel:", @@ -13,7 +20,6 @@ OC.L10N.register( "Notify members of the following groups about available updates:" : "Notify members of the following groups about available updates:", "Only notification for app updates are available." : "Only notification for app updates are available.", "The selected update channel makes dedicated notifications for the server obsolete." : "The selected update channel makes dedicated notifications for the server obsolete.", - "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server.", - "Updater" : "Updater" + "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/en_GB.json b/apps/updatenotification/l10n/en_GB.json index 830650fcce3..f8c435efdb7 100644 --- a/apps/updatenotification/l10n/en_GB.json +++ b/apps/updatenotification/l10n/en_GB.json @@ -1,9 +1,16 @@ { "translations": { "Update notifications" : "Update notifications", + "Could not start updater, please try the manual update" : "Could not start updater, please try the manual update", "{version} is available. Get more information on how to update." : "{version} is available. Get more information on how to update.", - "Nextcloud core" : "Nextcloud core", + "Channel updated" : "Channel updated", + "The update server could not be reached since %d days to check for new updates." : "The update server could not be reached since %d days to check for new updates.", + "Please check the Nextcloud and server log files for errors." : "Please check the Nextcloud and server log files for errors.", + "Update to %1$s is available." : "Update to %1$s is available.", "Update for %1$s to version %2$s is available." : "Update for %1$s to version %2$s is available.", + "Update for {app} to version %s is available." : "Update for {app} to version %s is available.", "A new version is available: %s" : "A new version is available: %s", + "Open updater" : "Open updater", + "Download now" : "Download now", "Your version is up to date." : "Your version is up to date.", "Checked on %s" : "Checked on %s", "Update channel:" : "Update channel:", @@ -11,7 +18,6 @@ "Notify members of the following groups about available updates:" : "Notify members of the following groups about available updates:", "Only notification for app updates are available." : "Only notification for app updates are available.", "The selected update channel makes dedicated notifications for the server obsolete." : "The selected update channel makes dedicated notifications for the server obsolete.", - "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server.", - "Updater" : "Updater" + "The selected update channel does not support updates of the server." : "The selected update channel does not support updates of the server." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/updatenotification/l10n/ja.js b/apps/updatenotification/l10n/ja.js index 02a009292f8..289eebe861e 100644 --- a/apps/updatenotification/l10n/ja.js +++ b/apps/updatenotification/l10n/ja.js @@ -6,6 +6,7 @@ OC.L10N.register( "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Channel updated" : "チャンネルが更新されました", "The update server could not be reached since %d days to check for new updates." : "%d日以降、新しい更新をチェックする更新サーバーにアクセスできませんでした。", + "Please check the Nextcloud and server log files for errors." : "Nextcloudとサーバーログファイルでエラーがないか確認してください。", "Update to %1$s is available." : "%1$s への更新が利用可能です。", "Update for %1$s to version %2$s is available." : "%1$s に対するバージョン %2$s へアップデートが利用可能です。", "Update for {app} to version %s is available." : " {app} に対するバージョン %s へアップデートが利用可能です。", diff --git a/apps/updatenotification/l10n/ja.json b/apps/updatenotification/l10n/ja.json index feb1993dc80..fcead04da5b 100644 --- a/apps/updatenotification/l10n/ja.json +++ b/apps/updatenotification/l10n/ja.json @@ -4,6 +4,7 @@ "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Channel updated" : "チャンネルが更新されました", "The update server could not be reached since %d days to check for new updates." : "%d日以降、新しい更新をチェックする更新サーバーにアクセスできませんでした。", + "Please check the Nextcloud and server log files for errors." : "Nextcloudとサーバーログファイルでエラーがないか確認してください。", "Update to %1$s is available." : "%1$s への更新が利用可能です。", "Update for %1$s to version %2$s is available." : "%1$s に対するバージョン %2$s へアップデートが利用可能です。", "Update for {app} to version %s is available." : " {app} に対するバージョン %s へアップデートが利用可能です。", diff --git a/apps/updatenotification/l10n/ko.js b/apps/updatenotification/l10n/ko.js index cc225791380..08fbd6e7cb0 100644 --- a/apps/updatenotification/l10n/ko.js +++ b/apps/updatenotification/l10n/ko.js @@ -1,13 +1,25 @@ OC.L10N.register( "updatenotification", { + "Update notifications" : "업데이트 알림", + "Could not start updater, please try the manual update" : "업데이트를 시작할 수 없습니다. 수동 업데이트를 시도하십시오.", "{version} is available. Get more information on how to update." : "{version}을(를) 사용할 수 있습니다. 업데이트하는 방법에 대해서 알아보십시오.", - "Updated channel" : "업데이트 된 채널", - "Updater" : "업데이터", + "Channel updated" : "채널 업데이트됨", + "The update server could not be reached since %d days to check for new updates." : "업데이트 서버에 %d일 동안 접근할 수 없어서 새 업데이트를 확인할 수 없습니다.", + "Please check the Nextcloud and server log files for errors." : "Nextcloud 및 서버 로그에서 오류 정보를 확인하십시오.", + "Update to %1$s is available." : "%1$s(으)로 업데이트할 수 있습니다.", + "Update for %1$s to version %2$s is available." : "%1$s을(를) 버전 %2$s(으)로 업데이트할 수 있습니다.", + "Update for {app} to version %s is available." : "{app}을(를) 버전 %s(으)로 업데이트할 수 있습니다.", "A new version is available: %s" : "새 버전을 사용할 수 있습니다: %s", "Open updater" : "업데이터 열기", + "Download now" : "지금 다운로드", "Your version is up to date." : "최신 버전을 사용하고 있습니다.", + "Checked on %s" : "%s에 확인함", "Update channel:" : "업데이트 채널:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "항상 새로운 버전이나 실험 채널로 업그레이드할 수 있지만, 안정 채널로 다운그레이드할 수는 없습니다." + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "항상 새로운 버전이나 실험 채널로 업그레이드할 수 있지만, 안정 채널로 다운그레이드할 수는 없습니다.", + "Notify members of the following groups about available updates:" : "다음 그룹 구성원에게 업데이트 알림 전달:", + "Only notification for app updates are available." : "앱 업데이트 알림만 사용할 수 있습니다.", + "The selected update channel makes dedicated notifications for the server obsolete." : "선택한 업데이트 채널은 서버 알림을 사용하지 않습니다.", + "The selected update channel does not support updates of the server." : "선택한 업데이트 채널은 서버 업데이트를 지원하지 않습니다." }, "nplurals=1; plural=0;"); diff --git a/apps/updatenotification/l10n/ko.json b/apps/updatenotification/l10n/ko.json index a2e0474a0e3..8f2014e5c83 100644 --- a/apps/updatenotification/l10n/ko.json +++ b/apps/updatenotification/l10n/ko.json @@ -1,11 +1,23 @@ { "translations": { + "Update notifications" : "업데이트 알림", + "Could not start updater, please try the manual update" : "업데이트를 시작할 수 없습니다. 수동 업데이트를 시도하십시오.", "{version} is available. Get more information on how to update." : "{version}을(를) 사용할 수 있습니다. 업데이트하는 방법에 대해서 알아보십시오.", - "Updated channel" : "업데이트 된 채널", - "Updater" : "업데이터", + "Channel updated" : "채널 업데이트됨", + "The update server could not be reached since %d days to check for new updates." : "업데이트 서버에 %d일 동안 접근할 수 없어서 새 업데이트를 확인할 수 없습니다.", + "Please check the Nextcloud and server log files for errors." : "Nextcloud 및 서버 로그에서 오류 정보를 확인하십시오.", + "Update to %1$s is available." : "%1$s(으)로 업데이트할 수 있습니다.", + "Update for %1$s to version %2$s is available." : "%1$s을(를) 버전 %2$s(으)로 업데이트할 수 있습니다.", + "Update for {app} to version %s is available." : "{app}을(를) 버전 %s(으)로 업데이트할 수 있습니다.", "A new version is available: %s" : "새 버전을 사용할 수 있습니다: %s", "Open updater" : "업데이터 열기", + "Download now" : "지금 다운로드", "Your version is up to date." : "최신 버전을 사용하고 있습니다.", + "Checked on %s" : "%s에 확인함", "Update channel:" : "업데이트 채널:", - "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "항상 새로운 버전이나 실험 채널로 업그레이드할 수 있지만, 안정 채널로 다운그레이드할 수는 없습니다." + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "항상 새로운 버전이나 실험 채널로 업그레이드할 수 있지만, 안정 채널로 다운그레이드할 수는 없습니다.", + "Notify members of the following groups about available updates:" : "다음 그룹 구성원에게 업데이트 알림 전달:", + "Only notification for app updates are available." : "앱 업데이트 알림만 사용할 수 있습니다.", + "The selected update channel makes dedicated notifications for the server obsolete." : "선택한 업데이트 채널은 서버 알림을 사용하지 않습니다.", + "The selected update channel does not support updates of the server." : "선택한 업데이트 채널은 서버 업데이트를 지원하지 않습니다." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/updatenotification/l10n/pl.js b/apps/updatenotification/l10n/pl.js index edc80cb3687..9ab4f0a2fee 100644 --- a/apps/updatenotification/l10n/pl.js +++ b/apps/updatenotification/l10n/pl.js @@ -6,6 +6,7 @@ OC.L10N.register( "{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.", "Channel updated" : "Zaktualizowany kanał", "The update server could not be reached since %d days to check for new updates." : "Połączenie z serwerem z aktualizacjami w celu sprawdzenia nowych aktualizacji nie powiodło się od %d dni.", + "Please check the Nextcloud and server log files for errors." : "Proszę sprawdzić pliki z logami Nextcloud i serwera w celu poszukiwania błędów.", "Update to %1$s is available." : "Aktualizacja do %1$s jest dostępna.", "Update for %1$s to version %2$s is available." : "Jest dostępna aktualizacja dla %1$s do wersji %2$s", "Update for {app} to version %s is available." : "aktualizacja dla {app} do wersji %s jest dostępna.", diff --git a/apps/updatenotification/l10n/pl.json b/apps/updatenotification/l10n/pl.json index 0e37989ac0a..f38ef3740e6 100644 --- a/apps/updatenotification/l10n/pl.json +++ b/apps/updatenotification/l10n/pl.json @@ -4,6 +4,7 @@ "{version} is available. Get more information on how to update." : "Wersja {version} jest dostępna. Dowiedz się jak zaktualizować.", "Channel updated" : "Zaktualizowany kanał", "The update server could not be reached since %d days to check for new updates." : "Połączenie z serwerem z aktualizacjami w celu sprawdzenia nowych aktualizacji nie powiodło się od %d dni.", + "Please check the Nextcloud and server log files for errors." : "Proszę sprawdzić pliki z logami Nextcloud i serwera w celu poszukiwania błędów.", "Update to %1$s is available." : "Aktualizacja do %1$s jest dostępna.", "Update for %1$s to version %2$s is available." : "Jest dostępna aktualizacja dla %1$s do wersji %2$s", "Update for {app} to version %s is available." : "aktualizacja dla {app} do wersji %s jest dostępna.", diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index cbdcafc58d6..70e505c18af 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -29,46 +29,26 @@ $helper = new \OCA\User_LDAP\Helper(\OC::$server->getConfig()); $configPrefixes = $helper->getServerConfigurationPrefixes(true); -$ldapWrapper = new OCA\User_LDAP\LDAP(); -$ocConfig = \OC::$server->getConfig(); -$notificationManager = \OC::$server->getNotificationManager(); -$notificationManager->registerNotifier(function() { - return new \OCA\User_LDAP\Notification\Notifier( - \OC::$server->getL10NFactory() - ); -}, function() { +if(count($configPrefixes) > 0) { + $ldapWrapper = new OCA\User_LDAP\LDAP(); + $ocConfig = \OC::$server->getConfig(); + $notificationManager = \OC::$server->getNotificationManager(); + $notificationManager->registerNotifier(function() { + return new \OCA\User_LDAP\Notification\Notifier( + \OC::$server->getL10NFactory() + ); + }, function() { $l = \OC::$server->getL10N('user_ldap'); return [ 'id' => 'user_ldap', 'name' => $l->t('LDAP user and group backend'), ]; -}); -if(count($configPrefixes) === 1) { - $dbc = \OC::$server->getDatabaseConnection(); - $userManager = new OCA\User_LDAP\User\Manager($ocConfig, - new OCA\User_LDAP\FilesystemHelper(), - new OCA\User_LDAP\LogWrapper(), - \OC::$server->getAvatarManager(), - new \OCP\Image(), - $dbc, - \OC::$server->getUserManager(), - $notificationManager - ); - $connector = new OCA\User_LDAP\Connection($ldapWrapper, $configPrefixes[0]); - $ldapAccess = new OCA\User_LDAP\Access($connector, $ldapWrapper, $userManager, $helper); + }); - $ldapAccess->setUserMapper(new OCA\User_LDAP\Mapping\UserMapping($dbc)); - $ldapAccess->setGroupMapper(new OCA\User_LDAP\Mapping\GroupMapping($dbc)); - $userBackend = new OCA\User_LDAP\User_LDAP($ldapAccess, $ocConfig, $notificationManager); - $groupBackend = new \OCA\User_LDAP\Group_LDAP($ldapAccess); -} else if(count($configPrefixes) > 1) { $userBackend = new OCA\User_LDAP\User_Proxy( $configPrefixes, $ldapWrapper, $ocConfig, $notificationManager ); $groupBackend = new OCA\User_LDAP\Group_Proxy($configPrefixes, $ldapWrapper); -} - -if(count($configPrefixes) > 0) { // register user backend OC_User::useBackend($userBackend); \OC::$server->getGroupManager()->addBackend($groupBackend); diff --git a/apps/user_ldap/l10n/cs.js b/apps/user_ldap/l10n/cs.js index 2645072771b..6c4f10cd309 100644 --- a/apps/user_ldap/l10n/cs.js +++ b/apps/user_ldap/l10n/cs.js @@ -12,6 +12,13 @@ OC.L10N.register( "No data specified" : "Neurčena žádná data", " Could not set configuration %s" : "Nelze nastavit konfiguraci %s", "Action does not exist" : "Tato akce neexistuje", + "LDAP user and group backend" : "Backend pro LDAP uživatele a skupiny", + "Renewing …" : "Obnovování …", + "Very weak password" : "Velmi slabé heslo", + "Weak password" : "Slabé heslo", + "So-so password" : "Přijatelné heslo", + "Good password" : "Dobré heslo", + "Strong password" : "Silné heslo", "The Base DN appears to be wrong" : "Base DN nevypadá být v pořádku", "Testing configuration…" : "Testování konfigurace...", "Configuration incorrect" : "Nesprávná konfigurace", @@ -44,9 +51,13 @@ OC.L10N.register( "An unspecified error occurred. Please check the settings and the log." : "Došlo k nespecifikované chybě. Zkontrolujte prosím nastavení a soubor logu.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Zástupný symbol \"%uid\" chybí. Při dotatzu na LDAP / AD bude nahrazen přihlašovacím jménem.", "Please provide a login name to test against" : "Zadejte prosím přihlašovací jméno pro otestování", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.", "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ", + "Please login with the new password" : "Prosím, přihlaste se pomocí nového hesla", + "Your password will expire tomorrow." : "Vaše heslo zítra vyprší.", + "Your password will expire today." : "Vaše heslo dnes vyprší.", "LDAP / AD integration" : "LDAP / AD propojení", "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"], "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"], @@ -64,8 +75,10 @@ OC.L10N.register( "Edit LDAP Query" : "Upravit LDAP požadavek", "LDAP Filter:" : "LDAP filtr:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", + "Verify settings and count the groups" : "Ověřit nastavení a spočítat skupiny", "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, %s bude hledat uživatele na základě následujících atributů:", "LDAP / AD Username:" : "LDAP / AD uživatelské jméno:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Umožňuje přihlášení LDAP / AD uživatelským jménem, což je uid nebo sAMAccountName a bude detekováno.", "LDAP / AD Email Address:" : "LDAP / AD emailová adresa:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Umožňuje přihlášení s atributem emailu. Jsou povoleny Mail a mailPrimaryAddress.", "Other Attributes:" : "Další atributy:", @@ -74,9 +87,11 @@ OC.L10N.register( "Verify settings" : "Ověřit nastavení", "1. Server" : "1. Server", "%s. Server:" : "%s. Server:", + "Add a new configuration" : "Přidat novou konfiguraci", "Copy current configuration into new directory binding" : "Zkopírovat současnou konfiguraci do nového adresářového propojení", "Delete the current configuration" : "Smazat současnou konfiguraci", "Host" : "Počítač", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Pokud nevyžadujete SSL, můžete protokol vynechat. Pokud ano, začněte ldaps://", "Port" : "Port", "Detect Port" : "Detekovat port", "User DN" : "Uživatelské DN", @@ -96,6 +111,15 @@ OC.L10N.register( "Saving" : "Ukládá se", "Back" : "Zpět", "Continue" : "Pokračovat", + "Please renew your password." : "Prosím, obnovte vaše heslo.", + "An internal error occurred." : "Došlo k interní chybě.", + "Please try again or contact your administrator." : "Zkuste to znovu, nebo kontaktujte vašeho administrátora.", + "Current password" : "Aktuální heslo", + "New password" : "Žádné heslo", + "Renew password" : "Obnovit heslo", + "Wrong password. Reset it?" : "Chybné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", + "Cancel" : "Zrušit", "LDAP" : "LDAP", "Server" : "Server", "Users" : "Uživatelé", @@ -141,10 +165,15 @@ OC.L10N.register( "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro každého uživatele", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super Administrátorům a skupinovým Administrátorům změnu hesel jejich LDAP uživatelů. Funguje pouze, pokud jsou na LDAP serveru příslušně nakonfigurovány seznamy řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čisté podobě, musí být použito šifrování při transportu a na LDAP serveru by mělo být nakonfigurováno hashování hesel.", "(New password is sent as plain text to LDAP)" : "(Nové heslo je LDAPu zasláno jako prostý text)", + "Default password policy DN" : "DN výchozí politiky hesel", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN výchozí politiky hesel, která bude použita ke zpracování vypršení hesel. Funguje pouze pokud jsou povoleny změny hesla uživatelem a používá se OpenLDAP. Ponechte prázdné pro výchozí zpracování vypršení hesel.", "Special Attributes" : "Speciální atributy", "Quota Field" : "Pole pro kvótu", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ponechte prázné pro výchozí uživatelskou kvótu. Jinak uveďte LDAP / AD atribut.", "Quota Default" : "Výchozí kvóta", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Přepsat výchozí kvótu pro LDAP uživatele, kteří nemají kvótu nastavenou v poli kvóty.", "Email Field" : "Pole emailu", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Nastavit e-mail uživatele na základě LDAP atributu. Ponechte prázdné pro výchozí chování.", "User Home Folder Naming Rule" : "Pravidlo pojmenování domovského adresáře uživatele", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.", "Internal Username" : "Interní uživatelské jméno", diff --git a/apps/user_ldap/l10n/cs.json b/apps/user_ldap/l10n/cs.json index c3b2279237a..e8e6553e2d8 100644 --- a/apps/user_ldap/l10n/cs.json +++ b/apps/user_ldap/l10n/cs.json @@ -10,6 +10,13 @@ "No data specified" : "Neurčena žádná data", " Could not set configuration %s" : "Nelze nastavit konfiguraci %s", "Action does not exist" : "Tato akce neexistuje", + "LDAP user and group backend" : "Backend pro LDAP uživatele a skupiny", + "Renewing …" : "Obnovování …", + "Very weak password" : "Velmi slabé heslo", + "Weak password" : "Slabé heslo", + "So-so password" : "Přijatelné heslo", + "Good password" : "Dobré heslo", + "Strong password" : "Silné heslo", "The Base DN appears to be wrong" : "Base DN nevypadá být v pořádku", "Testing configuration…" : "Testování konfigurace...", "Configuration incorrect" : "Nesprávná konfigurace", @@ -42,9 +49,13 @@ "An unspecified error occurred. Please check the settings and the log." : "Došlo k nespecifikované chybě. Zkontrolujte prosím nastavení a soubor logu.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Filtr vyhledávání je neplatný, pravděpodobně z důvodu chybné syntax jako třeba neuzavřené závorky. Ověřte to.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Došlo k chybě připojení k LDAP / AD, zkontrolujte prosím host, port a přihlašovací údaje.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Zástupný symbol \"%uid\" chybí. Při dotatzu na LDAP / AD bude nahrazen přihlašovacím jménem.", "Please provide a login name to test against" : "Zadejte prosím přihlašovací jméno pro otestování", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Skupinové pole bylo vypnuto, protože LDAP / AD server nepodporuje memberOf.", "Password change rejected. Hint: " : "Změna hesla zamítnuta. Nápověda: ", + "Please login with the new password" : "Prosím, přihlaste se pomocí nového hesla", + "Your password will expire tomorrow." : "Vaše heslo zítra vyprší.", + "Your password will expire today." : "Vaše heslo dnes vyprší.", "LDAP / AD integration" : "LDAP / AD propojení", "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"], "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"], @@ -62,8 +73,10 @@ "Edit LDAP Query" : "Upravit LDAP požadavek", "LDAP Filter:" : "LDAP filtr:", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", + "Verify settings and count the groups" : "Ověřit nastavení a spočítat skupiny", "When logging in, %s will find the user based on the following attributes:" : "Při přihlašování, %s bude hledat uživatele na základě následujících atributů:", "LDAP / AD Username:" : "LDAP / AD uživatelské jméno:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Umožňuje přihlášení LDAP / AD uživatelským jménem, což je uid nebo sAMAccountName a bude detekováno.", "LDAP / AD Email Address:" : "LDAP / AD emailová adresa:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Umožňuje přihlášení s atributem emailu. Jsou povoleny Mail a mailPrimaryAddress.", "Other Attributes:" : "Další atributy:", @@ -72,9 +85,11 @@ "Verify settings" : "Ověřit nastavení", "1. Server" : "1. Server", "%s. Server:" : "%s. Server:", + "Add a new configuration" : "Přidat novou konfiguraci", "Copy current configuration into new directory binding" : "Zkopírovat současnou konfiguraci do nového adresářového propojení", "Delete the current configuration" : "Smazat současnou konfiguraci", "Host" : "Počítač", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Pokud nevyžadujete SSL, můžete protokol vynechat. Pokud ano, začněte ldaps://", "Port" : "Port", "Detect Port" : "Detekovat port", "User DN" : "Uživatelské DN", @@ -94,6 +109,15 @@ "Saving" : "Ukládá se", "Back" : "Zpět", "Continue" : "Pokračovat", + "Please renew your password." : "Prosím, obnovte vaše heslo.", + "An internal error occurred." : "Došlo k interní chybě.", + "Please try again or contact your administrator." : "Zkuste to znovu, nebo kontaktujte vašeho administrátora.", + "Current password" : "Aktuální heslo", + "New password" : "Žádné heslo", + "Renew password" : "Obnovit heslo", + "Wrong password. Reset it?" : "Chybné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", + "Cancel" : "Zrušit", "LDAP" : "LDAP", "Server" : "Server", "Users" : "Uživatelé", @@ -139,10 +163,15 @@ "Enable LDAP password changes per user" : "Povolit změny LDAP hesla pro každého uživatele", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Povolit LDAP uživatelům změnu jejich hesla a povolit Super Administrátorům a skupinovým Administrátorům změnu hesel jejich LDAP uživatelů. Funguje pouze, pokud jsou na LDAP serveru příslušně nakonfigurovány seznamy řízení přístupu. Protože hesla jsou LDAP serveru zasílána v čisté podobě, musí být použito šifrování při transportu a na LDAP serveru by mělo být nakonfigurováno hashování hesel.", "(New password is sent as plain text to LDAP)" : "(Nové heslo je LDAPu zasláno jako prostý text)", + "Default password policy DN" : "DN výchozí politiky hesel", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "DN výchozí politiky hesel, která bude použita ke zpracování vypršení hesel. Funguje pouze pokud jsou povoleny změny hesla uživatelem a používá se OpenLDAP. Ponechte prázdné pro výchozí zpracování vypršení hesel.", "Special Attributes" : "Speciální atributy", "Quota Field" : "Pole pro kvótu", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ponechte prázné pro výchozí uživatelskou kvótu. Jinak uveďte LDAP / AD atribut.", "Quota Default" : "Výchozí kvóta", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Přepsat výchozí kvótu pro LDAP uživatele, kteří nemají kvótu nastavenou v poli kvóty.", "Email Field" : "Pole emailu", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Nastavit e-mail uživatele na základě LDAP atributu. Ponechte prázdné pro výchozí chování.", "User Home Folder Naming Rule" : "Pravidlo pojmenování domovského adresáře uživatele", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.", "Internal Username" : "Interní uživatelské jméno", diff --git a/apps/user_ldap/l10n/el.js b/apps/user_ldap/l10n/el.js index e33d8a0a82e..41924ab5ae6 100644 --- a/apps/user_ldap/l10n/el.js +++ b/apps/user_ldap/l10n/el.js @@ -12,6 +12,8 @@ OC.L10N.register( "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", + "Renewing …" : "Ανανέωση ...", + "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", "Weak password" : "Ασθενές συνηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Ισχυρό συνθηματικό", @@ -97,6 +99,9 @@ OC.L10N.register( "Continue" : "Συνέχεια", "Current password" : "Τρέχον συνθηματικό", "New password" : "Νέο συνθηματικό", + "Renew password" : "Ανανέωση συνθηματικού", + "Wrong password." : "Εσφαλμένο συνθηματικό.", + "Cancel" : "Ακύρωση", "LDAP" : "LDAP", "Server" : "Διακομιστής", "Users" : "Χρήστες", diff --git a/apps/user_ldap/l10n/el.json b/apps/user_ldap/l10n/el.json index 5e7b7e322be..dbc1da6a951 100644 --- a/apps/user_ldap/l10n/el.json +++ b/apps/user_ldap/l10n/el.json @@ -10,6 +10,8 @@ "No data specified" : "Δεν προσδιορίστηκαν δεδομένα", " Could not set configuration %s" : "Αδυναμία ρύθμισης %s", "Action does not exist" : "Η ενέργεια δεν υπάρχει", + "Renewing …" : "Ανανέωση ...", + "Very weak password" : "Πολύ αδύναμος κωδικός πρόσβασης", "Weak password" : "Ασθενές συνηματικό", "Good password" : "Καλό συνθηματικό", "Strong password" : "Ισχυρό συνθηματικό", @@ -95,6 +97,9 @@ "Continue" : "Συνέχεια", "Current password" : "Τρέχον συνθηματικό", "New password" : "Νέο συνθηματικό", + "Renew password" : "Ανανέωση συνθηματικού", + "Wrong password." : "Εσφαλμένο συνθηματικό.", + "Cancel" : "Ακύρωση", "LDAP" : "LDAP", "Server" : "Διακομιστής", "Users" : "Χρήστες", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index 44bb447ae97..59556732058 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -12,6 +12,13 @@ OC.L10N.register( "No data specified" : "No se han especificado los datos", " Could not set configuration %s" : "No se pudo establecer la configuración %s", "Action does not exist" : "La acción no existe.", + "LDAP user and group backend" : "Motor de usuarios y grupos LDAP", + "Renewing …" : "Renovando...", + "Very weak password" : "Contraseña muy débil", + "Weak password" : "Contraseña débil", + "So-so password" : "Contraseña pasable", + "Good password" : "Contraseña buena", + "Strong password" : "Contraseña fuerte", "The Base DN appears to be wrong" : "La Base DN parece estar mal", "Testing configuration…" : "Probando configuración", "Configuration incorrect" : "Configuración Incorrecta", @@ -44,9 +51,14 @@ OC.L10N.register( "An unspecified error occurred. Please check the settings and the log." : "Un error no especificado ocurrió. Por favor verifique las configuraciones y el registro.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de búsqueda es inválido, probablemente debido a problemas de sintáxis tales como números impares de paréntesis abiertos y cerrados. Por favor revíselos.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", + "Please login with the new password" : "Por favor, entra con la nueva contraseña", + "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", + "Your password will expire today." : "Tu contraseña expirará hoy.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña expirará dentro de %n día.","Tu contraseña expirará dentro de %n días."], "LDAP / AD integration" : "Integración LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], @@ -67,6 +79,7 @@ OC.L10N.register( "Verify settings and count the groups" : "Verifique los ajustes y cuente los grupos", "When logging in, %s will find the user based on the following attributes:" : "Cuando se inicia sesión, %s encontrará al usuario basado en los siguientes atributos:", "LDAP / AD Username:" : "Nombre de usuario LDAP /AD:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite identificarse contra el nombre de usuario LDAP / AD, que es o bien uid o bien sAMAccountName y será detectado.", "LDAP / AD Email Address:" : "LDAP / AD dirección de correo electrónico:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite el inicio de sesión contra un atributo de correo electrónico. Correo y dirección primario de correo electrónico está habilitada.", "Other Attributes:" : "Otros atributos:", @@ -79,6 +92,7 @@ OC.L10N.register( "Copy current configuration into new directory binding" : "Copiar la actual configuración en un nuevo directorio de enlace", "Delete the current configuration" : "Elimina la actual configuración", "Host" : "Servidor", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Puedes omitir el protocolo, excepto si requieres SSL. En este caso, comienza con ldaps://", "Port" : "Puerto", "Detect Port" : "Detectar puerto", "User DN" : "DN usuario", @@ -98,6 +112,15 @@ OC.L10N.register( "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", + "Please renew your password." : "Por favor, renueva tu contraseña.", + "An internal error occurred." : "Ha ocurrido un error interno.", + "Please try again or contact your administrator." : "Por favor, inténtalo de nuevo o contacta con tu administrador.", + "Current password" : "Contraseña actual", + "New password" : "Nueva contraseña", + "Renew password" : "Renovar contraseña", + "Wrong password. Reset it?" : "Contraseña errónea. ¿Resetearla?", + "Wrong password." : "Contraseña errónea.", + "Cancel" : "Cancelar", "LDAP" : "LDAP", "Server" : "Servidor", "Users" : "Usuarios", @@ -143,6 +166,8 @@ OC.L10N.register( "Enable LDAP password changes per user" : "Permitir cambios de contraseñas LDAP por usuario", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. SOlo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", + "Default password policy DN" : "Política de contraseñas por defecto DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN de una política de contraseñas por defecto que será usado para el manejo de la expiración de contraseñas. Solo funciona cuando los cambios por usuario de la contraseña LDAP están habilitados y solo está aceptada por OpenLDAP. Déjala vacía para deshabilitar el manejo de expiración de contraseñas.", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index ed7bdc158ad..d3686ded22a 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -10,6 +10,13 @@ "No data specified" : "No se han especificado los datos", " Could not set configuration %s" : "No se pudo establecer la configuración %s", "Action does not exist" : "La acción no existe.", + "LDAP user and group backend" : "Motor de usuarios y grupos LDAP", + "Renewing …" : "Renovando...", + "Very weak password" : "Contraseña muy débil", + "Weak password" : "Contraseña débil", + "So-so password" : "Contraseña pasable", + "Good password" : "Contraseña buena", + "Strong password" : "Contraseña fuerte", "The Base DN appears to be wrong" : "La Base DN parece estar mal", "Testing configuration…" : "Probando configuración", "Configuration incorrect" : "Configuración Incorrecta", @@ -42,9 +49,14 @@ "An unspecified error occurred. Please check the settings and the log." : "Un error no especificado ocurrió. Por favor verifique las configuraciones y el registro.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de búsqueda es inválido, probablemente debido a problemas de sintáxis tales como números impares de paréntesis abiertos y cerrados. Por favor revíselos.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Un error de conexión a LDAP / AD ocurrió, por favor verifique host, puerto y credenciales.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "Falta el marcador de posición \"%uid\". Será reemplazado por el nombre de registro al consultar LDAP / AD.", "Please provide a login name to test against" : "Por favor suministre un nombre de inicio de sesión para probar", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo fue deshabilitado, porque el servidor LDAP / AD no admite memberOf.", "Password change rejected. Hint: " : "Contraseña rechazada. Pista:", + "Please login with the new password" : "Por favor, entra con la nueva contraseña", + "Your password will expire tomorrow." : "Tu contraseña expirará mañana.", + "Your password will expire today." : "Tu contraseña expirará hoy.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Tu contraseña expirará dentro de %n día.","Tu contraseña expirará dentro de %n días."], "LDAP / AD integration" : "Integración LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], @@ -65,6 +77,7 @@ "Verify settings and count the groups" : "Verifique los ajustes y cuente los grupos", "When logging in, %s will find the user based on the following attributes:" : "Cuando se inicia sesión, %s encontrará al usuario basado en los siguientes atributos:", "LDAP / AD Username:" : "Nombre de usuario LDAP /AD:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite identificarse contra el nombre de usuario LDAP / AD, que es o bien uid o bien sAMAccountName y será detectado.", "LDAP / AD Email Address:" : "LDAP / AD dirección de correo electrónico:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite el inicio de sesión contra un atributo de correo electrónico. Correo y dirección primario de correo electrónico está habilitada.", "Other Attributes:" : "Otros atributos:", @@ -77,6 +90,7 @@ "Copy current configuration into new directory binding" : "Copiar la actual configuración en un nuevo directorio de enlace", "Delete the current configuration" : "Elimina la actual configuración", "Host" : "Servidor", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Puedes omitir el protocolo, excepto si requieres SSL. En este caso, comienza con ldaps://", "Port" : "Puerto", "Detect Port" : "Detectar puerto", "User DN" : "DN usuario", @@ -96,6 +110,15 @@ "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", + "Please renew your password." : "Por favor, renueva tu contraseña.", + "An internal error occurred." : "Ha ocurrido un error interno.", + "Please try again or contact your administrator." : "Por favor, inténtalo de nuevo o contacta con tu administrador.", + "Current password" : "Contraseña actual", + "New password" : "Nueva contraseña", + "Renew password" : "Renovar contraseña", + "Wrong password. Reset it?" : "Contraseña errónea. ¿Resetearla?", + "Wrong password." : "Contraseña errónea.", + "Cancel" : "Cancelar", "LDAP" : "LDAP", "Server" : "Servidor", "Users" : "Usuarios", @@ -141,6 +164,8 @@ "Enable LDAP password changes per user" : "Permitir cambios de contraseñas LDAP por usuario", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permite a usuarios LDAP cambiar su contraseña y permite administradores y administradores de grupos, cambiar la contraseña de sus usuarios LDAP. SOlo funciona cuando las políticas de control de acceso están configuradas de acuerdo a las del servidor LDAP. Como las contraseñas se mandan en texto plano al servidor, LDAP, encripción del transporte debe ser usado y cifrado de las contraseñas debe ser configurado en el servidor LDAP.", "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", + "Default password policy DN" : "Política de contraseñas por defecto DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "El DN de una política de contraseñas por defecto que será usado para el manejo de la expiración de contraseñas. Solo funciona cuando los cambios por usuario de la contraseña LDAP están habilitados y solo está aceptada por OpenLDAP. Déjala vacía para deshabilitar el manejo de expiración de contraseñas.", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", diff --git a/apps/user_ldap/l10n/ko.js b/apps/user_ldap/l10n/ko.js index 52b000e65b4..51d8d48defd 100644 --- a/apps/user_ldap/l10n/ko.js +++ b/apps/user_ldap/l10n/ko.js @@ -12,8 +12,15 @@ OC.L10N.register( "No data specified" : "데이터가 지정되지 않음", " Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음", "Action does not exist" : "동작이 존재하지 않음", + "LDAP user and group backend" : "LDAP 사용자 및 그룹 백엔드", + "Renewing …" : "갱신 중 …", + "Very weak password" : "매우 약한 암호", + "Weak password" : "약한 암호", + "So-so password" : "그저 그런 암호", + "Good password" : "좋은 암호", + "Strong password" : "매우 좋은 암호", "The Base DN appears to be wrong" : "기본 DN이 올바르지 않습니다", - "Testing configuration…" : "설정 시험 중...", + "Testing configuration…" : "설정 시험 중…", "Configuration incorrect" : "설정 올바르지 않음", "Configuration incomplete" : "설정 불완전함", "Configuration OK" : "설정 올바름", @@ -35,16 +42,24 @@ OC.L10N.register( "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 쿼리를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 질의를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?", "Mode switch" : "모드 전환", "Select attributes" : "속성 선택", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "사용자를 찾을 수 없습니다. 로그인 속성과 사용자 이름을 확인하십시오. 적용되는 필터(명령행에 붙여넣어 검증 가능):", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "사용자를 찾을 수 없습니다. 로그인 속성과 사용자 이름을 확인하십시오. 적용되는 필터(명령행에 붙여넣어 검증 가능):<br/>", "User found and settings verified." : "사용자를 찾았고 설정을 확인했습니다.", + "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "설정을 확인했지만 사용자가 한 명 이상 있습니다. 첫 번째 사용자만 로그인할 수 있습니다. 더 구체적인 필터를 지정하십시오.", "An unspecified error occurred. Please check the settings and the log." : "알 수 없는 오류가 발생했습니다. 설정과 로그를 확인하십시오.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "검색 필터가 잘못되었습니다. 열고 닫는 괄호 쌍이 맞지 않을 수도 있습니다. 확인 후 수정하십시오.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 연결 오류가 발생했습니다. 호스트, 포트, 인증 정보를 확인하십시오.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%uid\" 자리 비움자가 없습니다. LDAP/AD에 조회할 때 로그인 이름으로 대체됩니다.", "Please provide a login name to test against" : "테스트할 로그인 사용자 이름을 입력하십시오", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", + "Password change rejected. Hint: " : "암호 변경이 거부되었습니다. 힌트:", + "Please login with the new password" : "새 암호로 로그인하십시오", + "Your password will expire tomorrow." : "내 암호가 내일 만료됩니다.", + "Your password will expire today." : "내 암호가 오늘 만료됩니다.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["내 암호가 %n일 후 만료됩니다."], + "LDAP / AD integration" : "LDAP/AD 통합", "_%s group found_::_%s groups found_" : ["그룹 %s개 찾음"], "_%s user found_::_%s users found_" : ["사용자 %s명 찾음"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "사용자 표시 이름을 결정할 수 없습니다. 고급 LDAP 설정에서 직접 입력하십시오.", @@ -58,11 +73,13 @@ OC.L10N.register( "Search groups" : "그룹 검색", "Available groups" : "사용 가능한 그룹", "Selected groups" : "선택한 그룹", - "Edit LDAP Query" : "LDAP 쿼리 편집", + "Edit LDAP Query" : "LDAP 질의 편집", "LDAP Filter:" : "LDAP 필터:", "The filter specifies which LDAP groups shall have access to the %s instance." : "이 필터는 %s에 접근할 수 있는 LDAP 그룹을 설정합니다.", + "Verify settings and count the groups" : "설정을 확인하고 그룹 개수 세기", "When logging in, %s will find the user based on the following attributes:" : "로그인할 때 %s에서 다음 속성을 기반으로 사용자를 찾습니다:", "LDAP / AD Username:" : "LDAP/AD 사용자 이름:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. uid 및 sAMAccountName 중 하나이며 자동으로 감지합니다.", "LDAP / AD Email Address:" : "LDAP/AD 이메일 주소:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "이메일 속성으로 로그인을 허용합니다. Mail 및 mailPrimaryAddress를 허용합니다.", "Other Attributes:" : "기타 속성:", @@ -71,9 +88,11 @@ OC.L10N.register( "Verify settings" : "설정 검사", "1. Server" : "1. 서버", "%s. Server:" : "%s. 서버:", + "Add a new configuration" : "새 설정 추가", "Copy current configuration into new directory binding" : "현재 설정을 새 디렉터리 바인딩으로 복사", "Delete the current configuration" : "현재 설정 삭제", "Host" : "호스트", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "SSL이 필요한 경우가 아니라면 프로토콜을 입력하지 않아도 됩니다. SSL이 필요한 경우 ldaps:// 주소를 입력하십시오", "Port" : "포트", "Detect Port" : "포트 감지", "User DN" : "사용자 DN", @@ -86,12 +105,22 @@ OC.L10N.register( "Test Base DN" : "기본 DN 시험", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "자동 LDAP 요청을 줄입니다. 대형 사이트에서 유용하지만 LDAP에 관한 지식이 필요합니다.", "Manually enter LDAP filters (recommended for large directories)" : "수동으로 LDAP 필터 입력(대형 사이트에 추천)", + "Listing and searching for users is constrained by these criteria:" : "다음 조건으로 사용자 조회 및 검색 제한:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "일반적인 객체 클래스는 organizationalPerson, person, user, inetOrgPerson입니다. 어떤 객체 클래스를 사용해야 할 지 모르겠으면 디렉터리 서비스 관리자에게 연락하십시오.", "The filter specifies which LDAP users shall have access to the %s instance." : "이 필터는 %s에 접근할 수 있는 LDAP 사용자를 설정합니다.", "Verify settings and count users" : "설정을 확인하고 사용자 수 계산", "Saving" : "저장 중", "Back" : "뒤로", "Continue" : "계속", + "Please renew your password." : "암호를 갱신하십시오.", + "An internal error occurred." : "내부 오류가 발생했습니다.", + "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", + "Current password" : "현재 암호", + "New password" : "새 암호", + "Renew password" : "암호 갱신", + "Wrong password. Reset it?" : "암호가 잘못되었습니다. 초기화하시겠습니까?", + "Wrong password." : "암호가 잘못되었습니다.", + "Cancel" : "취소", "LDAP" : "LDAP", "Server" : "서버", "Users" : "사용자", @@ -134,13 +163,22 @@ OC.L10N.register( "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "이 설정을 사용하면 그룹 안의 그룹을 지원합니다.(그룹 구성원 속성이 DN을 포함하는 경우에만 사용 가능)", "Paging chunksize" : "페이지 청크 크기", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "사용자와 그룹 목록 가져오기와 같은 다량의 결과를 반환하는 페이지를 지정한 LDAP 검색에 사용할 청크 크기입니다.(0으로 설정하면 이러한 검색을 할 때 페이지를 사용하지 않습니다.)", + "Enable LDAP password changes per user" : "사용자별 LDAP 암호 변경 허용", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP 사용자가 암호를 변경하고 수퍼 관리자 및 그룹 관리자가 LDAP 사용자의 암호를 변경할 수 있도록 허용합니다. LDAP 서버의 접근 제어가 올바르게 설정되어 있어야 작동합니다. LDAP 서버에 평문으로 암호가 전송되기 때문에 전송 계층 암호화가 설정되어 있어야 하며 LDAP 서버에 암호 해시가 설정되어 있어야 합니다.", + "(New password is sent as plain text to LDAP)" : "(새 암호가 LDAP 서버에 평문으로 전송됨)", + "Default password policy DN" : "기본 암호 정책 DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "암호 만료 처리에 사용할 기본 암호 정책 DN입니다. 사용자별 LDAP 암호 변경이 활성화되어 있어야 하며 OpenLDAP에서만 동작합니다. 암호 만료 처리를 사용하지 않으려면 비워 두십시오.", "Special Attributes" : "특수 속성", "Quota Field" : "할당량 필드", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "사용자의 기본 할당량을 사용하려면 비워 두십시오. 할당량 설정이 필요하면 LDAP/AD 속성을 지정하십시오.", "Quota Default" : "기본 할당량", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "할당량 필드에 할당량이 설정되지 않은 LDAP 사용자를 위한 기본 할당량입니다.", "Email Field" : "이메일 필드", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "LDAP 속성에서 사용자의 이메일을 설정합니다. 기본 행동을 사용하려면 비워 두십시오.", "User Home Folder Naming Rule" : "사용자 홈 폴더 이름 규칙", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오.", "Internal Username" : "내부 사용자 이름", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "기본적으로 내부 사용자 이름은 UUID 속성에서 생성됩니다. 이를 통해서 사용자 이름이 유일하며 문자를 변환할 필요가 없도록 합니다. 내부 사용자 이름에는 다음 글자만 사용할 수 있습니다: [a-zA-Z0-9_.@-] 다른 모든 글자는 ASCII에 해당하는 글자로 대체되거나 생략됩니다. 충돌이 발생할 경우 숫자가 추가로 붙거나 증가합니다. 내부 사용자 이름은 사용자를 내부에서 식별하는 데에도 사용되며, 사용자 홈 폴더의 기본 이름입니다. 모든 *DAV 서비스 등에 사용되는 URL의 일부이기도 합니다. 이 설정을 사용하면 기본 행동을 사용자 정의할 수 있으며, 비워 두면 기본값을 사용합니다. 변경 사항은 새로 매핑 및 추가된 LDAP 사용자에게만 적용됩니다.", "Internal Username Attribute:" : "내부 사용자 이름 속성:", "Override UUID detection" : "UUID 확인 재정의", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "기본적으로 UUID 속성은 자동적으로 감지됩니다. UUID 속성은 LDAP 사용자와 그룹을 정확히 식별하는 데 사용됩니다. 지정하지 않은 경우 내부 사용자 이름은 UUID를 기반으로 생성됩니다. 이 설정을 다시 정의하고 임의의 속성을 지정할 수 있습니다. 사용자와 그룹 모두에게 속성을 적용할 수 있고 중복된 값이 없는지 확인하십시오. 비워 두면 기본 설정을 사용합니다. 새로 추가되거나 매핑된 LDAP 사용자와 그룹에만 적용됩니다.", diff --git a/apps/user_ldap/l10n/ko.json b/apps/user_ldap/l10n/ko.json index 370221ddcff..23dab6f2b93 100644 --- a/apps/user_ldap/l10n/ko.json +++ b/apps/user_ldap/l10n/ko.json @@ -10,8 +10,15 @@ "No data specified" : "데이터가 지정되지 않음", " Could not set configuration %s" : " 설정 %s을(를) 지정할 수 없음", "Action does not exist" : "동작이 존재하지 않음", + "LDAP user and group backend" : "LDAP 사용자 및 그룹 백엔드", + "Renewing …" : "갱신 중 …", + "Very weak password" : "매우 약한 암호", + "Weak password" : "약한 암호", + "So-so password" : "그저 그런 암호", + "Good password" : "좋은 암호", + "Strong password" : "매우 좋은 암호", "The Base DN appears to be wrong" : "기본 DN이 올바르지 않습니다", - "Testing configuration…" : "설정 시험 중...", + "Testing configuration…" : "설정 시험 중…", "Configuration incorrect" : "설정 올바르지 않음", "Configuration incomplete" : "설정 불완전함", "Configuration OK" : "설정 올바름", @@ -33,16 +40,24 @@ "Anonymous bind is not allowed. Please provide a User DN and Password." : "익명 연결은 허용되지 않습니다. 사용자 DN과 암호를 입력하십시오.", "LDAP Operations error. Anonymous bind might not be allowed." : "LDAP 작업 오류입니다. 익명 연결이 비활성화 되었을 수 있습니다.", "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "저장할 수 없습니다. 데이터베이스 상태를 확인하십시오. 계속하기 전에 새로 고치십시오.", - "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 쿼리를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "모드를 전환하면 자동 LDAP 질의를 활성화합니다. LDAP 크기에 따라서 시간이 걸릴 수도 있습니다. 모드를 전환하시겠습니까?", "Mode switch" : "모드 전환", "Select attributes" : "속성 선택", - "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "사용자를 찾을 수 없습니다. 로그인 속성과 사용자 이름을 확인하십시오. 적용되는 필터(명령행에 붙여넣어 검증 가능):", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "사용자를 찾을 수 없습니다. 로그인 속성과 사용자 이름을 확인하십시오. 적용되는 필터(명령행에 붙여넣어 검증 가능):<br/>", "User found and settings verified." : "사용자를 찾았고 설정을 확인했습니다.", + "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "설정을 확인했지만 사용자가 한 명 이상 있습니다. 첫 번째 사용자만 로그인할 수 있습니다. 더 구체적인 필터를 지정하십시오.", "An unspecified error occurred. Please check the settings and the log." : "알 수 없는 오류가 발생했습니다. 설정과 로그를 확인하십시오.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "검색 필터가 잘못되었습니다. 열고 닫는 괄호 쌍이 맞지 않을 수도 있습니다. 확인 후 수정하십시오.", "A connection error to LDAP / AD occurred, please check host, port and credentials." : "LDAP/AD 연결 오류가 발생했습니다. 호스트, 포트, 인증 정보를 확인하십시오.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "\"%uid\" 자리 비움자가 없습니다. LDAP/AD에 조회할 때 로그인 이름으로 대체됩니다.", "Please provide a login name to test against" : "테스트할 로그인 사용자 이름을 입력하십시오", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP/AD 서버에서 memberOf를 지원하지 않아서 그룹 상자를 비활성화합니다.", + "Password change rejected. Hint: " : "암호 변경이 거부되었습니다. 힌트:", + "Please login with the new password" : "새 암호로 로그인하십시오", + "Your password will expire tomorrow." : "내 암호가 내일 만료됩니다.", + "Your password will expire today." : "내 암호가 오늘 만료됩니다.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["내 암호가 %n일 후 만료됩니다."], + "LDAP / AD integration" : "LDAP/AD 통합", "_%s group found_::_%s groups found_" : ["그룹 %s개 찾음"], "_%s user found_::_%s users found_" : ["사용자 %s명 찾음"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "사용자 표시 이름을 결정할 수 없습니다. 고급 LDAP 설정에서 직접 입력하십시오.", @@ -56,11 +71,13 @@ "Search groups" : "그룹 검색", "Available groups" : "사용 가능한 그룹", "Selected groups" : "선택한 그룹", - "Edit LDAP Query" : "LDAP 쿼리 편집", + "Edit LDAP Query" : "LDAP 질의 편집", "LDAP Filter:" : "LDAP 필터:", "The filter specifies which LDAP groups shall have access to the %s instance." : "이 필터는 %s에 접근할 수 있는 LDAP 그룹을 설정합니다.", + "Verify settings and count the groups" : "설정을 확인하고 그룹 개수 세기", "When logging in, %s will find the user based on the following attributes:" : "로그인할 때 %s에서 다음 속성을 기반으로 사용자를 찾습니다:", "LDAP / AD Username:" : "LDAP/AD 사용자 이름:", + "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "LDAP/AD 사용자 이름으로 로그인하는 것을 허용합니다. uid 및 sAMAccountName 중 하나이며 자동으로 감지합니다.", "LDAP / AD Email Address:" : "LDAP/AD 이메일 주소:", "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "이메일 속성으로 로그인을 허용합니다. Mail 및 mailPrimaryAddress를 허용합니다.", "Other Attributes:" : "기타 속성:", @@ -69,9 +86,11 @@ "Verify settings" : "설정 검사", "1. Server" : "1. 서버", "%s. Server:" : "%s. 서버:", + "Add a new configuration" : "새 설정 추가", "Copy current configuration into new directory binding" : "현재 설정을 새 디렉터리 바인딩으로 복사", "Delete the current configuration" : "현재 설정 삭제", "Host" : "호스트", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "SSL이 필요한 경우가 아니라면 프로토콜을 입력하지 않아도 됩니다. SSL이 필요한 경우 ldaps:// 주소를 입력하십시오", "Port" : "포트", "Detect Port" : "포트 감지", "User DN" : "사용자 DN", @@ -84,12 +103,22 @@ "Test Base DN" : "기본 DN 시험", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "자동 LDAP 요청을 줄입니다. 대형 사이트에서 유용하지만 LDAP에 관한 지식이 필요합니다.", "Manually enter LDAP filters (recommended for large directories)" : "수동으로 LDAP 필터 입력(대형 사이트에 추천)", + "Listing and searching for users is constrained by these criteria:" : "다음 조건으로 사용자 조회 및 검색 제한:", "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "일반적인 객체 클래스는 organizationalPerson, person, user, inetOrgPerson입니다. 어떤 객체 클래스를 사용해야 할 지 모르겠으면 디렉터리 서비스 관리자에게 연락하십시오.", "The filter specifies which LDAP users shall have access to the %s instance." : "이 필터는 %s에 접근할 수 있는 LDAP 사용자를 설정합니다.", "Verify settings and count users" : "설정을 확인하고 사용자 수 계산", "Saving" : "저장 중", "Back" : "뒤로", "Continue" : "계속", + "Please renew your password." : "암호를 갱신하십시오.", + "An internal error occurred." : "내부 오류가 발생했습니다.", + "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", + "Current password" : "현재 암호", + "New password" : "새 암호", + "Renew password" : "암호 갱신", + "Wrong password. Reset it?" : "암호가 잘못되었습니다. 초기화하시겠습니까?", + "Wrong password." : "암호가 잘못되었습니다.", + "Cancel" : "취소", "LDAP" : "LDAP", "Server" : "서버", "Users" : "사용자", @@ -132,13 +161,22 @@ "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "이 설정을 사용하면 그룹 안의 그룹을 지원합니다.(그룹 구성원 속성이 DN을 포함하는 경우에만 사용 가능)", "Paging chunksize" : "페이지 청크 크기", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "사용자와 그룹 목록 가져오기와 같은 다량의 결과를 반환하는 페이지를 지정한 LDAP 검색에 사용할 청크 크기입니다.(0으로 설정하면 이러한 검색을 할 때 페이지를 사용하지 않습니다.)", + "Enable LDAP password changes per user" : "사용자별 LDAP 암호 변경 허용", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP 사용자가 암호를 변경하고 수퍼 관리자 및 그룹 관리자가 LDAP 사용자의 암호를 변경할 수 있도록 허용합니다. LDAP 서버의 접근 제어가 올바르게 설정되어 있어야 작동합니다. LDAP 서버에 평문으로 암호가 전송되기 때문에 전송 계층 암호화가 설정되어 있어야 하며 LDAP 서버에 암호 해시가 설정되어 있어야 합니다.", + "(New password is sent as plain text to LDAP)" : "(새 암호가 LDAP 서버에 평문으로 전송됨)", + "Default password policy DN" : "기본 암호 정책 DN", + "The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "암호 만료 처리에 사용할 기본 암호 정책 DN입니다. 사용자별 LDAP 암호 변경이 활성화되어 있어야 하며 OpenLDAP에서만 동작합니다. 암호 만료 처리를 사용하지 않으려면 비워 두십시오.", "Special Attributes" : "특수 속성", "Quota Field" : "할당량 필드", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "사용자의 기본 할당량을 사용하려면 비워 두십시오. 할당량 설정이 필요하면 LDAP/AD 속성을 지정하십시오.", "Quota Default" : "기본 할당량", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "할당량 필드에 할당량이 설정되지 않은 LDAP 사용자를 위한 기본 할당량입니다.", "Email Field" : "이메일 필드", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "LDAP 속성에서 사용자의 이메일을 설정합니다. 기본 행동을 사용하려면 비워 두십시오.", "User Home Folder Naming Rule" : "사용자 홈 폴더 이름 규칙", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "사용자 이름을 사용하려면 비워 두십시오(기본값). 기타 경우 LDAP/AD 속성을 지정하십시오.", "Internal Username" : "내부 사용자 이름", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "기본적으로 내부 사용자 이름은 UUID 속성에서 생성됩니다. 이를 통해서 사용자 이름이 유일하며 문자를 변환할 필요가 없도록 합니다. 내부 사용자 이름에는 다음 글자만 사용할 수 있습니다: [a-zA-Z0-9_.@-] 다른 모든 글자는 ASCII에 해당하는 글자로 대체되거나 생략됩니다. 충돌이 발생할 경우 숫자가 추가로 붙거나 증가합니다. 내부 사용자 이름은 사용자를 내부에서 식별하는 데에도 사용되며, 사용자 홈 폴더의 기본 이름입니다. 모든 *DAV 서비스 등에 사용되는 URL의 일부이기도 합니다. 이 설정을 사용하면 기본 행동을 사용자 정의할 수 있으며, 비워 두면 기본값을 사용합니다. 변경 사항은 새로 매핑 및 추가된 LDAP 사용자에게만 적용됩니다.", "Internal Username Attribute:" : "내부 사용자 이름 속성:", "Override UUID detection" : "UUID 확인 재정의", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "기본적으로 UUID 속성은 자동적으로 감지됩니다. UUID 속성은 LDAP 사용자와 그룹을 정확히 식별하는 데 사용됩니다. 지정하지 않은 경우 내부 사용자 이름은 UUID를 기반으로 생성됩니다. 이 설정을 다시 정의하고 임의의 속성을 지정할 수 있습니다. 사용자와 그룹 모두에게 속성을 적용할 수 있고 중복된 값이 없는지 확인하십시오. 비워 두면 기본 설정을 사용합니다. 새로 추가되거나 매핑된 LDAP 사용자와 그룹에만 적용됩니다.", diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js index 4b4bc4a94bc..624216e5775 100644 --- a/apps/user_ldap/l10n/pl.js +++ b/apps/user_ldap/l10n/pl.js @@ -12,6 +12,12 @@ OC.L10N.register( "No data specified" : "Nie określono danych", " Could not set configuration %s" : "Nie można ustawić konfiguracji %s", "Action does not exist" : "Akcja nie istnieje", + "Renewing …" : "Odnawianie ...", + "Very weak password" : "Bardzo słabe hasło", + "Weak password" : "Słabe hasło", + "So-so password" : "Mało skomplikowane hasło", + "Good password" : "Dobre hasło", + "Strong password" : "Silne hasło", "The Base DN appears to be wrong" : "Base DN wygląda na błedne", "Testing configuration…" : "Testowanie konfiguracji...", "Configuration incorrect" : "Konfiguracja niepoprawna", @@ -47,6 +53,10 @@ OC.L10N.register( "Please provide a login name to test against" : "Wprowadź nazwę użytkownika, aby wykonać test ponownie", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Wpisy dla grup zostały wyłączone, ponieważ LDAP / AD nie wspiera memberOf.", "Password change rejected. Hint: " : "Zmiana hasła odrzucona: Wskazówka:", + "Please login with the new password" : "Proszę się zalogować z nowym hasłem", + "Your password will expire tomorrow." : "Twoje hasło wygasa jutro.", + "Your password will expire today." : "Twoje hasło wygasa dziś.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Twoje hasło wygaśnie w ciągu %n dnia.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni."], "LDAP / AD integration" : "Integracja z LDAP / AD", "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup","%s znalezionych grup"], "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników","%s znalezionych użytkowników"], @@ -74,9 +84,11 @@ OC.L10N.register( "Verify settings" : "Weryfikuj ustawienia", "1. Server" : "1. Serwer", "%s. Server:" : "%s. Serwer:", + "Add a new configuration" : "Dodaj nową konfigurację", "Copy current configuration into new directory binding" : "Kopiuje aktualną konfigurację do nowej lokalizacji", "Delete the current configuration" : "Usuwa aktualną konfigurację", "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Protokół może zostać pominięty chyba, że wymagany jest protokół SSL. Jeśli tak, zacznij od ldaps://", "Port" : "Port", "Detect Port" : "Wykryj port", "User DN" : "Użytkownik DN", @@ -96,6 +108,15 @@ OC.L10N.register( "Saving" : "Zapisuję", "Back" : "Wróć", "Continue" : "Kontynuuj ", + "Please renew your password." : "Proszę odnowić hasło", + "An internal error occurred." : "Wystąpił wewnętrzny błąd.", + "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", + "Current password" : "Bieżące hasło", + "New password" : "Nowe hasło", + "Renew password" : "Odnów hasło", + "Wrong password. Reset it?" : "Nieprawidłowe hasło. Czy chcesz je zresetować?", + "Wrong password." : "Nieprawidłowe hasło", + "Cancel" : "Anuluj", "LDAP" : "LDAP", "Server" : "Serwer", "Users" : "Użytkownicy", @@ -141,6 +162,7 @@ OC.L10N.register( "Enable LDAP password changes per user" : "Włącz zmianę hasła LDAP przez użytkownika", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Pozwól użytkownikom LDAP-a na zmianę swoich haseł i pozwól Super Administratorom i Grupom Administratorów na zmianę haseł swoim użytkownikom LDAP-a. Działa tylko wtedy, kiedy polisy kontroli dostępu są prawidłowo skonfigurowane na serwerze LDAP. Jako że do serwera LDAP hasła są wysyłane czystym tekstem, na serwerze LDAP należy skonfigurować protokoł szyfrowania oraz haszowanie haseł.", "(New password is sent as plain text to LDAP)" : "(Nowe hasło jest wysyłane do LDAP-a czystym tekstem)", + "Default password policy DN" : "Domyślna polityka haseł DN", "Special Attributes" : "Specjalne atrybuty", "Quota Field" : "Pole limitu przestrzeni", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Zostaw puste dla domyślnego limitu przestrzeni dla użytkowników lub określ atrybut LDAP/AD.", diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json index 159b1441666..05e542f4d71 100644 --- a/apps/user_ldap/l10n/pl.json +++ b/apps/user_ldap/l10n/pl.json @@ -10,6 +10,12 @@ "No data specified" : "Nie określono danych", " Could not set configuration %s" : "Nie można ustawić konfiguracji %s", "Action does not exist" : "Akcja nie istnieje", + "Renewing …" : "Odnawianie ...", + "Very weak password" : "Bardzo słabe hasło", + "Weak password" : "Słabe hasło", + "So-so password" : "Mało skomplikowane hasło", + "Good password" : "Dobre hasło", + "Strong password" : "Silne hasło", "The Base DN appears to be wrong" : "Base DN wygląda na błedne", "Testing configuration…" : "Testowanie konfiguracji...", "Configuration incorrect" : "Konfiguracja niepoprawna", @@ -45,6 +51,10 @@ "Please provide a login name to test against" : "Wprowadź nazwę użytkownika, aby wykonać test ponownie", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Wpisy dla grup zostały wyłączone, ponieważ LDAP / AD nie wspiera memberOf.", "Password change rejected. Hint: " : "Zmiana hasła odrzucona: Wskazówka:", + "Please login with the new password" : "Proszę się zalogować z nowym hasłem", + "Your password will expire tomorrow." : "Twoje hasło wygasa jutro.", + "Your password will expire today." : "Twoje hasło wygasa dziś.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Twoje hasło wygaśnie w ciągu %n dnia.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni.","Twoje hasło wygaśnie w ciągu %n dni."], "LDAP / AD integration" : "Integracja z LDAP / AD", "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup","%s znalezionych grup"], "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników","%s znalezionych użytkowników"], @@ -72,9 +82,11 @@ "Verify settings" : "Weryfikuj ustawienia", "1. Server" : "1. Serwer", "%s. Server:" : "%s. Serwer:", + "Add a new configuration" : "Dodaj nową konfigurację", "Copy current configuration into new directory binding" : "Kopiuje aktualną konfigurację do nowej lokalizacji", "Delete the current configuration" : "Usuwa aktualną konfigurację", "Host" : "Host", + "You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "Protokół może zostać pominięty chyba, że wymagany jest protokół SSL. Jeśli tak, zacznij od ldaps://", "Port" : "Port", "Detect Port" : "Wykryj port", "User DN" : "Użytkownik DN", @@ -94,6 +106,15 @@ "Saving" : "Zapisuję", "Back" : "Wróć", "Continue" : "Kontynuuj ", + "Please renew your password." : "Proszę odnowić hasło", + "An internal error occurred." : "Wystąpił wewnętrzny błąd.", + "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", + "Current password" : "Bieżące hasło", + "New password" : "Nowe hasło", + "Renew password" : "Odnów hasło", + "Wrong password. Reset it?" : "Nieprawidłowe hasło. Czy chcesz je zresetować?", + "Wrong password." : "Nieprawidłowe hasło", + "Cancel" : "Anuluj", "LDAP" : "LDAP", "Server" : "Serwer", "Users" : "Użytkownicy", @@ -139,6 +160,7 @@ "Enable LDAP password changes per user" : "Włącz zmianę hasła LDAP przez użytkownika", "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Pozwól użytkownikom LDAP-a na zmianę swoich haseł i pozwól Super Administratorom i Grupom Administratorów na zmianę haseł swoim użytkownikom LDAP-a. Działa tylko wtedy, kiedy polisy kontroli dostępu są prawidłowo skonfigurowane na serwerze LDAP. Jako że do serwera LDAP hasła są wysyłane czystym tekstem, na serwerze LDAP należy skonfigurować protokoł szyfrowania oraz haszowanie haseł.", "(New password is sent as plain text to LDAP)" : "(Nowe hasło jest wysyłane do LDAP-a czystym tekstem)", + "Default password policy DN" : "Domyślna polityka haseł DN", "Special Attributes" : "Specjalne atrybuty", "Quota Field" : "Pole limitu przestrzeni", "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Zostaw puste dla domyślnego limitu przestrzeni dla użytkowników lub określ atrybut LDAP/AD.", diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 5242b928672..a70709df9d1 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -12,7 +12,7 @@ OC.L10N.register( "No data specified" : "Nenhum dado especificado", " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", - "LDAP user and group backend" : "Backend LDAP de usuário e grupo", + "LDAP user and group backend" : "Plataforma de serviço LDAP de usuário e grupo", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", "Weak password" : "Senha fraca", @@ -80,8 +80,8 @@ OC.L10N.register( "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite login com nome de usuário LDAP / AD, o qual é ou uid ou sAMAccountName e será detectado.", - "LDAP / AD Email Address:" : "Endereço de email LDAP / AD:", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de email. Email e mailPrimaryAddress serão permitidos.", + "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de e-mail. E-mail e mailPrimaryAddress serão permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a ser aplicado, quando o login for feito. %% UID substitui o nome do usuário na ação de login. Exemplo: \"uid=%% UID\"", "Test Loginname" : "Testar Loginname", @@ -129,7 +129,7 @@ OC.L10N.register( "Expert" : "Especialista", "Advanced" : "Avançado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> Os aplicativos user_ldap e user_webdavauth são incompatíveis e pode haver um comportamento inesperado. Por favor, peça ao administrador do sistema para desabilitar um deles.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e o backend não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e a plataforma de serviço não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", "Connection Settings" : "Configurações de conexão", "Configuration Active" : "Configuração em uso", "When unchecked, this configuration will be skipped." : "Quando desmarcada, esta configuração será ignorada.", @@ -173,8 +173,8 @@ OC.L10N.register( "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Cota.", - "Email Field" : "Campo de email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", + "Email Field" : "Campo de e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o e-mail do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra de Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index db0dd00c381..0e523b59143 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -10,7 +10,7 @@ "No data specified" : "Nenhum dado especificado", " Could not set configuration %s" : "Não foi possível definir a configuração %s", "Action does not exist" : "A ação não existe", - "LDAP user and group backend" : "Backend LDAP de usuário e grupo", + "LDAP user and group backend" : "Plataforma de serviço LDAP de usuário e grupo", "Renewing …" : "Renovando...", "Very weak password" : "Senha muito fraca", "Weak password" : "Senha fraca", @@ -78,8 +78,8 @@ "When logging in, %s will find the user based on the following attributes:" : "Ao entrar, %s vai encontrar o usuário com base nos seguintes atributos:", "LDAP / AD Username:" : "Nome do usuário LDAP / AD:", "Allows login against the LDAP / AD username, which is either uid or sAMAccountName and will be detected." : "Permite login com nome de usuário LDAP / AD, o qual é ou uid ou sAMAccountName e será detectado.", - "LDAP / AD Email Address:" : "Endereço de email LDAP / AD:", - "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de email. Email e mailPrimaryAddress serão permitidos.", + "LDAP / AD Email Address:" : "Endereço de e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite o login com um atributo de e-mail. E-mail e mailPrimaryAddress serão permitidos.", "Other Attributes:" : "Outros Atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define o filtro a ser aplicado, quando o login for feito. %% UID substitui o nome do usuário na ação de login. Exemplo: \"uid=%% UID\"", "Test Loginname" : "Testar Loginname", @@ -127,7 +127,7 @@ "Expert" : "Especialista", "Advanced" : "Avançado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> Os aplicativos user_ldap e user_webdavauth são incompatíveis e pode haver um comportamento inesperado. Por favor, peça ao administrador do sistema para desabilitar um deles.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e o backend não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Aviso:</b> O módulo PHP LDAP não está instalado e a plataforma de serviço não funcionará. Por favor, peça ao administrador do sistema para instalá-lo.", "Connection Settings" : "Configurações de conexão", "Configuration Active" : "Configuração em uso", "When unchecked, this configuration will be skipped." : "Quando desmarcada, esta configuração será ignorada.", @@ -171,8 +171,8 @@ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Cota.", - "Email Field" : "Campo de email", - "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", + "Email Field" : "Campo de e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o e-mail do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra de Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js index 036f78ea9b3..ff5702c3634 100644 --- a/apps/user_ldap/l10n/ru.js +++ b/apps/user_ldap/l10n/ru.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", "Please login with the new password" : "Войдите в систему со своим новым паролем", + "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", + "Your password will expire today." : "Сегодня истекает срок действия пароля.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP / AD integration" : "Интеграция LDAP / AD", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json index 0b61ca441cd..448a36cb396 100644 --- a/apps/user_ldap/l10n/ru.json +++ b/apps/user_ldap/l10n/ru.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Настройка групп была отключена, так как сервер LDAP / AD не поддерживает memberOf.", "Password change rejected. Hint: " : "Смена пароля отклонена. Подсказка:", "Please login with the new password" : "Войдите в систему со своим новым паролем", + "Your password will expire tomorrow." : "Завтра истекает срок действия пароля.", + "Your password will expire today." : "Сегодня истекает срок действия пароля.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Срок действия пароля истекает через %n день.","Срок действия пароля истекает через %n дня.","Срок действия пароля истекает через %n дней.","Срок действия пароля истекает через %n день."], "LDAP / AD integration" : "Интеграция LDAP / AD", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено","%s пользователей найдено"], diff --git a/apps/workflowengine/l10n/ca.js b/apps/workflowengine/l10n/ca.js new file mode 100644 index 00000000000..c8de2819b34 --- /dev/null +++ b/apps/workflowengine/l10n/ca.js @@ -0,0 +1,73 @@ +OC.L10N.register( + "workflowengine", + { + "Saved" : "Desat", + "Saving failed:" : "Error al desar", + "File MIME type" : "Tipus MIME d\\'arxiu", + "is" : "és", + "is not" : "no és", + "matches" : "coincidències", + "does not match" : "No hi ha coincidències", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Mida d\\'arxiu (pujar)", + "less" : "menys", + "less or equals" : "menor o igual", + "greater or equals" : "major o igual", + "greater" : "superior", + "File system tag" : "Etiqueta del sistema de fitxers", + "is tagged with" : "està estiquetat amb", + "is not tagged with" : "no està etiquetat amb", + "Select tag…" : "Selecciona etiqueta...", + "Request remote address" : "Demanar adreça remota", + "matches IPv4" : "coincidències IPv4", + "does not match IPv4" : "No hi ha coincidencies IPv4", + "matches IPv6" : "Coincidències IPv6", + "does not match IPv6" : "No hi ha coincidències IPv6", + "Request time" : "Temps d'espera", + "between" : "entre", + "not between" : "no entre", + "Start" : "Comença", + "End" : "Finalitza", + "Select timezone…" : "Selecciona zona horaria", + "Request URL" : "URL de la petició", + "Predefined URLs" : "URLs predefinits", + "Files WebDAV" : "Arxius WebDAV", + "Request user agent" : "Agent d\\'usuari de la petició", + "Sync clients" : "Sincronitzar clients", + "Android client" : "Client android", + "iOS client" : "Client iOS", + "Desktop client" : "Client d'escriptori", + "User group membership" : "Pertinença a grup d'usuaris", + "is member of" : "és membre de", + "is not member of" : "no és membre de", + "The given operator is invalid" : "L\\'operador donat no és vàlid", + "The given regular expression is invalid" : "L\\'expresió regular donada no és vàlida", + "The given file size is invalid" : "El tamany de fitxer donat no és vàlid", + "The given tag id is invalid" : "L\\'Id d'etiqueta donat no és vàlid", + "The given IP range is invalid" : "El rang d\\'IPs donat no és vàlid", + "The given IP range is not valid for IPv4" : "El rang d\\'IP donat no és vàlid per IPv4", + "The given IP range is not valid for IPv6" : "El rang d\\'IP donat no és vàlid per IPv6", + "The given time span is invalid" : "El rang de temps donat no és vàlid", + "The given start time is invalid" : "El temps d\\'inici donat no és vàlid", + "The given end time is invalid" : "El temps de finalització donat no és vàlid", + "The given group does not exist" : "El grup donat no existeix", + "Check %s is invalid or does not exist" : "Comprovació %s no és vàlida o no existeix", + "Operation #%s does not exist" : "L\\'operació #%s no existeix", + "Operation %s does not exist" : "L\\'operació %s no existeix", + "Operation %s is invalid" : "L\\'operació %s no és vàlida", + "Check %s does not exist" : "Comprovació %s no existeix", + "Check %s is invalid" : "Comprovació %s no és vàlid", + "Check #%s does not exist" : "Comprovació #%s no existeix", + "Workflow" : "Flux de treball", + "Open documentation" : "Obrir documentació", + "Add rule group" : "Afegeix una regla de grup", + "Short rule description" : "Descripció breu de regla", + "Add rule" : "Afegir regla", + "Reset" : "Resetejar", + "Save" : "Desa", + "Saving…" : "Desant...", + "Loading…" : "Carregant...", + "Successfully saved" : "S\\'ha desat correctament", + "File mime type" : "Tipus mime de l\\'arxiu" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/workflowengine/l10n/ca.json b/apps/workflowengine/l10n/ca.json new file mode 100644 index 00000000000..d142823c0bb --- /dev/null +++ b/apps/workflowengine/l10n/ca.json @@ -0,0 +1,71 @@ +{ "translations": { + "Saved" : "Desat", + "Saving failed:" : "Error al desar", + "File MIME type" : "Tipus MIME d\\'arxiu", + "is" : "és", + "is not" : "no és", + "matches" : "coincidències", + "does not match" : "No hi ha coincidències", + "Example: {placeholder}" : "Exemple: {placeholder}", + "File size (upload)" : "Mida d\\'arxiu (pujar)", + "less" : "menys", + "less or equals" : "menor o igual", + "greater or equals" : "major o igual", + "greater" : "superior", + "File system tag" : "Etiqueta del sistema de fitxers", + "is tagged with" : "està estiquetat amb", + "is not tagged with" : "no està etiquetat amb", + "Select tag…" : "Selecciona etiqueta...", + "Request remote address" : "Demanar adreça remota", + "matches IPv4" : "coincidències IPv4", + "does not match IPv4" : "No hi ha coincidencies IPv4", + "matches IPv6" : "Coincidències IPv6", + "does not match IPv6" : "No hi ha coincidències IPv6", + "Request time" : "Temps d'espera", + "between" : "entre", + "not between" : "no entre", + "Start" : "Comença", + "End" : "Finalitza", + "Select timezone…" : "Selecciona zona horaria", + "Request URL" : "URL de la petició", + "Predefined URLs" : "URLs predefinits", + "Files WebDAV" : "Arxius WebDAV", + "Request user agent" : "Agent d\\'usuari de la petició", + "Sync clients" : "Sincronitzar clients", + "Android client" : "Client android", + "iOS client" : "Client iOS", + "Desktop client" : "Client d'escriptori", + "User group membership" : "Pertinença a grup d'usuaris", + "is member of" : "és membre de", + "is not member of" : "no és membre de", + "The given operator is invalid" : "L\\'operador donat no és vàlid", + "The given regular expression is invalid" : "L\\'expresió regular donada no és vàlida", + "The given file size is invalid" : "El tamany de fitxer donat no és vàlid", + "The given tag id is invalid" : "L\\'Id d'etiqueta donat no és vàlid", + "The given IP range is invalid" : "El rang d\\'IPs donat no és vàlid", + "The given IP range is not valid for IPv4" : "El rang d\\'IP donat no és vàlid per IPv4", + "The given IP range is not valid for IPv6" : "El rang d\\'IP donat no és vàlid per IPv6", + "The given time span is invalid" : "El rang de temps donat no és vàlid", + "The given start time is invalid" : "El temps d\\'inici donat no és vàlid", + "The given end time is invalid" : "El temps de finalització donat no és vàlid", + "The given group does not exist" : "El grup donat no existeix", + "Check %s is invalid or does not exist" : "Comprovació %s no és vàlida o no existeix", + "Operation #%s does not exist" : "L\\'operació #%s no existeix", + "Operation %s does not exist" : "L\\'operació %s no existeix", + "Operation %s is invalid" : "L\\'operació %s no és vàlida", + "Check %s does not exist" : "Comprovació %s no existeix", + "Check %s is invalid" : "Comprovació %s no és vàlid", + "Check #%s does not exist" : "Comprovació #%s no existeix", + "Workflow" : "Flux de treball", + "Open documentation" : "Obrir documentació", + "Add rule group" : "Afegeix una regla de grup", + "Short rule description" : "Descripció breu de regla", + "Add rule" : "Afegir regla", + "Reset" : "Resetejar", + "Save" : "Desa", + "Saving…" : "Desant...", + "Loading…" : "Carregant...", + "Successfully saved" : "S\\'ha desat correctament", + "File mime type" : "Tipus mime de l\\'arxiu" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/workflowengine/l10n/fr.js b/apps/workflowengine/l10n/fr.js index afe164def4f..5fb2ff3f410 100644 --- a/apps/workflowengine/l10n/fr.js +++ b/apps/workflowengine/l10n/fr.js @@ -26,7 +26,7 @@ OC.L10N.register( "Request time" : "Temps de requête", "between" : "entre", "not between" : "en dehors de", - "Start" : "Commencer", + "Start" : "Démarrer", "End" : "Fin", "Select timezone…" : "Sélectionner le fuseau horaire...", "Request URL" : "Demande d'URL", diff --git a/apps/workflowengine/l10n/fr.json b/apps/workflowengine/l10n/fr.json index 7cee1e0107a..cdf39458889 100644 --- a/apps/workflowengine/l10n/fr.json +++ b/apps/workflowengine/l10n/fr.json @@ -24,7 +24,7 @@ "Request time" : "Temps de requête", "between" : "entre", "not between" : "en dehors de", - "Start" : "Commencer", + "Start" : "Démarrer", "End" : "Fin", "Select timezone…" : "Sélectionner le fuseau horaire...", "Request URL" : "Demande d'URL", diff --git a/apps/workflowengine/l10n/ja.js b/apps/workflowengine/l10n/ja.js index e5c53ffc109..90f7cf1b932 100644 --- a/apps/workflowengine/l10n/ja.js +++ b/apps/workflowengine/l10n/ja.js @@ -1,7 +1,9 @@ OC.L10N.register( "workflowengine", { + "Saved" : "保存されました", "Saving failed:" : "保存に失敗しました:", + "File MIME type" : "ファイルMIMEタイプ", "is" : "は", "is not" : "は異なる", "matches" : "合致", diff --git a/apps/workflowengine/l10n/ja.json b/apps/workflowengine/l10n/ja.json index e04fe1f85dd..7c90834dcee 100644 --- a/apps/workflowengine/l10n/ja.json +++ b/apps/workflowengine/l10n/ja.json @@ -1,5 +1,7 @@ { "translations": { + "Saved" : "保存されました", "Saving failed:" : "保存に失敗しました:", + "File MIME type" : "ファイルMIMEタイプ", "is" : "は", "is not" : "は異なる", "matches" : "合致", diff --git a/apps/workflowengine/l10n/ko.js b/apps/workflowengine/l10n/ko.js new file mode 100644 index 00000000000..ab51b421bc2 --- /dev/null +++ b/apps/workflowengine/l10n/ko.js @@ -0,0 +1,73 @@ +OC.L10N.register( + "workflowengine", + { + "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" : "사이", + "not between" : "사이에 없음", + "Start" : "시작", + "End" : "끝", + "Select timezone…" : "시간대 선택…", + "Request URL" : "요청 URL", + "Predefined URLs" : "사전 정의된 URL", + "Files WebDAV" : "파일 WebDAV", + "Request user agent" : "요청 사용자 에이전트", + "Sync clients" : "동기화 클라이언트", + "Android client" : "Android 클라이언트", + "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…" : "불러오는 중…", + "Successfully saved" : "성공적으로 저장됨", + "File mime type" : "파일 MIME 형식" +}, +"nplurals=1; plural=0;"); diff --git a/apps/workflowengine/l10n/ko.json b/apps/workflowengine/l10n/ko.json new file mode 100644 index 00000000000..f23a10c0690 --- /dev/null +++ b/apps/workflowengine/l10n/ko.json @@ -0,0 +1,71 @@ +{ "translations": { + "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" : "사이", + "not between" : "사이에 없음", + "Start" : "시작", + "End" : "끝", + "Select timezone…" : "시간대 선택…", + "Request URL" : "요청 URL", + "Predefined URLs" : "사전 정의된 URL", + "Files WebDAV" : "파일 WebDAV", + "Request user agent" : "요청 사용자 에이전트", + "Sync clients" : "동기화 클라이언트", + "Android client" : "Android 클라이언트", + "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…" : "불러오는 중…", + "Successfully saved" : "성공적으로 저장됨", + "File mime type" : "파일 MIME 형식" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/workflowengine/l10n/pl.js b/apps/workflowengine/l10n/pl.js index 69ee7a89a1d..d268df7a0b7 100644 --- a/apps/workflowengine/l10n/pl.js +++ b/apps/workflowengine/l10n/pl.js @@ -1,7 +1,9 @@ OC.L10N.register( "workflowengine", { + "Saved" : "Zapisano", "Saving failed:" : "Zapis się nie udał:", + "File MIME type" : "Typy plików MIME", "is" : "jest", "is not" : "nie jest", "matches" : "pasuje", diff --git a/apps/workflowengine/l10n/pl.json b/apps/workflowengine/l10n/pl.json index 3b913fd5306..61160d783cb 100644 --- a/apps/workflowengine/l10n/pl.json +++ b/apps/workflowengine/l10n/pl.json @@ -1,5 +1,7 @@ { "translations": { + "Saved" : "Zapisano", "Saving failed:" : "Zapis się nie udał:", + "File MIME type" : "Typy plików MIME", "is" : "jest", "is not" : "nie jest", "matches" : "pasuje", |